時系列データの正規性
国内総生産(GDP)やトヨタの株価などは時系列データと考えられる。時系列データの変動(一日のうちの値幅でもいいし、「高値」-「低値」でもいい)を考えた時、分布の仮定として正規分布を当てはまる事が多い。ところが、実際に時系列データを解析してみると、必ずしも正規分布に当てはまらない事が多い。ここでは時系列データの変動について、正規性の検定をいくつか取り上げる。
QQプロット
まずはQQプロットから。QQプロット(Quantile-Quantile plot)は、2つの確率分布が同じであるかどうかを視覚的に比較するためのグラフィカルツールである。特に、サンプルデータが特定の確率分布に従っているかどうかを確認するためによく使用される。一般的な利用方法は次のようになる。
- まず、サンプルデータを昇順にソートする。
- 次に、各サンプルデータのパーセンタイル(または四分位数)を計算する。
- 同じパーセンタイルで対応する理論的な確率分布の値(しばしば正規分布)を計算する。
- それぞれのサンプルデータについて、その値(\(x\)軸)と対応する理論的な値(\(y\)軸)をプロットする。
その結果、データが理論的な分布に従っていれば、プロットはおおよそ直線状になるはずである。もし直線から大きく逸脱する箇所があれば、それはデータがその分布から逸脱していることを示唆する。
以下に、Pythonを使って正規分布に従うデータのQQプロットを作成する例を示す。データは前回と同一のドル円の始値、高値などのデータを用いる。
import numpy as np
import statsmodels.api as sm
import pylab as py
USDJPY_DAY = pd.read_csv("/Users/Documents/USDJPY_DAY.csv")
USDJPY_DAY["CO"] = USDJPY_DAY["closing"]-USDJPY_DAY["opening"]
sm.qqplot(USDJPY_DAY["CO"], line ='45')
py.show()
あるいは以下のコードでも良い。
fig = plt.subplots(figsize=(8,8))
stats.probplot(USDJPY_DAY["CO"], dist = "norm", plot =plt)
中心部付近を除き、分布は正規分布とは言えないことがわかる。
Shapiro-Wilk検定
シャピロウィルク検定は標本が正規分布に従う母集団からサンプリングされたという帰無仮説を検定するものである。帰無仮説は「データは正規分布に従っている」である。したがって、p値がある臨界値(通常は0.05)よりも小さい場合、データが正規分布に従うという帰無仮説を棄却する。つまり、データが正規分布に従わない可能性が高いと結論付けることができる。pythonでは以下のコードで一行で検定を行うことができる。戻り値はW値(統計検定量)とp値である。
# Shapiro-Wilk
stats.shapiro(USDJPY_DAY["CO"])
ShapiroResult(statistic=0.934580385684967, pvalue=1.1789398634863694e-38)
したがって、ドル円の「終値-始値」の分布は、正規分布には従わないと結論付けることができる。
normaltest
D’Agostino and Pearson’s testを実施する。この検定は、歪度と尖度の統計的な異常を検定する。戻り値は2つで、検定統計量と2側のp値になる。
# normaltest
stats.normaltest(USDJPY_DAY["CO"])
NormaltestResult(statistic=584.8560368506143, pvalue=1.000288426523625e-127)
Kolmogorov-Smirnov検定
この検定はサンプルが特定の分布に従うかどうかを評価する。任意の分布(正規分布だけでなく)に対して使用することができるが、他の検定よりもパワーが低いとされている。
# Kolmogorov-Smirnov
stats.kstest(USDJPY_DAY["CO"], "norm")
KstestResult(statistic=0.16410789619846874, pvalue=6.359580591289221e-94)
Anderson検定
Anderson-Darling testを実施する。この検定は、与えられたデータが特定の分布(デフォルトでは正規分布)に従っているかどうかを検定する。戻り値は検定統計量、各有意水準の臨界値のリスト、対応する有意水準のリストになる。
# Anderson
stats.anderson(USDJPY_DAY["CO"])
AndersonResult(statistic=48.345879015305854, critical_values=array([0.575, 0.655, 0.786, 0.917, 1.091]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
各検定の使い分け
各検定の特徴と使い分けは以下の通りになる。
- D’Agostino’s K-squared test(
normaltest
):これはサンプルの歪度と尖度を検査し、それらが正規分布から大きく外れているかどうかを評価する。大きなサンプルサイズに適しており、データが多少非対称でも良い結果を示す。 - Shapiro-Wilk test:データが正規分布に従っているかどうかを評価する。一般的に最もパワフルな検定と見なされているが、サンプルサイズが小さい(50未満程度)場合に最も適している。大きなサンプルサイズでは、無意味な小さな偏差でも統計的に有意となる可能性がある。
- Kolmogorov-Smirnov test:サンプルが特定の分布に従うかどうかを評価する。上の2つの検定と異なり、任意の分布(正規分布だけでなく)に対して使用できる。しかし、他の2つの検定よりもパワーが低いとされている。
したがって、サンプルサイズが小さく、特に正規性を評価したい場合はShapiro-Wilk検定が良い選択になる。サンプルサイズが大きく、データが若干の非対称性を持っていても問題ない場合は、D’Agostino’s K-squared検定が良い選択になる。正規分布以外の分布に対しても検定したい場合は、Kolmogorov-Smirnov検定を使うが、他のテストと比較してパワーが低いため注意が必要になる。
関連記事
単位根検定とは?Pythonでの実装方法と結果の解釈について
コメント