8.5 비-계절성 ARIMA 모델
차분을 구하는 것을 자기회귀와 이동 평균 모델과 결합하면, 비-계절성(non-seasonal) ARIMA 모델을 얻습니다. ARIMA는 AutoRegressive Integrated Moving Average (이동 평균을 누적한 자기회귀)의 약자입니다(이러한 맥락에서, “누적(integration)”은 차분의 반대 의미를 갖습니다). 모델을 다음과 같이 나타낼 수 있습니다. \[\begin{equation} y'_{t} = c + \phi_{1}y'_{t-1} + \cdots + \phi_{p}y'_{t-p} + \theta_{1}\varepsilon_{t-1} + \cdots + \theta_{q}\varepsilon_{t-q} + \varepsilon_{t}, \tag{8.1} \end{equation}\] 여기에서 \(y'_{t}\)는 차분을 구한 시계열입니다(한 번 이상 차분을 구한 것일 수도 있습니다). 우변의 “예측변수(predictor)”에는 \(y_t\)의 시차 값과 시차 오차(lagged error) 둘 다를 포함합니다. 이것을 ARIMA(\(p, d, q\)) 모델이라고 부르겠습니다. 여기에서 각 변수 \(p, d, q\)는 다음과 같은 의미를 갖습니다.
\(p=\) | 자기회귀 부분의 차수; |
\(d=\) | 1차 차분이 포함된 정도; |
\(q=\) | 이동 평균 부분의 차수. |
자기회귀(autoregression)와 이동 평균 모델에 사용되는 것과 같은 정상성(stationarity)과 가역성(invertiblity) 조건은 ARIMA 모델에도 적용됩니다.
표 8.1 에서 나타낸 것처럼 지금까지 다룬 많은 모델은 ARIMA 모델의 특수한 경우입니다.
백색잡음 | ARIMA(0,0,0) |
확률보행 | 상수가 없는 ARIMA(0,1,0) |
표류를 포함하는 확률보행 | 상수가 있는 ARIMA(0,1,0) |
자기회귀 | ARIMA(\(p\),0,0) |
이동평균 | ARIMA(0,0,\(q\)) |
이러한 방식으로 더욱 복잡한 모델을 만들기 위해 성분을 결합할 때, 후방이동(backshift) 기호를 쓰면 훨씬 쉬워집니다. 예를 들어, 식 (8.1)은 후방이동 기호를 이용해서 다음과 같이 쓸 수 있습니다. \[\begin{equation} \tag{8.2} \begin{array}{c c c c} (1-\phi_1B - \cdots - \phi_p B^p) & (1-B)^d y_{t} &= &c + (1 + \theta_1 B + \cdots + \theta_q B^q)\varepsilon_t\\ {\uparrow} & {\uparrow} & &{\uparrow}\\ \text{AR($p$)} & \text{$d$ differences} & & \text{MA($q$)}\\ \end{array} \end{equation}\]
R에서는 약간 다른 매개변수화 과정을 사용합니다: \[\begin{equation} \tag{8.3} (1-\phi_1B - \cdots - \phi_p B^p)(y_t' - \mu) = (1 + \theta_1 B + \cdots + \theta_q B^q)\varepsilon_t, \end{equation}\] 여기에서 \(y_t' = (1-B)^d y_t\)이고 \(\mu\)는 \(y_t'\)의 평균입니다. (8.2)로 주어지는 형태로 바꾸기 위해, \(c = \mu(1-\phi_1 - \cdots - \phi_p )\)로 둡시다.
\(p\), \(d\), \(q\)의 적절한 값을 고르는 것이 어려울 수 있습니다. 하지만, R에서 auto.arima()
함수가 자동으로 해줄 것입니다. 8.7 절에서, 이 함수가 어떻게 작동하는지와 여러분 스스로 이러한 값을 선택할 수 있도록 돕는 몇 가지 기법을 배울 것입니다.
미국의 소비 지출
그림 8.7 은 미국 소비 지출 분기별 백분율 변화를 나타냅니다. 분기별 시계열이지만, 계절성 패턴이 나타나지 않는 것 같습니다. 따라서 비-계절성 ARIMA 모델로 맞추겠습니다.
autoplot(uschange[,"Consumption"]) +
xlab("연도") + ylab("분기별 백분율 변화")

Figure 8.7: 미국 소비 지출의 분기별 백분율 변화.
다음의 R 코드는 모델을 자동으로 선택할 때 사용합니다.
<- auto.arima(uschange[,"Consumption"], seasonal=FALSE) fit
#> Series: uschange[, "Consumption"]
#> ARIMA(1,0,3) with non-zero mean
#>
#> Coefficients:
#> ar1 ma1 ma2 ma3 mean
#> 0.589 -0.353 0.085 0.174 0.745
#> s.e. 0.154 0.166 0.082 0.084 0.093
#>
#> sigma^2 = 0.35: log likelihood = -164.8
#> AIC=341.6 AICc=342.1 BIC=361
아래는 ARIMA(1,0,3) 모델입니다: \[ y_t = c + 0.589y_{t-1} -0.353 \varepsilon_{t-1} + 0.0846 \varepsilon_{t-2} + 0.174 \varepsilon_{t-3} + \varepsilon_{t}, \] 여기에서 \(c= 0.745 \times (1 - 0.589) = 0.307\)이고 \(\varepsilon_t\)는 다음과 같이 \(0.592 = \sqrt{0.350}\) 이러한 표준 편차를 갖는 백색잡음(white noise)입니다. 그림 8.8에 모델로 얻은 예측값을 나타내었습니다.
%>% forecast(h=10) %>% autoplot(include=80) +
fit ggtitle("0이 아닌 평균을 가지는 ARIMA(2,0,2)로부터 얻은 예측값") + ylab("소비")

Figure 8.8: 미국 소비 지출의 분기별 백분율 변동의 예측값.
ARIMA 모델 이해하기
auto.arima()
함수는 유용합니다만, 모든 입력을 자동으로 결정하게 두면 약간 위험할 수 있습니다. 그리고 자동으로 모델을 고르게 두더라도 모델이 대략적으로 작동하는 방식은 공부해볼만 합니다.
상수 \(c\)는 이러한 모델에서 얻은 장기 예측값에 중요한 영향을 줍니다.
- \(c=0\)이고 \(d=0\)이면, 장기 예측값이 0에 가까워질 것입니다.
- \(c=0\)이고 \(d=1\)이면, 장기 예측값이 0이 아닌 상수에 가까워질 것입니다.
- \(c=0\)이고 \(d=2\)이면, 장기 예측값이 직선 형태로 나타나게 될 것입니다.
- \(c\ne0\)이고 \(d=0\)이면, 장기 예측값이 데이터의 평균에 가까워질 것입니다.
- \(c\ne0\)이고 \(d=1\)이면, 장기 예측값이 직선 형태로 나타나게 될 것입니다.
- \(c\ne0\)이고 \(d=2\)이면, 장기 예측값이 2차 곡선 추세로 나타나게 될 것입니다.
\(d\) 값은 예측 구간(prediction interval)에도 영향을 줍니다 — \(d\) 값이 클 수록, 예측 구간의 크기가 더욱 급격하게 늘어닙니다. \(d=0\)에서, 장기 예측 표준 편차가 과거 데이터의 표준 편차에 가까워질 것이고, 따라서 모든 예측 구간은 실제적으로는 같게 될 것입니다.
그림 8.8은 이러한 행동을 나타냅니다. 여기에서 \(d=0\)이고 \(c\ne0\)입니다. 이 그림에서, 예측 구간은 마지막 몇 개의 예측 수평선(forecast horizon)에 대한 경우와 거의 같고, 점 예측값(point forecast)은 데이터의 평균과 같습니다.
\(p\) 값은 데이터에서 주기(cycles)가 나타날 때 중요합니다. 주기적 예측값을 얻기 위해서는, 매개변수에 대한 몇 가지 추가적인 조건과 함께 \(p\ge 2\)이어야 합니다. AR(2) 모델의 경우에, \(\phi_1^2+4\phi_2<0\)이면 주기적인 행동이 나타냅니다. 이 경우에, 주기(cycle)의 평균 기간은 다음과 같습니다16. \[ \frac{2\pi}{\text{arc cos}(-\phi_1(1-\phi_2)/(4\phi_2))}. \]
ACF와 PACF 그래프
보통은 단순하게 시간 그래프(time plot)만 보고나서 어떤 \(p\)와 \(q\) 값이 데이터에 맞는지 이야기할 수 없습니다. 하지만, 적절한 \(p\)와 \(q\) 값을 결정하기 위해서 때때로 ACF 그래프와 PACF 그래프를 이용하면 가능합니다.
서로 다른 \(k\) 값에 대해, \(y_t\)와 \(y_{t-k}\)의 관계를 측정하는 자기상관값(autocorrelation)을 나타내는 ACF 그래프를 다시 떠올려봅시다. \(y_t\)와 \(y_{t-1}\)이 상관 관계가 있다면, \(y_{t-1}\)과 \(y_{t-2}\)에도 상관관계가 있어야 합니다. 하지만, \(y_t\)와 \(y_{t-2}\)는 (\(y_t\)를 예측하는데 사용될 수도 있는) \(y_{t-2}\)에 담긴 어떤 새로운 정보 때문이 아니라 단순히 두 값 모두 \(y_{t-1}\)과 관련이 있기 때문에 상관관계를 가질 수도 있습니다.
이러한 문제를 극복하기 위해, 부분 자기상관값들(partial autocorrelations)을 이용할 수 있습니다. 이 값은 시차 \(1, 2, 3, \dots, k - 1\)의 효과를 제거한 후의 \(y_{t}\)와 \(y_{t-k}\) 사이의 관계를 측정합니다. 그래서 첫 번째 부분 자기상관은 제거할 부분이 없어서 첫 번째 자기상관과 같습니다. 각 부분 자기상관은 자기회귀 모델의 마지막 계수처럼 측정할 수 있습니다. 구체적으로, \(k\)번째 부분 자기상관 계수 \(\alpha_k\)은 AR(\(k\)) 모델에서 \(\phi_k\) 측정값과 같습니다. 실제 상황에서는, 이러한 자기회귀값 전부를 맞추는 것과 같은 결과를 내면서 더 효율적으로 \(\alpha_k\)를 계산하는 알고리즘들이 존재합니다.
그림 8.9와 8.10은 그림 8.7에서 나타낸 미국 소비 데이터의 ACF와 PACF 그래프를 나타냅니다. 부분 자기상관값은 보통의 자기상관값처럼 \(\pm 1.96/\sqrt{T}\)로 같은 임계 값을 갖고, 보통은 그림 8.9에서 나타낸 것처럼 그래프로 나타냅니다.
ggAcf(uschange[,"Consumption"])

Figure 8.9: 미국 소비 데이터에서 분기별 백분율 변동의 ACF.
ggPacf(uschange[,"Consumption"])

Figure 8.10: 미국 소비 데이터에서 분기별 백분율 변동의 PACF.
데이터가 ARIMA(\(p\),\(d\),0)나 ARIMA(0,\(d\),\(q\)) 모델에서 왔다면, \(p\)나 \(q\) 값을 결정할 때 ACF와 PACF 그래프가 유용할 수 있습니다.17 \(p\)와 \(q\)가 모두 양수라면, 적절한 \(p\)와 \(q\) 값을 찾을 때 이러한 그래프는 도움이 되지 않습니다.
차분을 구한 데이터의 ACF와 PACF 그래프가 다음과 같은 패턴을 나타내면, 데이터는 ARIMA(\(p\),\(d\),0) 모델을 따를 수도 있습니다:
- ACF가 지수적으로 감소하거나 사인 함수 모양인 경우;
- PACF 그래프에서 시차 \(p\)에 뾰족한 막대가 유의미하게 있지만, 시차 \(p\) 이후에는 없을 때.
차분을 구한 데이터의 ACF와 PACF 그래프가 다음과 같은 패턴을 나타내면, 데이터는 ARIMA(0, \(d\),\(q\)) 모델을 따를 수도 있습니다:
- PACF가 지수적으로 감소하거나 사인 함수 모양인 경우;
- ACF 그래프에서 시차 \(q\)에 뾰족한 막대가 유의미하게 있지만, 시차 \(q\) 이후에는 없을 때.
그림 8.9에서, ACF에서 시차 4에서 나타나는 거의 유의미한 뾰족한 막대 이전에 3개의 뾰족한 막대가 있는 것을 알 수 있습니다. PACF에서 3개의 유의미한 뾰족한 막대가 있고, 그 이후에는 (22 뒤처짐에서 경계를 한 번 벗어나는 것을 제외하고는) 유의미하게 나타나는 뾰족한 막대가 없습니다. 각 그래프에서 처음 몇 뒤처짐이 아니라 한 번 유의미하게 경계를 벗어나는 것을 무시할 수 있습니다. 결국에, 뾰족한 막대가 유의미하게 될 확률은 1/20이고, 각 그래프에서 시차 22에서 나타나는 뾰족한 막대를 나타냈습니다. 첫 3개의 뾰족한 막대에서 나타나는 패턴은 PACF가 감소하는 경향을 통해 ARIMA(3,0,0)에서 예측했던 것입니다. 그래서 ACF와 PACF을 보면 이 경우에는 ARIMA(3,0,0) 모델이 적절할 수도 있다고 생각할 수 있습니다.
<- Arima(uschange[,"Consumption"], order=c(3,0,0)))
(fit2 #> Series: uschange[, "Consumption"]
#> ARIMA(3,0,0) with non-zero mean
#>
#> Coefficients:
#> ar1 ar2 ar3 mean
#> 0.227 0.160 0.203 0.745
#> s.e. 0.071 0.072 0.071 0.103
#>
#> sigma^2 = 0.349: log likelihood = -165.2
#> AIC=340.3 AICc=340.7 BIC=356.5
사실 이 모델은 (342.08와 비교하는 AICc 값 340.67을 가지는) auto.arima()
로 찾은 모델보다 살짝 낫습니다. auto.arima()
함수는 찾을 때 모든 가능한 모델을 고려하지 않기 때문에 이 모델을 못 찾습니다. stepwise=FALSE
와 approximation=FALSE
입력값으로 더 잘 찾을 수 있습니다:
<- auto.arima(uschange[,"Consumption"], seasonal=FALSE,
(fit3 stepwise=FALSE, approximation=FALSE))
#> Series: uschange[, "Consumption"]
#> ARIMA(3,0,0) with non-zero mean
#>
#> Coefficients:
#> ar1 ar2 ar3 mean
#> 0.227 0.160 0.203 0.745
#> s.e. 0.071 0.072 0.071 0.103
#>
#> sigma^2 = 0.349: log likelihood = -165.2
#> AIC=340.3 AICc=340.7 BIC=356.5
계절성 ARIMA 모델을 검색하지 않도록 하기 위해 입력값 seasonal=FALSE
도 사용합니다; 8.9 절에서 이러한 모델을 다루겠습니다.
이번에는 auto.arima()
가 ACF와 PACF 그래프에서 추측할 수 있는 것과 같은 모델을 찾았습니다. ARIMA(3,0,0) 모델로부터 얻은 예측값은 ARIMA(2,0,2) 모델에 대해 그림 8.8에서 나타낸 것과 거의 같기 때문에, 여기에서 그래프를 그리지는 않았습니다.