分布が正規分布かの確認をQQプロットで行う。
(1) そもそも、なぜ正規分布を確認するか?
多くの機械学習モデル(特に線形モデル)は、正規分布を仮定して出来ている。なので、各変数の分布が正規分布かどうか確認して、右に裾が長いときなど、対数変換で分布を正規分布に近づけたほうが、モデリングがうまくいく。
※ 正規分布の確認は、独立変数だけではなく、従属変数に対しても行う。
(2) QQプロットでの確認例
以下は、kaggle: House Pricesの'SalePrice'データ
# SalePriceのヒストグラム
sns.distplot(df_train['SalePrice'], fit=norm)
fig = plt.figure()
# QQプロットで正規分布に近いかを確認
res = stats.probplot(df_train['SalePrice'], plot=plt)
・SalePriceのヒストグラム
・以下が、SalePriceのQQプロット
赤い直線に沿っていれば、正規分布だが、赤い直線に沿っていないので正規分布と言えない。
そこで、対数変換してみる。
# 対数変換(下では、np.log()でそのまま値を変換しているが、値に0がある時は、+1してlog0を避けること。 np.log(df[] + 1) )
df_train['SalePrice'] = np.log(df_train['SalePrice'])
# 変換結果の可視化
sns.distplot(df_train['SalePrice'], fit=norm)
fig = plt.figure()
res = stats.probplot(df_train['SalePrice'], plot=plt)
ヒストグラムも正規分布に補正されており、QQプロットも直線になっている。
(3) 等分散性
各変数を正規分布に近づけることで、変数間の分散を揃えることができ、結果として等分散(homoscedasticity)に近づく。
・SalePriceとGrLivArea変数のどちらも正規分布に補正する前の散布図
GrLivAreaの値が1000近辺はSalePriceの分布の広がりが狭いが、GrLivAreaの値が大きくなるにつれて、SalePriceの分布が広がっており、GrLivAreaの値ごとのSalePriceの分散は異なっていることがわかる。
・SalePriceとGrLivArea変数のどちらも対数変換かけて、正規分布に近づけた場合の散布図
分布が円錐から長方形になっており、等分散性がもたらされていることがわかる。なので、各変数を正規分布に近づけると、等分散性をもたらすことができる。
0コメント