一、分析背景和目的
近些年国内房地产行业发展势头迅猛,二手房需求成为了一种新热门。本次项目分析的是作为行业巨头的链家关于“二手房成交价格、经纪人相关因素”的业务数据,其数据的相关分析可以为未来二手房业务的发展提供参考和指导。
二、提出问题北京二手房成交价格分布情况如何
每个板块总成交金额超过一亿的经纪人是谁
成交量达一亿的经纪人从业年限如何
每个板块成交均价高低、排名如何
北京二手房成交价格的变化趋势如何
三、理解数据
数据概况:数据城堡《链家北京二手房成交数据》,2011~2016年间共约16万2千条成交记录,涵盖较为全面的经纪人成交数据情况。
字段理解:
cjtaoshu-成交套数
mendian-门店
cjzongjia-成交总价
zhiwei-职位
haoping-好评
cjdanjia-成交单价
cjxiaoqu-成交小区
xingming-姓名
cjzhouqi-成交周期
biaoqian-标签
cjlouceng-成交楼层
cjshijian-成交时间
congyenainxian-从业年限
bankuai-板块
四、数据处理
1、数据读取
因为该数据源部分文件格式不一,这里用try-except读取不同格式的文件。
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('E:\\lianjia\\lianjia{}.csv'.format(i),encoding='gbk')
except:
data = pd.read_csv('E:\\lianjia\\lianjia{}.csv'.format(i))
data_list.append(data)
2、数据合并
data = pd.concat(data_list)
data.describe()
data.info()
数据合并显示正确,但观察描述数据明显发现行数不一致,最小值为0,说明其中可能存在缺失值和异常值,需要处理。
3、字段选择
选择分析需要的字段数据。
data = data[['cjzongjia','cjdanjia','xingming','cjlouceng','congyenianxian','bankuai']]
4、缺失值及重复值处理
(data.isnull()).sum()
data[data.cjdanjia.isnull()]
data.dropna(how = 'all',inplace = True)
判断并找出缺失值位置,并做删除/补充处理。
(data.duplicated(subset = ['cjdanjia','xingming','cjlouceng'])).sum()
data.sort_values(by = 'bankuai',inplace = True)
data.drop_duplicates(subset = ['cjdanjia','xingming','cjlouceng'],inplace = True)
判断并找出重复值位置,并做删除处理。(注意:这里通过排序将“bankuai”的NaN值排到最后,最大化的留下有效数据信息。)
5、数据类型转换
(~data.cjdanjia.str.contains('元/平')).sum()
np.round(data.cjdanjia.str.replace('元/平','').astype(np.float32).map(lambda x:x/10000),2)
判断数据是否一致,并对“cjdanjia”列做一致化处理。
6、异常值处理
data = data.assign(cjdanjia = np.round(data.cjdanjia.str.replace('元/平','').astype(np.float32).map(lambda x:x/10000),2))
data.cjdanjia.min()
data = data[data.cjdanjia > 0.5]
前面发现“cjdanjia”的最小值是0,这里合理预估“cjdanjia”的值,对异常值作删除处理。
8、字符串处理
(data.cjlouceng.str.split('/').map(len) != 3).sum()
data = data.assign(chaoxiang = data.cjlouceng.map(lambda x:x.split('/')[0]))
data = data.assign(louceng = data.cjlouceng.map(lambda x:x.split('/')[1]))
data.chaoxiang.unique()
data.louceng.unique()
pd.get_dummies(data.louceng)
data = data.join(pd.get_dummies(data.louceng))
对“cjlouceng”的数据进行判断和分类处理,判断分类出来的列是否异常。这里发现“楼层”列异常,删除“未知”和空字符项。
五、建模分析
1、北京二手房成交价格分布情况如何
bins = [0,1,2,3,4,5,7,10,15]
pd.cut(data.cjdanjia,bins).value_counts().plot.bar(rot = 30)
通过对成交单价进行区间划分,这里利用图表呈现出了不同单价区间的成交套数情况。由图可知:[2,3]、[3,4](单位:万)这两个区间的成交套数最多,说明2~4万的成交价格在大多数用户的可接受范围内。
2、每个板块总成交金额超过一亿的经纪人是谁
bj_zongjia = data.groupby(['bankuai','xingming'])['cjzongjia'].sum()
bj_zongjia = jjr_zongjia[jjr_zongjia > 10000]
通过分组运算,求得每个板块总成交金额超过1亿的有1022人。据此可作为经纪人的一项成交能力标准(当然也可以求每个版块总成交能力最多的经纪人),为选择售房推荐人、售房师徒带教等相关业务提供经纪人相关数据证明。
3、成交量达一亿的经纪人从业年限如何
data_nianxian = data.pivot_table('cjzongjia',index='xingming',columns='congyenianxian',aggfunc=sum)
plt.rcParams['font.sans-serif'] = ['SimHei']
(data_nianxian > 10000).sum().plot.pie(figsize=(7,7))
通过数据透视,分析总成交金额超过1亿的经纪人,人数和从业年限的相关关系。由上图可知:随着年限的增加,饼图中人数比重越高。说明经纪人的成交能力和从业年限非常相关。
4、每个板块成交均价高低、排名如何
data_junjia = data.groupby('bankuai')[['cjdanjia']].mean()
data_junjia.sort_values(by = 'cjdanjia',ascending = False)
通过板块分组进行成交均价的排序,分析北京二手房各板块均价和高低排序,最高为“西四”板块的9.47万元,最低为“三河”板块的1.73万元。此数据可为用户买房或相关销售策略提供参考和数据依据。
5、北京二手房成交价格的变化趋势如何
本目标以“远洋山水”小区为例,预测该小区二手房成交价格未来的变化趋势。
data.cjdanjia = np.round(data.cjdanjia.str.replace('元/平','').astype(np.float32).map(lambda x:x/10000),2)
data.cjshijian = pd.to_datetime(data.cjshijian.map(lambda x:x[5:]))
data = data[data.cjxiaoqu.str.contains('远洋山水')]
data = data.sort_values(by = 'cjshijian')
data = data.set_index('cjshijian')['2012':]
data = data[data.cjdanjia > 1]
data = data.assign(time = (data.index - pd.to_datetime('2012-01-01')).days)
data = data[['time','cjdanjia']]
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize = (8,6))
plt.scatter(data.time,data.cjdanjia)
plt.xlabel('成交时间')
plt.ylabel('成交单价')
这里选择的时间范围是“2012-01-01~2016-11-06”,并且仍需对该数据进行处理,排除异常数据(成交单价<1万元),以“2012-01-01”为时间原点,事先绘制成交价格随成交时间变化的散点图。
由于时间跨度较大,采用多项式回归方法建立预测模型可能不精准,这里采取以“2016-01~2016-11”的时间范围以确立预测模型,可以更有说明性地预测未来趋势。
X = data.time
Y = data.cjdanjia
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(pd.DataFrame(X),Y)
X_train,X_test = X['2016-01':'2016-05'],X['2016-05':]
Y_train,Y_test = Y['2016-01':'2016-05'],Y['2016-05':]
model1 = LinearRegression() #一阶回归训练
model1.fit(pd.DataFrame(X_train),Y_train)
np.sum((model1.predict(pd.DataFrame(X_test)) - Y_test)**2) #计算一阶回归预测模型的平方误差
from sklearn.preprocessing import PolynomialFeatures #利用工具生成多项式拟合模型
a2 = PolynomialFeatures(degree = 2) #设立二阶多项式回归训练
X2 = a2.fit_transform(pd.DataFrame(X_train))
model2 = LinearRegression()
model2.fit(X2,Y_train)
X2_ = a2.fit_transform(pd.DataFrame(X_test))
np.sum((model2.predict(pd.DataFrame(X2_)) - Y_test)**2) #计算二阶回归预测模型的平方误差
a3 = PolynomialFeatures(degree = 3) #设立三阶多项式回归训练
X3 = a3.fit_transform(pd.DataFrame(X_train))
model3 = LinearRegression()
model3.fit(X3,Y_train)
X3_ = a3.fit_transform(pd.DataFrame(X_test))
np.sum((model3.predict(pd.DataFrame(X3_)) - Y_test)**2) #计算三阶回归预测模型的平方误差
#绘制一阶模型图
x = [[1461],[1800]]
y = model1.predict(pd.DataFrame(x))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize = (8,6))
plt.plot(x,y,color = 'r')
plt.scatter(data.time,data.cjdanjia)
plt.xlabel('成交时间')
plt.ylabel('成交单价')
上面经过建立三次的模型评估,确立一阶回归模型的平方误差最小(一阶:67.65;二阶:343.76;三阶:38874.82),选择一阶模型绘制了上面预测红线。由图可知,预测红线的增长趋势很高,预计短期内,二手房的成交价格会继续按此趋势上涨。
PS:这里作为兴趣,计算了该红线函数y=61*x+49875,其中x表示距离日期“2012-01-01”的天数;y表示成交价格,单位“元”,只能作为很简单的短期预测。
六、总结与建议北京二手房成交价格主要分布在2~3,3~4万区间,其次是4~7万区间。
所有板块总成交金额超过一亿的经纪人共有1022位,可作为经纪人的一项成交能力标准,为每个板块选择售房推荐人、售房师徒带教等相关业务提供经纪人相关数据支撑。
随着年限的增加,成交额达一亿的人数越来越多。经纪人的成交能力和从业年限非常相关。
北京二手房各板块均价最高为“西四”的9.47万元,最低为“三河”的1.73万元。此数据可为用户买房或相关销售策略提供参考和数据依据。
以2016作为二手房成交价数据为预测数据源,预计短期内(未来一年)房价会继续沿着红线方向增长,二手房市场行情良好,可制定相关营销策略促进提升成交量。