はじめに
KaggelのHouse Price チュートリアルのEDAについて解説したいと思います。KaggelのHouse Priceとは、79の説明変数をもとに住宅価格を予測するというものになっています。
この79の変数には、天井の高さやプールの有無などがあります。
開発環境
今回このチュートリアルに取り組むにあたりJupyter Lab(Jupyter Notebook)を使用していきます。
インストール方法とは以下の記事を参考にしてみてください。
House Price チュートリアルのデータセット
以下のリンク先から、CSVデータダウンロードしてください。
House Price チュートリアルのEDA
それでは、House Price チュートリアルのEDAをしていきたいと思います。EDAの基本に関しては、以下の記事を参考にしてみてください。
ライブラリのインポート
まずは、必要なライブラリをインポートします。
import numpy as np
import pandas as pd
import seaborn as sns
import scipy.stats as stats
from scipy.stats import norm
import statsmodels.api as sm
import matplotlib.pyplot as plt
from scipy.stats import skew, norm
from sklearn.neighbors import KNeighborsRegressor
データセットの読み込み
次にデータセットを読み込みます。カレントディレクトリにダウンロードしたCSVを格納し、以下を実行してください。
house_data = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
data_w = house_data.copy()
data_w.columns = data_w.columns.str.replace(' ', '') # Replacing the white spaces in columns' names
data_w.info()
ここでは、trainとtestデータを連結し、各因子の詳細情報を抽出しています。実行結果は、以下です。
変数は、全部で80(ただし一つは、目的変数である住宅価格)です。
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1460 entries, 0 to 1459
Data columns (total 81 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Id 1460 non-null int64
1 MSSubClass 1460 non-null int64
2 MSZoning 1460 non-null object
3 LotFrontage 1201 non-null float64
4 LotArea 1460 non-null int64
5 Street 1460 non-null object
6 Alley 91 non-null object
7 LotShape 1460 non-null object
8 LandContour 1460 non-null object
9 Utilities 1460 non-null object
10 LotConfig 1460 non-null object
11 LandSlope 1460 non-null object
12 Neighborhood 1460 non-null object
13 Condition1 1460 non-null object
14 Condition2 1460 non-null object
15 BldgType 1460 non-null object
16 HouseStyle 1460 non-null object
17 OverallQual 1460 non-null int64
18 OverallCond 1460 non-null int64
19 YearBuilt 1460 non-null int64
20 YearRemodAdd 1460 non-null int64
21 RoofStyle 1460 non-null object
22 RoofMatl 1460 non-null object
23 Exterior1st 1460 non-null object
24 Exterior2nd 1460 non-null object
25 MasVnrType 1452 non-null object
26 MasVnrArea 1452 non-null float64
27 ExterQual 1460 non-null object
28 ExterCond 1460 non-null object
29 Foundation 1460 non-null object
30 BsmtQual 1423 non-null object
31 BsmtCond 1423 non-null object
32 BsmtExposure 1422 non-null object
33 BsmtFinType1 1423 non-null object
34 BsmtFinSF1 1460 non-null int64
35 BsmtFinType2 1422 non-null object
36 BsmtFinSF2 1460 non-null int64
37 BsmtUnfSF 1460 non-null int64
38 TotalBsmtSF 1460 non-null int64
39 Heating 1460 non-null object
40 HeatingQC 1460 non-null object
41 CentralAir 1460 non-null object
42 Electrical 1459 non-null object
43 1stFlrSF 1460 non-null int64
44 2ndFlrSF 1460 non-null int64
45 LowQualFinSF 1460 non-null int64
46 GrLivArea 1460 non-null int64
47 BsmtFullBath 1460 non-null int64
48 BsmtHalfBath 1460 non-null int64
49 FullBath 1460 non-null int64
50 HalfBath 1460 non-null int64
51 BedroomAbvGr 1460 non-null int64
52 KitchenAbvGr 1460 non-null int64
53 KitchenQual 1460 non-null object
54 TotRmsAbvGrd 1460 non-null int64
55 Functional 1460 non-null object
56 Fireplaces 1460 non-null int64
57 FireplaceQu 770 non-null object
58 GarageType 1379 non-null object
59 GarageYrBlt 1379 non-null float64
60 GarageFinish 1379 non-null object
61 GarageCars 1460 non-null int64
62 GarageArea 1460 non-null int64
63 GarageQual 1379 non-null object
64 GarageCond 1379 non-null object
65 PavedDrive 1460 non-null object
66 WoodDeckSF 1460 non-null int64
67 OpenPorchSF 1460 non-null int64
68 EnclosedPorch 1460 non-null int64
69 3SsnPorch 1460 non-null int64
70 ScreenPorch 1460 non-null int64
71 PoolArea 1460 non-null int64
72 PoolQC 7 non-null object
73 Fence 281 non-null object
74 MiscFeature 54 non-null object
75 MiscVal 1460 non-null int64
76 MoSold 1460 non-null int64
77 YrSold 1460 non-null int64
78 SaleType 1460 non-null object
79 SaleCondition 1460 non-null object
80 SalePrice 1460 non-null int64
dtypes: float64(3), int64(35), object(43)
memory usage: 924.0+ KB
住宅価格の可視化
次に目的変数である住宅価格がどのような分布であるのかを確認します。
- 確認の目的としては、データが正規分布しているか/否かが確認のポイントとなります。
正規分布していない場合は、log変換することで、正規分布かをするかを検討します。
# Getting the main parameters of the Normal Ditribution ()
(mu, sigma) = norm.fit(data_w['SalePrice'])
plt.figure(figsize = (12,6))
sns.distplot(data_w['SalePrice'], kde = True, hist=True, fit = norm)#カーネル密度推定(kde),norm:ガウス分布近似
plt.title('SalePrice distribution vs Normal Distribution', fontsize = 13)
plt.xlabel("House's sale Price in $", fontsize = 12)
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)],
loc='best')
plt.show()
- μ(平均):180921.20
- σ(標準偏差):79415.29
あまり、正規分布はしていないようです。カイの二乗分布のような左右非対称な形状をしています。
目的変数の確認
相関係数の確認
# 相関係数のMatrix
f, ax = plt.subplots(figsize=(30, 25))
mat = data_w.corr('pearson')
mask = np.triu(np.ones_like(mat, dtype=bool))
cmap = sns.diverging_palette(230, 20, as_cmap=True)
sns.heatmap(mat, mask=mask, cmap=cmap, vmax=1, center=0, annot = True,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
plt.show()
SalePriceと相関のあるパラメータは、
- OverallQuall
- GrLivArea
まずはこの2変数が特に相関が高いので、詳細分析をしていきます。
OverallQuall – SalePrice
- OverallQuall:家の仕上がり、材料の評価
まずは、OverallQuall単体のヒストグラムとユニークの数をカウントします。ユニークとは、この変数を構成する要素の数になります。
plt.figure(figsize = (12,6))
sns.distplot(data_w['OverallQual'],hist=True)
vc = data_w['OverallQual'].value_counts()
print(vc)
ユニークの数は、以下です。
5 397
6 374
7 319
8 168
4 116
9 43
3 20
10 18
2 3
1 2
Name: OverallQual, dtype: int64
5,6,7という数字が多いのですね。
ではこれらの変数がHouse Priceとどのような関係なのかを可視化していきます。
# OverallQuall - SalePrice [Pearson = 0.8]
figure, ax = plt.subplots(1,3, figsize = (20,8))
sns.stripplot(data=data_w, x = 'OverallQual', y='SalePrice', ax = ax[0])
sns.violinplot(data=data_w, x = 'OverallQual', y='SalePrice', ax = ax[1])
sns.boxplot(data=data_w, x = 'OverallQual', y='SalePrice', ax = ax[2])
plt.show()
GrLivArea- SalePrice
- GrLivArea:リビングの広さ
まずは、GrLivArea単体のヒストグラムとユニークの数をカウントします。ユニークとは、この変数を構成する要素の数になります。
plt.figure(figsize = (12,6))
sns.distplot(data_w['GrLivArea'],hist=True)
vc = data_w['GrLivArea'].value_counts()
print(vc)
1300付近にピークがあります。最頻値は、864であることが以下からわかります。
ユニークの数は、以下です。
864 22
1040 14
894 11
848 10
1456 10
..
3447 1
1396 1
1395 1
1393 1
2054 1
Name: GrLivArea, Length: 861, dtype: int64
これは連続値なので、散布図で比較してみます。
# GrLivArea vs SalePrice [corr = 0.71]
Pearson_GrLiv = 0.71
plt.figure(figsize = (12,6))
sns.regplot(data=data_w, x = 'GrLivArea', y='SalePrice', scatter_kws={'alpha':0.2})
plt.title('GrLivArea vs SalePrice', fontsize = 12)
plt.legend(['$Pearson=$ {:.2f}'.format(Pearson_GrLiv)], loc = 'best')
plt.show()
まとめ
KaggelのHouse Price チュートリアルのEDAについて解説しました。
相関係数分析から、以下二つの因子の相関係数が高いことがわかりました。
- OverallQuall:家の仕上がり、材料の評価
- GrLivArea:リビングの広さ
それらをより詳細に解析し、ヒストグラムやバイオリン図で分布を把握しました。
目的変数に関しては、正規分布はしていないようです。次回以降、これを正規分布により近けるための手法を解説します。
pythonをより深く学んでみたいという方は、こちらの記事も参考にしてみてください。
今回の記事は、以上です。
最後までお読みいただきありがとうございました。
コメント