こんにちは、ミナピピン(@python_mllover)です。今回は時系列データ分析で必要な定常性(単位根)の確認に使用するADF検定をPythonで実装していきたいと思います。
単位根・単位根過程とは
時系列分析を学ぶ上で重要な概念である「単位根過程」は身近な時系列データの多くが単位根過程に従います。「単位根過程」というのは、データの原系列は非定常だが差分をとると(弱)定常になるようなデータのことを指します。(一応強定常性という概念はあるもののあまり使われることはないので「定常」というワードが出たら弱定常性のことだと思って大丈夫です。)
株価データなどの金融データ経済データの多くは単位根過程の1つであるランダムウォークに従うと言われています。また有名なARIMA、SARIMAモデルも単位根過程の一種です。つまり単位根が確認できればARIMAやSARIMAモデルが使える、反対に確認できないければ使えないということを意味します。
使用するデータ
お馴染みの航空データのあれです。アイスクリームの売上データと同じで周期性が明確なのでサンプルにはうってつけです。
# ライブラリをインストールする $ pip install pydse
# ライブラリの読み込み import numpy as np from pydse import data %matplotlib inline df = data.airline_passengers() df.plot()
Pythonで単位根検定を実装する
単位根過程の確認にはADF検定という仮説検定を使います。ADF検定は拡張ディッキー-フラー検定(Augmented Dickey-Fuller test, ADF test)のことで対象の時系列データが、単位根過程(非定常過程)であるかどうかを調べたい時に利用されます。ADF検定は帰無仮説が『単位根過程(非定常過程)である』と設定されており、P値でこれを棄却することで、そのデータが定常過程とみなすことができます。
正確には定常性と単位根は少し違いますが、基本はこの流れで検定を行います。詳しくは以下参照
⇒ https://qiita.com/hoto17296/items/031f24b4220893f726cd
from statsmodels.tsa.stattools import adfuller import matplotlib.pyplot as plt import pandas as pd print('Results of Dickey-Fuller Examination:') # dftest = adfuller(df['diff_change'][1:], autolag='AIC') dftest = adfuller(df['Passengers']) dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used']) for key,value in dftest[4].items(): dfoutput['Critical Value (%s)'%key] = value print(dfoutput)
<実行結果>
Results of Dickey-Fuller Examination: Test Statistic 0.815369 p-value 0.991880 #Lags Used 13.000000 Number of Observations Used 130.000000 Critical Value (1%) -3.481682 Critical Value (5%) -2.884042 Critical Value (10%) -2.578770 dtype: float64
実行結果の出力はTest StatisticとCritical Valueを見比べて結果を確認します。Test Statisticの値が高く「データが非定常である」という帰無仮説を棄却することができません。基本的に時系列データは原系列をそのままADF検定に当てはめても帰無仮説は棄却することができません。
データを加工する
基本的に時系列データは原系列をそのまま使用するのではなく、差分を取ったり対数化したり加工します。今回は差分を取ってみます。
# 変化率を取る df['diff_change'] = df['Passengers'].pct_change() # もう一回ADF検定 print('Results of Dickey-Fuller Examination:') # dftest = adfuller(df['diff_change'][1:], autolag='AIC') dftest = adfuller(df['diff'][1:]) dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used']) for key,value in dftest[4].items(): dfoutput['Critical Value (%s)'%key] = value print(dfoutput)
<実行結果>
Results of Dickey-Fuller Examination: Test Statistic -2.926109 p-value 0.042395 #Lags Used 14.000000 Number of Observations Used 128.000000 Critical Value (1%) -3.482501 Critical Value (5%) -2.884398 Critical Value (10%) -2.578960 dtype: float64
Test StatisticがCritical Value (5%) を下回っているので帰無仮説を棄却し、データに定常性があると言えそうです。
終わり
このデータは定常性があると言えるので定常過程の時系列モデルに当てはめることができるようになります。次は時系列モデルを使って時系列データ予測をしてみたいと思います。
ちなみに「時系列解析」が今あるPythonでの時系列分析の参考書の中では一番自分にはしっくり来たのでオススメです。
関連記事:【R言語】Rでの単位根検定 その1
関連記事:【R言語】Rでの単位根検定 その2
コメント
[…] ⇒ 【Python】「ADF検定」で時系列データの定常性・単位根を確認する […]
[…] ⇒ 【Python】「ADF検定」で時系列データの定常性・単位根を確認する […]