用 pyecharts+sklearn 实现链家北京二手房价格预测
利用Python的pandas、pyecharts、sklearn库,对之前从链家网站爬取的北京二手房的数据进行统计和可视化,分析北京二手房价格的影响因素,进而构建随机森林回归模型对北京二手房平均价格进行预测。
环境: Python3.5.2,Anaconda4.2.0;
思路:
- 查看数据基本情况,包含哪些属性、是否存在异常数据和缺失值;
- 运用groupby+pyecharts统计并可视化,分析所在区、所在位置、面积、户型、电梯等各因素对二手房价格的影响;
- 房价预测:运用sklearn构建随机森林回归模型,预测二手房平均价格。
1.数据基本情况
数据包含链家网站上11个区的二手房数据28560条:
- 11个区包括:东城区、西城区、朝阳区、海淀区、丰台区、石景山区、通州区、昌平区、大兴区、顺义区、房山区
- 数据包含属性:所在区、小区名称、户型、面积(平米)、朝向、装修、有无电梯、所在楼层、建造年份、所在位置、总价(万元)、单价(元/平米)。
// An highlighted block
import pandas as pd
import numpy as np
data=pd.read_csv('house_bj.csv',encoding='gb2312')
data.head()
data.info()
data.describe()
2.房价影响因素可视化分析
运用groupby从所在区、所在位置、面积等各方面分组统计,然后用pyecharts可视化。
(1)所在区对房价的影响
// An highlighted block
from pyecharts import Bar, Line, Overlap
zone_price=pd.merge(data.groupby(['所在区'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index(),data.groupby(['所在区'])['总价(万元)'].mean().round(0).to_frame().reset_index(),on=['所在区'])
bar = Bar("北京各区二手房价格")
bar.add("单价(元/平米)", zone_price['所在区'], zone_price['单价(元/平米)'],is_label_show=True,label_pos='inside',label_text_color ='#000',is_toolbox_show=False,)
line = Line()
line.add("总价(万元)", zone_price['所在区'], zone_price['总价(万元)'],is_label_show=True,is_toolbox_show=False,)
overlap = Overlap(height=400,width=900)
overlap.add(bar)
overlap.add(line,yaxis_index=1, is_add_yaxis=True,)
overlap
根据二手房平均单价将北京各个划分为四个梯队:
- 第一梯队:西城区、东城区、海淀区,平均单价为8万–10万/平米;
- 第二梯队:朝阳区、石景山区、丰台区,平均单价为6万–8万/平米;
- 第三梯队:大兴区、通州区、昌平区、顺义区,平均单价为4万–6万/平米;
- 第四梯队:房山区,平均单价低于4万/平米。
但从总价来看,海淀区的平均总价仅低于西城区,位于第二名;大兴区和通州区的平均总价分别为第五、六名。
(2)户型对房价的影响
#分析户型与二手房价格
from pyecharts import Pie,Bar
layout_price=pd.merge(data.groupby(['户型'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index(),data.groupby(['户型']).size().to_frame().reset_index(),on='户型')
layout_price.columns =['户型','单价(元/平米)','计数']
print (layout_price)
#进行户型统计,发现存在‘3室0厅’和‘3室3厅’的户型,且数量较少,因此删除
layout_price=layout_price[(layout_price['户型'] !='3室0厅') & (layout_price['户型'] !='3室3厅')]
print(layout_price)
pie = Pie("北京二手房各户型房源数量统计",width=700,height=400,)
pie.add("", layout_price['户型'],layout_price['计数'],is_label_show=True,legend_orient="vertical",legend_pos="right",is_toolbox_show=False,label_formatter='{b}:{c},{d}%')
pie
bar= Bar("北京二手房各户型平均房价(元/平米)",width=600,height=400)
bar.add("",layout_price['户型'],layout_price['单价(元/平米)'],is_label_show=True,bar_category_gap='40%',is_toolbox_show=False)
bar
对二手房进行户型统计发现,北京二手房中2室1厅的户型最多,有12609套(占比44.54%);其次是3室2厅、3室1厅的户型,分别有4822套(占比17.03%)、4468套(占比15.78%)。从各户型平均房价看,北京3室2厅的二手房最便宜,平均单价55996元/平米;而4室2厅的最贵,平均单价为70609;房屋数量最多的2室1厅户型的房屋的价格居中,平均单价为59400元/平米。
(3)所在位置对房价的影响
##分析北京二手房位置和单价
from pyecharts import Bar
#print (data.ix[:,['小区名称','所在区']])
pos_perprice=data.groupby(['所在位置','所在区'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index()
pos_perprice.columns =['所在位置','所在区','单价(元/平米)']
top10_pos=pos_perprice.head(10).sort_values(['单价(元/平米)'],ascending=True)#.merge(data.ix[:,['小区名称','所在区']],on='小区名称',how = 'left')
bar=Bar('北京二手房平均单价TOP10位置(元/平米)',width=500)
bar.add('',top10_pos['所在位置'],top10_pos['单价(元/平米)'],is_label_show=True,label_text_color='#000',label_pos='inside',label_formatter='{b}:{c}',is_yaxis_show=False,is_convert=True)
bar
##筛选各区域内平均单价排名top5的位置
from pyecharts import Bar
pos_zone=data.groupby(['所在区','所在位置'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index()
pos_zone.columns =['所在区','所在位置','单价(元/平米)']
top5_pos_zone=pos_zone.assign(rn=pos_zone.sort_values(['单价(元/平米)'], ascending=False)
.groupby(['所在区'])
.cumcount()+1)\
.query('rn < =5').sort_values(['所在区','单价(元/平米)'],ascending=False)
print (top5_pos_zone)
在北京平均单价top10位置中,东城区有4个;西城区3个;海淀区2个;朝阳区1个。其中,西城区六铺炕和海淀区的世纪城的平均单价超过了13万/平米;海淀区的万柳和朝阳区太阳宫的平均单价为12万-13万/平米;其余位置的平均单价为11万-12万/平米。
(4)所在小区对房价的影响
##分析北京二手房所在小区和单价
from pyecharts import Bar
#print (data.ix[:,['小区名称','所在区']])
house_perprice=data.groupby(['小区名称','所在区','所在位置'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index()
house_perprice.columns =['小区名称','所在区','所在位置','单价(元/平米)']
top10_house=house_perprice.head(10).sort_values(['单价(元/平米)'],ascending=False)#.merge(data.ix[:,['小区名称','所在区']],on='小区名称',how = 'left')
bar=Bar('北京二手房平均单价TOP10小区(元/平米)',width=500)
bar.add('',top10_house['小区名称'],top10_house['单价(元/平米)'],is_label_show=True,label_text_color='#000',label_pos='inside',label_formatter='{b}:{c}',is_yaxis_show=False,is_convert=True)
#bar
top10_house
##筛选各区域内平均单价排名前五的小区
from pyecharts import Bar
house_zone=data.groupby(['所在区','小区名称'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index()
house_zone.columns =['所在区','小区名称','单价(元/平米)']
top5_hosue_zone=house_zone.assign(rn=house_zone.sort_values(['单价(元/平米)'], ascending=False)
.groupby(['所在区'])
.cumcount()+1)\
.query('rn < =5').sort_values(['所在区','单价(元/平米)'],ascending=False)
print (top5_hosue_zone)
在北京平均单价top10小区中,东城区有4个小区;西城区2个;海淀区3个;朝阳区1个。其中,西城区的六铺炕有2个小区平均单价在top10内。此外,西城区六铺炕三区和海淀区的观山园小区的平均单价超过了13万/平米;其余小区平均单价为12万-13万/平米。
(5)电梯对房价的影响
from pyecharts import Bar,Pie
house_loft= data.groupby(['有无电梯','所在区'])['单价(元/平米)'].agg(['size','mean','sum']).round(0).reset_index()
house_loft.columns=['有无电梯','所在区','数量','单价','总价之和']
print (house_loft)
#value=data[u'有无电梯'].groupby(data[u'所在区']).size().round(0).tolist()
#print (value)
#print (name)
pie = Pie("北京二手房有无电梯房源数量(套)",width=700,height=400,)
pie.add("", ['有电梯','无电梯'],[house_loft[house_loft['有无电梯']=='有电梯']['数量'].sum(),house_loft[house_loft['有无电梯']=='无电梯']['数量'].sum()],is_label_show=True,is_toolbox_show=False,label_formatter='{b}:{c},{d}%')
pie
bar=Bar('北京各区二手房有无电梯房源数量(套)',width=900)
bar.add('有电梯',house_loft[house_loft['有无电梯']=='有电梯']['所在区'],house_loft[house_loft['有无电梯']=='有电梯']['数量'],is_label_show=True,label_text_color='#000',label_pos='inside',is_stack=True)
bar.add('无电梯',house_loft[house_loft['有无电梯']=='无电梯']['所在区'],house_loft[house_loft['有无电梯']=='无电梯']['数量'],is_label_show=True,is_stack=True)
bar
bar=Bar('北京各区有无电梯二手房平均单价(元/平米)',width=900)
bar.add('有电梯',house_loft[house_loft['有无电梯']=='有电梯']['所在区'],house_loft[house_loft['有无电梯']=='有电梯']['单价'],is_label_show=True,mark_line=['average'],is_toolbox_show=False)
bar.add('无电梯',house_loft[house_loft['有无电梯']=='无电梯']['所在区'],house_loft[house_loft['有无电梯']=='无电梯']['单价'],is_label_show=True,mark_line=['average'],is_toolbox_show=False)
bar
#data.groupby(['所在区']).count()
在北京二手房中,有电梯的房源有18132套,占比为63.49%;无电梯的房源有10428套,占比为36.51%。分区看,除昌平区无电梯房数量多于有电梯房,顺义区两种房源数量持平,其余区均是有电梯房源较多。此外,北京二手房中有电梯的二手房平均单价高于无电梯的二手房。但是分区而言,除东城区和西城区无电梯房平均单价高于有电梯房平均单价,其余区无电梯房平均单价低于有电梯房。另外,在有电梯房源中,东城区、朝阳区、海淀区和西城区的平均单价高于北京市平均水平;在无电梯房源中,东城区、海淀区和西城区的平均单价低于北京市的平均水平。
(6)装修类型对房价的影响
from pyecharts import Bar,Pie
fit_up_price=pd.merge(data.groupby(['装修'])['单价(元/平米)'].mean().round(0).sort_values(ascending=False).to_frame().reset_index(),data.groupby(['装修']).size().to_frame().reset_index(),on='装修')
fit_up_price.columns =['装修','单价(元/平米)','计数']
print (fit_up_price)
pie = Pie("北京二手房各装修类型房源数量统计",width=700,height=400,)
pie.use_theme("macarons") #use_theme换图表主题
pie.add("", fit_up_price['装修'],fit_up_price['计数'],is_label_show=True,legend_orient="vertical",legend_pos="right",is_toolbox_show=False,label_formatter='{b}:{c},{d}%')
pie
##统计各装修类型房屋数量及房价
house_fitup= data.groupby(['所在区','装修'])['单价(元/平米)'].agg(['size','mean','sum']).round(0).reset_index()
house_fitup.columns=['所在区','装修','数量','单价','总价之和']
print (house_fitup)
bar=Bar('北京各区二手房精/简装修房源数量(套)',width=900)
bar.use_theme("macarons")
bar.add('精装',house_fitup[house_fitup['装修']=='精装']['所在区'],house_fitup[house_fitup['装修']=='精装']['数量'],is_label_show=True,label_text_color='#000',label_pos='inside',is_stack=True)
bar.add('简装',house_fitup[house_fitup['装修']=='简装']['所在区'],house_fitup[house_fitup['装修']=='简装']['数量'],is_label_show=True,label_text_color='#000',label_pos='inside',is_stack=True)
#bar.add('毛坯',house_fitup[house_fitup['装修']=='
推荐阅读
-
从链家网抓取北京各区二手房价格数据并进行可视化分析-使用工具
-
房产中介遭遇寒冬,链家转型之路任重道远?-房产中介寒冬到来,链家急切求生? “想到了市场会变坏,但没有想到会来得这么快,逼着我们转型。”这是2017年下半年,已经处于转型当中的搜房网董事长莫天全说过的一句话,这句话反映了链家所在的房产交易市场近两年来并不好过。 2017年链家在北京和上海的二手房市场陷入低谷。链家在北京二手房成交量同比下滑51%,在上海,链家2017年月均交易量只有一万套左右。上海北京一直是支撑链家房产交易量的两个重点城市,这两个城市交易量呈现下降,很大程度上说明其它地方可能也不好过。据业内人士估算,二手房市场月成交1.5万套才是盈亏的分水岭,并且规模越大,亏损得越多。 事实上,链家所在的房产中介行业,从2016年开始,受国家不断出台的房产调控政策,比如“去库存”、“棚改”、“房产税收”等影响,行业内各个房产中介开始出现裁员收缩、关店、交易量下降等现象。这些现象虽然都是正常的市场反应,不必过慌,但对于链家而言,每少一家线下店,每少一名经纪人,可能都是不小的打击。 链家闫觅曾说:“目前如何提高运营效率是长租公寓运营商面临的一大难题,推出贝壳找房一方面能给加入者带来流量红利,一方面为参与者带来业务升级,提升房产交易效率。”如此看来,加入贝壳找房好处颇多。不过天下毕竟没有免费的午餐,链家如此让利给入局者,总得有一个说得过去理由。其实,长期以上述模式走下去的贝壳找房,能帮助链家实现真房源数据的维护。如果是出于这样的目的,那么推出贝壳找房可以看成是链家在行业压力下寻求自救的举措。 链家拥抱第三方平台,真实房源数据是终极目标? 要问链家的核心资源在哪里,那么毫无疑问,全国约7000万套真房源数据是链家的核心所在,这是链家生态系统得以运转的血液,也是链家在对外讲话当中,常常提到的事情。从链家的官网简介当中可以看出,链家已经涉及到房产交易服务、大数据处理、资产管理等业务,这些业务大多数是建立在房源数据交易的基础之上。因而如果房源数据出现了问题,那么其产生的后果可想而知。 真房源数据甄别的主体可以来源于两方面,要么亲力亲为,要么让别人去帮你完成甄别。对于主打真房源的链家而言,线下门店是链家真房源的有利保障,要知道从链家一开始提出真房源理念后,其线下门店就开始马不停蹄地扩张,所以即使当行业虚假房源信息泛滥的时候,链家也能有底气提出“真房源”理念。而随着线下门店数量的减少,在2017年8月,链家开始和拥有1800家门店、覆盖54座城市的21世纪中国不动产,就双方加盟合作事宜进行谈判,而且在今年1月份,链家重启德佑品牌,进行加盟模式的布局,可见链家对于加盟模式的重视程度。 目前链家的加盟模式可以分为轻加盟和重度加盟。对于一些平台,例如对乐乎、同创、城家、湾流等品牌公寓,链家采取的是“品质联盟”的形式,换个角度可以理解为轻加盟模式,大家签个正品协议,然后你把你的房源挂到我的平台上。而对于个人加盟甚至是中小中介平台,链家一般采用重度加盟模式,这种模式会从人员的招聘、培训、管理等环节对加入者实行全程干预。 例如链家在2017年下半年,鼓励内部员工自主加盟到链家网当中,加盟者需承担门店的一切费用。同时向链家支付10%的营业额作为加盟费,而加盟者的员工由链家培训,以确保加盟模式跟自己的直营模式在服务上做到无差异。这些事例都在一定程度上反映了链家想找最省钱的真房源确认途径。 其实,链家很清楚,重度垂直门店模式会占用大量的资金,在业务不景气的时候,易造成资金周转困难,不过链家也明白,线下门店是链家开疆扩土的前沿阵地,是真房源数据的最基础来源。因而在线下门店处于收缩的时候,以第三方平台确认真房源的打法,自然而然会成为链家现今的最佳选择。 匆忙布局,链家转型之路并不平坦
-
用 pyecharts+sklearn 实现链家北京二手房价格预测