通過數據爬取和數據清洗後,終於到了數據分析的部分。具體從探索型數據分析和驗證型數據分析兩部分進行。探索型數據分析是主要爲了瞭解屬性的分佈、屬性之間的相關性,驗證型數據分析則用來預測租金價格。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']
rent_data=pd.read_csv('rent_data_clean.csv',encoding='gbk') rent_data.describe()
房間價格分佈圖python
plt.hist(rent_data['price'],bins=20,edgecolor='w',color='lightskyblue')
房間面積分布圖app
plt.hist(rent_data['size'],bins=27,edgecolor='w',color='orange')
從數據的統計特徵和分佈直方圖來看: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
每一個行政區的房源數量(這裏下沙由於它高教園和麪積較大的特色,做爲一個單獨的區域)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元之間,這是由於下沙是高教園區,學生比例大,租房價格不會過高。
所以在上城區工做的人能夠考慮在價格相對較低的下城、濱江、江乾區租房;而在江干、下城區工做的人能夠考慮在下沙租房。
不一樣地鐵線上房屋面積與租金的散點圖,三種顏色分別表明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)整體來講,隨公寓房間數的增多,租金呈降低趨勢;離地鐵站的距離越近,租金越高。
以上是對租金價格影響因素的探索型數據分析,接下來對租金作一個簡單的預測。
預測前處理,對房間數和行政區從新編碼,使得按租金高低有序。
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個,因此預測結果不是特別接近,若是能得到更多的影響因素和樣本,預測結果會更好。