数据分析实战训练营8期-拉钩教育
数据分析实战训练营8期-拉钩教育
download:https://www.51xuebc.com/thread-441-1-1.html
数据初探
首先导入要运用的科学计算包numpy
,pandas
,可视化matplotlib
,seaborn
,以及机器学习包sklearn
。
import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib as mplimport matplotlib.pyplot as pltfrom IPython.display import display plt.style.use("fivethirtyeight") sns.set_style({'font.sans-serif':['simhei','Arial']}) %matplotlib inline# 检查Python版本from sys import version_infoif version_info.major != 3: raise Exception('请运用Python 3 来完成此项目')
然后导入数据,并停止初步的察看,这些察看包括理解数据特征的缺失值,异常值,以及大约的描绘性统计。
# 导入链家二手房数据lianjia_df = pd.read_csv('lianjia.csv') display(lianjia_df.head(n=2))
初步察看到一共有11
个特征变量,Price
在这里是我们的目的变量,然后我们继续深化察看一下。
# 检查缺失值状况lianjia_df.info()
发现了数据集一共有23677
条数据,其中Elevator
特征有明显的缺失值。
lianjia_df.describe()
上面结果给出了特征值是数值的一些统计值,包括均匀数,规范差,中位数,最小值,最大值,25%分位数,75%分位数。这些统计结果简单直接,关于初始理解一个特征好坏十分有用,比方我们察看到 Size 特征
的最大值为1019平米,最小值为2平米,那么我们就要考虑这个在实践中是不是存在的,假如不存在没有意义,那么这个数据就是一个异常值,会严重影响模型的性能。
当然,这只是初步察看,后续我们会用数据可视化来明晰的展现,并证明我们的猜想。
# 添加新特征房屋均价df = lianjia_df.copy()df['PerPrice'] = lianjia_df['Price']/lianjia_df['Size']# 重新摆放列位置columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']df = pd.DataFrame(df, columns = columns)# 重新审视数据集display(df.head(n=2))
我们发现 Id
特征其实没有什么实践意义,所以将其移除。由于房屋单价剖析起来比拟便当,简单的运用总价/面积就可得到,所以增加一个新的特征 PerPrice
(只用于剖析,不是预测特征)。另外,特征的次第也被调整了一下,看起来比拟舒适。
数据可视化剖析
Region特征剖析
关于区域特征,我们能够剖析不同区域房价和数量的比照。
# 对二手房区域分组比照二手房数量和每平米房价df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index() df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index() f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15)) sns.barplot(x='Region', y='PerPrice', palette="Blues_d", data=df_house_mean, ax=ax1) ax1.set_title('北京各大区二手房每平米单价比照',fontsize=15) ax1.set_xlabel('区域') ax1.set_ylabel('每平米单价') sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2) ax2.set_title('北京各大区二手房数量比照',fontsize=15) ax2.set_xlabel('区域') ax2.set_ylabel('数量') sns.boxplot(x='Region', y='Price', data=df, ax=ax3) ax3.set_title('北京各大区二手房房屋总价',fontsize=15) ax3.set_xlabel('区域') ax3.set_ylabel('房屋总价') plt.show()
运用了pandas
的网络透视功用 groupby
分组排序。区域特征可视化直接采用 seaborn
完成,颜色运用调色板 palette
参数,颜色突变,越浅阐明越少,反之越多。
能够察看到:
二手房均价:西城区的房价最贵均价大约11万/平,由于西城在二环以里,且是抢手学区房的汇集地。其次是东城大约10万/平,然后是海淀大约8.5万/平,其它均低于8万/平。
二手房房数量:从数量统计上来看,目前二手房市场上比拟炽热的区域。海淀区和朝阳区二手房数量最多,差不多都接近3000套,毕竟大区,需求量也大。然后是丰台区,近几年正在改造建立,有赶超之势。
二手房总价:经过箱型图看到,各大区域房屋总价中位数都都在1000万以下,且房屋总价离散值较高,西城最高到达了6000万,阐明房屋价钱特征不是理想的正太散布。
Size特征剖析
f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))# 建房时间的散布状况sns.distplot(df['Size'], bins=20, ax=ax1, color='r') sns.kdeplot(df['Size'], shade=True, ax=ax1)# 建房时间和出卖价钱的关系sns.regplot(x='Size', y='Price', data=df, ax=ax2) plt.show()
Size 散布:
经过 distplot
和 kdeplot
绘制柱状图察看 Size 特征的散布状况,属于长尾类型的散布,这阐明了有很多面积很大且超出正常范围的二手房。
Size 与 Price 的关系:
经过 regplot
绘制了 Size 和 Price 之间的散点图,发现 Size 特征根本与Price呈现线性关系,契合根本常识,面积越大,价钱越高。但是有两组明显的异常点:1. 面积不到10平米,但是价钱超出10000万;2. 一个点面积超越了1000平米,价钱很低,需求查看是什么状况。
df.loc[df['Size']< 10]
经过查看发现这组数据是别墅,呈现异常的缘由是由于别墅构造比拟特殊(无朝向无电梯),字段定义与二手商品房不太一样招致爬虫爬取数据错位。也因别墅类型二手房不在我们的思索范围之内,故将其移除再次察看Size散布和Price关系。
df.loc[df['Size']>1000]
经察看这个异常点不是普通的民用二手房,很可能是商用房,所以才有1房间0厅确有如此大超越1000平米的面积,这里选择移除。
df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]
重新停止可视化发现就没有明显的异常点了。
Layout特征剖析
f, ax1= plt.subplots(figsize=(20,20)) sns.countplot(y='Layout', data=df, ax=ax1) ax1.set_title('房屋户型',fontsize=15) ax1.set_xlabel('数量') ax1.set_ylabel('户型') plt.show()
这个特征真是不看不晓得,各种厅室组合搭配,居然还有9室3厅,4室0厅等奇异的构造。其中,2室一厅占绝大局部,其次是3室一厅,2室2厅,3室两厅。但是认真察看特征分类下有很多不规则的命名,比方2室一厅与2房间1卫,还有别墅,没有统一的叫法。这样的特征肯定是不能作为机器学习模型的数据输入的,需求运用特征工程停止相应的处置。
Renovation 特征剖析
df['Renovation'].value_counts()
平装 11345
简装 8497
其他 3239
毛坯 576
南北
20
Name: Renovation, dtype: int64
发现Renovation装修特征中居然有南北,它属于朝向的类型,可能是由于爬虫过程中一些信息位置为空,招致“Direction”朝向特征呈现在这里,所以需求肃清
或替换掉
。
# 去掉错误数据“南北”,由于爬虫过程中一些信息位置为空,招致“Direction”的特征呈现在这里,需求肃清或交换df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']# 画幅设置f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5)) sns.countplot(df['Renovation'], ax=ax1) sns.barplot(x='Renovation', y='Price', data=df, ax=ax2) sns.boxplot(x='Renovation', y='Price', data=df, ax=ax3) plt.show()
察看到,平装修的二手房数量最多,简装其次,也是我们素日常见的。而关于价钱来说,毛坯类型却是最高,其次是平装修。
Elevator 特征剖析
初探数据的时分,我们发现 Elevator 特征是有大量缺失值的,这关于我们是非常不利的,首先我们先看看有几缺失值:
misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])print('Elevator缺失值数量为:'+ str(misn))
Elevator 缺失值数量为:8237
这么多的缺失值怎样办呢?这个需求依据实践状况思索,常用的办法有均匀值/中位数填补法,直接移除,或者依据其他特征建模预测等。
这里我们思索填补法,但是有无电梯不是数值,不存在均匀值和中位数,怎样填补呢?这里给大家提供一种思绪:就是依据楼层 Floor 来判别有无电梯,普通的楼层大于6的都有电梯,而小于等于6层的普通都没有电梯。有了这个规范,那么剩下的就简单了。
# 由于存在个别类型错误,如简装和平装,特征值错位,故需求移除df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']# 填补Elevator缺失值df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10)) sns.countplot(df['Elevator'], ax=ax1) ax1.set_title('有无电梯数量比照',fontsize=15) ax1.set_xlabel('能否有电梯') ax1.set_ylabel('数量') sns.barplot(x='Elevator', y='Price', data=df, ax=ax2) ax2.set_title('有无电梯房价比照',fontsize=15) ax2.set_xlabel('能否有电梯') ax2.set_ylabel('总价') plt.show()
结果察看到,有电梯的二手房数量居多一些,毕竟高层土天时用率比拟高,合适北京庞大的人群需求,而高层就需求电梯。相应的,有电梯二手房房价较高,由于电梯前期装修费和后期维护费包含内了(但这个价钱比拟只是一个均匀的概念,比方无电梯的6层奢华小区当然价钱更高了)。
Year 特征剖析
grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',size=4) grid.map(plt.scatter, 'Year', 'Price') grid.add_legend()
在Renovation和Elevator的分类条件下,运用 FaceGrid
剖析 Year 特征,察看结果如下:
整个二手房房价趋向是随着时间增长而增长的;
2000年以后建造的二手房房价相较于2000年以前有很明显的价钱上涨;
1980年之前简直不存在有电梯二手房数据,阐明1980年之前还没有大面积装置电梯;
1980年之前无电梯二手房中,简装二手房占绝大多数,平装反而很少;
Floor 特征剖析
f, ax1= plt.subplots(figsize=(20,5)) sns.countplot(x='Floor', data=df, ax=ax1) ax1.set_title('房屋户型',fontsize=15) ax1.set_xlabel('数量') ax1.set_ylabel('户型') plt.show()
能够看到,6层二手房数量最多,但是单独的楼层特征没有什么意义,由于每个小区住房的总楼层数都不一样,我们需求晓得楼层的相对意义。另外,楼层与文化也有很重要联络,比方中国文化七上八下,七层可能受欢送,房价也贵,而普通也不会有4层或18层。当然,正常状况下中间楼层是比拟受欢送的,价钱也高,底层和顶层受欢送度较低,价钱也相对较低。所以楼层是一个十分复杂的特征,对房价影响也比拟大。
总结
本次分享旨在让大家理解如何用Python做一个简单的数据剖析,关于刚刚接触数据剖析的朋友无疑是一个很好的练习。不过,这个剖析还存在很多问题需求处理,比方:
处理爬虫获取的数据源精确度问题;
需求爬取或者寻觅更多好的售房特征;
需求做更多地特征工程工作,比方数据清洗,特征选择和挑选;
运用统计模型树立回归模型停止价钱预测;