9.6 시차 예측변수

때때로, 회귀 모델에 들어가는 예측변수(predictor variable)의 영향이 단순하거나 즉각적이지 않을 것입니다. 예를 들면, 광고 캠페인이 캠페인이 끝난 이후에도 영향을 미칠 수도 있고, 한 달 동안의 판매량은 이전 몇 달 각각의 광고 지출에 의존할 것입니다. 비슷하게, 회사의 안전 정책의 변화는 사고를 바로 줄일 수도 있겠지만, 근로자가 새로운 작업 환경에 적응하면서 덜 신경쓰게 되고 시간에 따른 효과가 줄어듭니다.

이러한 상황에서, 예측변수(predictor variable)의 시차(lag) 효과를 넣을 필요가 있습니다. 모델에서 하나의 예측변수(predictor variable)만 있는 상황을 생각해봅시다. 그러면 시차 효과를 허용하는 모델은 다음과 같이 쓸 수 있습니다. \[ y_t = \beta_0 + \gamma_0x_t + \gamma_1 x_{t-1} + \dots + \gamma_k x_{t-k} + \eta_t, \] 여기에서 \(\eta_t\)은 ARIMA 과정입니다. \(k\) 값은 AICc를 이용하여 ARIMA 오차에 대한 \(p\)\(q\) 값에 따라 고를 수 있습니다.

예제: TV 광고와 보험 견적

어떤 미국 보험 회사는 제공하는 보험 견적 수(결과적으로 새로운 정책의 수)를 늘리기 위해 전국 방송에 광고합니다. 그림 9.12은 2002년 1월부터 2005년 4월까지 그 회사의 매월 TV 광고 지출과 견적의 수를 나타냅니다.

colnames(insurance) <- c("견적수","TV광고")
autoplot(insurance, facets=TRUE) +
  xlab("연도") + ylab("") +
  ggtitle("보험 광고와 견적")
매월 제공되는 보험 견적수와 매월 광고비 지출.

Figure 9.12: 매월 제공되는 보험 견적수와 매월 광고비 지출.

colnames(insurance) <- c("Quotes","TV.advert")

최대 4개월까지의 광고 비용을 포함하여 다룰 것입니다. 즉, 이 모델에는 현재 월의 광고 비용과 3개월 전의 광고비가 들어갈 수 있습니다. 모델을 비교할 때, 모두 같은 테스트 데이터를 사용하는 것이 중요합니다. 다음의 코드에서는 공정한 비교를 위해, 첫 3개월 값을 제외합니다.

# Lagged predictors. Test 0, 1, 2 or 3 lags.
Advert <- cbind(
    AdLag0 = insurance[,"TV.advert"],
    AdLag1 = stats::lag(insurance[,"TV.advert"],-1),
    AdLag2 = stats::lag(insurance[,"TV.advert"],-2),
    AdLag3 = stats::lag(insurance[,"TV.advert"],-3)) %>%
  head(NROW(insurance))

# Restrict data so models use same fitting period
fit1 <- auto.arima(insurance[4:40,1], xreg=Advert[4:40,1],
  stationary=TRUE)
fit2 <- auto.arima(insurance[4:40,1], xreg=Advert[4:40,1:2],
  stationary=TRUE)
fit3 <- auto.arima(insurance[4:40,1], xreg=Advert[4:40,1:3],
  stationary=TRUE)
fit4 <- auto.arima(insurance[4:40,1], xreg=Advert[4:40,1:4],
  stationary=TRUE)

다음은 AICc에 기초하여 광고 예제 경우의 최적 시차 길이를 선택합니다.

c(fit1[["aicc"]],fit2[["aicc"]],fit3[["aicc"]],fit4[["aicc"]])
#> [1] 68.500 60.024 62.833 65.457

(AICc 값이 가장 작은) 가장 좋은 모델에는 2개의 시차 예측변수(lagged predictor variable)가 있습니다. 즉, 현재 달과 이전 달의 광고만 포함합니다. 따라서 이제 모든 가능한 데이터를 이용하여 다시 계산하겠습니다.

(fit <- auto.arima(insurance[,1], xreg=Advert[,1:2],
  stationary=TRUE))
#> Series: insurance[, 1] 
#> Regression with ARIMA(3,0,0) errors 
#> 
#> Coefficients:
#>         ar1     ar2    ar3  intercept  AdLag0  AdLag1
#>       1.412  -0.932  0.359      2.039   1.256   0.162
#> s.e.  0.170   0.255  0.159      0.993   0.067   0.059
#> 
#> sigma^2 estimated as 0.217:  log likelihood=-23.89
#> AIC=61.78   AICc=65.4   BIC=73.43

선택된 모델에는 AR(3) 오차가 있습니다. 이 모델은 다음과 같이 쓸 수 있습니다. \[ y_t = 2.039 + 1.256 x_t + 0.162 x_{t-1} + \eta_t, \] 여기에서 \(y_t\)\(t\)월에 제공한 보험 견적의 수이고, \(x_t\)\(t\)월의 광고 지출이고, \[ \eta_t = 1.412 \eta_{t-1} -0.932 \eta_{t-2} + 0.359 \eta_{t-3} + \varepsilon_t, \] 이며, \(\varepsilon_t\)는 백색잡음(white noise)입니다.

광고 변수의 미래 값을 가정하면, 이 모델을 가지고 예측값을 계산할 수 있습니다. 미래 월별 광고를 8 단위로 정하면, 그림 9.13에 나타낸 것과 같은 예측값을 얻습니다.

fc8 <- forecast(fit, h=20,
  xreg=cbind(AdLag0=rep(8,20), AdLag1=c(Advert[40,1],rep(8,19))))
autoplot(fc8) + ylab("견적") +
  ggtitle("미래 광고를 8로 두고 견적 예측")
미래 월별 광고 지출을 8 단위로 가정한 월별 보험 견적 예측.

Figure 9.13: 미래 월별 광고 지출을 8 단위로 가정한 월별 보험 견적 예측.