Python

【Kaggle】House Price チュートリアルを初心者向けに解説|EDA編

Python

はじめに

KaggelのHouse Price チュートリアルのEDAについて解説したいと思います。KaggelのHouse Priceとは、79の説明変数をもとに住宅価格を予測するというものになっています。

この79の変数には、天井の高さやプールの有無などがあります。

開発環境

今回このチュートリアルに取り組むにあたりJupyter Lab(Jupyter Notebook)を使用していきます。

インストール方法とは以下の記事を参考にしてみてください。

 

House Price チュートリアルのデータセット

以下のリンク先から、CSVデータダウンロードしてください。

House Prices - Advanced Regression Techniques | Kaggle
Predict sales prices and practice feature engineering, RFs, and gradient boosting

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をより深く学んでみたいという方は、こちらの記事も参考にしてみてください。

今回の記事は、以上です。

最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました