[시계열분석] 2. ARIMA
install.packages("TTR")
install.packages("forecast")
install.packages("tseries")
library(TTR)
library(forecast)
library(tseries)
data <- scan("http://robjhyndman.com/tsdldata/data/nybirths.dat")
birth <- ts(data, frequency = 12, start = c(1946, 1))
필요한 패키지들을 설치하고, '뉴욕 월별 출생자수' 데이터를 입력받습니다.
ts 함수를 쓰면 보다 편리하게 원 자료를 시계열 자료로 변환이 가능합니다.
data
birth
class(birth)
plot(birth)
전반적인 추세도 조금 있는 것 같고, 계절성이 있는 것 같아요.
평균과 분산이 시간에 따라 달라지는 것으로 관찰되는데 정상성을 만족하진 않는 자료인것 같습니다.
autoplot(decompose(birth))
시계열 자료를 원 데이터, 트렌드, 계절성, 그외 오차로 나눠주는 autoplot(decompose()) 함수 입니다.
자료를 시각적으로 보기 매우 좋은 것 같아요.
acf(birth, lag.max=20)
acf 자기상관계수 입니다. 빠르게 감소하는 지점이 있다면 MA를 쓰는게 좋으나 그렇지 않아 보입니다.
pacf(birth, lag.max=20)
pacf 편자기상관계수 입니다. 빠르게 감소하는 지점이 있다면 AR을 쓰는 것이 적절합니다.
fit <- ar(birth, method = 'mle')
fit
자동으로 P값을 정해서 계산해줍니다.
est.1 <- arima(birth, order = c(11,0,0), fixed = c(0,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
est.1
order = (p,d,q) 이고 fixed는 0인경우 그 항의 계수를 사용하지 않고 NA인 경우 계수를 사용하겠다는 의미입니다.
acf(est$residuals)
ACF 값이 안정회된 모습입니다.
Box.test(est$residuals)
통계적 검증도 할 수 있습니다.
plot(birth, type = 'l')
lines(fitted(est), col = 2, lty = 1)
예측한 값을 그래프로 표현했습니다.
fitted(est, h = 3)
fitted 함수를 가지고 모델로 만든 예측값을 사용했습니다. h를 3으로 제한했기 때문에 앞 3개 값은 나올 수가 없습니다.
ma.est = arima(birth, order = c(0,0,9))
ma.est
order = c(p, d, q) 에서 q값이 MA 개수를 결정합니다.
fitted(ma.est, h = 1)
fitted(ma.est, h = 10)
h가 일정 수준 이상 커지면 MA 모델은 평균값으로 수렴합니다.
est <- auto.arima(birth, stepwise = FALSE, max.p = 12, max.q = 10)
est
auto.arima 함수를 가지고 자동으로 arima 작업을 했습니다.
이론적으로 p, q 값을 5 이하로 하는 것이 적당한데, 그에 맞는 결과입니다.
d값은 추세를 의미합니다.
fitted(est)
plot(birth, type = 'l')
lines(fitted(est), col = 2, lty = 1)
이전 모델보다 더 잘 적합된 모습입니다.
간단한 ARIMA 모형에 대해서 공부했습니다.
AR와 MA가 무엇인지 부분적으로는 이해했는데 완벽히, 직관적으로, 누구에게 설명할 정도로 이해한 것 같진 않아서 조금 걱정입니다.
요즘 딥러닝으로 시계열 자료를 많이 예측합니다만 소규모 데이터 셋은 과적합 방지를 위해, 또 설명력을 가지기 위해 ARIMA 모델도 사용합니다.
시계열분석에 기초인 ARIMA 모델을 배워서 그동안 시계열 데이터를 보면 막막했던게 조금 사라진 것 같아요.