![v2-b8e24fa14d4ccbebc7cc20efa91e2920_1440w.jpg?source=172ae18b](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-b8e24fa14d4ccbebc7cc20efa91e2920_1440w.jpg?source=172ae18b)
前言
最近在自学Python,通过学习大家的分享案例,看到使用Python进行较多的主要4个方面:爬虫,数据处理,数据可视化以及机器学习建模。对我来说目标就是:
- 熟练使用numpy pandas 进行数据清洗和预处理;
- 熟练使用pandas进行数据统计;
- 熟练使用matplotlib seaborn进行数据可视化;
- 了解机器学习常用算法,并能够做一个项目。
我将1-3归为Phase1,也就是这篇文章的主体内容。本篇以模仿为主,俗话说输出是最好的学习方式。希望通过这篇文章可以增加自己对Python基础的熟练程度,内化常规的数据分析思路。
分析思路
分析目标:查看北京二手居民住房的分布价格情况 Part 1- 数据读取和预处理
理解变量、数据选取、重复值缺失值处理 Part 2 - 北京市房源分布
数量、单价、总价 Part 3 - 各城区房源分布 Part 4 - 各城区房价分布
单价分布、总价分布、高价Top15小区、低价Top15小区 Part 5 - 各城区房源面积分布
全市平均面积分布、各城区平均面积分布、各城区总面积分布 Part 6 - 房价与房源特性的关系
房价与户型、楼层、朝向、建筑年代的关系
Part 1 - 数据读取和预处理
- 获取数据
本篇使用参考资料文章3的数据:https://pan.baidu.com/s/1_n3TkvESgOXfl5TUoqlk7w。
#导入常用包
![v2-aa54bc861e407951b530544ebfefd245_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-aa54bc861e407951b530544ebfefd245_b.jpg)
可以看到一共有12个变量,包括:
- Direction: 房屋朝向;
- Region/District/Gadern: 城区/街道/小区地址或者名称
- Id: 链家编码
- Elevator: 楼是否有电梯
- Floor:楼层
- Layout: 房屋户型
- Renovation: 装修情况
- Size: 房屋大小,单位平米
- Year: 房屋建筑年代
- Price: 房屋总价
2. 查看缺失值以及变量类型
rawdata.info()
![v2-9865ccc29349164d3abff7707c86f806_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-9865ccc29349164d3abff7707c86f806_b.jpg)
可以看到-
- 变量类型都符合预期,其中数值型变量的类型均为int64,不需要进行进一步处理;
- 只有Elevator有缺失值,并且缺失数量并不少,之后需要进一步处理。
3. 查看重复值
![v2-d5743a11ca527022bde034d5aff4ee70_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-d5743a11ca527022bde034d5aff4ee70_b.jpg)
在查看重复值时,发现真的有,但是打印出来查看的时候没有发现真的重复;没有找到原因,但是还是将重复的删掉了。
4. 处理缺失值
![v2-cb7688e8f597a3b9b20d1a3ea3fd5bb8_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-cb7688e8f597a3b9b20d1a3ea3fd5bb8_b.jpg)
发现有6种情况:‘NaN’'无电梯', '有电梯', '毛坯', '精装', '简装';因为数据抓取时有串行,导致数据不正确,所以删除 '毛坯', '精装', '简装';同时考虑楼房6层以下的无电梯,高层有电梯对缺失值进行填补,不过考虑Floor显示的只是此房源楼层而不是小区楼层,可能有误差。分析结果应该谨慎参考。
#缺失值处理
df.loc[(df['Elevator'].isnull())&(df['Floor']>6),'Elevator']='有电梯'
df.loc[(df['Elevator'].isnull())&(df['Floor']<=6),'Elevator']='无电梯'
del_row=df[(df['Elevator'] == '毛坯')|(df['Elevator'] == '简装')|(df['Elevator'] == '精装')].index.tolist()
len(del_row)
df=df.drop(del_row).reset_index(drop=True)
df.info()
5. 查看数据的一般描述统计值
df.describe()
![v2-b04037d82e4a29a548b5df0113ac8b79_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-b04037d82e4a29a548b5df0113ac8b79_b.jpg)
可以看到:
- 楼层分布在1到57层,75%集中在20层以下;
- Id没有实际意义,可以去掉;
- 每套房子总价在60W-6000W之间;75%价格小于710万,所以6000W有些异常;
- 房子面积在15平-1019平之间;75%的面积小于118平,所以最高面积1019平也有些异常;
- 房子建造年代从1950到2017年。
6. 异常值处理
考虑要分析普通居民住宅,所以具体查看房屋面积进行处理。
#查看区域面积分布
f, ax1=plt.subplots(1,figsize=(15,10))
sns.boxplot(x="Region",y="Size",data=df,ax=ax1)
ax1.set_title("北京各大区二手房面积分布")
ax1.set_xlabel('区域')
ax1.set_ylabel('二手房面积')
plt.xticks(fontsize=9)
plt.show()
![v2-3e46286415b72e4353a708d0c0f45fda_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-3e46286415b72e4353a708d0c0f45fda_b.jpg)
可以看到:
- 怀柔的房屋面积分布范围明显比其他城区广,具体查看数据,的确是建筑的居民楼面积较大。考虑其地理位置,数据情况和实际相符;
![v2-e2e2431d656903adea6b658862a9fd69_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-e2e2431d656903adea6b658862a9fd69_b.jpg)
- 面积小于20的查看了,无明显异常;
- 面积大于800的几个房源很明显。单独查看发现其中“新华联科技大厦”1房间0卫有1019平,明显不是居民住宅,需要删除;同时考虑“X房间0卫”也看起来也不像是居民住宅;
![v2-54a1d98f3d29a2cb12df27ee4afff18c_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-54a1d98f3d29a2cb12df27ee4afff18c_b.jpg)
进一步查看,户型分布,从逻辑上看是否有需要删除的异常值。发现有“X房间0卫”和“X室0厅”有很多;分布查看数据后发现“X室0厅”符合居民住宅情况,最后决定删除所有的“X房间0卫”。
#户型面积分布
f, ax1=plt.subplots(1,figsize=(10,10))
sns.boxplot(y="Layout",x="Size",data=df,ax=ax1)
ax1.set_title("北京二手房户型面积分布")
ax1.set_xlabel('户型')
ax1.set_ylabel('二手房面积')
plt.xticks(fontsize=9)
plt.show()
![v2-25e7a64f52c36e04101c41d3a66ecfb6_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-25e7a64f52c36e04101c41d3a66ecfb6_b.jpg)
#找到需要删除的行
del_list=df.loc[(df['Layout']=='5房间0卫')|(df['Layout']=='3房间0卫')|(df['Layout']=='2房间0卫')|(df['Layout']=='1房间0卫')].index.tolist()
del_list
df=df.drop(del_list) #删除x房间0卫
7. 变量选取
- 删除变量“Id”因为没有实际意义;
- 增加每平米单价“PerPrice”便于之后分析;
- 重新设置变量位置,方便查看。
#选取子集
![v2-de306d7c110a043f7100295b52a7e078_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-de306d7c110a043f7100295b52a7e078_b.jpg)
df.describe()
![v2-d94742ac78c4db5fa89417f80423ebbb_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d94742ac78c4db5fa89417f80423ebbb_b.jpg)
Part 2 - 北京市房源分布
# 北京二手房分布情况
%matplotlib inline
sns.set_style({'font.sans-serif':['simhei','Arial']})
f, [ax1,ax2,ax3] = plt.subplots(3,1, figsize=(15, 5))
sns.distplot(df['Size'], bins=30, ax=ax1, color='r')
sns.kdeplot(df['Size'], shade=True, ax=ax1)
sns.distplot(df['Price'], bins=30, ax=ax2, color='r')
sns.kdeplot(df['Price'], shade=True, ax=ax2)
sns.distplot(df['PerPrice'], bins=30, ax=ax3, color='r')
sns.kdeplot(df['PerPrice'], shade=True, ax=ax3)
plt.show()
![v2-fb8beb6de0e6b03c6b06c6bedba9c48f_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-fb8beb6de0e6b03c6b06c6bedba9c48f_b.jpg)
- 房间面积集中在0-200平以内,更大面积的房源面积变化范围大但数量很少;
- 二手房总价集中在1000W以内;
- 二手房每平米均价在4W左右最多,但均价的分布明显更加分散从3W-10W的房源数量都不算少。
Part 3 - 各城区房源分布
# 对二手房区域分组对比二手房数量
![v2-47e768a182620bf930a6c7ea483a3f28_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-47e768a182620bf930a6c7ea483a3f28_b.jpg)
- 丰台、海淀、朝阳和昌平数量相近,在第一梯队;西城和大兴数量相近,在第二梯队;平谷、怀柔和密云数量非常少;
Part 4 - 各城区房价分布
- 各区域总价以及每平米均价分布
#各城区房平均总价分布
![v2-6a851c9743c1cc2977ce78facde2925c_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-6a851c9743c1cc2977ce78facde2925c_b.jpg)
![v2-1fcb82cb2c14a21f17f086fc3d7567ab_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-1fcb82cb2c14a21f17f086fc3d7567ab_b.jpg)
#各城区房每平米单价分布
df_perprice_mean=df.groupby("Region")["PerPrice"].mean().sort_values(ascending=False).to_frame().reset_index()
f,[ax1,ax2]=plt.subplots(2,1,figsize=(20,15))
sns.barplot(x="Region",y="PerPrice",palette="Blues_d",data=df_perprice_mean,ax=ax1)
ax1.set_title("北京各大区二手房每平米单价对比")
ax1.set_xlabel('区域')
ax1.set_ylabel('每平米单价')
sns.boxplot(x="Region",y="PerPrice",palette="Blues_d",data=df,ax=ax2)
ax2.set_title("北京各大区二手房每平米单价分布")
ax2.set_xlabel('区域')
ax2.set_ylabel('每平米单价')
plt.xticks(fontsize=9)
plt.show()
![v2-144c2fc0ac554e80d8b86cba0f4e053f_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-144c2fc0ac554e80d8b86cba0f4e053f_b.jpg)
![v2-feee1bfe716cb33bf8d5b835aa9ed548_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-feee1bfe716cb33bf8d5b835aa9ed548_b.jpg)
- 东西城、海淀、怀柔和朝阳的平均每套二手房总价相近,在第一梯队;除怀柔外,每平米单价也保持和总价一样的排名;怀柔的均价并不在第一梯队,结合之前的房屋面积,因为怀柔二手房的房屋面积较大,造成总价较高;
- 东西城、海淀和朝阳的二手房总价分布也非常接近,怀柔的价格分布范围较广;
- 平谷、密云、门头沟和房山4个区域的房子总价和单价都很低,尤其是平谷和密云;为什么怀柔的二手房情况要远远好于它们,有待考证。
2. 房价Top15小区
#查看房屋总价最贵的小区
totalp_village = df.groupby(['Garden','Region'])['Price'].mean().sort_values(ascending = False).reset_index().head(15)
totalp_village
#城区分布
Topdis_check=totalp_village.groupby('Region')['Price'].count().sort_values(ascending = False).reset_index()
Topdis_check
![v2-6b6875d13b7a553d6d527cde0585da59_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-6b6875d13b7a553d6d527cde0585da59_b.jpg)
![v2-be637bff1233c51efac182926cbf28ed_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-be637bff1233c51efac182926cbf28ed_b.jpg)
#查看单价最贵的小区
Perp_village = df.groupby(['Garden','Region'])['PerPrice'].mean().sort_values(ascending = False).reset_index().head(15)
Perp_village
#对应城区分布
Perdis_check=Perp_village.groupby('Region')['PerPrice'].count().sort_values(ascending = False).reset_index()
Perdis_check
![v2-d4df23cd1d4c6e3f6055905a34e74c2e_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-d4df23cd1d4c6e3f6055905a34e74c2e_b.jpg)
![v2-3e72a92fd7c8ce53f6ae292913b578c5_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-3e72a92fd7c8ce53f6ae292913b578c5_b.jpg)
- Top结果与区域价格分析一致,贵的小区集中在西城东城,如果看总价的话,还有城六区外的顺义和昌平有小区入选。
Part 5 - 各区域房屋面积分布
按照前面对于Size的查看,以区间[0,50)、[50,100)、[100,150)、[150,200)、[200,+∞)为划分标准,将面积划分为Mini small、small、medium、big、huge五个等级,分别对应极小户型、小户型、中等户型、大户型和巨大户型。
df
![v2-76923ebdf2f31ea8069953a94872cfdf_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-76923ebdf2f31ea8069953a94872cfdf_b.jpg)
- 市场上最多的二手房面积在[50,100)内,[100,150)次之;
- 从房屋总价来看,超小户型<小户型<中等户型,并且三类价格比较集中;
- 从每平米单价来看,超小户型最高,其余几类差别不算太大,结合房屋总价,可能跟供需关系有关,总价低的市场需求量大,而相对供给量较低。
Part 6 - 房价与房源特性的关系
- 房价与户型分布
考虑之前的户型非常多,写法不一,根据全部的分布情况,只选取数量大于10套的户型进行可视化查看。因为户型分类较多,没有看到特别明显的和房价的关系。
#房每平米均价/数量和户型
![v2-6f9574ecb89cac2fce2ef95c087f0303_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-6f9574ecb89cac2fce2ef95c087f0303_b.jpg)
2. 房价与朝向分布
统计发现朝向的写法非常乱,所以选取朝向套数>100的进行可视化查看。发现房屋朝向与房屋价格并没有什么明显的关系。
#房均价/数量和朝向
![v2-1d1ef39e40cf4761c7ca889032532773_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-1d1ef39e40cf4761c7ca889032532773_b.jpg)
![v2-7a0df1c1dc0e885a36532ad41256d5b0_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-7a0df1c1dc0e885a36532ad41256d5b0_b.jpg)
![v2-38f0c92d72dc20cf7efc632ff1b3bb0e_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-38f0c92d72dc20cf7efc632ff1b3bb0e_b.jpg)
3. 房价与装修分布
- 在售二手房以精装和简装为主;
- 毛坯房数量虽少,却在每平单价和总价上均超过了精装房。查看毛坯房源分布的区域和面积都很分散,没有明显特征,原因有待考证。
#房均价/数量和装修
![v2-3d2ad4ab017423bc4279b93ef0d33b19_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-3d2ad4ab017423bc4279b93ef0d33b19_b.jpg)
4. 房价与楼层
- 6层房源最多;
- 1层、42和57层的每平米单价明显较高;其余层差异不大;
- 2层、3层的房屋总价分布与每平米单价表现不一致,平均总价明显高于其他楼层。
#房均价/数量和楼层
![v2-63718bcb4901d764b588fa7038695bfa_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-63718bcb4901d764b588fa7038695bfa_b.jpg)
5. 房价与电梯
电梯的数值在前面进行过填充,此处显示有电梯的房源数量和总价都高于没有电梯的,符合常识。但是填充的结果是否正确,也有待考证。
#房均价/数量和有无电梯
![v2-169050b6b925d726e81c2913d796e815_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-169050b6b925d726e81c2913d796e815_b.jpg)
6. 房价与建筑年限
y1
![v2-312e886a94dbbe0d68206b3ad60eb1f9_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-312e886a94dbbe0d68206b3ad60eb1f9_b.jpg)
plt.figure(figsize=(15,5))
df.groupby('Year').PerPrice.mean().plot()
plt.title('建筑时间-每平米单价')
![v2-e05c1a7120a8e0a52a4c9920ac0e8adf_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-e05c1a7120a8e0a52a4c9920ac0e8adf_b.jpg)
#不同城区的建筑情况
plt.figure(figsize=(15,10))
sns.swarmplot(x="Year",y="Region",data=df)
plt.title('建筑时间-数量')
plt.show()
![v2-e1c23bce8948b42e6df194345c99bf72_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=cd3a0190-fe2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-e1c23bce8948b42e6df194345c99bf72_b.jpg)
- 2000-2010年10年间北京大规模增加住宅,房屋总价同时增长,但整体房屋单价下降;结合不同年限各区域的住宅分布,可知这段实际增加了非内城区的其他区域的住宅,所以单价没有增加;
- 西城的住宅建设开始的最早,1980年之后各大城区才开始建设;建设时间和城区位置相符。
小结
通过分析可以看到,二手房市场的房源数量和房价表现出的北京特征非常明显:
- 中心城区东西城和学区房海淀朝阳房源多同时房价高;
- 房源面积集中在50-150平之内,总价均值在500-600万,<50平的房源因为房屋数量少和总价低,反而单价最高;
- 房屋的建筑时间和北京各区域发展的时间一致;
- 房价更多与区域位置和面积相关,与户型、装修和电梯等等相关性不明显。
本篇侧重于锻炼python实现数据清洗和可视化的能力,不足之处:
- 对于变量电梯、朝向、户型等的处理非常粗糙;
- 分析的问题不够明确,导致分析结论不明确。
参考资料:
- 第二篇数据分析项目实战:链家二手房分析
- 乐天:Python进行电影数据分析及可视化
- 路远:入门Python数据分析最好的实战项目(一)分析篇
小感悟:当目标不同时,即使数据源相同,分析的呈现思路也是完全不一样的:1和2都是对数据有预设问题,带着问题去看数据找到结论;3更突出探索性分析的特点,目标是为了理解完数据之后选取特征建模。