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

はなむけ競馬場

python プログラム

【3日目】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

前日の内容はコチラ

4つの仮定を確認

目的変数との多変量解析を適用するために、事前に統計的仮定をクリアする必要があるらしい。

それで、外国の本によると4つの仮定をテストするらしい。

  1. 正規性:目的変数と特定の説明変数が正規分布しているかどうか。200以上のサンプルがある場合は大きな問題ではないが、正規性を獲得できれば、その他の多くの問題を回避できるらしい。正規性を示さない場合、対数を取ることで正規性を獲得できるなどの対策がある。
  2. Homoscedasticity(等分散?恒常性):目的変数の範囲内で、説明変数が同レベルの分散を示す。おそらく等分散性を表す。
  3. 線形性:散布図で線形パターンがあるかどうか。
  4. 相関関係にエラーがあるかどうか。

正規性を確認するためにヒストグラムと散布図を作る


from scipy.stats import norm

from scipy import stats

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

sns.distplot(df_train["SalePrice"],fit=norm) #fit=normで図中に正規分布を出す

<br data-mce-bogus="1">

#正規確率プロット

fig = plt.figure()

res = stats.probplot(df_train["SalePrice"],plot=plt)

黒い正規分布に対して、目的変数の分布は完全に外れている。

つまり、正規性はない。正規確率プロットでも線に沿ってデータがプロットされていない。

正の歪度を示すときは、対数を取れば正規性を獲得できることがある。


df_train = np.log(df_train["SalePrice"]

sns.distplot(df_train["SalePrice"],fit=norm) #fit=normで図中に正規分布を出す



#正規確率プロット

fig = plt.figure()

res = stats.probplot(df_train["SalePrice"],plot=plt)

 

 

これで正規性を獲得できた。

logのままこれらの目的変数と説明変数を使っていくのだと思う。

多量のデータが0を示す場合の正規性の処理

上記の図を見ると、左側に0のデータがたくさんあることが分かる。

np.log(0) = infとなり、0が含まれた状態で対数処理するのはダメ。

データが0だということを保持したまま、その他データを対数にするため、データが0であることを示す新たな変数を作り、残りのデータのみ対数にする。


df_train["HasBsmt"] = pd.Series(len(df_train["TotalBsmtSF"]),index=df_train.index)
df_train["HasBsmt"] = 0
df_train.loc[df_train["TotalBsmtSF"]>0,"HasBsmt"] = 1

df_train.loc[df_train["HasBsmt"] == 1,"TotalBsmtSF"]= np.log(df_train["TotalBsmtSF"])

これで0ということを保持したまま、その他のデータを対数にして正規化することができた。

 

homoscedasticityを調べるには、2値で散布図を作る

homoscedasticity (等分散性)を調べるには、散布図を作成する。

等分散の検定をすればいいんじゃないかと思うが、多分だめなんだろうな。わからないけど。

等分散性を示すのは画像右側のように直線にプロットが並んだ状態。

負等分散は扇状(作者は円錐と表現)にプロットが広がっている状態。

#scatter plot
plt.scatter(df_train["GrLivArea"],df_train["SalePrice"])

等分散になっていれば問題ない。

 

カテゴリ変数はget_dummies

カテゴリ変数事態にユニークなデータの数が少なかったので、たぶんget_dummiesをしているのかも。

たくさん列ができるようだったら、ラベルエンコーディングをするのだろうか。


df_train = pd.get_dummies(df_train)

-python, プログラム

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