欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自如网杭州市租房数据分析(2)

程序员文章站 2022-06-19 15:55:59
自如网杭州市租房数据分析 经过 "数据爬取" 和 "数据清洗" 后,终于到了数据分析的部分。具体从探索型数据分析和验证型数据分析两部分进行。探索型数据分析是主要为了了解属性的分布、属性之间的相关性,验证型数据分析则用来预测租金价格。 1.探索型数据分析 (1)首先看一下数值型属性的统计情况 房间价格 ......

自如网杭州市租房数据分析

经过数据爬取数据清洗后,终于到了数据分析的部分。具体从探索型数据分析和验证型数据分析两部分进行。探索型数据分析是主要为了了解属性的分布、属性之间的相关性,验证型数据分析则用来预测租金价格。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style("darkgrid")  #绘图风格
sns.set_context("talk")
plt.rcParams['font.sans-serif']=['SimHei']

1.探索型数据分析

(1)首先看一下数值型属性的统计情况

rent_data=pd.read_csv('rent_data_clean.csv',encoding='gbk')
rent_data.describe()

自如网杭州市租房数据分析(2)

房间价格分布图

plt.hist(rent_data['price'],bins=20,edgecolor='w',color='lightskyblue')

自如网杭州市租房数据分析(2)

房间面积分布图

plt.hist(rent_data['size'],bins=27,edgecolor='w',color='orange')

自如网杭州市租房数据分析(2)

从数据的统计特征和分布直方图来看:

(1) 房源的租金均值为1854元/月,最便宜的是830元,最贵的是2890元,价格主要集中在1600-2300元。
因为这里的价格是合租的单个房间价格,相比杭州整个租房情况,可能价格有点偏高,不过加上清洁打扫等服务,价格应该说还比较合理。

(2) 房间的面积大小平均在12平米,从最小的5平米到最大的32平米,主要集中在8-15平米,面积的差异还是挺大的。

最贵的房源和最便宜的房源分别位于哪里?

rent_data[rent_data['price']==rent_data['price'].max()]

自如网杭州市租房数据分析(2)

rent_data[rent_data['price']==rent_data['price'].min()]

自如网杭州市租房数据分析(2)

最贵的房间有两个,都达到了2890元/月,一个是位于西湖区文新站附近的新金都城市花园,该房间贵的原因应该是面积较大、周边配套设施齐全。另外一个是位于上城区城战附近的建国南苑,该房间贵的原因应该主要是位于交通枢纽附近,而且面积也挺大的。

最便宜的房间有三个,价格为830元/月,都位于余杭区,由于余杭区距离市区较远,交通、周围设施相对比较欠缺,所以租房价格相对便宜。

(2)再来看一下非数值型属性的分布情况

每个行政区的房源数量(这里下沙因为它高教园和面积较大的特点,作为一个单独的区域)

sns.countplot('district',data=rent_data,palette="Oranges")

自如网杭州市租房数据分析(2)

从公寓名称来看:‘龙湖旭辉春江悦茗’出租的房源最多,共54个。

从行政区划分来看:江干区出租的房源最多,共134个;另外,余杭区、萧山区的房源也较多,都超过了120。

从位置范围来看:近江范围内出租房源最多,共64个。

从地铁站点来看:江陵路站周围的房源最多,共65个。

各个行政区的房源价格箱线图

sns.boxplot('district','price',data=rent_data,palette="Set3")

自如网杭州市租房数据分析(2)

从各个行政区的价格箱线图来看:

上城区的租房价格最高,大致集中在2100-2400元之间,这与上城区商业发达,地处市区有关;

余杭区的租房价格最低,大致集中在1000-1600元之间;

下沙的租房价格也相对便宜,主要集中在1500-1750元之间,这是因为下沙是高教园区,学生比例大,租房价格不会太高。

因此在上城区工作的人可以考虑在价格相对较低的下城、滨江、江干区租房;而在江干、下城区工作的人可以考虑在下沙租房。

(3) 分析了单个属性的情况后,接下来看一下属性之间的关系。

不同地铁线上房屋面积与租金的散点图,三种颜色分别代表1号线、2号线、4号线

g=sns.FacetGrid(rent_data,hue='subway',palette={1:"red", 2:"orange",4:"green"},size=6,aspect=1.5).set(xlim=(0,25))
g.map(plt.scatter,'size','price',edgecolor='w',alpha=0.7).add_legend()

自如网杭州市租房数据分析(2)

可以看到,面积与租金总体来说成正相关,随房间面积增大,租金也会上升,但相关性不是特别强,
这是因为影响房屋租金的因素有很多,比如交通、购物、娱乐设施等等。

各个行政区各条地铁线上,房间面积与房间价格的关系

g=sns.FacetGrid(rent_data,hue='subway',col='district',col_wrap=3,
                palette={1:"red", 2:"orange",4:"green"}).set(xlim=(0,25))
g.map(plt.scatter,'size','price',edgecolor='w',alpha=0.7).add_legend()
plt.subplots_adjust(top=0.9)
g.fig.suptitle('各个行政区各条地铁线上,房间面积与房间价格的关系',fontsize=16)

自如网杭州市租房数据分析(2)

(1)从上面各个区域面积与房价的散点图来看,也可以看出上城区的租房价格最贵,基本都在2000元以上,而余杭区基本都在2000元以下。

(2)地铁线路密集的区域往往房租较高,例如三条地铁都覆盖的上城区和江干区,而萧山区虽然也有三条地铁,但4号线覆盖很少,因此相比前两个区域,价格要低一些由于杭州地铁还没有全部通车,有些区域目前只有1条地铁,随着地体的覆盖增加,租金可能会有所提升。

(3)而且可以发现,有些区域的租金与地铁线路有关,例如江干区,2号线附近租金最高,然后是4号线、1号线,滨江区也有类似的情况。

房间数与租金的关系图

sns.factorplot('num_rooms','price',data=rent_data,size=5,aspect=1.5)

自如网杭州市租房数据分析(2)

随公寓房间数的增多,租金呈下降趋势,但是房间数为6是一个特例,该数量不降反升,这主要是因为房间数为6的房源较少导致的,相对来说不具一般性,这些公寓可能由于人群定位、周边配套设施的关系租金较高。

到地铁站的距离与租金价格的关系图

rent_data['dis_to_subway']=rent_data['dis_to_subway'].fillna(3000)  #补全缺失值
bins=[0,500,1000,1500,2000,2500,3000]
cut_class=['很近','近','一般近','一般远','远','很远']  #将租金划分为6档
rent_data['dis_cut']=pd.cut(rent_data['dis_to_subway'],bins=6,labels=cut_class)
sns.factorplot('dis_cut','price',data=rent_data,ci=68,size=5,aspect=1.5,color='g')

自如网杭州市租房数据分析(2)

总体而言,随着到地铁站的距离越近,租金越高。
同样的,也因为影响租金高低的因素很多,所以图上‘一般远’和‘远’的价格均值反而近似相等,距离为‘远’的房源价格浮动很大。

通过对自如网杭州地区的租房情况分析,主要结论如下:
(1)租金均值为1854元/月,价格主要集中在1600-2300元;面积平均在12平米,主要集中在8-15平米。
(2)江干区出租的房源最多,共134个;另外,余杭区、萧山区的房源也较多,都超过了120。
(3)上城区的租房价格最高,集中在2100-2400元,这与上城区商业发达,地处市区有关;余杭区的租房价格最低,大致集中在1000-1600元;
下沙的租房价格也相对便宜,主要集中在1500-1750元,这是因为下沙是高教园区,学生比例大,租房价格不会太高。
因此在上城区工作的人可以考虑在价格相对较低的下城、滨江、江干区租房;在江干、下城区工作的人可以考虑在下沙租房。
(4)总体来说,随公寓房间数的增多,租金呈下降趋势;离地铁站的距离越近,租金越高。


2. 验证型数据分析

以上是对租金价格影响因素的探索型数据分析,接下来对租金做一个简单的预测。

预测前处理,对房间数和行政区重新编码,使得按租金高低有序。

room_codes={2:1,3:2,6:3,4:4,5:5,7:6}
def room_code(num):
    for key in room_codes.keys():
        if num==key:
            return room_codes[key]
rent_data['room_code']=rent_data['num_rooms']
rent_data['room_code']=rent_data['room_code'].apply(room_code)
district_rank=rent_data[['district','price']].groupby(['district']).mean().sort_values(by='price',ascending=False)
code_dict={}
i=1
for key in district_rank.index:
    code_dict[key]=i
    i=i+1
code_dict

{'上城': 1, '下城': 2, '下沙': 8, '余杭': 9, '拱墅': 6, '江干': 4, '滨江': 5, '萧山': 7, '西湖': 3}

def district_code(district):
    for value in district_rank.index:
        if district==value:
            return code_dict[value]
rent_data['district_code']=rent_data['district']
rent_data['district_code']=rent_data['district_code'].apply(district_code)
rent_data.head()

自如网杭州市租房数据分析(2)

线性回归系数

from sklearn.linear_model import LinearRegression
from sklearn import preprocessing
features=['size','dis_to_subway','district_code','room_code']
std_scale = preprocessing.StandardScaler()
rent_data[features]=std_scale.fit_transform(rent_data[features])
X=rent_data[features]
y=rent_data['price']
lm=LinearRegression()
lm.fit(X,y)
print(lm.intercept_)
print(lm.coef_)

1854.03333333
[ 153.34600711 -82.81457497 -227.78316433 -28.91179471]

从各个特征的系数可以看出,行政区对租金价格的影响最大,房间数对价格的影响最小。

通过交叉验证来优化模型,提高模型的泛化性

from sklearn import cross_validation
from sklearn.model_selection import cross_val_predict
from sklearn import metrics
prediction = cross_val_predict(lm, X, y, cv=5)
print("MSE:",metrics.mean_absolute_error(y, prediction)) #平均绝对值误差

MSE: 212.85073474

用随机森林进行回归预测

from sklearn.ensemble import RandomForestRegressor
rf=RandomForestRegressor(random_state=50)
prediction = cross_val_predict(rf, X, y, cv=5)
print("MSE:",metrics.mean_absolute_error(y, prediction)) 

MSE: 187.784730867


通过对租金进行预测,主要结论如下:

(1) 通过用线性回归和随机森林回归两种方法对租金价格进行预测,发现随机森林的效果更好,平均误差在188元,也就是说实际租金和预测租金平均相差188元。

(2) 根据房源面积、到地铁站的距离、行政区和房间数这些影响因素,可以大概知道房源的价格。可以给有租房需求的人提供一个很有用的帮助,他们可以知道目标房源的价格是偏高了,还是偏低了,从而做出有效的决定。

(3) 另外,由于实验中的样本数量(900)不多,影响因素也只有4个,所以预测结果不是特别接近,如果能获得更多的影响因素和样本,预测结果会更好。