Granger 인과관계

    목차
반응형

Granger 인과관계(Granger Causality)란?

Granger 인과관계(Granger Causality)는 시계열 데이터의 인과관계를 통계적으로 분석하는 기법이다. "변수 X가 변수 Y의 미래 값을 예측하는 데 유의미한 정보를 제공하는가?"라는 질문에 답하기 위해 고안된 방법이다.

Granger 인과관계의 핵심 개념은 시계열의 시간적 선후 관계에 있다. 단순한 상관관계와는 다르게, 과거의 X 값이 Y의 미래 값을 얼마나 잘 예측하는지를 살펴본다는 점이다.

Granger 인과관계의 수학적 정의

Granger 인과관계는 다음의 두 개의 자기회귀(Autoregressive, AR) 모델을 비교함으로써 정의된다.

1. 기준 모델 (Baseline Model)

$Y_t = \alpha_0 + \sum_{i=1}^{p} \alpha_i Y_{t-i} + \varepsilon_t$

  • $Y_t$: 시점 $t$에서의 $Y$의 값
  • $Y_{t-i}$: 과거 $i$ 시점의 $Y$의 값
  • $\alpha_i$: $Y$의 과거 값에 대한 회귀 계수
  • $\varepsilon_t$: 노이즈

2. 확장 모델 (Extended Model)

$Y_t = \alpha_0 + \sum_{i=1}^{p} \alpha_i Y_{t-i} + \sum_{j=1}^{q} \beta_j X_{t-j} + \varepsilon_t$

  • $X_{t-j}$: 과거 $j$ 시점의 $X$ 값
  • $\beta_j$: $X$의 과거 값에 대한 회귀 계수

Granger 인과관계의 핵심 논리

  • 기준 모델과 확장 모델의 성능을 비교하여, 확장 모델의 예측력이 더 높다면, $X$는 $Y$의 Granger 원인(Granger cause)이라고 한다.
  • 귀무가설 $H_0$: $X$는 $Y$의 Granger 원인이 아니다. 
  • 대립가설 $H_1$: $X$는 $Y$의 Granger 원인이다.

Granger 인과관계의 유형

Granger 인과관계는 다음의 유형으로 구분할 수 있다.

  1. X가 Y에 인과영향을 주고, Y는 X에 인과영향을 주지 않는 경우 (또는 그 반대의 경우)
    • 의미: X가 Y의 미래 값을 예측하는 데 유의미한 정보를 제공하지만, Y는 X의 미래 값을 예측하지 못한다.
    • 해석: X가 Y의 인과요인일 가능성이 높다.
  2. X와 Y가 서로 인과영향을 주는 경우
    • 의미: X가 Y의 미래 값을 예측하는 데 유의미한 정보를 제공하고, Y도 X의 미래 값을 예측하는 데 유의미한 정보를 제공한다.
    • 해석: 제3의 외부 변수가 영향을 줬을 가능성이 있다.
  3. X와 Y가 서로 인과영향을 주지 않는 경우
    • 의미: X가 Y의 미래 값을 예측하는 데 기여하지 않고, Y도 X의 미래 값을 예측하는 데 기여하지 않는다.
    • 해석: 두 변수 간에 인과관계가 없거나, 다른 형태의 관계일 수 있다.

Granger 인과관계 검정 절차 (python 코드)

0. 데이터 생성

먼저 X와 시차가 1인 Y를 생성해준다.

import pandas as pd
import numpy as np

# 0. 데이터 생성
np.random.seed(42)
n = 200

# X는 무작위 노이즈로 생성
X = np.random.randn(n)

# Y는 X의 과거 값에 영향을 받는 형태로 생성(시차=1)
Y = np.zeros(n)
for t in range(1, n):
    Y[t] = 0.8 * Y[t-1] + 0.5 * X[t-1] + np.random.randn() * 0.5

df = pd.DataFrame({'X': X, 'Y': Y})

1. 데이터 전처리

  • 시계열의 정상성을 확보해야 한다.
  • 단위근 검정(Unit Root Test, 예: ADF Test)을 통해 정상성을 확인한다.
  • 정상성이 없으면 차분(differencing)을 통해 정상화한다.
from statsmodels.tsa.stattools import adfuller, grangercausalitytests

# 1. 단위근 검정 (ADF Test)
def adf_test(series):
    name = series.name
    adf, pvalue, _, _, critical_values, _ = adfuller(series)
    print(f'ADF Test for {name}:')
    print(f'ADF Statistic: {adf:.3f}')
    print(f'p-value: {pvalue:.3f}')
    print(f'Critical Values: 1%: {critical_values["1%"]:.3f}, 5%: {critical_values["5%"]:.3f}, 10%: {critical_values["10%"]:.3f}')
    if pvalue < 0.05:
        print(f'{name}는 정상성(Stationarity)을 가짐\n')
    else:
        print(f'{name}는 정상성이 없음. 차분이 필요함\n')

adf_test(df['X'])
adf_test(df['Y'])
ADF Test for X:
ADF Statistic: -14.744
p-value: 0.000
Critical Values: 1%: -3.464, 5%: -2.876, 10%: -2.575
X는 정상성(Stationarity)을 가짐

ADF Test for Y:
ADF Statistic: -3.527
p-value: 0.007
Critical Values: 1%: -3.464, 5%: -2.876, 10%: -2.575
Y는 정상성(Stationarity)을 가짐

검정 결과 X와 Y 모두 정상성을 가져 차분을 하지 않아도 된다. 정상성을 지니지 않아 차분이 필요할 경우 아래와 같은 방법으로 확인하고, 정상성을 가지면 `df_diff`를 이용하여 검정을 이어간다.

# 1차 차분 후 정상성 확인
df_diff = df.diff().dropna()
adf_test(df_diff['X'], 'X (1st Difference)')
adf_test(df_diff['Y'], 'Y (1st Difference)')

2. 시차(lag) 선택

  • 몇 시차(lag)까지 고려할지를 결정해야 한다.
  • Akaike 정보 기준(AIC), Bayesian 정보 기준(BIC) 등을 활용하여 최적의 시차를 선택한다.
from statsmodels.regression.linear_model import OLS
import statsmodels.api as sm

# 2. 최적 시차(lag) 선택 (AIC, BIC 계산)
def select_best_lag(y, x, max_lag=10):
    """ AIC와 BIC를 기반으로 최적 시차를 찾는 함수 """
    aic_values = []
    bic_values = []
    lags = list(range(1, max_lag + 1))

    for lag in lags:
        # 시차 데이터 생성
        df_lagged = df.copy()
        df_lagged[f'X_lag{lag}'] = df['X'].shift(lag)
        df_lagged = df_lagged.dropna()

        # OLS 회귀 분석 (Y ~ X_lag)
        X_lagged = sm.add_constant(df_lagged[f'X_lag{lag}'])
        model = OLS(df_lagged['Y'], X_lagged).fit()

        # AIC, BIC 저장
        aic_values.append(model.aic)
        bic_values.append(model.bic)

    # 최적 시차 선택
    best_aic_lag = lags[np.argmin(aic_values)]
    best_bic_lag = lags[np.argmin(bic_values)]

    return best_aic_lag, best_bic_lag

# 최적 시차 선택
best_aic_lag, best_bic_lag = select_best_lag(df['Y'], df['X'])

print(f"최적 시차 선택:")
print(f"AIC 기준 최적 시차: {best_aic_lag}")
print(f"BIC 기준 최적 시차: {best_bic_lag}\n")
최적 시차 선택:
AIC 기준 최적 시차: 1
BIC 기준 최적 시차: 1

시차를 1로 설정했으니 당연하겠지만 최적 시차는 1로 선정이 되었다.

3. Granger 인과관계 검정

  • 기준 모델과 확장 모델의 성능을 비교한다.
  • F-검정을 수행해 귀무가설을 기각할 수 있는지를 판단한다.
  • 테스트 시 영향을 받는 인자를 앞에 두고 실행
    • X → Y를 확인 = `grangercausalitytests(df[['Y', 'X']], maxlag=max_lag)`)
# 3. Granger 인과관계 검정 (최적 시차 적용)
max_lag = max(best_aic_lag, best_bic_lag) # 보수적으로 큰 lag 선정
print(f"Granger Causality Test (최대 시차 {max_lag} 적용)")
granger_results = grangercausalitytests(df[['Y', 'X']], maxlag=max_lag)
Granger Causality Test (최대 시차 1 적용)

Granger Causality
number of lags (no zero) 1
ssr based F test:         F=216.2652, p=0.0000  , df_denom=196, df_num=1
ssr based chi2 test:   chi2=219.5754, p=0.0000  , df=1
likelihood ratio test: chi2=147.9669, p=0.0000  , df=1
parameter F test:         F=216.2652, p=0.0000  , df_denom=196, df_num=1
  • 반대로 Y → X도 확인
granger_results = grangercausalitytests(df[['X', 'Y']], maxlag=max_lag)
Granger Causality
number of lags (no zero) 1
ssr based F test:         F=0.8887  , p=0.3470  , df_denom=196, df_num=1
ssr based chi2 test:   chi2=0.9023  , p=0.3422  , df=1
likelihood ratio test: chi2=0.9003  , p=0.3427  , df=1
parameter F test:         F=0.8887  , p=0.3470  , df_denom=196, df_num=1

Granger 인과관계 결과 해석

  • X → Y의 F test의 p-value가 0.0000로 매우 낮기 때문에, 귀무가설 $H_0$ (X는 Y의 Granger 원인이 아니다)를 기각할 수 있다.
  • 한편 Y → X의 F test의 p-value가 0.3470로 높기 때문에, 귀무가설 $H_0$를 기각할 수 없다.
  • 앞선 인과관계 유형 중 1번에 해당한다. 따라서 X가 Y의 Granger 원인임을 확인할 수 있다.

▼ 검정 결과 종류

더보기

1. F-검정 (ssr based F test, parameter F test)

(1) SSR 기반 F-검정 (ssr based F test)

: 귀무가설 $H_0$가 성립할 때, 기준 모델과 확장 모델의 SSR 차이를 검정

: 귀무가설 $H_0$ = $SSR_{baseline} \approx SSR_{extended}$

: 대립가설 $H_1$ = $SSR_{baseline} > SSR_{extended}$

(2) Parameter F-검정 (parameter F test)

: 회귀 모델의 계수(parameter)가 0인지 여부를 검정

: 귀무가설 $H_0$ = $(\beta_1 = \beta_2 = \cdots = \beta_q = 0)$

: 대립가설 $H_1$ = $ \exists \, j \text{ such that } \beta_j \neq 0 $

2. 카이제곱 검정 (ssr based chi2 test)

: 기준 모델과 확장 모델 간의 SSR 차이를 검정하며 샘플 크기가 매우 클 때 더 안정적인 결과를 제공

: SSR 기반 F-검정과 귀무가설, 대립가설이 동일하며, 통계량만 카이제곱 검정으로 바꾼 것과 같음

3. 우도비 검정 (likelihood ratio test)

: 기준 모델과 확장 모델의 로그 우도(log-likelihood) 차이를 계산하여 두 모델이 얼마나 다른지를 평가

: 귀무가설 $H_0$ = $\log L_{baseline} \approx \log L_{extended}$

: 대립가설 $H_1$ = $\log L_{baseline} < \log L_{extended}$

 

Granger 인과관계의 해석과 한계

  1. Granger 인과관계는 진정한 인과관계를 의미하지 않는다
    • Granger 인과관계는 통계적 개념으로, 실제 원인과 결과의 관계와는 다르다.
  2. 외생 변수 문제
    • 제3의 외부 변수가 두 변수에 동시에 영향을 미치면, 두 변수 사이의 인과관계를 잘못 해석할 수 있다.
  3. 시차(lag) 설정의 중요성
    • 잘못된 시차 설정은 Granger 인과관계 검정의 결과를 왜곡할 수 있다.
  4. 비선형 관계를 반영하지 못함
    • Granger 검정은 선형 회귀 모델 기반으로 동작하기 때문에, 두 변수 간의 관계가 비선형적(non-linear)일 경우 올바르게 인과관계를 평가하지 못할 수 있다.
728x90
반응형