房價數據處理與分析

1、直接上代碼

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt #導入matplotlib模塊
from warnings import simplefilter #使用 warnings 抑制第三方警告
simplefilter(action='ignore', category=FutureWarning)
plt.rcParams['font.sans-serif']=['SimHei']  ## 用於正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False ##用於正常顯示負號
# 導入數據
data = pd.read_csv('E:\\house.csv',encoding='utf-8')#從E盤目錄下讀取數據文件
data.head()

'''''''''''''''''''''''''''''''''''''程現峯負責'''''''''''''''''''''
#數據預處理(探索性分析)
# 使用describe方法,查看數據基本統計特徵
data.describe()
## 使用info方法,查看是否有缺失
data.info()

# 查看缺失值比率
data.isnull().sum()/data.shape[0]

# 每平價格多少
data['PerPrice'] = data['Price']/data['Size']
data.head(10)
#查看行政區域與房價的關係
plt.figure(figsize=(15, 8))
sns.boxplot(x='Region', y='Price', data=data)
plt.title('北京各大區二手房房屋總價')
plt.show()

#查看房屋大小的分佈 以及 房屋大小與價格的關係
figure, [ax1,ax2] = plt.subplots(1, 2, figsize=(12, 5))
# 房屋大小的分佈情況
sns.distplot(data['Size'], bins=20, ax=ax1, color='r')
sns.kdeplot(data['Size'], shade=True, ax=ax1)
# 房屋大小和出售價格的關係
sns.regplot(x='Size', y='Price', data=data, ax=ax2)
plt.show()
data.loc[data['Size']<10]
data.loc[data['Size']>1000]
data = data[(data['Layout']!="疊拼別墅")&(data['Size']<1000)]
#查看對Size的異常值處理之後的結果
figure, [ax1,ax2] = plt.subplots(1, 2, figsize=(12, 5))
# 房屋大小的分佈情況
sns.distplot(data['Size'], bins=20, ax=ax1, color='r')
sns.kdeplot(data['Size'], shade=True, ax=ax1)
# 房屋大小和出售價格的關係
sns.regplot(x='Size', y='Price', data=data, ax=ax2)
plt.show()
data.head()
#查看房屋戶型的分佈
figure, ax1= plt.subplots(figsize=(10,10))
sns.countplot(y='Layout', data=data, ax=ax1)
plt.title('房屋戶型')
plt.show()
#查看房屋裝修分佈 以及 裝修與房價的關係
data['Renovation'].value_counts()
plt.figure(figsize=(10,8))
sns.boxplot(x='Renovation',y='Price',data=data)
plt.show()
data['Elevator'][:10]

data['Elevator'].value_counts(dropna=False)
data.isnull().sum()/data.shape[0]
data.head(10)
data.loc[(data['Floor']>6) & (data['Elevator'].isnull()),'Elevator'] = '有電梯'
data.loc[(data['Floor']<=6) & (data['Elevator'].isnull()),'Elevator'] = '無電梯'
data['Elevator'].value_counts(dropna=False)
data.head(10)
#查看房屋樓層的分佈
plt.figure(figsize=(20,8))
plt.title('房屋樓層')
sns.countplot(x='Floor',data=data)
plt.show()
#處理房屋朝向
data['Direction'].value_counts()

'''''''''''''''''''''''''''''''''''''薛曉華負責'''''''''''''''''''''
# 建立一個處理direction的函數
def direct_func(x):
    if not isinstance(x,str):
        raise TypeError
    x = x.strip()
    x_len = len(x)
    x_list = pd.unique([y for y in x])
    if x_len != len(x_list):
        return 'no'
        
    if (x_len == 2) & (x not in d_list_two):
        m0 = x[0]
        m1 = x[1]
        return m1+m0
    elif (x_len == 3) & (x not in d_list_three):
        for n in d_list_three:
            if (x_list[0] in n) & (x_list[1] in n) & (x_list[2] in n):
                return n
    elif (x_len == 4) & (x not in d_list_four):
        return d_list_four[0]
    else:
        return x
       
# 通過 apply() 方法將 Direction 數據格式轉換
d_list_one = ['東','西','南','北']
d_list_two = ['東西','東南','東北','西南','西北','南北']
d_list_three = ['東西南','東西北','東南北','西南北']
d_list_four = ['東西南北']    
data['Direction'] = data['Direction'].apply(direct_func)
data = data.loc[(data['Direction']!='no')&(data['Direction']!='nan')]
data['Direction'].value_counts()
data.head()
#填補 elevator 缺失值,有無電梯
#房屋大小 size 異常值
#房屋朝向整理

#接下來做一些特徵工程(合併,數值化。。。)
#特徵工程
#創建新特徵:房間數、客廳數
data['Layout_room_num'] = data['Layout'].str.extract('(^\d).*', expand=False).astype('int64')
data['Layout_hall_num'] = data['Layout'].str.extract('^\d.*?(\d).*', expand=False).astype('int64')
#上面用的是string類型的正則表達式
data.head()
data['Layout_room_num'].value_counts()
data['Layout_hall_num'].value_counts()
#對特徵Year(建築年份) 離散化
data['Year'][:10]
data['Year'] = pd.qcut(data['Year'],8).astype('object')
data['Year'].value_counts()
data.head()
#創建新特徵:房間總數、平均每間房間大小
data['Layout_total_num'] = data['Layout_room_num'] + data['Layout_hall_num']
data['Size_room_ratio'] = data['Size']/data['Layout_total_num']
data.head()
data = data.drop(['Layout','Id','Garden','PerPrice'],axis=1)
data.head()
#介紹one-hot encoding
# 可以使用pd.get_dummies實現 one-hot encoding
dummies = pd.get_dummies(data['Elevator'],prefix='Elevator')
data = pd.concat([data,dummies],axis=1) # 拼接回原來的數據結構
data = data.drop(['Elevator'],axis=1)
data['Renovation'].value_counts()
data = pd.get_dummies(data)
data.head()
'''''''''''''''''''''''''''''''''''''張朝龍負責'''''''''''''''''''''
#建立模型
# 可以使用sklearn中的train_test_split函數,進行訓練集和測試集的切分
# 我們使用R^2對模型效果進行評價
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
y = data['Price']
x = data.copy().drop(['Price'], axis=1)
# (1)劃分訓練集和測試集,比例爲80%(訓練)--20%(測試)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,random_state = 33)

# (2)導入模型,這裏先嚐試DecesionTree決策樹(迴歸樹)
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor()

# (3)訓練模型
model.fit(x_train,y_train)

# (4)模型預測
y_predict = model.predict(x_test)
# (5)模型效果評估
print('決策樹模型train r2:')
print(r2_score(y_test, y_predict))
#迴歸樹葉節點的數據類型是連續的,而分類樹葉節點的數據類型是離散的。
#迴歸樹葉節點是一個個具體的值,而分類樹葉節點是依據訓練樣本類別確定的預測類別。
#迴歸樹的葉節點返回的是“一團”訓練數據的均值,而不是具體的、連續的預測值。
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(random_state=1)
rfr.fit(x_train,y_train)
y_predict_rfr = rfr.predict(x_test)
rfr
print('隨機森林模型 r2:')
print(r2_score(y_test, y_predict_rfr))
#下面我們可以進行一些模型參數調整的過程,看能否提高模型準確率
#模型調參
#使用GridSearch(網格搜索)和K-cross_validation(K-交叉驗證)
#網格搜索是我們事先爲每個參數確定一組值,然後窮舉各種參數組合
#K-交叉驗證是將數據集平均劃分爲K組,其中K-1組爲訓練集,剩下1組爲驗證集
from sklearn.model_selection import GridSearchCV
tuned_parameters = {'n_estimators': [100,150], 'max_depth': [25,40]}
rfr = RandomForestRegressor(random_state=1)
clf = GridSearchCV(rfr, tuned_parameters, cv=5, scoring='r2', n_jobs=-1, verbose=1)
clf.fit(x_train, y_train)
print(clf.best_estimator_)
#得到調參後的模型
clf.best_estimator_
#使用調參後的模型進行預測
rfr_after = clf.best_estimator_
rfr_after.fit(x_train,y_train)
y_predict_after = rfr_after.predict(x_test)
print('調參數後的隨機森林模型 r2:')
print(r2_score(y_test, y_predict_after))
#查看模型預測出來的房屋價格
y_predict_after[:10].astype(int)
y_test.values[:10].astype(int)



2、結果展示
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章