赞
踩
该项目是使用Python对北京二手房经纪人成交数据进行分析的一个综合实例,包括pandas/numpy/matplotlib绘图的应用,涉及到数据读取、清洗、离散化等处理,使用了分组分析、假设验证分析和相关性分析等分析方法。
分析目标:
数据涵盖2011年-2016之间,北京二手房经纪人的成交数据,共约16万2千条成交记录,包括比较全面的信息。
数据字段如下图:
如下图,数据源包括7个csv文件。
为了读取上述7个文件,我们可以使用循环读取数据,读取的方法是read_csv。同时,因为数据编码方式不同,所以要设定读取的编码方式。读取结果如下图,我们获得了7个list。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
data_list = []
for i in range(1,8):
try:
data = pd.read_csv('./fangchan/lianjia{}.csv'.format(i),encoding = 'utf-8') # encoding默认是utf-8,可省略
except:
data = pd.read_csv('./fangchan/lianjia{}.csv'.format(i),encoding = 'gbk')
finally:
data_list.append(data)
前面我们已经读取了7个csv文件数据,并放在了data_list这个列表中。现在要合并数据,合并的类型是增加行,所以使用pd.concat。
data = pd.concat(data_list)
在成功读取与合并数据之后,我们查看下数据各字段的类型。代码和效果如下:
data.info()
接下来我们想分析下成交单价,但是现在的数据类型是object,不便于分析,要进行转换和调整。先提取出成交单价这一列,删除null值,替换掉“元/平”,转换数据类型为float,单位转换为万元(保留两位小数点)。完成后我们赋值给变量dj,观察最大值、最小值和平均值。其中,最小值有等于0的,需要去除这部分“脏数据”。
dj = data.cjdanjia.dropna().map(lambda x: round(float(x.replace('元/平',''))/10000,2))
dj = dj[dj > 0]
为了直观查看成交单价的分布情况,我们按照0到2万、2到4万、一直到16万,对数据进行离散化处理。然后使用绘图查看分布情况。
bins= [0,2,4,6,8,10,16]
pd.cut(dj,bins).value_counts().plot.barh(figsize = (12,6))
从上图我们可以看出,成交价格主要分布在2-4万和4-6万之间。(注意数据成交时间是在2016年之前)
我们先查看下成交量超过一亿的经纪人有哪些。然后,我们分析下这些成交量高的经纪人的相关因素。我们假设从业年限对成交量有影响,待会通过数据来进行验证。
我们要使用到分组运算,根据经纪人姓名、版块信息来分组计算出成交总金额超过一亿的经纪人。
bj_zongjia = data.groupby(['bankuai','xingming'])['cjzongjia'].sum()
bj_zongjia[bj_zongjia > 10000]
以上是我们得到的结果。根据分析的结果,如果买房可以相应考虑找对应版块的经纪人,这些人业务经验相对丰富。
透视表:
所谓透视,就是动态的改变表的布局,以方便我们分析数据,比如说,重新制定数据的行或者列,数据透视表会按照新的不知计算或汇总数据。
了解了透视表,接下里我们对数据按照经纪人姓名和从业年限对其成交总价进行透视。
data.pivot_table('cjzongjia',index = 'xingming',columns = 'congyenianxian',aggfunc = 'sum')
然后,使用布尔值运算,判断从业年限5年以上的经纪人中,成交总价超过一亿的有多少人。
(data_nx > 10000).sum()
使用饼图来展示结果:
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
(data_nx > 10000).sum().plot.pie(figsize = (6,6))
通过上面这张图可以很明显的看到,从业5年以上的经纪人成交总价超过一亿的是最多的,其次是4-5年。
考虑到数据中原有经纪人从业年限分布情况:
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
data.groupby(['congyenianxian'])['xingming'].count().plot.pie(figsize = (6,6))
两相对比可以看出,从业年限和成交总价成正相关,也就是从业年限长的经纪人,成交量相对也会高。
最后,我们想看看针对每个经纪人,根据他们的成交总价来找出前5条成交记录情况。
首先,我们要自定义一个函数,来找出分组里前5条记录。
def top(group,n = 5):
return group.sort_values('cjzongjia',ascending = False)[:n]
定义好函数后,我们把数据按照经纪人姓名进行分组,然后取出成交总价最高的5条。
data.groupby('xingming').apply(top)
总结一下今天的内容。
我们获得了一份北京二手房的成交记录数据,并从三个方面进行了初步分析,分别是:
运用到的知识点包括:
希望以上内容对你有帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。