6.6 STL 분해

STL은 다양한 상황에서 사용할 수 있는 강력한 시계열 분해 기법입니다. STL은 “Seasonal and Trend decomposition using Loess(Loess를 사용한 계절성과 추세 분해)”의 약자입니다. 여기에서 Loess는 비선형 관계를 추정하기 위한 기법입니다. STL기법은 Cleveland, Cleveland, McRae, & Terpenning (1990) 가 개발하였습니다.

STL은 고전적인 분해, SEATS, X11을 뛰어넘는 몇 가지 장점을 가지고 있습니다:

  • SEAT와 X11과는 다르게, STL은 월별이나 분기별 데이터를 포함하여 어떤 종류의 계절성도 다룰 수 있습니다.

  • 계절적인 성분이 시간에 따라 변해도 괜찮습니다. 계절성분의 변화율을 사용자가 조절할 수 있습니다.

  • 추세-주기의 매끄러운 정도를 사용자가 조절할 수 있습니다.

  • 가끔 있는 이상값이 추세-주기와 계절성분에 영향을 주지 않게 만들 수 있습니다(즉, 사용자가 강력한 분해법을 명시할 수 있습니다). 하지만, 이상값은 나머지 성분(remainder)에 영향을 줄 것입니다.

반면에, STL은 몇 가지 단점을 가지고 있습니다. 특별히, 거래일이나 달력 변동을 자동으로 다루지 않고, 덧셈 분해만 지원합니다.

데이터에 먼저 로그를 취하고 성분을 다시 원래대로 되돌리는 방식으로 곱셈 분해를 얻을 수 있습니다. \(0<\lambda<1\)로 데이터의 박스-칵스(Box-Cox) 변환으로 덧셈과 곱셈 사이의 분해를 얻을 수 있습니다. \(\lambda=0\) 값은 곱셈 분해, \(\lambda=1\) 은 덧셈 분해와 같습니다.

몇 가지 설정과 함께 예제와 실험을 살펴보는 것이 STL 사용법을 익히는 가장 좋은 방법입니다. 그림 6.2은 전자 장비 지수 데이터에 STL을 적용한 예입니다. 그림 6.13은 또 다른 STL 분해를 나타냅니다. 여기에서 추세-주기가 더 유동적이며, 계절성분이 시간에 따라서 변하지 않고, 안전한 옵션을 사용하였습니다. 시계열 후반부에 감소 추세가 있다는 것과 (나머지 성분에서 큰 음수값 몇몇과 관계 있는) 2009년의 값이 특이하게 낮다는 것을 분명하게 알 수 있습니다.

elecequip %>%
  stl(t.window=13, s.window="periodic", robust=TRUE) %>%
  autoplot()
전자 장비 지수(위)와 유동적인 추세-주기와 고정된 계절성을 고려하는 안정적인 STL 분해로부터 얻은 세 가지 덧셈 성분.

Figure 6.13: 전자 장비 지수(위)와 유동적인 추세-주기와 고정된 계절성을 고려하는 안정적인 STL 분해로부터 얻은 세 가지 덧셈 성분.

STL을 사용할 때 선택한 두 개의 주 매개변수는 추세-주기 윈도우(t.window)와 계절성 윈도우(s.window)입니다. 이러한 매개변수로 추세-주기와 계절성분이 급격하게 변할 지 조절할 수 있습니다. 값이 작을 수록 더 급격하게 변합니다. t.windows.window 둘 다 홀수이어야 합니다. t.window는 추세-주기를 추정할 때 사용할 연이은 관측값의 개수이고, s.window는 계절성분에서 각 값을 추정할 때 사용할 연이은 관측값의 개수입니다. s.window에 기본 설정값이 없기 때문에 값을 설정해야만 합니다. 계절성 윈도우를 무한대로 설정하면 계절성분을 주기적으로 고정하는 것과 같습니다(즉, 매년 같게 두는 것입니다). t.window를 정하는 것은 선택사항이며, 생략하면 기본 설정값을 사용할 것입니다.

mstl() 함수는 s.window=13와 자동으로 선택한 t.window를 이용하여 STL 분해를 자동으로 수행합니다. 이 함수는 보통 계절성에 과대적합(over-fitting)이 일어나는 것과 시간에 따른 느린 변화를 허용하는 사이의 균형을 맞춰줍니다. 하지만, 자동화된 과정이라서, 기본 설정 때문에 몇몇 시계열에 대해 조정하는 작업이 필요할 것입니다.

이 책에서 다루는 다른 분해 기법처럼, 그림 6.8에 나타낸 성분을 구하려면 계절성분에 대해서는 seasonal() 함수를, 추세-주기 성분에 대해서는 trendcycle() 함수를, 나머지 성분에 대해서는 remainder() 함수를 사용하시길 바랍니다. 계절성으로 조정된 시계열을 계산하기 위해 seasadj() 함수를 사용할 수 있습니다.

참고 문헌

Cleveland, R. B., Cleveland, W. S., McRae, J. E., & Terpenning, I. J. (1990). STL: A seasonal-trend decomposition procedure based on loess. Journal of Official Statistics, 6(1), 3–33. http://bit.ly/stl1990