- 問題
- 答え
- 解説
Python コード:
import pandas as pd import numpy as np import statsmodels.tsa.stattools as ts np.random.seed(42) data = pd.DataFrame({ 'A': np.random.randn(100).cumsum(), 'B': np.random.randn(100).cumsum() }) ts.grangercausalitytests( data[['A', 'B']], maxlag=3)
回答の選択肢:
(A) 時系列データの自己相関を調べる
(B) データ間の因果関係を調べる
(C) トレンドを除去する
(D) 季節成分を分離する
Granger Causality number of lags (no zero) 1 ssr based F test: F=0.0919 , p=0.7624 , df_denom=96, df_num=1 ssr based chi2 test: chi2=0.0948 , p=0.7582 , df=1 likelihood ratio test: chi2=0.0947 , p=0.7583 , df=1 parameter F test: F=0.0919 , p=0.7624 , df_denom=96, df_num=1 Granger Causality number of lags (no zero) 2 ssr based F test: F=0.9449 , p=0.3924 , df_denom=93, df_num=2 ssr based chi2 test: chi2=1.9913 , p=0.3695 , df=2 likelihood ratio test: chi2=1.9714 , p=0.3732 , df=2 parameter F test: F=0.9449 , p=0.3924 , df_denom=93, df_num=2 Granger Causality number of lags (no zero) 3 ssr based F test: F=0.5832 , p=0.6276 , df_denom=90, df_num=3 ssr based chi2 test: chi2=1.8855 , p=0.5965 , df=3 likelihood ratio test: chi2=1.8674 , p=0.6004 , df=3 parameter F test: F=0.5832 , p=0.6276 , df_denom=90, df_num=3
正解: (B)
回答の選択肢:
(A) 時系列データの自己相関を調べる
(B) データ間の因果関係を調べる
(C) トレンドを除去する
(D) 季節成分を分離する
- コードの解説
-
このコードは、時系列データ間の因果関係を調べるためのグレンジャー因果検定(Granger Causality Test)を実行しています。
import pandas as pd import numpy as np import statsmodels.tsa.stattools as ts np.random.seed(42) data = pd.DataFrame({ 'A': np.random.randn(100).cumsum(), 'B': np.random.randn(100).cumsum() }) ts.grangercausalitytests( data[['A', 'B']], maxlag=3)
詳しく説明します。
サンプルデータを生成します。2つの列
A
とB
に対してランダムウォーク(累積和)を生成しdata
というデータフレームを作成します。np.random.seed(42) data = pd.DataFrame({ 'A': np.random.randn(100).cumsum(), 'B': np.random.randn(100).cumsum() })
data
には、以下のようなデータが格納されています。A B 0 0.496714 -1.415371 1 0.358450 -1.836016 2 1.006138 -2.178731 3 2.529168 -2.981008 4 2.295015 -3.142294 .. ... ... 95 -10.712354 4.045353 96 -10.416233 3.161495 97 -10.155178 3.315220 98 -10.150065 3.373429 99 -10.384652 2.230459 [100 rows x 2 columns]
ts.grangercausalitytests
関数を使用して、列A
とB
の間のグレンジャー因果関係を検定します。maxlag=3
は最大3ラグまでの因果関係を検定することを指定しています。ts.grangercausalitytests( data[['A', 'B']], maxlag=3)
以下、グレンジャー因果関係の検定結果です。
Granger Causality number of lags (no zero) 1 ssr based F test: F=0.0919 , p=0.7624 , df_denom=96, df_num=1 ssr based chi2 test: chi2=0.0948 , p=0.7582 , df=1 likelihood ratio test: chi2=0.0947 , p=0.7583 , df=1 parameter F test: F=0.0919 , p=0.7624 , df_denom=96, df_num=1 Granger Causality number of lags (no zero) 2 ssr based F test: F=0.9449 , p=0.3924 , df_denom=93, df_num=2 ssr based chi2 test: chi2=1.9913 , p=0.3695 , df=2 likelihood ratio test: chi2=1.9714 , p=0.3732 , df=2 parameter F test: F=0.9449 , p=0.3924 , df_denom=93, df_num=2 Granger Causality number of lags (no zero) 3 ssr based F test: F=0.5832 , p=0.6276 , df_denom=90, df_num=3 ssr based chi2 test: chi2=1.8855 , p=0.5965 , df=3 likelihood ratio test: chi2=1.8674 , p=0.6004 , df=3 parameter F test: F=0.5832 , p=0.6276 , df_denom=90, df_num=3
この結果は、グレンジャー因果検定の結果を示しています。各ラグ(遅延)に対して、複数の統計量と対応するp値が出力されています。これらのp値を使用して、因果関係の有無を判断します。
ラグ1の場合(number of lags (no zero) 1)
ssr based F test: F=0.0919, p=0.7624 ssr based chi2 test: chi2=0.0948, p=0.7582 likelihood ratio test: chi2=0.0947, p=0.7583 parameter F test: F=0.0919, p=0.7624
すべてのp値が0.05より大きいため、ラグ1では因果関係がないと判断されます。
ラグ2の場合(number of lags (no zero) 2)
ssr based F test: F=0.9449, p=0.3924 ssr based chi2 test: chi2=1.9913, p=0.3695 likelihood ratio test: chi2=1.9714, p=0.3732 parameter F test: F=0.9449, p=0.3924
すべてのp値が0.05より大きいため、ラグ2でも因果関係がないと判断されます。
ラグ3の場合(number of lags (no zero) 3)
ssr based F test: F=0.5832, p=0.6276 ssr based chi2 test: chi2=1.8855, p=0.5965 likelihood ratio test: chi2=1.8674, p=0.6004 parameter F test: F=0.5832, p=0.6276
すべてのp値が0.05より大きいため、ラグ3でも因果関係がないと判断されます。
この結果から、データの列
A
とB
の間には、指定されたラグ(1, 2, 3)においてグレンジャー因果関係がないことが示されています。すべてのp値が0.05より大きいため、因果関係が統計的に有意であるとは言えません。 - グレンジャー因果検定について
-
グレンジャー因果検定(Granger Causality Test)は、時系列データ間の因果関係を調べるための統計的手法です。
この検定は、ある時系列が他の時系列の将来の値を予測するのに役立つかどうかを判断します。
グレンジャー因果検定の仮説
- 帰無仮説 (H0): 時系列 X は時系列 Y の将来の値を予測するのに役立たない。
- 対立仮説 (H1): 時系列 X は時系列 Y の将来の値を予測するのに役立つ。
2つのモデル
まず、時系列 Y をその自身の過去の値で回帰します(自己回帰モデル)。
\displaystyle Y_t = \alpha_0 + \alpha1 Y_{t-1} + \alpha_2 Y_{t-2} + \cdots + \alpha_p Y_{t-p} + \epsilon_t次に、時系列 Y をその自身の過去の値と時系列 X の過去の値で回帰します(拡張モデル)。
\displaystyle Y_t = \beta_0 + \beta_1 Y_{t-1} + \beta_2 Y_{t-2} + \cdots + \beta_p Y_{t-p} + \gamma_1 X_{t-1} + \gamma_2 X_{t-2} + \cdots + \gamma_q X_{t-q} + \epsilon_tここで、
- Y_t は時系列 Y の現在の値
- X_t は時系列 X の現在の値
- \alpha と \beta は回帰係数
- \epsilon_t は誤差項
F検定
2つのモデルの誤差分散を比較するためにF検定を行います。
もし拡張モデルの方が有意に誤差分散が小さい場合、時系列 X は時系列 Y の将来の値を予測するのに役立つと判断されます。
- p値が小さい(一般的に0.05未満)場合、帰無仮説を棄却し、時系列 X が時系列 Y の将来の値を予測するのに役立つと判断します。
- p値が大きい場合、帰無仮説を棄却できず、時系列 X が時系列 Y の将来の値を予測するのに役立たないと判断します。
グレンジャー因果検定は因果関係を示すものではなく、予測能力を示すものです。時系列データが定常であることが前提となります。
このようにして、グレンジャー因果検定は時系列データ間の予測関係を評価するための強力なツールです。