房价数据分析
文章目錄
- 一、數據預處理
- 1、刪除多余列
- 2、缺失值、異常值處理
- 二、 數據探索分析
- 1、DistanceKM與房價關系
- 2、14歲及以下比重與房價關系
- 3、自駕實際值與房價關系
- 4、65歲及以上比重與房價關系
- 5、人口占比與房價關系
- 三、機器學習預測房價
- 1、模型選擇
- 2、模型調參
- 四、總結
一、數據預處理
使用jupter book載入訓練數據
import numpy as np import pandas as pd import re import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體 data=pd.read_excel(r'C:\Users\Administrator\Desktop\house\train.xlsx') data.head()
數據有62個特征值,觀察后發現數據中有不少缺失值,并且存在很多信息冗余的特征,有必要對其逐一分析:
1、刪除多余列
首先id列以及板塊列作為標識列可以作直接刪除處理
這些列表示都是人口特征,其中存在信息冗余,人數和比重保留其一即可,這里我選擇保留比重數據
這些列表示的是房屋所在區域的配套設施數量分布,其中優勢配套分布列并沒有提供額外的信息,對于建模來說意義不大,可以做刪除處理。
接下來的這幾列表示的是房屋的交通便利情況,這里住戶數量和路口數量特征絕大多數為0,判斷為缺失值,做刪除處理。 自駕和自駕實際值表示含義未可知,兩者之間差距比較大,應該是量級不一致導致的。這里我們只保留一個自駕實際值。公共交通我們也只保留一個實際值;
這幾列表示一些民生部門的數量分布,其中優勢分布屬于信息冗余,我們將其刪除
最高房價列和房價中位數列由于缺失值太多只能做刪除處理
這幾列表示房屋附近產業分布,占比和數量我們保留其一即可,這里選擇保留數量。優勢產業為信息冗余直接刪除
這幾列房屋所在區域氛圍,優勢氛圍列信息冗余,做刪除處理
后面這幾列同樣缺失比例過大,做刪除處理
這幾列,與前面的氛圍列數據重合了,作刪除處理
刪除多余的列之后,現在只有26列,分析難度大大降低
2、缺失值、異常值處理
對于人口特征’人口占比’, ‘14歲及以下比重’, ‘15至64歲比重’, '65歲及以上比重’這幾列來說,數值為0的應該表示的是缺失值,這里我們使用均值來代替
自駕實際值和公共交通這兩列也有不少0值,其實這兩列值代表的含義并不可知,這里姑且也用平均值去代替
peoplecolumns=['人口占比', '14歲及以下比重', '15至64歲比重', '65歲及以上比重','自駕實際值','公共交通實際值'] for i in peoplecolumns:data.loc[data[i]==0,i]=data[i].mean()我們看一下房價分布的箱線圖:
fig=plt.figure(dpi=400) data.boxplot(column='房價', whis=1.5) plt.title("房屋價格分析(箱形圖)") plt.show()
很明顯有一個離群點,雖然這并不意味著這是異常值,它可能是別墅或者其他什么原因導致的價格偏高,但是這會對建模產生影響,我們需要將其刪除
二、 數據探索分析
我們先看一下房價的整體分布
price = data['房價'] max_price = price.max() min_price = price.min() mean_price = price.mean() median_price = price.median()print("最高價格:%.2f元/平方米" %max_price) print("最低價格:%.2f元/平方米" %min_price) print("平均價格:%.2f元/平方米" %mean_price) print("中位數價格:%.2f元/平方米" %median_price)
可以看到房價最高價格為20000元,而最低價格為4450元,均值為8464元,這可能是一個中小城市的房價分布
從圖中可以看到,房屋價格呈明顯的雙峰分布,集中在5000元和1萬元兩處。而房價的中位數與平均值差距很小,意味著房價的分布較為均勻。
接下來我們分析下具體的特征與房價之間的關系,因為特征數較多,我們這里只取最重要的五項特征進行分析。
首先使用xgboost算法計算特征重要度
可以看到DistanceKM、14歲及以下比重、自駕實際值、65歲及以上比重、人口占比這五項對于房價的影響是最重要的
1、DistanceKM與房價關系
我們使用seaborn中的regplot作圖函數,可以描繪兩列數據的散點圖,同時可以自動擬合它們之間的關系
plt.figure(dpi=200) sns.regplot(x="DistanceKM",y="房價",data=data_new,color="g")
可以看到隨著距市中心距離的提升,房價呈現下降的趨勢,這與我們的常識相符合
2、14歲及以下比重與房價關系
plt.figure(dpi=200)javascript sns.regplot(x="14歲及以下比重",y="房價",label="14歲及以下比重",data=data_new,color="b")
可以看到隨著14歲以下占比的提高,房價有明顯上升趨勢,這可能是因為青少年集中的區域其教育資源一般較為密集,房價也會偏高
3、自駕實際值與房價關系
plt.figure(dpi=200) sns.regplot(x="自駕實際值",y="房價",label="14歲及以下比重",data=data_new,color="b")
隨著自駕實際值的提升,房價呈下降趨勢,此處自駕值的具體含義并不可知,其原因也無法探究
4、65歲及以上比重與房價關系
plt.figure(dpi=200) sns.regplot(x="65歲及以上比重",y="房價",data=data_new,color="b")
可以看到隨著65歲及以上比重的提高,房價也呈現上升趨勢。一方面可能是因為老年人財富積累高,能承擔高房價。另一方面是老年人居住地一般為老城區,房價一般來說比新城區要高。
5、人口占比與房價關系
我們將人口占比分為四個區間’人口稀疏’,‘人口較稀疏’,‘人口較密集’,‘人口密集’,分析其與房價的關系
data["peoplesize"]=pd.qcut(data["人口占比"],4,labels=['人口稀疏','人口較稀疏','人口較密集','人口密集']) plt.figure(dpi=200) data.groupby("peoplesize")["房價"].mean().sort_values(ascending=False).plot(kind="bar") plt.xlabel("人口密集程度") plt.ylabel("房屋平均價格(元/平方米)")
雖然變化不是很明顯,但是還是可以看出人口稀疏的地方房價反而要比人口密集的地方要多,這似乎與我們的常識不想符合,可能是因為該城市工廠數量較多,所在區域人群密度較高,而工廠位置一般位于郊區,導致房價偏低、
三、機器學習預測房價
1、模型選擇
對數據進行以下處理:確定特征與標簽、分割數據以及歸一化處理
x=data_new.loc[:,data_new.columns!="房價"] y=data_new.loc[:,'房價']from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=40, test_size=0.3) from sklearn.preprocessing import MinMaxScaler ss_x = MinMaxScaler() x_train = ss_x.fit_transform(x_train) x_test = ss_x.transform(x_test)分別調用sklearn庫中相應的模塊,建立隨機森林回歸、極端隨機森林回歸、xgboost模型,并在訓練集上訓練模型,然后在測試集上預測二手房的房價,使用r2-score評估模型精度
from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import r2_score from sklearn.ensemble import ExtraTreesRegressor import xgboost as xgb rfr=RandomForestRegressor() etr=ExtraTreesRegressor() xg=xgb.XGBRegressor() rfr.fit(x_train,y_train) etr.fit(x_train,y_train) xg.fit(x_train,y_train) print('隨機森林回歸模型的r2-score為:',r2_score(rfr.predict(x_test),y_test)) print('極端隨機森林模型的r2-score為:',r2_score(etr.predict(x_test),y_test)) print('xgboost模型的r2-score為:',r2_score(xg.predict(x_test),y_test))
可以看到極端隨機森林模型的表現要更好一點,所以我們選擇極端隨機森林算法建立房價預測模型
2、模型調參
對極端隨機森林算法進行調參,這里參數選取**‘max_depth’,‘n_estimators’**兩個參數進行調參,它們分別代表決策樹的深度以及模型迭代次數
from sklearn.model_selection import GridSearchCV estimator = etrparam_grid = {'max_depth':[10,20,30], 'n_estimators': [10,50,100] } ETR=GridSearchCV(estimator,param_grid) ETR.fit(x, y) print('Best parameters found by grid search are:', ETR.best_params_)
當模型參數為’max_depth’: 30, ‘n_estimators’: 50時,模型的擬合效果最好,我們最終采用此模型預測房價
這是我們預測的房價整體分布,房價呈現正態分布,中位數與平均數相近,房價分布均勻。
四、總結
本項目對給出的房價數據進行了分析建模,首先對數據進行預處理,減少了不必要的特征,以及對缺失值、異常值進行了處理。然后采用統計分析的方法對數據進行初步分析,大致了解房價分布及其影響因素;最后采用機器學習方法建模預測,并比較了幾種常用回歸模型的預測效果。由于時間有限,本次數據分析項目還有很多可供優化的方面,如缺失值、異常值的處理可以如使用算法建模填充,模型的選擇、調優可以再添加幾組對照
總結
- 上一篇: 答应了好久的camera资料
- 下一篇: USB协议普及文