- 問題
- 答え
- 解説
Python コード:
import numpy as np
from statsmodels.tsa.stattools import adfuller
np.random.seed(42)
data = np.random.randn(200).cumsum()
for l,d in [
("原系列",data),
("1階差分",np.diff(data))
]:
s,p,lag,_,c,_ = adfuller(d, autolag='AIC')
print(f"[{l}] ADF統計量:{s:.4f} p値:{p:.4f}"
f" ラグ:{lag} 臨界値(5%):{c['5%']:.4f}")
回答の選択肢:
(A) データは定常である (B) データは非定常である(単位根を持つ) (C) データのトレンドは線形である (D) データの自己相関はゼロである
[原系列] ADF統計量:-2.3073 p値:0.1696 ラグ:0 臨界値(5%):-2.8762 [1階差分] ADF統計量:-14.6918 p値:0.0000 ラグ:0 臨界値(5%):-2.8763
正解: (B)
ADF検定(拡張ディッキー=フラー検定)の帰無仮説は「データは非定常である(単位根を持つ)」です。原系列ではp値=0.1696でありADF統計量も臨界値より大きいため帰無仮説を棄却できず、非定常と判断されます。一方、1階差分後はp値=0.0000で帰無仮説が棄却され、定常であると判断されます。これは、元データがランダムウォーク(1階差分で定常になる過程)であることと整合しています。
回答の選択肢:
(A) データは定常である (B) データは非定常である(単位根を持つ) (C) データのトレンドは線形である (D) データの自己相関はゼロである
- コードの解説
-
このコードは、時系列データとその1階差分に対してADF検定を実行し、定常性を判定しています。
import numpy as np from statsmodels.tsa.stattools import adfuller np.random.seed(42) data = np.random.randn(200).cumsum() for l,d in [ ("原系列",data), ("1階差分",np.diff(data)) ]: s,p,lag,_,c,_ = adfuller(d, autolag='AIC') print(f"[{l}] ADF統計量:{s:.4f} p値:{p:.4f}" f" ラグ:{lag} 臨界値(5%):{c['5%']:.4f}")簡単に説明します。
ライブラリのインポート
numpy:数値計算を行うためのライブラリ。ここでは乱数生成や差分処理に使用しています。statsmodels.tsa.stattools.adfuller:ADF検定(Augmented Dickey-Fuller検定)を実行する関数です。
データの生成
np.random.seed(42):乱数のシードを固定し、結果を再現可能にします。np.random.randn(200).cumsum():標準正規乱数の累積和を計算し、ランダムウォークを生成しています。ランダムウォークは非定常な時系列の代表例であり、1階差分を取ると定常過程(ホワイトノイズ)になります。
ADF検定の実行
adfuller(d, autolag='AIC'):ADF検定を実行します。autolag='AIC'によりAICを基準に最適なラグ次数が自動選択されます。戻り値は6つです。s:ADF検定統計量。値が小さい(負の方向に大きい)ほど、帰無仮説に反する証拠が強いことを意味します。p:p値。有意水準(例: 0.05)を下回れば帰無仮説を棄却できます。lag:自己相関を補正するために使用されたラグ数。c:各有意水準に対応する臨界値の辞書。
- 原系列と
np.diff(data)(1階差分)の両方に対して検定を実行し、差分処理による定常化の効果を確認しています。
- 選択肢の解説
-
(A) データは定常である → ×
「データは定常である」を帰無仮説とするのはKPSS検定です。ADF検定はこれと逆で、「データは非定常である(単位根を持つ)」が帰無仮説です。
(B) データは非定常である(単位根を持つ) → ○
正解です。ADF検定の帰無仮説は「データが単位根を持つ(非定常である)」です。p値が有意水準を下回った場合に帰無仮説が棄却され、データは定常であると判断されます。
(C) データのトレンドは線形である → ×
ADF検定はトレンドの形状を検定するものではありません。ただし、
regressionパラメータで検定式にトレンド項を含めるかどうかを指定できます(後述)。(D) データの自己相関はゼロである → ×
自己相関がゼロかどうかの検定はLjung-Box検定などで行います。ADF検定は単位根の有無を検定しており、自己相関の有無とは異なる概念です。
- ADF検定の判定方法
-
ADF検定の結果を判定するには、以下の2つの方法があります。
方法1: p値で判定
- p値 ≤ 0.05 → 帰無仮説を棄却 → 定常と判断
- p値 > 0.05 → 帰無仮説を棄却できない → 非定常の可能性
方法2: ADF統計量と臨界値で判定
- ADF統計量 < 臨界値(5%) → 帰無仮説を棄却 → 定常と判断
- ADF統計量 ≥ 臨界値(5%) → 帰無仮説を棄却できない → 非定常の可能性
今回の結果では、原系列はADF統計量-2.3073 > 臨界値-2.8762で棄却できません。1階差分はADF統計量-14.6918 < 臨界値-2.8763で棄却されます。
- ADF検定とKPSS検定の使い分け
-
ADF検定とKPSS検定は帰無仮説が逆であるため、併用することでより信頼性の高い定常性の判断ができます。
ADF検定 KPSS検定 帰無仮説 非定常(単位根あり) 定常 棄却 → 結論 定常と判断 非定常と判断 両検定の結果を組み合わせた判断パターンは以下の通りです。
- ADF棄却 + KPSS棄却せず → 定常(両方が一致)
- ADF棄却せず + KPSS棄却 → 非定常(両方が一致)
- ADF棄却 + KPSS棄却 → トレンド定常の可能性
- ADF棄却せず + KPSS棄却せず → 判断が困難(データ不足の可能性)
- regression パラメータの選び方
-
adfullerのregressionパラメータは、検定式に含める決定論的な項を指定します。デフォルトは'c'です。'n'(定数項なし):純粋なランダムウォークの検定。データが平均0付近で推移すると想定する場合に使います。'c'(定数項あり、デフォルト):ドリフト付きランダムウォークの検定。データが非ゼロの平均を持つ場合に使います。最も一般的な設定です。'ct'(定数項+トレンド項):確定的トレンドの周りでの定常性を検定します。データに明らかな線形トレンドがある場合に使います。'ctt'(定数項+トレンド項+2次トレンド項):2次トレンドを含む検定。実務ではほとんど使われません。
- ARIMAモデリングにおけるd次数の決定
ADF検定の実務的な活用法の一つは、ARIMAモデルの**差分次数d**の決定です。以下の手順で判断します。- 1. 原系列にADF検定を適用する。
- 2. 帰無仮説が棄却されなければ(非定常)、1階差分を取って再びADF検定を実行する。
- 3. 帰無仮説が棄却されれば(定常)、d=1とする。棄却されなければ、さらに差分を取る。
今回の結果から、原系列は非定常(p=0.1696)、1階差分は定常(p=0.0000)であるため、ARIMAモデルのd=1が妥当と判断できます。ただし、過剰な差分処理(d=2以上)はデータの情報を不必要に失い、モデルの性能が低下するリスクがあるため注意が必要です。

