9.5 동적 조화 회귀

긴 계절성 주기가 있을 때, 푸리에 항을 고려한 동적회귀(dynamic regression)가 종종 이 책에서 지금까지 다룬 다른 모델보다 더 좋습니다.

예를 들면, 일별 데이터에는 365 길이의 연도 계절성이 있을 수 있고, 주별 데이터는 근사적으로 52 주기의 계절성이 있을 수 있고, 30분 단위 데이터는 몇몇 계절성 주기를 가질 수 있고 그 중에서 가장 짧은 것은 주기 48의 일별 패턴입니다.

ARIMA와 ETS 모델의 계절성 형태는 월별 데이터에서 12나 분기별 데이터의 4와 같은 더 짧은 주기를 위해 설계되었습니다. ets() 함수는 계절성이 최대 24 주기값을 갖도록 제한이 있고 더 큰 계절성 주기의 데이터는 안 됩니다. 문제는 \(m\)이 계절성 주기일 때, 추정할 초기 계절성 상태에 대한 \(m-1\) 매개변수가 있다는 것입니다. 따라서 \(m\)이 클 때 추정하는 것이 거의 불가능하게 됩니다.

Arima()auto.arima() 함수에는 \(m=350\)까지 계절성 주기를 넣을 수 있습니다만, 실제로는 계절성 주기를 약 200 이상으로 잡을 때 보통은 메모리 오류가 생길 것입니다. 어쨌든, 높은 차수의 계절성 차분은 그렇게 의미 있진 않습니다 — 일별 데이터에서는 오늘 일어난 것과 정확히 1년 전에 일어난 일을 비교하는 일이 들어가고 계절성 패턴이 매끄럽다는 제한조건이 없습니다.

따라서 이러한 시계열에서는 ARMA 오차로 다루는 단기 시계열 동역학을 고려하는 푸리에 항을 이용하는 조화회귀(harmonic regression) 접근 방식이 낫습니다.

이러한 접근 방식의 장점은 다음과 같습니다:

  • 어떠한 길이의 계절성도 가능합니다;
  • 2 이상의 계절성 주기를 가지는 데이터에서, 다른 주기의 푸리에 항을 넣을 수 있습니다.
  • 계절성 패턴의 매끄러운 정도(평활도; smoothness)는 푸리에 사인과 코사인 쌍의 개수인 \(K\)로 조절할 수 있습니다. 계절성 패턴은 \(K\)가 작을수록 더 매끄럽습니다;
  • 단기 동역학을 단순한 ARMA 오차로 쉽게 다룹니다.

유일한 실제적인 단점은(계절성 ARIMA 모델과 비교할 때) 계절성이 고정되어있다고 가정하는 것입니다 — 계절성 패턴이 시간에 따라 변하지 않는다고 두는 것. 하지만 실제 상황에서 계절성은 보통 상수이고 따라서 긴 시계열을 제외하고는 이러한 단점이 그렇게 큰 문제가 되지 않습니다.

예제: 호주 외식비 지출

이 예제에서는 계절성을 잡아내는 푸리에 항과 데이터의 다른 동역학을 잡아내는 ARIMA 오차를 결합하는 것을 설명하겠습니다. 간결함을 위해, 월별 데이터 예제를 사용하겠습니다. 주별 데이터를 이용한 같은 모델링 방식을 12.1 절에서 다뤘습니다.

auscafe라는 데이터에는 호주의 카페, 식당, 테이크아웃 전문점 등의 월별 지출(단위: 10억 달러)이 2004년부터 2016년 11월까지 있습니다. 이 데이터를 사용해서 24개월 앞을 예측하겠습니다. 푸리에 사인과 코사인 쌍의 개수인 \(K\)\(K=1\)부터 \(K=6\)까지 바꿔보겠습니다(계절성 가변수(dummy variables)를 넣는 것과 같습니다). 그림 9.11\(K\)에 따라 예측된 계절성 패턴을 나타냅니다. \(K\)가 증가함에 따라, 푸리에 항이 더 “꾸불꾸불한” 계절성 패턴을 더 잘 잡아내고, 다른 동역학을 잡아내려면 더 단순한 ARIMA 모델이 필요합니다. AICc 값은 \(K=4\)에서 \(K=5\)로 갈 때 급격하게 뛰면서 \(K=5\)에서 최소가 됩니다. 따라서 이 모델에서 얻은 예측값이 사용될 수도 있겠습니다.

cafe04 <- window(auscafe, start=2004)

plots <- list()

for (i in seq(6)) {
  fit <- auto.arima(cafe04, xreg = fourier(cafe04, K = i),
    seasonal = FALSE, lambda = 0)
  plots[[i]] <- autoplot(forecast(fit,
      xreg=fourier(cafe04, K=i, h=24))) +
    xlab(paste("K=",i,"   AICC=",round(fit[["aicc"]],2))) +
    ylab("") + ylim(1.5,4.7)
}

gridExtra::grid.arrange(
  plots[[1]],plots[[2]],plots[[3]],
  plots[[4]],plots[[5]],plots[[6]], nrow=3)
푸리에 항과 ARIMA 오차를 이용한 호주 월별 외식 지출 예측.

Figure 9.11: 푸리에 항과 ARIMA 오차를 이용한 호주 월별 외식 지출 예측.