欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用 pyecharts+sklearn 实现链家北京二手房价格预测

最编程 2024-06-03 17:28:14
...

利用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)
#进行户型统计,发现存在‘30厅’和‘33厅’的户型,且数量较少,因此删除
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['装修']=='					

推荐阅读