3.2 변환과 조정

과거 데이터를 조정하면 종종 예측 작업이 더 쉬워집니다. 여기에서는 달력 조정, 인구 조정, 인플레이션 조정, 수학적 변환 등 이렇게 4종류의 조정 방식을 다룹니다. 이러한 변환과 조정 방식을 사용하는 목적은 변동의 알려진 원인을 제거하거나 전체 데이터 모음에 걸친 패턴을 더 일관성 있게 만들어서 과거 데이터에 나타나는 패턴을 단순하게 만드는 것입니다.

달력 조정

계절성 데이터에 나타나는 어떤 변동은 단순히 달력 때문일 수 있습니다. 이런 경우에는, 예측 모델을 맞추기 전에, 변동을 제거하면 보통 훨씬 쉬워집니다. monthdays() 함수로 각 월과 각 분기의 날짜를 계산할 수 있습니다.

예를 들어, 여러분이 농장의 월별 우유 생산량 데이터를 다루고 있다면, 한 연도에서 단순히 각 월의 날짜 개수가 다른 것 때문에 월별 차이가 있을 것입니다.

dframe <- cbind(Monthly = milk,
                DailyAverage = milk/monthdays(milk))
  colnames(dframe) <- c("월별", "일별 평균")
  autoplot(dframe, facet = TRUE) +
    xlab("연도") + ylab("파운드") +
    ggtitle("젖소별 우유 생산량")
젖소별 월별 우유 생산량.

Figure 3.3: 젖소별 월별 우유 생산량.

일별 평균 생산량 그래프에 나타난 계절성 패턴이 얼마나 더 단순한지 월별 총 생산량 그래프와 비교하여 살펴보시길 바랍니다. 월별 총 생산량 대신에 일별 평균 생산량을 보고, 월 길이가 달라서 생기는 변동을 효과적으로 제거하였습니다. 보통 더 단순한 패턴이 모델링 작업을 더 쉽게 만들고 더 정확한 예측치를 주도록 합니다.

판매량 데이터에서 각 월의 거래일 수가 다를 때 비슷한 조정을 할 수 있습니다. 이 경우에, 모델링에서 각 월의 전체 판매량을 사용하는 대신에 거래일별 판매량을 사용할 있습니다.

인구 조정

인구 변화에 영향을 받는 데이터를 1명당 데이터로 조정할 수 있습니다. 즉, 전체 대신에 1명당 데이터(또는 천명, 백만명)를 고려하는 것입니다. 예를 들어, 어떤 특정 지역에서 시간에 따른 병원 침상 개수를 다루고 있다고 합시다. 여러분이 천명당 침상수를 고려하여 인구 변화 효과를 제거하면, 결과를 해석하기가 훨씬 더 쉬워집니다. 그러면 침상 수가 정말로 증가했는지 여부나 증가량이 완전히 인구 증가에 따른 자연스러운 현상인지 여부를 확인할 수 있습니다. 전체 침상 수는 증가하지만 천명당 침상수는 감소할 수 있습니다. 인구가 병원 침상수보다 빠르게 증가하면 이런 현상이 나타납니다. 인구 변화에 영향을 받는 대부분의 데이터에서 전체보다 1명당 데이터를 다루는 것이 좋습니다.

인플레이션 조정

돈의 가치에 영향을 받는 데이터는 모델링에 앞서 적절하게 조정되어야 합니다. 예를 들면, 인플레이션 때문에 이전 몇 십년 동안 새로운 집의 평균 가격이 증가했을 것입니다. 올해 $200,000 가격의 집은 20년 전 $200,000 가격의 집과 같지 않습니다. 이러한 이유에서, 보통은 모든 값을 특정 연도의 달러 가치로 나타내도록 금융 시계열을 조정합니다. 예를 들면, 주택 가격 데이터는 2000년대의 달러로 나타낼 수 있습니다.

이렇게 조정하기 위해, 가격 지수를 사용합니다. \(z_{t}\)가 가격 지수를 나타내고 \(y_{t}\)가 연도 \(t\)의 원래의 주택 가격을 나타낸다고 하면, \(x_{t} = y_{t}/z_{t} * z_{2000}\)는 2000년대 달러 가치로 주택 가격을 조정한 결과를 나타냅니다. 종종 정부 기관에서 가격 지수를 만듭니다. 소비재에 대해, 보통 가격 지수는 소비자 가격 지수(또는 CPI)입니다.

수학적 변환

데이터에서 시계열의 수준에 비례하여 증가하거나 감소하는 변동이 보이면, 변환(transformation)이 유용할 수 있습니다. 예를 들면, 로그 변환(log transformation)은 종종 유용합니다. 원본 관측값과 변환된 관측값을 각각 \(y_{1},\dots,y_{T}\)\(w_{1}, \dots, w_{T}\)로 쓰면, \(w_t = \log(y_t)\)입니다. 로그 값으로 바뀐 것은 원래의 눈금에 대해 상대적으로 (또는 비례하게) 바뀐 것이라서, 로그를 사용하면 의미를 해석하기 좋아서 유용합니다. 로그의 밑을 10으로 사용하면, 로그 눈금에서 1만큼 증가하는 것이 원래의 눈금에서 10배 증가한 것과 대응됩니다. 로그 변환의 또 다른 장점은 원래의 눈금에 대해 예측치를 그대로 양수로 놓는다는 것입니다.

때때로 (사용했을 때 그렇게 의미를 해석하기 쉽지는 않지만) 다른 변환도 사용합니다. 예를 들면, 제곱근과 세제곱근을 사용할 수 있습니다. 이러한 것들을 이러한 형식\(w_{t} = y_{t}^p\) 으로 쓸 수 있어서 거듭곱 변환(power transformation)이라고 합니다.

로그 변환(log transformation)과 거듭곱 변환(power transformation) 둘 다 포함하는 유용한 변환은 박스-칵스(Box-Cox) 변환의 일종입니다. 박스-칵스(Box-Cox) 변환은 매개변수 \(\lambda\)에 따라 달라지고 다음과 같이 정의됩니다. \[ w_t = \begin{cases} \log(y_t) & \text{$\lambda=0$ 인 경우}; \\ (y_t^\lambda-1)/\lambda & \text{이외의 경우}. \end{cases} \]

박스-칵스(Box-Cox) 변환에서 로그는 항상 자연 로그입니다(즉, 밑이 \(e\)). 그래서 \(\lambda=0\)이면, 자연 로그를 사용합니다만, \(\lambda \ne 0\)이면, 어떤 단순한 눈금에 따라 거듭곱 변환(power transformation)을 사용합니다.

\(\lambda=1\)이면, \(w_t = y_t-1\)이라, 변환된 데이터에서 시계열의 모양 변화 없이 아래쪽으로 이동하게 됩니다. 하지만, 모든 다른 \(\lambda\)값에 대해서는, 시계열의 모양이 변할 것입니다.

호주 월별 전력 생산을 변환하기 위해 아래의 슬라이더를 사용하여 \(\lambda\)에 따른 효과를 살펴보시길 바랍니다:

좋은 \(\lambda\) 값은 계절성 변동의 크기를 대략적으로 전체 시계열에서 나타나는 계절성 변동의 크기와 비슷하게 만듭니다. 그리고 예측 모델을 더 단순하게 만듭니다. 이 경우에, 0과 0.5사이의 \(\lambda\) 값이 \(\lambda=0.30\)와 비교했을 때 비슷한 결과를 주긴 하지만, \(\lambda=0.30\) 결과가 꽤 괜찮습니다.

BoxCox.lambda() 함수가 여러분에게 필요한 \(\lambda\) 값을 선택해줄 것입니다.

(lambda <- BoxCox.lambda(elec))
#> [1] 0.2654
autoplot(BoxCox(elec,lambda))

변환을 선택하고나면, 변환된 데이터를 예측해야 합니다. 그리고, 원래의 눈금에 대한 예측치를 얻기 위해 변환을 되돌릴 (또는 역-변환(back transformation)) 필요가 있습니다. 역 박스-칵스(Box-Cox) 변환은 다음과 같이 주어집니다. \[\begin{equation} \tag{3.1} y_{t} = \begin{cases} \exp(w_{t}) & \text{$\lambda=0$인 경우};\\ (\lambda w_t+1)^{1/\lambda} & \text{이외의 경우}. \end{cases} \end{equation}\]

거듭곱 변환의 특징

  • 어떤 \(y_{t} \le 0\)에서는 모든 관측값에 어떤 상수를 더해서 조정하지 않으면 거듭곱 변환을 사용할 수 없습니다.
  • 단순한 \(\lambda\) 값을 선택하시길 바랍니다. 그러면 설명하기 더 쉬워집니다.
  • 예측 결과가 상대적으로 \(\lambda\) 값에 따라 민감하게 변하지는 않습니다.
  • 종종 변환이 필요 없을 수 있습니다.
  • 변환해도 예측값에는 때때로 거의 차이가 없지만, 예측구간(prediction interval)에는 커다란 영향을 줍니다.

편향조정

박스-칵스(Box-Cox) 변환 같은 수학적인 변환을 사용할 때 한 가지 문제가 있는데 그것은 역-변환된 점예측값(point forecast)이 예측 분포의 평균이 되지 않는 것입니다. 사실, 보통은 (변환된 공간에서 분포가 대칭이라고 가정할 때) 예측 분포(forecast distribution)의 중간값(median)이 될 것입니다. 여러 가지 목적에서, 중간값도 괜찮긴 합니다만, 종종 평균 예측값이 필요하기도 합니다. 예를 들면, 한 나라 전체에 대한 예측값을 내기 위해 다양한 지역들의 판매량 예측값을 더하고 싶을 수 있습니다. 평균은 합산 과정이지만, 중간값(median)은 그렇지 않습니다.

박스-칵스(Box-Cox) 변환에 대해, 역 변환된 평균은 다음과 같이 주어집니다. \[\begin{equation} \tag{3.2} y_t = \begin{cases} \exp(w_t)\left[1 + \frac{\sigma_h^2}{2}\right] & \text{$\lambda=0$인 경우;}\\ (\lambda w_t+1)^{1/\lambda}\left[1 + \frac{\sigma_h^2(1-\lambda)}{2(\lambda w_t+1)^{2}}\right] & \text{이외의 경우;} \end{cases} \end{equation}\] 여기에서 \(\sigma_h^2\)\(h\)-단계 예측 분산입니다. 예측분산(forecast variance)이 클 수록, 평균과 중간값(median)의 차이가 큽니다.

(3.1)로 주어진 단순하게 역-변환된 예측값과 (3.2)로 주어진 평균 사이의 차이를 편향(bias)이라고 부릅니다. 중간값 대신 평균을 사용할 때, 점 예측치들이 편향-조정(bias-adjustment)되었다고 말합니다.

이러한 편향-조정(bias-adjustment)이 얼마나 큰 차이를 만드는지 확인하기 위해, 다음의 예제를 살펴보겠습니다. 여기에서는 로그 변환된 \((\lambda=0)\) 표류 기법(drift method)을 사용하여 달걀의 연간 평균 가격을 예측하겠습니다. 이 경우에 로그 변환(log transform)은 예측값과 예측 구간이 반드시 양수가 되도록 하는데 쓸모가 있습니다.

fc <- rwf(eggs, drift=TRUE, lambda=0, h=50, level=80)
fc2 <- rwf(eggs, drift=TRUE, lambda=0, h=50, level=80,
  biasadj=TRUE)
autoplot(eggs) +
  autolayer(fc, series="단순 역변환") +
  autolayer(fc2, series="편향 조정", PI=FALSE) +
  guides(colour=guide_legend(title="예측"))
로그 변환된 데이터에 표류를 포함하는 확률보행 기법을 사용하여 달걀 가격을 예측한 것.

Figure 3.4: 로그 변환된 데이터에 표류를 포함하는 확률보행 기법을 사용하여 달걀 가격을 예측한 것.

그림 3.4의 파란색 선은 예측 중간값을 나타내고 빨간색 선은 예측 평균값을 나타냅니다. 편향 조정을 사용할 때 한 쪽으로 쏠린 예측 분포가 점 예측치를 어떻게 끌어올리는지 주목하시길 바랍니다.

forecast 패키지에서는 편향 조정을 사용하지 않는 것이 기본값입니다. 중간값 대신에 평균 예측값이 필요하다면, 박스-칵스(Box-Cox) 변환 매개변수 중에서 biasadj=TRUE를 사용하시길 바랍니다.