Python

【Python】QQプロットとは?対数変換とは?|初心者向けに解説

Python

はじめに

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
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や統計学を学びたい方はこちらの記事を参考にしてみてください。

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

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

コメント

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