12.9 결측값과 이상값 다루기

실제 데이터에서는 값이 없는 경우(결측값; missing value), 이상한 관측값(이상값; outlier), 그리고 다른 지저분한 특징이 종종 나타납니다. 이러한 것을 다루는 일은 골칫거리가 될 수 있습니다.

결측값

여러 이유로 데이터가 빠질 수 있습니다. 이렇게 데이터가 빠진 것 때문에 예측 모델에서 편향이 생길 것인지 여부를 고려해보는 것은 가치가 있습니다. 예를 들어, 어떤 상점의 판매량 데이터를 다루고 있는 상황을 생각해봅시다. 상점이 닫는 공휴일에는 값이 나타나지 않을 것입니다. 그리고 다음 날에는 결과적으로 판매량이 늘어날 수 있습니다. 예측 모델에서 이러한 효과를 고려하지 못한다면, 공휴일 다음 첫 날의 판매량을 낮게 추정하거나 높게 추정하게 될 것입니다. 어떤 날이 공휴일인지 공휴일 다음 날인지 나타내는 가변수(dummy variable)를 포함하는 동적회귀(dynamic regression) 모델은, 이러한 상황을 다훌 수 있는 한 가지 선택지가 될 수 있습니다. 어떠한 자동화된 기법도 이렇게 특정한 맥락에 의존하는 효과를 다룰 수 없습니다.

다른 상황에서는, 값이 빠지는 상황이 무작위로 일어날 수 있습니다. 예를 들면, 어떤 사람이 판매량을 기록하는 것을 깜빡할 수도 있고, 데이터를 기록하는 장치가 오작동할 수도 있습니다. 빠진 데이터의 타이밍이 예측 문제를 푸는데 특별한 정보를 주지 못하는 경우에는, 이렇게 빠진 값을 더 쉽게 다룰 수도 있습니다.

어떤 기법은 빠진 값을 별 문제 없이 다룹니다. 예를 들면, 단순 예측 기법(naïve forecasting method)은 가장 최근 값만 있다면 미래 시기에 대한 예측값을 낼 수 있습니다. 비슷하게, 과거 데이터에 빠진 값이 있을 때 3.1 절에서 소개한 다른 벤치마크 기법도 모두 예측값을 낼 것입니다. R에 있는 ARIMA 모델, 동적 회귀 모델, NNAR 모델 역시 작동 오류 없이 작동할 것입니다. 하지만, ets(), stlf(), tbats() 등을 포함하여 다른 모델링 함수는 빠진 값이 있을 때 처리하지 못합니다.

빠진 값 때문에 작동 오류가 생길 때는, 문제를 해결할 수 있는 방법이 적어도 2가지 있습니다. 첫 번째 방법은, 의미 있는 예측값을 내기 위해 충분히 많은 관측값이 준비되어 있다고 가정하고, 데이터 전체 중에서 가장 마지막으로 빠진 값 다음부터 사용하는 것입니다. 두 번째 방법은, 빠진 값을 추정하여 채워넣는 것입니다. na.interp() 함수는 빠진 값을 추정하여 채울 수 있게 해줍니다.

gold 데이터에는 1985년 1월 1일부터 1989년 3월 31일까지 매일 아침 금 가격이 있습니다. 이 시계열은 저자가 참여했던 컨설팅 프로젝트에서 제공 받은 것입니다. 여기에는 34개의 빠진 값이 있고 1개의 분명히 잘못된 값도 있습니다. 그림 12.9은 빠진 관측값의 추정값을 빨간색으로 나타냅니다.

gold2 <- na.interp(gold)
autoplot(gold2, series="내삽한 것") +
  autolayer(gold, series="원본") +
  scale_colour_manual(
    values=c(`내삽한 것`="red",`원본`="gray")) +
  xlab("시간")
1985년 1월 1일부터 1989년 3월 31일까지 1108 연속 거래일 동안의 금의 일별 시가.

Figure 12.9: 1985년 1월 1일부터 1989년 3월 31일까지 1108 연속 거래일 동안의 금의 일별 시가.

이 데이터와 같이 계절성이 없는 데이터의 경우에는, 단순하게 선형 내삽(Linear interpolation)으로 빠진 부분을 채웁니다. 계절성이 있는 데이터의 경우에는, 계절성 성분을 추정하기 위해 STL 분해를 사용하고, 계절성으로 조정된 시계열을 선형 내삽합니다. imputeTS 패키지에서 더 세련된 방식으로 빠진 값을 채우는 내삽 방법을 제공합니다.

이상값

이상값(outlier)들은 시계열에 있는 대부분의 관측값과는 다른 관측값입니다. 이러한 값은 오류일 수도 있고, 그냥 아주 특이한 것일 수도 있습니다. 이 책에서 다룬 모든 기법은 데이터에 극단적인 이상값이 있을 때 잘 작동하지 않습니다. 이 경우에, 이상값을 빠진값으로 처리하고 싶을 수도 있고, 데이터에 나타나는 대부분의 관측값과 더 일관적이도록 추정하고 싶을 수 있습니다.

이상값이 왜 나타나는지 생각하지 않고 단순히 이상값을 바꾸는 것은 위험합니다. 이상값을 통해 예측할 때 고려해야하는 유용한 정보(데이터를 생성하는 과정에 관한)를 얻을 수도 있습니다.

하지만, 이상값이 정말로 오류이거나 예측하려는 기간에 나타나지 않을 것이라고 가정한다면, 이러한 이상값을 바꾸는 것을 통해 예측 작업이 쉬워질 수 있습니다.

tsoutliers() 함수는 이상값을 잡아내도록 그리고 가능한 대체 값을 제시하도록 작성되었습니다. 그림 12.9에 나타난 gold 데이터에서 770일은 분명히 이상값입니다.

tsoutliers(gold)
#> $index
#> [1] 770
#> 
#> $replacements
#> [1] 494.9

더 자세히 살펴보면 주변 관측값은 분명한 이상값과는 달리 100 달러에 가깝게 나타납니다.

gold[768:772]
#> [1] 495.00 502.75 593.70 487.05 487.75

대부분 이것은 옮겨적는 과정에서 나타난 오류이고, 493.70 달러가 되어야 맞습니다.

또 하나의 유용한 함수는 tsclean()입니다. tsclean()은 이상값을 잡아내고 바꿔주며, 빠진 값으로도 바꿔줍니다. 이 함수는 정말 조심스럽게 사용해야합니다. 이 함수를 사용하면 빠진값을 다루지 못하거나 이상값에 예민하게 반응하는 예측 모델을 사용할 수 있도록 해줍니다. 예를 들면, tsclean()을 적용한 다음, ets() 함수를 gold 시계열에 사용할 수 있습니다.

gold %>%
  tsclean() %>%
  ets() %>%
  forecast(h=50) %>%
  autoplot()
이상값을 제거한 후 ETS 모델을 금 가격 데이터에 적용하여 얻은 예측값.

Figure 12.10: 이상값을 제거한 후 ETS 모델을 금 가격 데이터에 적용하여 얻은 예측값.

여기에서는 이상값과 빠진값을 추정값으로 대체하였습니다.