自如網杭州市租房數據分析(2)

自如網杭州市租房數據分析

通過數據爬取數據清洗後,終於到了數據分析的部分。具體從探索型數據分析和驗證型數據分析兩部分進行。探索型數據分析是主要爲了瞭解屬性的分佈、屬性之間的相關性,驗證型數據分析則用來預測租金價格。html

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

房間價格分佈圖python

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

price

房間面積分布圖app

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

size

從數據的統計特徵和分佈直方圖來看:dom

(1) 房源的租金均值爲1854元/月,最便宜的是830元,最貴的是2890元,價格主要集中在1600-2300元。
由於這裏的價格是合租的單個房間價格,相比杭州整個租房狀況,可能價格有點偏高,不過加上清潔打掃等服務,價格應該說還比較合理。優化

(2) 房間的面積大小平均在12平米,從最小的5平米到最大的32平米,主要集中在8-15平米,面積的差別仍是挺大的。編碼

最貴的房源和最便宜的房源分別位於哪裏?3d

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

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

最貴的房間有兩個,都達到了2890元/月,一個是位於西湖區文新站附近的新金都城市花園,該房間貴的緣由應該是面積較大、周邊配套設施齊全。另一個是位於上城區城戰附近的建國南苑,該房間貴的緣由應該主要是位於交通樞紐附近,並且面積也挺大的。rest

最便宜的房間有三個,價格爲830元/月,都位於餘杭區,因爲餘杭區距離市區較遠,交通、周圍設施相對比較欠缺,因此租房價格相對便宜。code

(2)再來看一下非數值型屬性的分佈狀況

每一個行政區的房源數量(這裏下沙由於它高教園和麪積較大的特色,做爲一個單獨的區域)orm

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個,因此預測結果不是特別接近,若是能得到更多的影響因素和樣本,預測結果會更好。

相關文章
相關標籤/搜索