来自:Python数据科学(微信号:Python _蜘蛛侠)
北京二手房价格分析与预测
目的:本文介绍了一个数据分析的初步项目,旨在了解如何使用Python进行简单的数据分析。
数据来源:博主通过爬虫收集的全链家网北京二手房数据(后台回复0022即可获得)。
数据的初步研究
一开始是导入科学计算包numpy,熊猫,visual matplotlib,seaborn,机器学习包sklearn。
进口熊猫aspd
importnumpy asnp
importseaborn assns
importmatplotlib asmpl
importmatplotlib.pyplot asplt
from ipython . display import display
PLT . style . use(" five 30 yeah ")
SNS . set _ style({ ' font . sans-serif ':[' sim hei ',' Arial']})
%matplotlib内联
#检查Python版本
fromsys importversion_info
ifversion_info.major!= 3:
RaiseException('请使用Python 3完成此项目')
然后导入数据,进行初步观察,包括了解缺失值、异常值和数据特征的近似描述性统计。
#导入链家二手房数据
贾立安_df = pd.read_csv('lianjia.csv ')
显示器(贾立安_df.head(n=2))
初步观察有11个特征变量,价格是我们这里的目标变量,然后我们继续深入观察。
#检查缺失值
贾立安_df.info()
找到了一个公共数据集
23677
数据,其中
升降机
特征有明显的缺失值。
贾立安_ df . description()
上述结果给出了特征值为数值的一些统计值,包括均值、标准差、中值、最小值、最大值、25%分位数和75%分位数。这些统计结果简单直接,对于一个特征的初步理解非常有用。比如我们观察到Size特征的最大值是1019平方米,最小值是2平方米,那么我们就要思考这个在实际中是否存在。如果不存在,那么这个数据就是一个离群值,会严重影响模型的性能。
当然,这只是初步观察。未来,我们将使用数据可视化来清晰地显示和确认我们的猜测。
#增加新功能平均房价
df=贾立安_df.copy()
df['PerPrice'] =贾立安_ df[' Price ']/贾立安_df['Size']
#重新定位列
栏目= ['地区','小区','花园','布局','楼层','年份','大小','电梯','方向','改造','价格',]
df = pd。数据帧(df,列=列)
#重新检查数据集
显示器(df.head(n=2))
我们发现Id特性没有实际意义,就去掉了。由于房子的单价很容易分析,并且可以简单地通过使用总价/面积来获得,所以增加了一个新的特征PerPrice(仅用于分析,不用于预测)。另外,功能的顺序也做了调整,看起来很舒服。
数据可视化分析
区域特征分析
至于地域特点,可以分析不同地区房价和数量的对比。
#将二手房面积分组,对比二手房数量和每平方米价格
df _ house _ count = df . group by(' Region ')[' Price ']。计数()。sort_values(升序=False)。to_frame()。reset_index()
df _ house _ mean = df . group by(' Region ')[' Perprice ']。平均值()。sort_values(升序=False)。to_frame()。reset_index()
f,[ax1,ax2,ax3]= PLT . subtracts(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 ('zone ')
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 ('zone ')
Ax2.set_ylabel('数量')
sns.boxplot(x='Region ',y='Price ',data=df,ax=ax3)
Ax3.set_title('北京各地区二手房总价',fontsize=15)
Ax3.set_xlabel ('zone ')
Ax3.set_ylabel('总房价')
plt.show()
熊猫的网络透视功能是用来分组排序的。区域特征可视化直接由seaborn完成,使用调色板调色板参数,颜色逐渐变化。描述越轻,解释越少,越反。
可以观察到:
二手房均价:西城区的房价最贵均价大约11万/平,因为西城在二环以里,且是热门学区房的聚集地。其次是东城大约10万/平,然后是海淀大约8.5万/平,其它均低于8万/平。二手房房数量:从数量统计上来看,目前二手房市场上比较火热的区域。海淀区和朝阳区二手房数量最多,差不多都接近3000套,毕竟大区,需求量也大。然后是丰台区,近几年正在改造建设,有赶超之势。二手房总价:通过箱型图看到,各大区域房屋总价中位数都都在1000万以下,且房屋总价离散值较高,西城最高达到了6000万,说明房屋价格特征不是理想的正太分布。尺寸特征分析
f,[ax1,ax2] = plt .支线剧情(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 ']& lt;10]
查了一下,发现这组数据是别墅,异常原因是别墅结构特殊(无朝向,无电梯),场地定义与二手商品房不同,导致爬行数据错位。别墅型二手房不在我们考虑范围内,去掉再观察尺寸分布与价格的关系。
df.loc[df['Size']>1000]
经过观察,这个不正常点不是普通的民用二手房,很可能是商品房,所以只有一室零厅,面积1000多平米,所以我们选择在这里拆迁。
df= df[(df[ 'Layout']!= '重叠别墅')&;(df[' Size ']& lt;1000)]
目测发现后没有明显异常。
布局特征分析
f,ax1 = PLT . subtracts(fig size =(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厅等奇怪的结构。其中两室一厅占绝大多数,其次是三室一厅、两室两厅。但仔细观察特征分类,有很多不规则的名字,如两室一厅、两室一卫、别墅等,却没有统一的名字。此类特征不能作为机器学习模型的数据输入,应采用特征工程进行相应处理。
翻新特征分析
df['翻新']。value_counts()
精装11345 Lite 8497其他3239空白576
南北20
名称:翻新,数据类型:int64
发现装修特征有南北两种,属于朝向型。可能是因为爬虫进程中的一些信息位置是空,导致此处出现“方向”定向特征,需要清除或替换。
#去掉错误的数据“南北”,因为爬虫进程中的一些信息位置是空,导致此处出现“方向”的特征,需要清除或替换
df['翻新'] = df.loc[(df['翻新']!= '南北'),'改造']
#框架设置
f,[ax1,ax2,ax3]= PLT . subtracts(1,3,figsize=(20,5))
sns.countplot(df['翻新'],ax=ax1)
sns.barplot(x= '翻新',y= '价格',数据=df,ax=ax2)
sns.boxplot(x= '翻新',y= '价格',数据=df,ax=ax3)
plt.show()
据观察,精装修的二手房数量最多,其次是简单装修,这在我们的日常生活中也很常见。至于价格,空白型最高,精装修次之。
电梯特征分析
当我们探索数据时,我们发现电梯特性中有很多缺失的值,这对我们非常不利。首先,让我们看看有多少缺失值:
misn = len(df.loc[(df['电梯'])。isnull()),‘电梯’])
打印(缺少“电梯是:+str(misn)”值的数量)
缺失电梯值的数量为:8237
那么多缺失值怎么办?这个需要根据实际情况来考虑。常用的方法有均值/中值填充法、直接剔除法或根据其他特征建模预测法。
这里考虑填充方式,但是有没有电梯不是数值,没有平均值,也没有中位数。怎么才能填满?这里我们提供一种思路:根据楼层判断是否有电梯。一般6层以上有电梯,6层以下没有电梯。有了这个标准,剩下的就简单了。
#因为有个别类型的错误,比如平装和精装,特征值放错了,需要去掉
DF ['电梯'] = DF.loc [(DF ['电梯'] = = '带电梯')|(df['电梯'] == '不带电梯'),'电梯']
#填写电梯缺失值
df.loc[(df['Floor']>;6)和amp(df ['电梯']。isnull()),'电梯'] = '有电梯'
df . loc[(df[' Floor ']& lt;=6)和amp(df ['电梯']。isnull()),'电梯'] = '无电梯'
f,[ax1,ax2] = plt .支线剧情(1,2,figsize=(20,10))
sns.countplot(df['电梯'],ax=ax1)
Ax1.set_title('比较带电梯和不带电梯的电梯数量',fontsize=15)
Ax1.set_xlabel('有电梯吗')
Ax1.set_ylabel('数量')
sns.barplot(x= '电梯',y= '价格',数据=df,ax=ax2)
Ax2.set_title('有或没有电梯的价格比较',fontsize=15)
Ax2.set_xlabel('有电梯吗')
Ax2.set_ylabel('总价')
plt.show()
结果表明,有电梯的二手房数量大多是有的。毕竟高层土地利用率比较高,适合北京庞大的人群,高层需要电梯。相应的,有电梯的二手房价格更高,因为包含了电梯的前期安装和后期维护费用(但这个价格对比只是一个平均概念,比如6层无电梯的豪华住宅小区价格肯定更高)。
年份特征分析
grid= sns。FacetGrid(df,row= '电梯',col= '翻新',调色板= '抗震',size=4)
网格.地图(点散布,“年”,“价格”)
grid.add_legend()
在装修和电梯的分类条件下,利用FaceGrid分析年份特征,观测结果如下:
整个二手房房价趋势是随着时间增长而增长的;2000年以后建造的二手房房价相较于2000年以前有很明显的价格上涨;1980年之前几乎不存在有电梯二手房数据,说明1980年之前还没有大面积安装电梯;1980年之前无电梯二手房中,简装二手房占绝大多数,精装反而很少;楼层特征分析
f,ax1 = PLT . subtracts(fig size =(20,5))
sns.countplot(x='Floor ',data=df,ax=ax1)
Ax1.set_title('房屋类型',fontsize=15)
Ax1.set_xlabel('数量')
Ax1.set_ylabel('公寓类型')
plt.show()
可以看出,6楼二手房数量最多,但个别楼层的特点没有意义,因为每个小区的总楼层数是不一样的,所以需要了解楼层的相对含义。此外,楼层和文化之间有一个非常重要的联系。比如中国文化优于别人,七层可能比较受欢迎,房价也比较贵,但是一般不会有四层或者十八层。当然,一般情况下,中楼层受欢迎,价格高,底层和顶层受欢迎程度低,价格相对低。所以楼层是一个很复杂的特征,对房价影响很大。
总结
这个分享的目的是让大家知道如何用Python做一个简单的数据分析,对于刚接触数据分析的朋友来说,无疑是一个很好的练习。然而,这一分析仍有许多问题有待解决,如:
解决爬虫获取的数据源准确度问题;需要爬取或者寻找更多好的售房特征;需要做更多地特征工程工作,比如数据清洗,特征选择和筛选;使用统计模型建立回归模型进行价格预测;●数字509,直接输入该条的数字
1.《北京二手房价格 数据分析实战—北京二手房房价分析》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《北京二手房价格 数据分析实战—北京二手房房价分析》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/808508.html