描述性统计分析——北京二手房市场交易情况分析项目

456 阅读8分钟

今天,让我们通过北京二手房市场交易情况分析项目来熟悉一下数据分析的常规流程,同时实际应用下描述性统计分析方法。

1.分析背景

现有一份北京二手房市场近几年交易信息的数据集,我们希望通过分析该数据集对北京二手房市场交易的整体情况有所了解,并能够为在北京买房做出一定数据参考。

字段解析

id:交易编号
tradeTime:交易时间
followers:关注人数
totalPrice:总价
price:单价
square:面积
livingRoom:卧室数量
drawingRoom:客厅数量
kitchen:厨房数量
bathRoom:浴室数量
floor:楼层
buildingType:建筑类型
buildingStructure:建筑结构
ladderRatio:梯户比
elevator:有无电梯
fiveYearsProperty:是否满五年
subway:有无地铁
disrict:所在区域
communityAverage:小区均价

2.分析思路与方法

根据以上提供的字段,我们看看从中能提炼到哪些能为我们在北京买房做数据参考的信息。

首先需要了解“价格”,比如:

1.市场近几年的整体价格趋势如何?

2.房源在不同价格区间的分布状态如何?

然后,可以看看房源的“交易数量与热度”,比如:

3.通过不同时间的交易数量可以大致判断有没有明显的交易淡旺季?

4.通过关注人数可以了解哪些房源比较受欢迎,然后我们可以观察一下这些房源都有些什么共同特征。

针对以上我们准备了解的信息,本次分析主要会使用描述性统计分析方法,然后对分析结果进行可视化展示。

3.数据处理过程

1.数据导入及整体信息查看:

import pandas as pd
import numpy as np
import matplotlib as plt

载入数据后,报出数据类型警告如下,方便起见,我们全部定义为str,处理过程中根据需要再进行修改,

df = pd.read_csv('./test_data/beijing_houst_price.csv',dtype={'id':'str', 'tradeTime':'str','livingRoom':'str','drawingRoom':'str','bathRoom':'str'})

查看数据整体情况代码如下,

df.shape
df.head(10)
df.describe()
df.count()

约32万条数据,共19个字段

查看数据前10行,信息如下
数值类列的常用统计值如下
查看各列非空值数量

2.数据清洗、转换等预处理操作:

每个编号对应一笔交易,看下是否有重复数据, df[df['id'].duplicated()]

由于是横跨好几年的数据,有些年份可能数据会比较少,先看看每年数据的总量,确定一下是否需要删除数据少的年份,我们从时间维度对数据进行一次清洗,使用tradeTime字段,

先将字符串转为日期格式,方便提取

df['tradeTime'] = pd.to_datetime(df['tradeTime'])
# df.dtypes    # 可以查看当前的数据类型

统计下每年的数据量

df['tradeTime'].dt.year.value_counts()

其中有几个年份数据量太少,我们在这里选择2012-2017年的数据比较合适

df.drop(df[df['tradeTime'].dt.year < 2012].index, inplace=True)
df.drop(df[df['tradeTime'].dt.year > 2017].index, inplace=True)

好了,现在我们拿到了合适时间范围的数据。刚才在查看常用统计值时,我们看到在totalPrice和price两个字段中存在像0.1或者1这样不正常的值,接下来我们从价格维度再清洗一次数据,分别使用totalPrice,price和communityAverage三个字段, 根据四分位数的分布范围,在totalPrice字段中暂取小于50万和小于100万这两个范围先分别查看一下各自对应多少条数据

df[df['totalPrice'] < 50]
df[df['totalPrice'] < 100]

总价小于50万如下:

总价小于100万如下:

根据我们刚才清洗后的样本数据量(约31万),这里可以直接删除总价在100万以下的数据了,然后同样的方法再用price字段进行一次清洗,这里选择删除单价在10000以下的数据,现在我们可以再看一下常用统计值,

df.drop(df[df['totalPrice'] < 100].index, inplace=True)
df.drop(df[df['price'] < 10000].index, inplace=True)

df.drop(df[df['communityAverage'].isnull()].index, inplace=True)

communityAverage最大值和最小值合理,不过有空值,大约只有400条数据,这里我们直接删掉(也可以选择填充),最后再看一下square列,值都在合理的范围内,并且也没有空值,现在,数据清洗就已经完成了,接下来可以开始分析。

4.数据分析及可视化

根据之前确定的分析思路,我们依次来解答上面几个问题。

1.从均价一般可以看出市场的整体价格水平,这里我们统计一下从12年初至17年末每日所有房源的平均单价,绘图展示如下:

上图可以看出近几年北京房价的一个整体上涨趋势,其中有个别偏离度较大的极值,可能是房价受一些短期因素的影响或者当日成交房源的价格中有偏离度极大的值造成的,这里不用过多考虑。

2.通过之前对整体价格趋势的分析,可以看到在有些年份房价的涨幅非常明显,考虑到这一点,我们如果要看房源价格区间的分布,最好设定一个时间范围,这里我们选择以年为单位分别进行统计,下面以成交量最大的2016年为例,其他年份可以按照同样的方法进行类比,取出2016年的所有数据,我们以总价的最大值和最小值为整体范围,按50万的区间距离,先画一个粗略的直方图:

可以看到,总价在2000万以上的房子几乎都没有了,为了更好地表示区间分布情况,调整一下取值范围,在最小值到2000万的范围内重新统计
好了,现在可以明显地看出来,在2016一整年里,250万到300万之间成交的房源数量是最多的。当然,这里价位区间的间距可以根据需要再放大或缩小,其他年份的统计方法以此类推,就不再赘述了。

3.可以通过每个月的交易数量来判断一下交易淡旺季,然后我们把这几个年份放在一起对比,看看有没有比较明显的规律。

上图反映了交易量随月份变化的情况,通过连续六年的对比,我们可以看出在大多数年份,3月左右房子交易会有一个小高峰,12月左右,交易量也有明显上升趋势。

4.考虑到时间因素的影响,房子价格等信息或许有较大变化,为了分析结果更加精细,我们还是取单一年份分别统计,这里以交易量最大的2016年为例。共有约9万条数据,因为还有很多关注人数为0的数据,预先查看后,这里取关注人数最多的前3%的数据,做一个样本集,我们看下这个样本集的房源价格、房子面积等属性呈现怎样的特征

上面两张图分别是这些房源的总价及单价分布情况,下面两张图分别是房源是否满5年和房源面积的占比情况。可以看出,这些最受欢迎的房源总价大多在200到300万之间,有7成左右都是满5年的,并且面积在30到90平米之间的居多。如果你打算在北京买房,这些房源可以考虑考虑哦。

5.分析结论及建议

最后我们来总结一下,看看数据说了些什么。市场的总体价格趋势是持续上涨,在16年有一个较大的增幅,17年略有回落;以16年为例,我们看到围绕200到300万这个价格范围的房源是最多的;通过连续6年的对比,在3月和12月附近有较为明显的交易小高峰;最受欢迎的房源也都在200-300万之间,这些受欢迎的房子多在30到90平米,大多数都是5年以上的房子。上面是我们从数据中获取到的信息,除了能给打算在北京买房的朋友作为数据参考,还能告诉我们:一定要好好挣钱!!!毕竟这些价格都已经是几年前的咯。如果有机会在北京买了房,勿相忘哦!