1.進行各數值變量的相關性分析
import seaborn as sns
import pandas as pd
corrmat = train.corr() ##corrmat是相關性矩陣
corrmat
表中具體數值是變量間的相關系數
2.根據相關系數繪制相關系數熱力圖
熱力圖可以迅速檢視變量相關性。
顔色越淺的地方說明兩個變量的相關性越強。
觀察saleprice和其他變量的關系發現GrLivArea(地上居住面積)、OverallQual(整體品質)、GarargeCars(車庫能裝幾輛車)等變量的顔色比較淺,說明它們對房價的預測能力可能比較強。
另外可以看到其他變量中也可能存在強相關關系,這可能是因為多重共線性導緻,對于這部分特征,後續也要考慮進行處理。
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
heatmap用法
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)¶
- data:矩陣資料集,可以使numpy的數組(array),如果是pandas的dataframe,則df的index/column資訊會分别對應到heatmap的columns和rows
- linewidths,熱力圖矩陣之間的間隔大小
- vmax,vmin, 圖例中最大值和最小值的顯示值,沒有該參數時預設不顯示
seaborn熱力圖用法參考
seaborn熱力圖參數介紹
3.選出前10個與房價強相關的變量檢視相關系數
pandas nlargest用法
#選出前10個與房價強相關的變量
k=10
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cols
#檢視10個變量的相關系數
cols_cor = train[cols].corr()
cols_cor
#繪制熱力圖
sns.set(font_scale=1.25)
sns.heatmap(cols_cor, vmax=.8, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10})
通過熱力圖觀察,可以發現
- ‘OverallQual’(房屋整體材料和裝修水準), ‘GrLivArea’(地上生活區總面積) and ‘TotalBsmtSF’ (地下室總面積)和房價強相關
- “GarageCars”(車庫可放車數量)和“GarageArea”(車庫面積)也是相關性很強的變量。然而GarageCars和GarageArea就像一對孿生兄弟互相相關性就很強,無法分辨它們(放在一起也會産生多重共線性問題)。是以,我們在分析中隻需要這些變量中的一個(我們可以保留“GarageCars”,因為它與“SalePrice”的相關性更高)。
- “TotalBsmtSF”(地下室面積)和“1stFloor”道理如上,似乎都是代表地下室面積,這裡不确定這兩個變量含義的差別,不過它們也有很強的相關性
4. 再深入看一下這些強相關變量和房價的關系
(1)GrLivArea (地上生活區總面積)
var = 'GrLivArea'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000))
#GrLivArea代表含義是居住面積,發現和房價有比較明顯的正相關關系
#我們可以在右下角看到兩個明顯的outlier,價格很低,但面積巨大,我們可以考慮删除掉這兩個異常值。
(2)TotalBsmtSF(地下室總面積)
#TotalBsmtSF含義為地下室面積,發現地下室面積與房價似乎有更強的潛線上性關系,同時在右側似乎也有一個異常值存在
var = 'TotalBsmtSF'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
(3)GarageArea車庫面積
#GarageArea含義為車庫面積,可以看到車庫面積和房價也存在一定的正相關關系
var = 'GarageArea'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
對于連續型變量,我們可以用散點圖的方式檢視它們和房價之間的關系,下面我們再來看一下離散型變量,對于離散型變量,我們可以用箱型圖去檢視特征不同取值中房價的分布情況。
(4)OverallQual(房屋整體材料和裝修水準)
var = 'OverallQual'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
f, ax = plt.subplots(figsize=(8, 6))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
(5)YearBuilt房屋建造時間
#再看一下房屋的建造時間和價格的關系,可以看到房屋的建造時間雖然沒有和房價有明顯的線性關系,但最近建造的新房屋,整體的價格會比較高,這個在後面的特征工程中會用到,注意
var = 'YearBuilt'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
f, ax = plt.subplots(figsize=(16, 8))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
plt.xticks(rotation=90);
(6)Fireplaces壁爐數量
#上面是一些比較容易想到的變量,再看壁爐數量和房價的關系,壁爐越多,房價越高
var = 'Fireplaces'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
f, ax = plt.subplots(figsize=(16, 8))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
plt.xticks(rotation=90);