Advertisement

Python数据分析实战之北京二手房房价分析

阅读量:

本次分享旨在介绍如何利用Python进行二手房房价数据分析与可视化。通过爬虫获取链家全网北京二手房数据,并对目标变量Price进行初步分析。数据预览显示共有11个特征变量和约2万条记录。通过统计描述发现Size(面积)和PerPrice(每平米价格)存在异常值需要进一步处理。利用Seaborn进行箱型图分析发现Size分布呈现长尾特征,并通过回归关系分析发现Size与Price呈正相关关系。Renovation(装修状态)和Layout(户型)等分类特征因缺失值较多或命名不统一被剔除或修正。Elevator(电梯缺失值填充)和Floor(楼层分布与房价关系)也被纳入分析范围。最终目标是为后续的建模预测打下基础,并展示如何利用Python完成从数据采集到可视化分析的完整流程。

总结
本次分享旨在帮助读者了解如何使用Python进行二手房房价数据分析与可视化:
工具与库:使用pandas、numpy、matplotlib等工具完成数据预览。
关键步骤:包括爬虫获取数据、初步观察性分析、异常值处理及特征工程。
可视化:通过Seaborn完成分布图、箱型图及散点图等可视化。
后续计划:包括模型建立及预测的应用场景探索。
如需深入学习更多数据分析内容,请关注我的个人网站或其他发布平台获取更多信息!

北京二手房房价分析与预测

目的:本篇文章旨在向大家介绍一个数据分析的初级项目,并通过该项目来学习如何使用Python进行简单的数据分析。

**二手房数据

**二手房数据

二手房数据

数据初探

为了更好地进行数据分析和建模,在实验环境中需要先安装并导入以下核心科学计算库:numpy、pandas等用于数据处理与分析;同时引入数据可视化工具matplotlib与seaborn进行图表展示;此外还需要加载机器学习算法库sklearn以实现预测与分类功能。

复制代码
 import pandas as pd

    
 import numpy as np
    
 import seaborn as sns
    
 import matplotlib as mpl
    
  
    
 import matplotlib.pyplot as plt
    
 from IPython.display import display
    
 plt.style.use("fivethirtyeight")
    
 sns.set_style({'font.sans-serif':['simhei','Arial']})
    
 %matplotlib inline
    
  
    
  
    
 # 检查Python版本
    
 from sys import version_info
    
 if version_info.major != 3:
    
     raise Exception('请使用Python 3 来完成此项目')

随后导入所需数据后进行初始分析,在此过程中对数据特征展开详细研究:首先识别数据特征中的缺失值;其次关注可能存在的异常值;最后计算并记录基本统计信息以辅助整体判断

复制代码
 # 导入链家二手房数据

    
 lianjia_df = pd.read_csv('lianjia.csv')
    
 display(lianjia_df.head(n=2))
640

在初步分析中发现共有11个特征变量,在这里Price被确定为我们的目标变量。接着我们可以进一步深入分析

640
复制代码
 23677

    
 Elevator
复制代码
    lianjia_df.describe()
640

该段内容包含了特征值作为数值的一些统计指标:平均数、标准差、中位数、最小值、最大值以及第25%和75%分位点。这些统计结果直观简洁地反映了数据分布的基本特征。例如,在Size这一特征维度上发现其最大取值为1019平方米而最小仅为2平方米这样的情况是否存在?如果在实际应用中并未出现类似数据,则该数值可能被视为异常点(参考

据观察所述,在此阶段我们仅是我们初步的观察结果,并计划利用数据可视化技术...进行直观呈现,并以验证我们的假设。

复制代码
 # 添加新特征房屋均价

    
 df = lianjia_df.copy()
    
 df['PerPrice'] = lianjia_df['Price']/lianjia_df['Size']
    
  
    
 # 重新摆放列位置
    
 columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']
    
 df = pd.DataFrame(df, columns = columns)
    
  
    
 # 重新审视数据集
    
 display(df.head(n=2))

我们注意到Id这一特征没有实质意义,并将其去除。因为房屋单价易于分析计算,在此情况下较为简便。因此引入了新的PerPrice特征(仅用于分析而非预测)。此外,在重新排列各特征后效果更加良好。

640

数据可视化分析

Region特征分析

对于区域特征,我们可以分析不同区域房价和数量的对比。

复制代码
 # 对二手房区域分组对比二手房数量和每平米房价

    
 df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index()
    
 df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index()
    
  
    
 f, [ax1,ax2,ax3] = plt.subplots(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('区域')
    
 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('区域')
    
 ax2.set_ylabel('数量')
    
  
    
 sns.boxplot(x='Region', y='Price', data=df, ax=ax3)
    
 ax3.set_title('北京各大区二手房房屋总价',fontsize=15)
    
 ax3.set_xlabel('区域')
    
 ax3.set_ylabel('房屋总价')
    
  
    
 plt.show()
640
640
640

基于pandas的网络透视功能对数据进行groupby分组排序。区域特征可视化通过seaborn实现,并利用调色板palette参数设置颜色渐变效果。具体而言,在色彩渐变过程中,色调较浅的部分表示对应区域的数据较少,而色调较深的部分则代表数据较多。

可以观察到:

二手房平均价格:

二手房房源数量: 基于数量统计数据显示,在当前二手房市场中最为火爆的区域包括海淀区与朝阳区两个核心区域。其中海淀区与朝阳区作为主要核心区域,在房源数量方面占据显著优势。具体数据显示这些区域合计约有3,000套以上的新 listing 数据。此外随着北京市政府对城市规划的不断推进丰台区的发展也呈现出明显增长趋势,在未来一段时间内有望超越上述核心区域成为新的市场热点。

二手房总价:从箱型图分析可以看出,大多数区域的房屋总价中位数均未超过1000万元,且房价数据波动较大。值得注意的是,其中西城区房价最高曾达到6亿元,这一数值显著高于其他区域,表明该地区的房价分布呈现明显的偏态特征。

Size特征分析

复制代码
 f, [ax1,ax2] = plt.subplots(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()
640

Size 分布:

利用 distplotkdeplot 方法生成柱状图来呈现 Size 特征的数据分布情况。其中呈现出长尾型的分布模式。这表明存在大量面积显著超出常规范围的二手房。

Size 与 Price 的关系:

利用 regplot 生成了 Size与Price的相关散点图,在观察到Size特征大致上与Price呈现线性关系的同时也呈现出符合预期的趋势(即面积越大价格越高)。然而存在明显的异值现象:第一组数据中面积小于10平方米却价格显著高于1亿;第二组数据中存在一个特例其面积超过千平方米却价格明显低于预期。 需要进一步调查具体情况以确定是否存在数据错误或其他潜在问题。

复制代码
    df.loc[df['Size']< 10]
640

通过查看分析得知这组数据属于别墅类型。出现异常的原因在于其特殊的建筑结构(如无明确朝向和电梯配置),而这一特点使得字段定义与传统意义上的二手房商品房存在差异导致爬虫的数据抓取出现了偏差。因为别墅类型的二手房不在我们研究范围内,所以将其从数据集中剔除后重新审视Size和Price之间的关系。

复制代码
    df.loc[df['Size']>1000]
640

通过观察发现该异常点并非普通的民用二手房, 很可能是商业用途的房屋, 由于具有大于1000平方米的面积, 因此决定删除该数据点

复制代码
    df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]
640

重新进行可视化发现就没有明显的异常点了。

Layout特征分析

复制代码
 f, ax1= plt.subplots(figsize=(20,20))

    
 sns.countplot(y='Layout', data=df, ax=ax1)
    
 ax1.set_title('房屋户型',fontsize=15)
    
 ax1.set_xlabel('数量')
    
 ax1.set_ylabel('户型')
    
 plt.show()
640

这一项特性确实值得关注。在建筑设计中存在多种 Hall 房间组合设计的情况中还包含了一些特殊的构造如 n 房间 m 堂等极端情况甚至更多房间无卧室的情况。从数据特征的角度而言其中一些参数如 2 房间 1 堂与 2 房间 1卫 显然在命名上并不统一且别墅类建筑更是存在明显的例外情况这些差异性使得直接作为 ML 模型的数据输入存在障碍因此需要通过特征工程对其进行规范化处理。

Renovation 特征分析

在分析Renovation装修特征时发现存在南北之分,在爬取数据时某些字段信息缺失而导致该字段中出现了Direction朝向属性因而需要对该字段进行清除或替换处理以确保数据完整性

复制代码
 # 去掉错误数据“南北”,因为爬虫过程中一些信息位置为空,导致“Direction”的特征出现在这里,需要清除或替换

    
 df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']
    
  
    
 # 画幅设置
    
 f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5))
    
 sns.countplot(df['Renovation'], ax=ax1)
    
 sns.barplot(x='Renovation', y='Price', data=df, ax=ax2)
    
 sns.boxplot(x='Renovation', y='Price', data=df, ax=ax3)
    
 plt.show()
640
640
640

观察到,在二手房市场中,
精装修(即精工修饰)的房子数量最多,
其次是简约装修的房子,
这也是我们日常生活中常见的。
就价格而言,
则属于未做任何处理(即毛坯状态)的房子价格最高,
其次是精装修的房子。

Elevator 特征分析

在初步探索数据时,我们注意到 Elevator 特征具有显著的缺失值数量,并对我们的分析带来了诸多不便。接下来我们需要先确定缺失值的数量。

复制代码
 misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])

    
 print('Elevator缺失值数量为:'+ str(misn))

Elevator 缺失值数量为:8237

面对如此多的数据缺失问题该如何解决;具体选择哪种填补方法应结合数据特点来决定;其中包括:采用平均值或中位数进行填补;直接删除缺失数据点;或基于其他特征构建模型进行预测等多种方法。

在处理缺失数据时(即缺失值填充问题),由于'是否有电梯'这一属性属于二元分类特征(即只能取两个可能的值),因此无法直接计算其均值或中位数统计量。那么具体如何进行填补呢?这里给大家提供一个思路:具体来说,则是依据建筑层数Floor这一特征来判断是否存在电梯。 通常情况下,在超过6层的建筑中(即Floor>6),都会配备有电梯;而在低于或等于6层的一般则不具备。有了这样的判断标准后,则剩下的工作就相对较为简单了。

复制代码
 # 由于存在个别类型错误,如简装和精装,特征值错位,故需要移除

    
 df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']
    
  
    
 # 填补Elevator缺失值
    
 df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'
    
 df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'
    
  
    
 f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10))
    
 sns.countplot(df['Elevator'], ax=ax1)
    
 ax1.set_title('有无电梯数量对比',fontsize=15)
    
 ax1.set_xlabel('是否有电梯')
    
 ax1.set_ylabel('数量')
    
 sns.barplot(x='Elevator', y='Price', data=df, ax=ax2)
    
 ax2.set_title('有无电梯房价对比',fontsize=15)
    
 ax2.set_xlabel('是否有电梯')
    
 ax2.set_ylabel('总价')
    
 plt.show()
640

结果显示,在北京市区购买带电梯的二手房数量较多。这主要得益于高层建筑的土地利用率较高,并能够更好地满足大量购房者的居住需求。因此,在这些区域通常都需要安装电梯以供使用。相应地,在其他条件相同的情况下,在带电梯区域购买二手房的成本会略高于其他区域——其中包含了前期建设阶段投入的装修费用以及后期日常使用的维修费用。需要注意的是,在这种情况下所计算出的价格只是一个大致估计。例如,在某些高端社区中即使没有安装电梯的价格也往往不菲。

Year 特征分析

复制代码
 grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',size=4)

    
 grid.map(plt.scatter, 'Year', 'Price')
    
 grid.add_legend()
640

根据 Renovation 与 Elevator 的分组设置,在分类条件下通过 FaceGrid 对Year特征进行解析,并观察结果如下:

整个二手房房价趋势是随着时间增长而增长的;

2000年以后建造的二手房房价相较于2000年以前有很明显的价格上涨;

1980年前几乎没有含有电梯的二手房交易记录存在;这表明在1980年前期,并未普遍安装电梯。

1980年之前无电梯二手房中,简装二手房占绝大多数,精装反而很少;

Floor 特征分析

复制代码
 f, ax1= plt.subplots(figsize=(20,5))

    
 sns.countplot(x='Floor', data=df, ax=ax1)
    
 ax1.set_title('房屋户型',fontsize=15)
    
 ax1.set_xlabel('数量')
    
 ax1.set_ylabel('户型')
    
 plt.show()
640

需要注意的是,在分析二手房价格时会发现一个有趣的规律性现象:六楼的二手房数量最为显著。然而这一简单的观察结果并不能直接作为分析依据因为单一的房屋建筑中的某一层属性缺乏实质意义因此在分析过程中需要结合不同小区的具体情况来进行综合判断。不同小区由于其建筑高度通常存在差异因此我们在研究某一层属性时必须明确其对应的具体位置及其在整栋建筑中的价值定位。了解各栋建筑中各楼层的具体位置及其相对价值更为关键。例如,在中国传统文化中,七楼往往被视为较为吉祥的位置,并受到市场偏好。然而在中国文化传统观念中并不一定所有的建筑都遵循这一规律例如有些地区可能更加重视八楼或四层等其他层数的原因需要具体情况具体分析。通常而言,在多数建筑中居于中间位置的楼层往往倍受青睐而底楼和顶楼则通常不那么受欢迎。由此可见,楼层这一特征的影响因素极为复杂且具有显著的重要性。

总结

本次分享的主要目标是帮助大家掌握使用Python进行数据分析的基本方法。对于那些刚开始接触数据分析的新手来说,这次分享无疑是一次很好的学习机会。然而,目前这份分析还存在一些需要改进的地方,例如:

数据预处理阶段可能会遇到哪些挑战?

希望通过本次分享内容的学习与讨论,希望能够帮助大家更好地掌握数据分析的基本方法,并为未来的实际操作打下坚实的基础。

解决爬虫获取的数据源准确度问题;

需要爬取或者寻找更多好的售房特征;

需要做更多地特征工程工作,比如数据清洗,特征选择和筛选;

使用统计模型建立回归模型进行价格预测;

更多内容会慢慢介绍和分享,敬请期待。

640?

探索我的职业路径:我是如何利用网页抓取技术进入职场领域的?

对于程序员和IT从业者而言,在探索这十个工具时会发现它们的价值所在。

从零开始教您掌握高效完成个人网站搭建的方法

借助Python技术, 本文将为你揭示深圳房租的价格与费用情况

你无需担心无法配置双系统,在这里你将轻松实现双系统的安装与管理

深入探究深圳地区的程序员工资水平如何?通过Python语言进行分析。

Python能用来做什么?以下是Python的三大主要用途

Python爬虫实战(批量采集Stock数据,并保存到Excel中)

640?

全部评论 (0)

还没有任何评论哟~