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

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

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

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()

describe

房间价格分布图

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

price

房间面积分布图

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

size

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上城区的租房价格最高,大致集中在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()

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

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

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)

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

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

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

房间数与租金的关系图

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

随公寓房间数的增多,租金呈下降趋势,但是房间数为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')

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

通过对自如网杭州地区的租房情况分析,主要结论如下:
(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()

线性回归系数

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个,所以预测结果不是特别接近,如果能获得更多的影响因素和样本,预测结果会更好。

猜你喜欢

转载自www.cnblogs.com/toastavocado/p/8983130.html