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 인과관계는 다음의 유형으로 구분할 수 있다.
- X가 Y에 인과영향을 주고, Y는 X에 인과영향을 주지 않는 경우 (또는 그 반대의 경우)
- 의미: X가 Y의 미래 값을 예측하는 데 유의미한 정보를 제공하지만, Y는 X의 미래 값을 예측하지 못한다.
- 해석: X가 Y의 인과요인일 가능성이 높다.
- X와 Y가 서로 인과영향을 주는 경우
- 의미: X가 Y의 미래 값을 예측하는 데 유의미한 정보를 제공하고, Y도 X의 미래 값을 예측하는 데 유의미한 정보를 제공한다.
- 해석: 제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 인과관계의 해석과 한계
- Granger 인과관계는 진정한 인과관계를 의미하지 않는다
- Granger 인과관계는 통계적 개념으로, 실제 원인과 결과의 관계와는 다르다.
- 외생 변수 문제
- 제3의 외부 변수가 두 변수에 동시에 영향을 미치면, 두 변수 사이의 인과관계를 잘못 해석할 수 있다.
- 시차(lag) 설정의 중요성
- 잘못된 시차 설정은 Granger 인과관계 검정의 결과를 왜곡할 수 있다.
- 비선형 관계를 반영하지 못함
- Granger 검정은 선형 회귀 모델 기반으로 동작하기 때문에, 두 변수 간의 관계가 비선형적(non-linear)일 경우 올바르게 인과관계를 평가하지 못할 수 있다.
'데이터 분석' 카테고리의 다른 글
WSL Ubuntu에서 Vue.js 앱을 로컬호스트로 올리고 코드 수정하기 (0) | 2025.03.17 |
---|---|
Windows에서 WSL2와 Ubuntu 설치 및 Docker 사용하기 (0) | 2025.02.28 |
이동 평균 종류 및 python 구현 (0) | 2024.02.04 |