본문 바로가기
Data & Research

[Time series] 시계열의 정상화

by TrillionNT 2025. 1. 11.

Dr.Trillion

Time Series 목차

 

오랜만에 다시 포스팅을 올립니다. 지난번까지 해서 AR, MA process에 대해서 배웠고, estimation과 함께 Forecasting은 어떻게 할 수 있는지 parameter의 추정은 어떤 방식을 활용하는지 알아보았죠. 그런데, 이 모든 이론들을 적용하기 위해서는 필요한 가정이 있었습니다. 처음 말씀드린 것처럼 stationarity, 시계열의 정상성이 담보되었을 때만 이런 방법들을 적용할 수가 있는데요.. 그런데 우리가 현실에서 만나게 되는 수 많은 시계열들은 사실 비정상성을 보이는 경우가 많습니다. 비정상성(Non-sationarity)의 원인 또한 다양할 수 있는데 deterministic trend가 존재할 수도 있고, 주기성이 존재할 수도 있고, stoachstic trend가 존재할 수도 있습니다. 우리는 각각의 상황에 맞게 그 비정상성을 제거하고 정상성을 확보해야만 ARIMA모델을 사용할 수가 있습니다.

 

1. 결정론적 추세(Deterministic Trend)가 존재하는 경우

추세가 시간에 대한 특정 함수의 형태로 나타나는 경우라고 할 수 있습니다. 이런 경우에는 원 시계열에서 해당 추세를 제거하고 남은 정상 시계열 term에 대해 모델링을 진행합니다. 

예시) \(Y_t = \beta_0 + \beta_1 t + \epsilon_t\)

위와 같은 꼴인 경우 원 시계열에서는 deterministic trend가 존재하며 비정성성을 띱니다. 이 비정상성을 제거하기 위해서는 회귀분석을 통해 추세를 추정하고 원 시계열에서 추세를 제거해줍니다:  \(Y_t - (\beta_0 + \beta_1 t)\) 

 

2. 주기(Cycle)가 존재하는 경우

역시 마찬가지로 주기성이 시간에 대한 특정 함수로 모델링될 수 있을 경우에는 이 주기성을 제외하고 남은 부분에 대해서 모델링을 진행합니다. 

 

3. 확률론적 추세(Stochastic Trend)가 존재하는 경우

사실 앞의 두 요소들은 꽤나 직관적이고 존재여부를 판단하기도 어렵지 않습니다. (보통 눈으로 보면 트렌드가 존재한다. 주기가 있다. 쉽게 보이거든요) 그런데, stochastic trend는 약간 좀 난해한 측면이 있습니다. 항상 일정하게 증가하는 trend가 있는 것은 아니지만 계속 두면 안정적인 평균이나 분산을 가지지 않고 시간이 지날수록 충격이 누적됩니다. 이 stochastic trend의 대표적인 예시가 'Random walk'입니다. 확률론적 추세가 존재하는 경우에는 차분(Differencing)을 통해서 정상성을 확보하게 됩니다. 시계열의 확률론적 추세가 존재하는지 여부를 알아보는 것은 곧, 시계열의 단위근(Unit root)이 존재하는지 알아보는 것과 동일한 이야기입니다. (Lag Operator를 이용해서 표현했든 특성방정식 기억나시죠? 이 특성방정식의 해가 1이 되는 상황이 Stochastic trend가 존재하는 상황이기에 이름도 "unit root"라는 이름이 붙은것이죠)

 

단위근 검정에 ADF (Augmented Dickey-Fuller Test)를 주로 사용하긴 하지만 그 밖의 다른 단위근 검정도 소개하겠습니다. 한가지 명심할 부분은 어떤 방법론도 완벽한 끝판왕은 존재하지 않는다는 점입니다. 사실 엄밀하게 판단하기 위해서는 단위근 검정뿐 아니라 실제 시계열 그래프, ACF/PACF 함수를 같이 관찰해가면서 종합적인 판단을 해주어야 합니다. 

 

1) Augmented Dickey-Fuller Test (ADF Test)

귀무가설 (\(H_0\)): 단위근이 존재한다. (일반적인 가설검정과 조금 다른 부분이라 주의)

대립가설 (\(H_1\)): 단위근이 존재하지 않는다.

ADF 검정은 다음 회귀식을 기반으로 단위근을 테스트합니다: \[ \Delta Y_t = \alpha + \beta t + \gamma Y_{t-1} + \sum_{i=1}^p \delta_i \Delta Y_{t-i} + \epsilon_t, \]

\(\Delta Y_t = Y_t - Y_{t-1}\): 차분 데이터

\(\alpha\): 상수항

\(\beta t\): 시간 추세

\(\gamma\): 단위근 여부를 판단하는 계수

\(\delta_i\): 지연 차분 항의 계수

\(\epsilon_t\): white noise

 

검정 통계량은 다음과 같이 계산됩니다: \[ \tau = \frac{\hat{\gamma}}{\text{SE}(\hat{\gamma})}, \]

\(\tau\)-통계량과 임계값을 비교하여 귀무가설을 기각할지 결정합니다.

from statsmodels.tsa.stattools import adfuller

# 비정상 시계열 데이터
import numpy as np
data = np.cumsum(np.random.normal(size=100))

# ADF Test
result = adfuller(data)
print("ADF Statistic:", result[0])
print("p-value:", result[1])
print("Critical Values:", result[4])

 

 

2) KPSS Test

귀무가설 (\(H_0\)): 단위근이 존재하지 않는다.

대립가설 (\(H_1\)): 단위근이 존재한다.

KPSS 검정은 시계열을 아래와 같이 분해합니다. 

\[ Y_t = \tau_t + \eta_t + \epsilon_t, \]

\(\tau_t\): 결정론적 추세

\(\eta_t\): random walk

\(\epsilon_t\): white noise

KPSS 통계량은 다음과 같이 계산됩니다:

\[ KPSS = \frac{1}{T^2} \sum_{t=1}^T S_t^2 / \hat{\sigma}^2, \]

여기서 \(S_t\)는 누적 잔차, \(\hat{\sigma}^2\)는 잔차의 분산입니다.

from statsmodels.tsa.stattools import kpss

# KPSS Test
kpss_result = kpss(data, regression='c')
print("KPSS Statistic:", kpss_result[0])
print("p-value:", kpss_result[1])
print("Critical Values:", kpss_result[3])

 

참고자료) 블로그 글 중에 ADF에 대해 아주 상세하고 잘 정리해주신 글이 있어서 소개합니다.

https://zephyrus1111.tistory.com/169

 

[시계열 분석] 9. (Augmented) Dickey-Fuller Test(검정) with Python

이번 포스팅에서는 단위근 검정을 위한 대표적인 방법으로 Dickey-Fuller Test(검정)과 이를 확장한 Augmented Dickey Fuller Test(검정)에 대한 내용을 알아본다. 또한 Python(파이썬)을 이용하여 (Augmented) Dickey

zephyrus1111.tistory.com

 

'Data & Research' 카테고리의 다른 글

[Time series] Table of Contents  (0) 2025.02.26
[Time series] ARIMA 적용 표준절차  (2) 2025.01.11
[Time Series] ARMA parameter의 MLE 추정  (2) 2024.11.30
[Time Series] ARMA Forecast  (2) 2024.11.27
[Time series] Forecasting 일반론  (3) 2024.11.25