시계열의 정상성
일반적으로 시계열에서 '정상성(Stationary)'은 굉장히 중요한 의미를 갖는다.
사실 시계열을 급하게 공부해서, 정확하고 또 적확하게 개념을 이해하고 사용한 것은 아니지만, 기계적으로 시계열 데이터를 다뤘던 대부분의 경우, 시계열 데이터가 정상성을 따르는지 확인하고, 정상성을 따르지 않는다면 차분 or 변환을 통해 정상성을 만족하는 형태로 바꾸어가며, ARIMA 모델을 만들어 나갔다.
정상성(Stationary)에 대해 간략하게 정리하면, 데이터 간의 자기 상관이 없는 경우를 의미한다. 즉, 특정 시점과 h 시점 이후의 시점의 데이터는 시차(lag)에만 영향을 받고, t 와 t+h 라는 시점 자체에는 영향을 받지 않는 것을 의미한다.
이러한 정상성을 띄는 대표적인 경우가 '백색잡음(White Noise)'인데, 백색잡음은 다음의 특징을 갖는다.
- 평균이 일정하고,
- 분산도 일정하고,
- 관측치 간에 서로 상관이 없다.
이러한 특성을 만족하지 않는다면, 시계열 분석을 진행하지 못한다고 봐도 무방하다.
library(forecast) # 일반적으로 시계열 분석에 사용.
library(fpp2) # 분석에 사용할 데이터를 불러오는 라이브러리
library(tidyverse)
autoplot(AirPassengers)
'fpp2'에서 제공하는 'AirPassengers'의 데이터를 plot으로 그리면 다음과 같다.
- 데이터의 값이 시간이 지남에 따라 증가하고 있고,
- 특정 주기마다 데이터의 값이 유독 튀는(?) 시점이 있다는 것을 확인할 수 있다.
plot만 봤을 때는 평균이 일정하지 않기 때문에 추세(Trend)에 대한 부분을 제거해줘야 하고,
특정 주기마다 값이 튀기 때문에 계절성(Seasonality)에 대한 부분을 고려해야 한다는 것을 파악할 수 있다.
시계열의 고전적 분해
AirPassengers %>% decompose(type = c("additive")) %>% autoplot()
decompose 명령어를 사용하여, 주기성(Trend) + 계절성(Seasonality) + 기타 변동성(Remainder) 항목으로 각각 분해하였다. 주기성, 계절성이 있구나를 얼추 파악할 수 있다.
주기성이 있으면서 분산이 일정한 경우에는 보통 차분(differencing)을, 분산이 일정하지 않은 경우에는 변환(transformation)을 진행하는데, 해당 데이터의 경우 분산은 비교적 일정한 형태를 띄는 것으로 보이므로 차분을 사용하여 데이터를 '정상성'을 띄는 형태로 맞춰주도록 한다.
또한, 특정 주기에 따라 움직이는 형태를 보이므로 계절성 차분도 같이 고려해줘야 한다.
시계열 차분
ndiffs(AirPassengers) # 최적 차분
nsdiffs(AirPassengers) # 최적 계절성 차분을 찾아주는 함수
해당 함수를 사용할 경우, 최적 차분은 '1', 최적 계절성 차분은 '1'로 나오게 되는데 일반적으로 계절성 차분을 먼저 적용하고, 이후 차분을 적용한다.
Air.sdiffs <- diff(AirPassengers, 12)
plot(Air.sdiffs)
ndiffs(Air.sdiffs)
계절성 차분을 적용한 결과, 특정 주기성을 띄는 부분은 많이 완화되었다. 그러나 여전히 시간이 지남에 따라 값이 증가하는 추세성이 남아있다.
ndiff 함수를 통해 다시 한 번 최적 차분을 찾아본 결과, 1번의 차분이 더 필요하다고 나온다. 차분을 더 진행해본다.
Air.sdiffs.diff <- diff(Air.sdiffs)
plot(Air.sdiffs.diff)
아까보다는 훨씬 정상성에 가까운 형태임을 확인할 수 있다.
이제 ACF랑 PACF를 확인해보면, AR과 MA 모형을 각각 어떻게 적용할 수 있을지 파악할 수 있다.
원래는 ACF랑 PACF가 나름의 중요한 의미를 갖고 있을텐데, 기계적으로 급하게 주입하여 의미까지는 명확하게 모르겠다. 추후 공부를 더 진행해야 할 부분이다.
ACF, PACF
# 시계열그래프, acf, pacf를 함께 그리기
ggtsdisplay(Air.sdiffs.diff)
ggtsdisplay 명령어를 사용하면, 시계열 그래프 + ACF, PACF 그래프를 함께 보여준다.
초짜가 보기에는 ACF, PACF 모두 뭔가 애매하다(..)
일반적으로 AR 모형의 경우에는
- ACF - 지수함수적으로 감소 or 사인함수 모양으로 0에 수렴
- PACF - 특정 lag까지는 파란색 선을 넘어가는 값을 갖다가, 이후로는 0에 가깝게, 즉 특정 lag를 기점으로 값이 분절되는 형태를 갖는다.
MA 모형은 그 반대로,
- ACF - 특정 lag를 기점으로 값이 분절
- PACF - 사인 함수 모양으로 서서히 0에 가까워짐
현재 그림을 보면 ACF는 사인 함수 모양이기는 한데, 이미 왠만하면 다 파란 라인 안에 들어와있고, 특별한 분절점은 보이지 않는다. PACF도 마찬가지다.
사실 ACF, PACF만 보고 모형을 제대로 못 정하겠다
굳이 따지면 ACF에 툭 튀어나온 선이 있기 때문에 MA(1) 까지는 고려해봄직 한 것 같다.
ARIMA 모형 만들기
arima1 <- Arima(AirPassengers, order=c(0, 1, 0), seasonal=c(0, 1, 0))
arima2 <- Arima(AirPassengers, order=c(0, 1, 1), seasonal=c(0, 1, 0))
arima3 <- auto.arima(AirPassengers)
장고 끝에
- 1번 모형 - 차분만 진행
- 2번 모형 - MA(1) 까지만 적용
- 3번 모형 - 자동적으로 최적 ARIMA를 찾아주는 모형을 적용해 보았다.
원래대로라면 원본 데이터를 train vs test data set으로 나눠서, 예측력을 평가해야 하지만...
그건 다음 포스팅(?)에 정리할 예정이라 일단 전체 데이터 셋에 대해 3개 모형을 적용해 보았다.
3개 모형 결과는 다음과 같다.
auto.arima가 찾아준 모형은 ARIMA(2,1,1)(0,1,0) 모형으로 AR(2) + 1번 차분 + MA(1) 에 계절성 차분 1번이 들어간 모형이다.
auto.arima가 찾아준 모형의 AIC가 가장 낮아, 일단은 가장 좋은 모형으로 보인다.
auto.arima 기준으로 미래 데이터를 예측해보면, 다음과 같은 plot이 나온다.
시간이 지나면 지날수록, 분산이 커지면서 신뢰구간 역시 넓어지는 것을 확인할 수 있다.
ARIMA 모형의 경우, 시점에 종속적이고, 데이터의 정상성이 중요하기 때문에 일반적으로 다음의 단계를 밟아가면서 분석이 진행된다.
그러나 시계열 패키지는 ARIMA만 있는 건 아니어서!
다음에는 페이스북에서 만든 Prophet 패키지를 ARIMA 모형과 비교해보려고 한다.
그 때까지 ARIMA & Prophet 패키지를 좀 더 공부해야겠다!
참고링크
towardsdatascience.com/arima-vs-prophet-forecasting-air-passenger-numbers-4e01b2d93608
ichi.pro/ko/sigyeyeol-yecheug-arima-vs-lstm-vs-prophet-107907230218811
myinno.tistory.com/7?category=977885
'Statistics' 카테고리의 다른 글
수리통계학 - MLE와 MVUE에 대하여 (2) | 2021.08.28 |
---|---|
수리통계학 - 추정량을 선택하는 기준에 대하여 (0) | 2021.08.10 |
헷갈리는 회귀분석의 기록(2) - 회귀분석 모형 진단 (0) | 2021.02.07 |
k means clustering에 대한 고찰 (0) | 2021.01.09 |
헷갈리는 회귀분석의 기록(1) - 회귀분석의 가정 및 결정계수의 의미 (0) | 2020.11.09 |