数据分析:pandas分析链家网二手房信息
程序员文章站
2024-01-24 20:11:46
...
分析链家网南京市二手房信息
链家网二手房数据的采集方法参见之前的博客:数据采集(四):用XPath爬取链家网房价数据
总共有3000条二手房信息记录。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
house=pd.read_csv('house.csv',sep=' ')
house.head()
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 156.0 | 江岸水城 | 2室2厅 | 80.85平米 | 南 | 精装 | 有电梯 | 98人关注 | 共31次带看 | 23天以前发布 |
1 | 480.0 | 龙凤花园隽凤园 | 4室2厅 | 112.36平米 | 南 北 | 简装 | 无电梯 | 168人关注 | 共62次带看 | 7个月以前发布 |
2 | 238.0 | 凤凰西街188号 | 3室1厅 | 76.48平米 | 南 | 简装 | NaN | 29人关注 | 共21次带看 | 23天以前发布 |
3 | 148.0 | 安康村 | 2室1厅 | 50.36平米 | 南 北 | 简装 | 无电梯 | 11人关注 | 共27次带看 | 11天以前发布 |
4 | 86.0 | 万达紫金明珠 | 1室1厅 | 38.64平米 | 北 | 简装 | NaN | 98人关注 | 共34次带看 | 25天以前发布 |
发现异常记录(行)
乍一看数据都很正常,但是处理数据时发现,当“huxing”(户型)字符中包含“别墅”时,标签和对应的数据出现了错位。
bieshu=house[house.huxing.str.contains('别墅')]
bieshu.head()
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
60 | 560.0 | 翠屏国际香樟苑 | 联排别墅 | 3室2厅 | 222.81平米 | 南 北 | 简装 | 20人关注 | 共23次带看 | 2个月以前发布 |
98 | 1280.0 | 海德卫城 | 叠拼别墅 | 5室2厅 | 239.76平米 | 南 | 毛坯 | 28人关注 | 共22次带看 | 3个月以前发布 |
156 | 758.0 | 爱涛漪水园临溪苑 | 联排别墅 | 5室3厅 | 259.18平米 | 南 北 | 其他 | 1人关注 | 共0次带看 | 21天以前发布 |
293 | 700.0 | 武夷花园 | 联排别墅 | 6室2厅 | 250.61平米 | 南 北 | 精装 | 13人关注 | 共5次带看 | 1个月以前发布 |
325 | 574.0 | 华侨新村紫薇苑 | 联排别墅 | 3室2厅 | 164.11平米 | 南 北 | 简装 | 27人关注 | 共15次带看 | 4个月以前发布 |
当然,字段’totalprice’,’xiaoqu’,’guanzhu’,’daikan’,’fabu’中的数据还是正常的
print '记录*有别墅%d栋'%bieshu.shape[0]
记录*有别墅19栋
价格最高的5栋别墅
bieshu.sort_values('totalprice',ascending=False).head(5)
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
98 | 1280.0 | 海德卫城 | 叠拼别墅 | 5室2厅 | 239.76平米 | 南 | 毛坯 | 28人关注 | 共22次带看 | 3个月以前发布 |
2927 | 1260.0 | 模范新村 | 独栋别墅 | 4室2厅 | 186.9平米 | 南 北 | 精装 | 11人关注 | 共1次带看 | 4个月以前发布 |
2060 | 1249.0 | 钟鼎山庄 | 叠拼别墅 | 5室2厅 | 346.71平米 | 南 | 毛坯 | 17人关注 | 共12次带看 | 3个月以前发布 |
472 | 850.0 | 山水风华 | 联排别墅 | 3室2厅 | 175.25平米 | 南 北 | 精装 | 10人关注 | 共1次带看 | 1个月以前发布 |
2636 | 830.0 | 山水华门岭秀苑 | 联排别墅 | 4室2厅 | 223.1平米 | 南 北 | 精装 | 20人关注 | 共8次带看 | 3个月以前发布 |
价格最低的5栋别墅
bieshu.sort_values('totalprice').head(5)
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
2312 | 370.0 | 江南文枢苑竹削馆 | 叠拼别墅 | 5室2厅 | 211.98平米 | 南 北 | 毛坯 | 31人关注 | 共11次带看 | 2个月以前发布 |
2804 | 380.0 | 江南文枢苑竹削馆 | 叠拼别墅 | 4室2厅 | 214.96平米 | 南 北 | 其他 | 8人关注 | 共3次带看 | 1个月以前发布 |
2500 | 460.0 | 瑞景文华 | 叠拼别墅 | 4室2厅 | 184.6平米 | 南 | 其他 | 45人关注 | 共6次带看 | 4个月以前发布 |
1761 | 500.0 | 银城一方山 | 叠拼别墅 | 5室2厅 | 163.37平米 | 南 北 | 精装 | 0人关注 | 共0次带看 | 11天以前发布 |
60 | 560.0 | 翠屏国际香樟苑 | 联排别墅 | 3室2厅 | 222.81平米 | 南 北 | 简装 | 20人关注 | 共23次带看 | 2个月以前发布 |
删除异常记录(行)
del_index=bieshu.index
house.drop(del_index,inplace=True)
print '现在还剩下%d条记录'%house.shape[0]
现在还剩下2981条记录
房价最高的10套二手房
house.sort_values('totalprice',ascending=False).head(10)
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
1338 | 1220.0 | 天正滨江花园 | 4室2厅 | 260.9平米 | 南 北 | 毛坯 | 有电梯 | 9人关注 | 共38次带看 | 9个月以前发布 |
1366 | 1220.0 | 天正滨江花园 | 4室2厅 | 260.9平米 | 南 北 | 毛坯 | 有电梯 | 9人关注 | 共38次带看 | 9个月以前发布 |
2442 | 1200.0 | 宋都美域锦园 | 5室3厅 | 183.4平米 | 南 北 | 其他 | 有电梯 | 3人关注 | 共0次带看 | 17天以前发布 |
1674 | 1160.0 | 星雨华府 | 4室2厅 | 238.24平米 | 南 北 | 精装 | 有电梯 | 6人关注 | 共1次带看 | 14天以前发布 |
2995 | 1150.0 | 锋尚国际公寓 | 4室3厅 | 279.8平米 | 南 北 | 精装 | 有电梯 | 16人关注 | 共5次带看 | 9个月以前发布 |
2278 | 1100.0 | 仁恒江湾城三期 | 4室2厅 | 182.14平米 | 南 北 | 其他 | NaN | 2人关注 | 共0次带看 | 刚刚发布 |
2056 | 1100.0 | 天正滨江花园 | 5室2厅 | 261.71平米 | 南 北 | 毛坯 | NaN | 0人关注 | 共10次带看 | 6个月以前发布 |
2286 | 1100.0 | 仁恒江湾城三期 | 4室2厅 | 182.14平米 | 南 北 | 其他 | NaN | 2人关注 | 共0次带看 | 刚刚发布 |
1799 | 1058.0 | 雅居乐花园 | 5室2厅 | 262.03平米 | 东南 | 其他 | 有电梯 | 2人关注 | 共1次带看 | 11天以前发布 |
2128 | 1000.0 | 仁恒江湾城一期 | 4室2厅 | 176.62平米 | 南 北 | 精装 | 有电梯 | 20人关注 | 共20次带看 | 7个月以前发布 |
房价最低的10套二手房
house.sort_values('totalprice').head(10)
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
2552 | 65.0 | 都市公社 | 1室1厅 | 40.15平米 | 南 | 简装 | 无电梯 | 28人关注 | 共0次带看 | 1个月以前发布 |
2002 | 78.0 | 天地新城天柱座 | 1室1厅 | 35平米 | 东 | 精装 | 有电梯 | 8人关注 | 共8次带看 | 14天以前发布 |
1446 | 80.0 | 宁港一村 | 2室0厅 | 39.94平米 | 南 北 | 简装 | NaN | 21人关注 | 共7次带看 | 2个月以前发布 |
1435 | 80.0 | 宁港一村 | 2室0厅 | 39.94平米 | 南 北 | 简装 | NaN | 21人关注 | 共7次带看 | 2个月以前发布 |
2072 | 82.0 | 丹佛小镇 | 1室0厅 | 34.87平米 | 北 | 精装 | 有电梯 | 100人关注 | 共10次带看 | 9个月以前发布 |
2066 | 82.0 | 丹佛小镇 | 1室0厅 | 34.87平米 | 北 | 精装 | 有电梯 | 100人关注 | 共10次带看 | 9个月以前发布 |
1788 | 82.0 | 万达紫金明珠 | 1室0厅 | 30.19平米 | 东 | 精装 | 有电梯 | 183人关注 | 共18次带看 | 8个月以前发布 |
2964 | 83.0 | 南方花园B组团 | 1室1厅 | 27.84平米 | 东 西 | 其他 | NaN | 6人关注 | 共1次带看 | 9天以前发布 |
2333 | 83.0 | 托乐嘉单身公寓 | 1室0厅 | 34.06平米 | 北 | 其他 | NaN | 18人关注 | 共27次带看 | 3个月以前发布 |
4 | 86.0 | 万达紫金明珠 | 1室1厅 | 38.64平米 | 北 | 简装 | NaN | 98人关注 | 共34次带看 | 25天以前发布 |
二手房源最多的10个小区
house['xiaoqu'].value_counts().head(10)
江岸水城 24
天润城第十街区 22
丹佛小镇 18
东郊小镇第四街区 17
威尼斯水城第七街区 16
武夷绿洲品茗苑 16
良城美景家园 16
南京恒大绿洲 15
东渡国际青年城 14
水月秦淮 14
Name: xiaoqu, dtype: int64
出现最多的5种户型
house['huxing'].value_counts().head(5)
3室2厅 813
2室1厅 713
2室2厅 616
3室1厅 370
4室2厅 176
Name: huxing, dtype: int64
变量转化
“面积”和“关注人数”字段具有数值含义,将其从字符串类型转换为数值类型
house['mianji']=house['mianji'].str[1:-7].astype(float)
house['guanzhu']=house['guanzhu'].str[:-10].astype(int)
面积最小的二手房
house.sort_values('mianji').iloc[0,:]
totalprice 83
xiaoqu 南方花园B组团
huxing 1室1厅
mianji 27.84
chaoxiang 东 西
zhuangxiu 其他
dianti NaN
guanzhu 6
daikan 共1次带看
fabu 9天以前发布
Name: 2964, dtype: object
面积最大的二手房
house.sort_values('mianji',ascending=False).iloc[0,:]
totalprice 980
xiaoqu 万科金域蓝湾
huxing 5室3厅
mianji 323.97
chaoxiang 南 北
zhuangxiu 毛坯
dianti 无电梯
guanzhu 5
daikan 共1次带看
fabu 13天以前发布
Name: 1248, dtype: object
关注人数最多的10套二手房
house.sort_values('guanzhu',ascending=False).head(10)
totalprice | xiaoqu | huxing | mianji | chaoxiang | zhuangxiu | dianti | guanzhu | daikan | fabu | |
---|---|---|---|---|---|---|---|---|---|---|
2359 | 180.0 | 凤凰西街223号 | 2室2厅 | 67.78 | 南 北 | 精装 | 无电梯 | 698 | 共80次带看 | 一年前发布 |
51 | 90.0 | 金陵村 | 1室1厅 | 42.49 | 南 | 精装 | 无电梯 | 505 | 共41次带看 | 3个月以前发布 |
2475 | 165.0 | 水西门大街153号 | 2室2厅 | 70.25 | 南 | 精装 | 无电梯 | 366 | 共30次带看 | 6个月以前发布 |
24 | 420.0 | 江南名府 | 4室2厅 | 145.07 | 南 北 | 精装 | 无电梯 | 355 | 共76次带看 | 4个月以前发布 |
2193 | 112.0 | 水关桥 | 2室2厅 | 45.69 | 南 北 | 其他 | 无电梯 | 347 | 共79次带看 | 4个月以前发布 |
2184 | 112.0 | 水关桥 | 2室2厅 | 45.69 | 南 北 | 其他 | 无电梯 | 347 | 共79次带看 | 4个月以前发布 |
2187 | 180.0 | 南方花园瑞阳居 | 3室2厅 | 61.40 | 东 | 简装 | 有电梯 | 326 | 共56次带看 | 9个月以前发布 |
2201 | 180.0 | 南方花园瑞阳居 | 3室2厅 | 61.40 | 东 | 简装 | 有电梯 | 326 | 共56次带看 | 9个月以前发布 |
652 | 258.0 | 百家湖国际花园 | 3室2厅 | 104.54 | 西北 | 精装 | 有电梯 | 325 | 共157次带看 | 5个月以前发布 |
1578 | 260.0 | 翠屏湾花园城 | 3室2厅 | 116.01 | 南 北 | 精装 | 无电梯 | 306 | 共141次带看 | 11个月以前发布 |
增加“每平米房价”字段
house['price']=house['totalprice']/house['mianji']
二手房平均面积
print '南京市二手房平均面积为%f平方米'%house['mianji'].mean()
南京市二手房平均面积为93.175881平方米
二手房平均总价
print '南京市二手房平均总价为%f万元'%house['totalprice'].mean()
南京市二手房平均总价为283.182321万元
二手房平均价格
print '南京市二手房平均价格为%f万元每平米'%house['price'].mean()
南京市二手房平均价格为3.046645万元每平米
按照面积分组
%matplotlib inline
house.mianji.hist(bins=35)
plt.title("Distribution of area of house")
plt.ylabel('count of house')
plt.xlabel('area')
#labels = ['1-50', '51-100', '101-150', '151-200', '201-250', '251-300','301-350']
# 面积分组的labels
bins = range(0, 351, 10) # [0, 50, 100, 150, 200, 250, 300, 350]
# 告诉我们bin是哪些
house['mianji_group'] = pd.cut(house.mianji, bins, right=False)
# 按照bin把数据cut下来,并附上labels,做成一个新的column,保存下来。
最普遍的二手房面积
house['mianji_group'].value_counts().head(5)
[80, 90) 395
[90, 100) 388
[60, 70) 380
[70, 80) 338
[50, 60) 279
Name: mianji_group, dtype: int64
可见最普遍的二手房面积在50-100平方米之间
print '占比是%f%%'%(100.0*house['mianji_group'].value_counts().head(5).sum()/len(house))
占比是59.711506%
不同小区的房价差异
取出现最多的50个社区
xiaoqu_50=house.groupby('xiaoqu').size().sort_values(ascending=False)[:50]
house_in50xiaoqu=house[house['xiaoqu'].isin(list(xiaoqu_50.index))]
按平均总价排序:
house_in50xiaoqu.groupby('xiaoqu').mean()['totalprice'].sort_values().head(10)
xiaoqu
天泰青城苑 131.666667
营苑新寓 157.818182
东郊小镇第四街区 158.941176
营苑西村 163.375000
王府园小区 183.700000
江岸水城 190.037500
钟山山庄 191.400000
天润城第十四街区 192.809091
天润城第五至七街区 195.454545
丹佛小镇 199.611111
Name: totalprice, dtype: float64
按每平米均价排序:
house_in50xiaoqu.groupby('xiaoqu').mean()['price'].sort_values().head(10)
xiaoqu
华汇康城 2.011065
天润城第五至七街区 2.046685
江岸水城 2.047492
明发滨江新城三期 2.099873
明发滨江新城一期 2.155085
威尼斯水城第七街区 2.181221
天润城第十街区 2.257201
翠屏湾花园城 2.265674
天润城第十四街区 2.338558
天润城第十二街区 2.346086
Name: price, dtype: float64
不同小区各户型的数量
house_in50xiaoqu_huxingshu=house_in50xiaoqu.groupby('xiaoqu')['huxing'].value_counts()
house_in50xiaoqu_huxingshu.head(10)
xiaoqu huxing
万达紫金明珠 2室2厅 5
3室2厅 5
1室0厅 1
1室1厅 1
东方龙湖湾 2室1厅 3
2室2厅 3
3室2厅 2
东渡国际青年城 2室1厅 5
2室2厅 4
3室2厅 3
Name: huxing, dtype: int64
house_in50xiaoqu_huxingshu=house_in50xiaoqu_huxingshu.unstack(fill_value=0)
house_in50xiaoqu_huxingshu.head()
huxing | 1室0厅 | 1室1厅 | 2室1厅 | 2室2厅 | 3室1厅 | 3室2厅 | 4室1厅 | 4室2厅 | 4室3厅 | 5室1厅 | 5室2厅 | 5室3厅 | 6室2厅 | 6室3厅 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
xiaoqu | ||||||||||||||
万达紫金明珠 | 1 | 1 | 0 | 5 | 0 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
东方龙湖湾 | 0 | 0 | 3 | 3 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
东渡国际青年城 | 0 | 0 | 5 | 4 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
东郊小镇第四街区 | 0 | 0 | 7 | 3 | 0 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
丹佛小镇 | 3 | 0 | 0 | 7 | 1 | 6 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
不同小区最多的户型
house_in50xiaoqu_huxing=house_in50xiaoqu_huxingshu.apply(lambda x:x[x==x.max()],axis=1)
house_in50xiaoqu_huxing.head()
1室0厅 | 2室1厅 | 2室2厅 | 3室1厅 | 3室2厅 | 4室2厅 | |
---|---|---|---|---|---|---|
xiaoqu | ||||||
万达紫金明珠 | NaN | NaN | 5.0 | NaN | 5.0 | NaN |
东方龙湖湾 | NaN | 3.0 | 3.0 | NaN | NaN | NaN |
东渡国际青年城 | NaN | 5.0 | NaN | NaN | NaN | NaN |
东郊小镇第四街区 | NaN | 7.0 | NaN | NaN | NaN | NaN |
丹佛小镇 | NaN | NaN | 7.0 | NaN | NaN | NaN |
house_in50xiaoqu_huxing=house_in50xiaoqu_huxing.fillna(0)
house_in50xiaoqu_huxing.shape
for i in range(house_in50xiaoqu_huxing.shape[0]):
for j in range(house_in50xiaoqu_huxing.shape[1]):
if house_in50xiaoqu_huxing.iloc[i,j]!=0:
print '%s:%s'%(house_in50xiaoqu_huxing.index[i],house_in50xiaoqu_huxing.columns[j])
万达紫金明珠 : 2室2厅
万达紫金明珠 : 3室2厅
东方龙湖湾 : 2室1厅
东方龙湖湾 : 2室2厅
东渡国际青年城 : 2室1厅
东郊小镇第四街区 : 2室1厅
丹佛小镇 : 2室2厅
亚东国际公寓 : 3室2厅
亲水湾花园 : 2室2厅
凤凰庄 : 2室1厅
凤凰花园城静幽园 : 3室2厅
华保新寓 : 2室1厅
华汇康城 : 2室2厅
南京恒大绿洲 : 4室2厅
名嘉佳园小区 : 3室2厅
和燕花苑 : 3室1厅
墨香山庄 : 3室2厅
天元吉第城 : 2室2厅
天元吉第城 : 3室2厅
天悦花园 : 2室2厅
天悦花园 : 3室2厅
天泰青城苑 : 1室0厅
天润城第五至七街区 : 2室2厅
天润城第十一街区 : 3室2厅
天润城第十二街区 : 2室2厅
天润城第十二街区 : 3室2厅
天润城第十四街区 : 3室2厅
天润城第十街区 : 2室2厅
威尼斯水城第七街区 : 2室2厅
富丽山庄 : 2室2厅
小火瓦巷 : 2室1厅
市政天元城 : 2室2厅
御水湾花园 : 2室2厅
时光澔韵 : 3室2厅
明发滨江新城一期 : 3室2厅
明发滨江新城三期 : 4室2厅
武夷绿洲品茗苑 : 3室2厅
武夷绿洲观竹苑 : 2室2厅
水月秦淮 : 2室2厅
水月秦淮 : 3室2厅
江岸水城 : 2室2厅
王府园小区 : 2室1厅
白鹭花园凤栖苑 : 3室1厅
百家湖国际花园 : 3室2厅
百家湖西花园伦敦城 : 2室1厅
美达浅草明苑 : 2室2厅
翠屏东南 : 3室2厅
翠屏湾花园城 : 3室2厅
良城美景家园 : 3室2厅
莫愁花园牡丹里 : 2室1厅
莫愁花园牡丹里 : 3室1厅
营苑新寓 : 2室1厅
营苑西村 : 2室1厅
诚品城 : 3室2厅
金王府 : 3室2厅
钟山山庄 : 2室1厅
阳光聚宝山庄 : 2室2厅
对不同户型的关注度差异
house.groupby('huxing').sum()['guanzhu'].sort_values(ascending=False)
huxing
3室2厅 21734
2室1厅 17037
2室2厅 15766
3室1厅 8619
4室2厅 3955
1室1厅 3239
5室2厅 1033
1室0厅 789
5室3厅 423
4室1厅 352
4室3厅 345
2室0厅 212
6室3厅 192
6室2厅 188
3室3厅 141
5室1厅 105
3室0厅 87
1室2厅 73
6室4厅 17
2室3厅 4
5室4厅 2
Name: guanzhu, dtype: int64
对不同总价的关注度差异
首先将房价分组
print house['totalprice'].min()
print house['totalprice'].max()
65.0
1220.0
#labels = ['1-50', '51-100', '101-150', '151-200', '201-250', '251-300','301-350']
# 面积分组的labels
bins = range(50, 1251, 50) # [0, 50, 100, 150, 200, 250, 300, 350]
# 告诉我们bin是哪些
house['totalprice_group'] = pd.cut(house.totalprice, bins, right=False)
# 按照bin把数据cut下来,并附上labels,做成一个新的column,保存下来。
totalprice_guanzhu=house.groupby('totalprice_group').sum()['guanzhu'].sort_values(ascending=False)
totalprice_guanzhu.head()
totalprice_group
[150, 200) 18708
[200, 250) 13190
[250, 300) 11445
[100, 150) 7706
[300, 350) 7062
Name: guanzhu, dtype: int64
%matplotlib inline
house.totalprice.hist(bins=len(totalprice_guanzhu))
print len(totalprice_guanzhu)
24