自如網杭州市租房數據分析(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個,所以預測結果不是特別接近,如果能獲得更多的影響因素和樣本,預測結果會更好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM