はじめに
QQプロットと対数変換に関して解説します。
月見
- QQプロットってなんだ?
- 対数変換ってなんだ?
こういった悩みを解決したいと思います。
この記事のゴール
以下二点の疑問を解決します。
- QQプロットとは?
- 対数変換とは?
QQプロットとは?
- 観測値が正規分布に従う場合の期待値をY軸にとり、観測値そのものをX軸にとった確率でプロット
- プロット結果が一直線上に並べば、観測値は正規分布に従っていると考えられる
- 観測値を昇順に並べた順位から累積確率を求める
- 正規分布の確率密度関数の逆関数を用いて期待値を予測
- プロットが一直線上に並べば、観測値は正規分布に従っている
月見
- 一般論なのですが、データに偏りがない方が、生成するモデルが高精度化することが多いです。
- あくまでモデルの高精度化を目的とした処理なので、必ずしも正規分布に従っている必要性はないです。
対数変換とは?
- 対数変換とは、対数を取ることです
- データ分析では、log(x+1)の変換をすることがよくある
- 0を含む変数だと対数が取れないので1を加算してlogをとります
- データ分布が一方方向に裾が伸びている場合によく使う
実際の例を使って、対数変換とQQプロットの例を確認していきましょう。
ボストン住宅価格による対数変換とQQプロット
データの読み込み
#ボストン住宅価格データセットの読み込み
from sklearn.datasets import load_boston
import pandas as pd
boston = load_boston()
#説明変数
X = pd.DataFrame(boston.data,columns=boston.feature_names)
#目的変数
Y = pd.DataFrame(boston.target,columns={"Sales_Price"})
ヒストグラムの確認
今回は、目的変数の対数変換とQQプロットを確認していきます。
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import norm
# Getting the main parameters of the Normal Ditribution ()
(mu, sigma) = norm.fit(Y['Sales_Price'])
plt.figure(figsize = (12,6))
sns.distplot(Y["Sales_Price"], 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()
出力結果は以下です。
QQプロット
- Pythonでは、sm.qqplotでQQプロット可能
statsmodelsの使い方詳細は、こちらを参考にしてください。
statsmodels.graphics.gofplots.qqplot - statsmodels 0.14.1
import statsmodels.api as sm
import scipy.stats as stats
fig, ax = plt.subplots(1,2, figsize= (15,5))
fig.suptitle(" qq-plot & distribution SalePrice ", fontsize= 15)
sm.qqplot(Y["Sales_Price"], stats.t, distargs=(4,),fit=True, line="45", ax = ax[0])
sns.distplot(Y["Sales_Price"], kde = True, hist=True, fit = norm, ax = ax[1])
plt.show()
出力結果は以下です。
データが正規分布している場合、この赤い線に乗ります。
- 右のヒストグラムから、データは右側に裾が長い分布であることがわかる
そこで、対数変換でどの程度正規化されるか確認していきましょう。
対数変換
対数変換し、再度QQプロットします。
import numpy as np
Y_log = np.log1p(Y)
fig, ax = plt.subplots(1,2, figsize= (15,5))
fig.suptitle(" qq-plot & distribution SalePrice ", fontsize= 15)
sm.qqplot(Y_log["Sales_Price"], stats.t, distargs=(4,),fit=True, line="45", ax = ax[0])
sns.distplot(Y_log["Sales_Price"], kde = True, hist=True, fit = norm, ax = ax[1])
plt.show()
出力結果は以下です。
- 変換前よりは、変換後の方が正規分布に従っている
まとめ
QQプロットと対数変換に関して解説しました。
QQプロットとは、以下です。
- 観測値が正規分布に従う場合の期待値をY軸にとり、観測値そのものをX軸にとった確率プロット
- y=xの式でプロットが一直線上に並べば、観測値は正規分布に従っていると考えられる
対数変換は、以下です。
- 対数変換とは、対数を取ることです
- データ分析では、log(x+1)の変換をすることがよくある
- 0を含む変数だと対数が取れないので1を加算してlogをとります
- データ分布が一方方向に裾が伸びている場合によく使う
もっとPythonや統計学を学びたい方はこちらの記事を参考にしてみてください。
今回の記事は、以上です。
最後までお読み頂きありがとうございました。
コメント