ARIMA 이해하기



데이터 분석시 가장 전통적인 시계열 통계 분석이라 하면, ARIMA모델일 것입니다.

ARIMA는 AutoRegressive Integrated MovingAverage의 약자로써
AutoRegressive / MovingAverage 2개의 모델이 합쳐지고 Stationary하게 보정된 모델입니다.
먼저 ARIMA를 설명하기 위해 간단히 두 모델을 알아보겠습니다.

1. 자기회귀모델 AR : AutoRegressive

AR모델은 이전 시점의 정보를 현재 시점에도 영향을 준다는 특징이 있습니다.

$y(t)=c+ϕ_{1}y_{t−1}+ϕ_{2}y_{t−2}+⋯+ϕ_{p}y_{t−p}+ε_{t}$

2. 이동평균모델 MA : MovingAverage

MA모델은 현재 시점과 일정 과거 시점의 에러를 평균취함으로써 변화율을 반영한다는 특징이 있습니다.

$y(t)=c+ε_{t}+θ_{1}ε_{t−1}+θ_{2}ε_{t−2}+⋯+θ_{q}ε_{t−q}$

3. ARMA : MovingAverage

ARMA모델은 자기회귀모델 AR과 이동평균모델 MA를 합친 모델입니다. 사실 ARMA모델은 우리가 알고자하는 ARIMA와는 조금 다릅니다.

바로 ARMA모델은 Non-Stationary 상태에 대응하지 못한다는 단점이 있습니다. 밑에서 Stationary / Non-Stationary 상태에 대해 알아보겠습니다.

Stationary / Non-Stationary
Detect your uniform

Stationary / Non Stationary 상태의 그래프

Stationary한 그래프는 “평균”과 “분산”이 일정한 상태를 의미합니다.

반면 위와 반대인 비정상적인 상태는 Non Stationary하다고 표현합니다. Non Stationary한 데이터들엔 어떤 종류가 있을까요?

  • 그래프의 분산은 일정하지만 평균이 상승하는 상태
  • 그래프의 분산도 평균도 불규칙한 상태
  • 그래프가 시계열적으로 골구로 퍼지지 않은 상태 (얼핏 보기에 분산이나 평균은 문제 없어 보임)
어떻게 정상상태로 바꿀까?

바로 “Differencing(차분)”을 해줌으로써 Stationary하게 그래프를 바꿔줄 수 있습니다.
이때 차분은 보통 1~2번정도 해주고, 차분 횟수에 따라 1차차분 / 2차 차분이라고 불립니다.

ARIMA란?

AR / MA / ARMA 모델은 기본적으로 데이터가 정상적인(Stationary) 시계열 데이터라는 가정하에 사용됩니다. 반면 ARIMA 모델은 데이터가 비 정상적인(Non-Stationary) 할 경우, “차분”을 통해 데이터를 정상적인(Stationary) 상태로 처리하여 ARMA모델을 사용하는 것입니다.

즉 ARIMA는 자기회귀누적이동평균 모델이며, “AR” + “I” + “MA” = “ARIMA” 라고 이해하시면 됩니다. ARIMA 모델은 (p,d,q)의 파라미터 값을 갖습니다.

$y_{t}=c+ϕ_{1}y_{t−1}+⋯+ϕ_{p}y_{t−p}+θ_{1}ε_{t−1}+⋯+θ_{q}ε_{t−q}+ε_{t}$

  • p : 자기회귀 부분의 차수
  • d : 차분의 횟수
  • q : 이동 평균 부분의 차수

자기회귀의 양을 p로, 이동평균의 합을 q로, 차분의 횟수를 d로 정합니다.



Pytorch Code

from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import statsmodels.api as sm

p = range(0,5)
d = range(1,2)
q = range(0,5)
pdq = list(itertools.product(p,d,q))
pdq = pdq[1:] # Drop (0,1,0)

aic = []
for i in pdq:
    model = ARIMA(train_sample.values, order=(i))
    model_fit = model.fit()
    print("ARIMA : {} | AIC : {:.3f}".format(i,model_fit.aic))
    aic.append(model_fit.aic)
>>> ARIMA : (0, 1, 1) | AIC : 155.020
ARIMA : (0, 1, 2) | AIC : 153.662
ARIMA : (0, 1, 3) | AIC : 155.662
ARIMA : (0, 1, 4) | AIC : 157.662
ARIMA : (1, 1, 0) | AIC : 155.087
ARIMA : (1, 1, 1) | AIC : 155.415
ARIMA : (1, 1, 2) | AIC : 155.662
ARIMA : (1, 1, 3) | AIC : 156.740
.....


Reference
  • https://otexts.com/fppkr/non-seasonal-arima.html
  • https://www.researchgate.net/figure/Forecast-from-ARIMA1-0-10-1-1-with-weekly-lags_fig4_284142511