AI競馬で回収率100%越えを目指して

はなむけ競馬場

python プログラム

【2日目】COMPREHENSIVE DATA EXPLORATION WITH PYTHON 写経

更新日:

COMPREHENSIVE DATA EXPLORATION WITH PYTHON(https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python)のコードを写経し、復習として学んだことを書き留める。

土地の価格を予想するコンペの一つ。https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

前日の内容はコチラ

ヒートマップで変数同士の相関関係を調べる

直感で相関を考えるのも重要だが、客観的にデータ同士が創刊していることを調べるためにヒートマップを作成する。

ヒートマップを作るために、相関関数を計算する。

pandasのcorr関数を使うとすぐに出る。

 

 

#トレーニングデータの読み込み 

df_train = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")

corrmat = df_train.corr()

f,ax = plt.subplot(figsize=(12,9))

sns.heatmap(corrmat,vmax=0.8,square=True) #square=Trueで図を正方形にする

色が白いほど各関数に相関があるということにある。

注目するのは図の中央部分にある白い正方形の二つ。

TotalBsmtと1stFirSFとGarageCarsとGarageAreaの二つの組み合わせが、それぞれr=0.8に近い高い相関を見せている。

地下室の広さと1階の広さ、ガレージにある車とガレージの広さがそれぞれ相関しているということ。

地下の広さと1階の広さがだいたい同じだろうというのは想像つくし、ガレージの広さが置ける車の台数に関係するのも想像に難くない。

それぞれの変数の意味するところはほぼ変わらないため、どちらか一方を使わないということができる。変数が減ればそれだけモデルの複雑性を落とせるので、ともて重要な作業。

目的変数と相関係数の高い変数を調べる

使い勝手の良いその他の変数を調べるためにヒートマップを整理する。

相関係数の高い順番に並べて、目的変数との関連性を調べる。


k = 10 #上位10個

cols = corrmat.nlargest(k,"SalePrice")["SalePrice"].index # SalePriceとの相関係数が高いインデックスを取得

cm = np.corrcoef(df_train[cols].values.T) #numpyで相関係数を計算

sns.set(font_scale=1.25)

hm = sns.heatmap(cm,cbar=True,annot=True,square=True,fmt=".2f",annot_kws={"size":10},yticklabels=cols.values,xticklabels=cols.values)

plt.show()

上からOverallQual,GrLiveAare,GaregeCars,GarrageArea,TotalBsmtSFの順番で効いている。

ただし、GrLiveAare,GaregeCars同氏も相関係数が0.88と極めて高く、GarageAreaはいらない。

TotalBsmtSFと1stFlrSFも同じく相関係数が高いので、一方が要らない。

Notebookの作者はYearBuiltが関係ありそうだと感じていたけど、弱い相関にとどまっていることにひっかかっていた。

YearBuiltを時系列データのもととして扱うことをすべきではないかと説いている。

散布図のペアプロットを作成

相関係数を出すときは数字だけでなくて、散布図でプロットしてどうなっているかを把握する。

#scatterplot
sns.set()
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(df_train[cols], size = 2.5)
plt.show();

TotalBsmtSFとGrLiveAreaで直線関係の図が出来上がっている。地下室と地上の面積をそれぞれ表しているが、地下面積が地上より大きくなることは基本的ないこととを示している。
YearBuiltは築年数が浅いほど、跳ね上がるように価格が上がる傾向がある。ピョンと上がるのが見える。

 

欠損値の扱い

データ全体で欠損値がどれだけあるかを把握するのが第一。

total = df_train.isnull().sum().sort_values(ascending=False)
percent = (df_train.isnull().sum()/df_train.isnull().count()).sort_values(ascending=False)

missing_data = pd.concat([total,percent],axis=1,keys=["Total","Percent"])
missing_data.head(20)

 

Total Percent
PoolQC 1453 0.995205
MiscFeature 1406 0.963014
Alley 1369 0.937671
Fence 1179 0.807534
FireplaceQu 690 0.472603
LotFrontage 259 0.177397
GarageCond 81 0.055479
GarageType 81 0.055479
GarageYrBlt 81 0.055479
GarageFinish 81 0.055479
GarageQual 81 0.055479
BsmtExposure 38 0.026027
BsmtFinType2 38 0.026027
BsmtFinType1 37 0.025342
BsmtCond 37 0.025342
BsmtQual 37 0.025342
MasVnrArea 8 0.005479
MasVnrType 8 0.005479
Electrical 1 0.000685
Utilities 0

 

今回一番勉強になったことは、

欠損値が15%を超えたものは、削除して最初からなかったものとして扱うということ。

とうことは、ほぼすべて上記のものは削除してかまわないということになる。

df_train = df_train.drop((missing_data[missing_data["Total"] > 1]).index,axis=1)
</pre>
df_train = df_train.drop(df_train.loc[df_train["Electrical"].isnull()].index) #Electricalについては欠損値が一つだけだから、列ごと削除せず該当するデータのみを削除

df_train.isnull().sum().max()
<pre>

 

外れ値の扱い

外れ値はモデルに影響を与え、モデル作成のために深い洞察を与えることもある。

外れ値の削除も含めて、データどうなっているかを把握する。

標準化(平均を0、標準偏差を1)にして、データがどれくらいばらついているのかをみえる。

#standardizing data
<span class="nb"><a class="indexed_symbol">print</a></span><span class="p">(</span><span class="n"><a class="indexed_symbol">low_range</a></span><span class="p">)</span>
<span class="nb"><a class="indexed_symbol">print</a></span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">outer range (high) of the distribution:'</span><span class="p">)</span>
<span class="nb"><a class="indexed_symbol">print</a></span><span class="p">(</span><span class="n"><a class="indexed_symbol">high_range</a></span><span class="p">)

</span></pre>
<pre>outer range (low) of the distribution:
[[-1.83820775]
 [-1.83303414]
 [-1.80044422]
 [-1.78282123]
 [-1.77400974]
 [-1.62295562]
 [-1.6166617 ]
 [-1.58519209]
 [-1.58519209]
 [-1.57269236]]

outer range (high) of the distribution:
[[3.82758058]
 [4.0395221 ]
 [4.49473628]
 [4.70872962]
 [4.728631  ]
 [5.06034585]
 [5.42191907]
 [5.58987866]
 [7.10041987]
 [7.22629831]]</pre>
<pre><span class="p"> </span></pre>

 

値が小さいほうはそれほど0から離れてもおらず、極端に大きな数字が出ていない。

一方で値が大きいほうは7台の数字が出ていて、突出しているデータがある。

<pre><span class="c1">#deleting points</span>
<span class="n"><a class="indexed_symbol">df_train</a></span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">by</span> <span class="o">=</span> <span class="s1">'GrLivArea'</span><span class="p">,</span> <span class="n">ascending</span> <span class="o">=</span> <span class="kc"><a class="indexed_symbol">False</a></span><span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n"><a class="indexed_symbol">df_train</a></span> <span class="o">=</span> <span class="n"><a class="indexed_symbol">df_train</a></span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n"><a class="indexed_symbol">df_train</a></span><span class="p">[</span><span class="n"><a class="indexed_symbol">df_train</a></span><span class="p">[</span><span class="s1">'Id'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1299</span><span class="p">]</span><span class="o">.</span><span class="n"><a class="indexed_symbol">index</a></span><span class="p">)</span>
<span class="n"><a class="indexed_symbol">df_train</a></span> <span class="o">=</span> <span class="n"><a class="indexed_symbol">df_train</a></span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n"><a class="indexed_symbol">df_train</a></span><span class="p">[</span><span class="n"><a class="indexed_symbol">df_train</a></span><span class="p">[</span><span class="s1">'Id'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">524</span><span class="p">]</span><span class="o">.</span><span class="n"><a class="indexed_symbol">index</a></span><span class="p">)</span></pre>

-python, プログラム

Copyright© はなむけ競馬場 , 2021 All Rights Reserved Powered by AFFINGER5.