시계열 분석 기말 과제
기말 과제
- 1. 사용할 데이터 : mcopper
- 2. 사용할 데이터 : hsales
- (1) 변수변환이 필요한지를 설명하고 , 필요하다면 적절한 변수 변환을 하여라
- (2) 데이터가 정상시계열인가 ? 아니면 적절한 차분을 통해 정상시계열로 변환하여라 .
- (3) 모형을 식별하여라 . (2 개 이상의 모형 고려 )( 형태 : ARIMA( p.d.q )(P,D,Q)s )
- (4) (3) 에서 고려한 모형을 적합하여라 . ( 형태 : ARIMA( p.d.q )(P,D,Q)s, 모수추정값 )
- (5) (4) 에서 적합된 결과를 이용하여 더 좋은 모형을 선택하여라 .
- (6) (5) 에서 선택한 모형을 이용하여 잔차검정을 시행하여라 .
- (7) 다음 2년간의 값을 예측하여라 .
- 3 사용할 데이터 : ukcars
library(fpp2)
library(astsa)
library(data.table)
library(ggplot2)
library(gridExtra)
library(forecast)
library(portes)
library(fUnitRoots)
library(tseries)
library(sarima)
library(lmtest)
library(TTR)
z <- as.numeric(mcopper)
dt <- data.table(t = seq.Date(as.Date("1984-01-01"),
by='month',
length.out=length(mcopper)), z = z)
p3 <- ggplot(dt, aes(t, z)) +geom_line(col='steelblue') +xlab("")+ylab('')+ ggtitle('mcopper 시계열그림')+ theme_bw()
p1 <- ggAcf(dt$z) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(dt$z) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 분산이 일정하지 않은 모습을 보여, 심지어 커지기 때문에 변수 변환이 필요하겠다.
BoxCox.lambda(z, method='loglik')
0.25
- 분산안정화시켜주는 람다값은 0.25가 나왔다.
dt[, lnz := log(z)]
dt[, sqrtz := sqrt(z)]
dt[, boxcoxz := BoxCox(z,lambda= BoxCox.lambda(z))]
melt.dt <- melt(dt, id=1)
ggplot(melt.dt, aes(t, value)) +
geom_line(col='steelblue') +
xlab("")+ylab('')+
facet_wrap(variable~.,nrow=2, scales = "free_y")+
theme_bw()
- 시계열 그림을 그려보니 마지막이 독특하게 튀어나온 모습을 볼 수 있었고, 분산 안정화를 통해 정상화가 필요하겠다.
- 그림을 그려보니 trend는 모두 비슷하지만 log 변환이 가장 분산이 안정화되어 보인다.
- 그래서 log 변환을 선택해 사용할 것이다.
p3 <- ggplot(dt, aes(t, lnz)) + geom_line(col='steelblue') + xlab("")+ylab('')+ ggtitle('로그변환된 자료의 시계열그림')+ theme_bw()
p1 <- ggAcf(dt$lnz) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(dt$lnz) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 로그 변환을 통해 분산 안정화를 했더니 ACF 가 천천히 지수적으로 감소하여 차분이 필요할 것 같다.
dt[, df1_lnz := c(0, diff(lnz))]
ddt <- dt[-1,]
p3 <- ggplot(ddt, aes(t, df1_lnz)) + geom_line(col='steelblue') + xlab("")+ylab('')+ ggtitle('로그변환과 차분된 자료의 시계열그림')+ theme_bw()
p1 <- ggAcf(ddt$df1_lnz) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(ddt$df1_lnz) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 차분 후 시계열 그림을 보면 추세는 없고, 평균도 0 인것처럼보인다.
- 따라서 단위근 검정 시 상수항 없는 단위근 검정 type 옵션 nc 를 사용할 것이다.
- ACF는 1 시차 이후 절단된 형태였다.
- PACF는 빠르게 지수적으로 감소하고 있었다.
adfTest(ddt$df1_lnz, lags = 0, type = "nc")
adfTest(ddt$df1_lnz, lags = 1, type = "nc")
adfTest(ddt$df1_lnz, lags = 2, type = "nc")
- 단위근 검정을 해보아도 모두 기각하여 단위근이 없다는 결론이 나왔다.
- 따라서 추가적인 차분이 필요하지 않겠다.
auto.arima(ddt$df1_lnz, trace=T, ic='aic')
- auto.arima를 적용해보았다.
- 상수항 없는 ARIMA(0.0.1) 모형이 제일 적합하다는 결론이 나와 예측 모형을 적합해 보았다.
fit = arima(ddt$df1_lnz, order = c(0,0,1), include.mean = F)
summary(fit)
- 모형 적합 결과에서 coeff가 Se보다 크기 때문에 유의하지 않다는 근거가 생겼다.
- AIC 값은 -1561.69 가 나왔고,log-likelihood 값은 782.84 가 나왔다.
coeftest(fit)
- 위에서 로그변환 후 차분을 한 번 해줬기 때문에 원자료에 대해 모형을 표현하자면,
- $ARIMA(0,1,1)(0,0,0)_0$ 모수추정값: 0.3756
- $(1-B)lnZ_t=(1-0.3756)\epsilon_t$
- 로그변환후 차분한 데이터의 ACF,PACF 그림만 보면 ACF가 1 시차 이후 절단되었고, PACF가 지수적으로 서서히 감소하는 것처럼 보이기 때문에
- $ARIMA(0,0,1)$ 모형이 적절해 보이지만, (2)에서 이미 적합해 본 모형이기 때문에 다른 모형을 적합해보았다.
- 로그변환 후 차분한 모형에 상수항 없는 $ARIMA(1,0,0)$ 모형을 적합해보았다.
fit2 = arima(ddt$df1_lnz, order = c(1,0,0), include.mean = F)
summary(fit2)
- 모형 적합 결과에서 coeff가 Se보다 크기 때문에 유의하지 않다는 근거가 생긴다.
- AIC 값은 -1550.47이 나왔고, log likelihood 값은 777.24가 나왔다.
coeftest(fit2)
- 해당 모형도 원자료에 대해 모형을 표현하자면,
- $ARIMA(1,1,0)(0,0,0)_0$ 모수추정값: 0.324265
- $(1-0.3243B)(1-B)lnZ_t=\epsilon_t$
- (2)
- $ARIMA(0,1,1)(0,0,0)_0$ 모수추정값: 0.3756
- $(1-B)lnZ_t=(1-0.3756)\epsilon_t$
- $AIC$ 값은 -1561.69 가 나왔고,$log-likelihood$ 값은 782.84 가 나왔다.
- (3)
- $ARIMA(1,1,0)(0,0,0)_0$ 모수추정값: 0.3243
- $(1-0.3243B)(1-B)lnZ_t=\epsilon_t$
- $AIC$ 값은 -1550.47이 나왔고, $log likelihood$ 값은 777.24가 나왔다.
- AIC값은 (2)에서 적합한 모형이 더 작다.
- log likelihood 값은 (2)에서 적합한 모형이 더 크다.
- 따라서 (2)모형을 선택하였다.
ddt[, res := as.numeric(resid(fit))]
p3 <- ggplot(ddt, aes(t, res)) + geom_line(col='steelblue') + xlab("")+ylab('')+ ggtitle('ARIMA(0,1,1)(0,0,0)잔차의 시계열그림')+ theme_bw()
p1 <- ggAcf(ddt$res) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(ddt$res) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 잔차 plot이 잘 흩어져 있는 모습이지만, 등분산인지는 애매하다.
- ACF와 PACF가 모두 유의하지 않은 모습이었다. 백색소음!
dwtest(ddt$res~1)
- 더빈왓슨 검정 결과 p값은 유의하지 않아 자기상관관계가 없다고 할 수 있다.
LjungBox(fit, lags=seq(6,24,6))
- 잔차의 포트맨토 검정 결과도 모두 유의하지 않은 모습이었다.
shapiro.test(ddt$res)
- 정규성 가정을 만족하지 않은 모습이다.
qqnorm(ddt$res)
qqline(ddt$res, col = 2)
- qqplot을 보니 직선 가운데는 잘 맞지만 꼬리 쪽에서 직선을 벗어난 모습을 볼 수 있었다.
sarima.for(dt$lnz, 25, 0,1,1)
- mcopper 데이터가 2006년까지 있고, 월단위로 데이터가 있기 때문에 24이상의 값을 입력하여 2007년과 2008년 데이터를 예측해보았다.
sarima.for(ddt$df1_lnz, 25, 0,0,1)
- 로그변환 후 1차 차분한 데이터에 대해서도 예측값을 구해보았다.
- MA(1)모형의 예측값이 n+1 시차 이후 표본평균(0)에 수렴하는 모습이었다.
z<-as.numeric(hsales)
length(z)
tmp.dat <- data.table(t=seq.Date(as.Date("1949-01-01"),by='month',length.out=275),
original=z, log = log(z), sqrt = sqrt(z),
Boxcox_0.75 = BoxCox(z,lambda= BoxCox.lambda(z, method='loglik'))
)
melt.tmp <- melt(tmp.dat, id=1)
ggplot(melt.tmp, aes(t,value)) +
geom_line(col='steelblue', lwd=1) +
xlab("")+ylab("")+
ggtitle("tit")+
theme_bw()+
facet_wrap(.~variable, nrow = 2, scales = "free")
- 로그변환이 필요해보여 로그변환한 데이터를 사용할 예정이다.
p3 <- ggplot(tmp.dat, aes(t, log)) + geom_line(col='steelblue') +
xlab("")+ylab('')+ ggtitle('Time serise plot of hsales')+
theme_bw()
p1 <- ggAcf(tmp.dat$log) + theme_bw() + ylim(-1,1) +
theme(plot.title = element_blank())
p2 <- ggPacf(tmp.dat$log) + theme_bw() +ylim(-1,1) +
theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2,
layout_matrix = rbind(c(1,1), c(2,3)))
- 추세가 없어보임, 평균이 4인 것 같다.
- ACF가 빠르게 감소하고 있는 것처럼 보이면서 산처럼 솟은 곳이 보여 계절차분을 해도 되겠다.
- 혹은 ACF가 천천히 감소한다고 보고 차분을 먼저 해볼 수도 있겠다.
- PACF 1 이후 유의한 부분이 보인다. 아마 ACF에서 판단한 것처럼 계절차분이 필요하기 때문이지 않을까?
- 혹은 ACF가 빠르게 감소한다고 보고, PACF를 1시차에서 절단된다고 봐서 AR(1) 모형을 적합해보는 방법도 고려해봤다.
tmp.dat[, df1_lnz := c(0, diff(log))]
dt <- tmp.dat[-1,]
p3 <- ggplot(dt, aes(t, df1_lnz)) + geom_line(col='steelblue') + xlab("")+ylab('')+ ggtitle('1차 차분된 자료의 시계열그림')+ theme_bw()
p1 <- ggAcf(dt$df1_lnz, lag.max = 40) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(dt$df1_lnz, lag.max = 40) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 1차 차분 후 plot을 보니 위에서 예측한대로 계절주기가 보이는 것 같다.
- 즉, 우똑 솟은 유의한 값 양쪽으로도 유의한 모습을 보이고 있었다.
- 시계열 plot에서 일단 계절성이 뚜렷하고, ACF에서 주기 주변으로 유의한 값이 있는 모습, 그리고 PACF도 계절 주기에 해당되는 시차에서 서서히 감소하고 있어 계절차분이 추가로 필요함을 알 수 있었다.
adfTest(dt$df1_lnz, lags = 0, type = "ct")
adfTest(dt$df1_lnz, lags = 1, type = "ct")
adfTest(dt$df1_lnz, lags = 2, type = "ct")
- 단위근 검정을 해보니 p 값이 모두 작아 모두 기각하였으며, 단위근이 없다는 결론이 나왔다.
dt[, df12_df1_lnz := c(rep(0,12), diff(df1_lnz,12))]
sdt <- dt[-(1:12)]
p3 <- ggplot(sdt, aes(t, df12_df1_lnz)) + geom_line(col='steelblue') +xlab("")+ylab('')+ ggtitle('1차 차분 및 계절차분된 자료의 시계열그림')+theme_bw()
p1 <- ggAcf(sdt$df12_df1_lnz) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(sdt$df12_df1_lnz) + theme_bw() +ylim(-1,1) +theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 1차 차분 및 계절차분된 시계열 plot은 평균이 0인인 것처럼 보이며,
- ACF는 12에서만 유의하며,
- PACF는 12,24에서 주기적으로 유의한 값을 띄었다.
- 정상성을 띄고 있는 것으로 보면서,
- 동시에 상수항이 없는 $ARIMA(0,0,0)(0,0,1)_{12}$ 모형 잠정모형으로 적절할 것 같다는 생각을 했다.
adf.test(sdt$df12_df1_lnz)
adfTest(sdt$df12_df1_lnz, lags = 0, type = "c")
adfTest(sdt$df12_df1_lnz, lags = 1, type = "c")
adfTest(sdt$df12_df1_lnz, lags = 2, type = "c")
- 단위 검정 결과 모두 기각하여 단위근이 없다는 결과가 나왔다.
- 분산이 안정화되어 있고, 차분이 필요하지 않아 정상시계열로 변환된 것 같다.
- (2)에서 예측한대로 상수항이 없는 $ARIMA(0,0,0)(0,0,1)_{12}$ 모형이 적절해 보인다. 이때 이 잠정 모형은 1차 차분 및 계절차분에서 나온 값이기 때문에 $ARIMA(0,1,0)(0,1,1)_{12}$ 모형을 잠정모형으로 선택하였다.
- 혹은 계절 차분 전 ACF 및 PACF 를 보아 상수항 없는 $ARIMA(0,0,1)(1,0,0)_{12}$ 모형도 적합해볼 수 있겠다. 이때도 1차 차분한 데이터에서 추정한 것이기 때문에 모형 적합에서는 $ARIMA(0,1,1)(1,0,0)_{12}$ 모형을 선택하였다.
- 추가로, $ARIMA(0,1,1)(0,1,1)_{12}$ 모형과 $ARIMA(0,1,2)(1,0,0)_{12}$ 모형을 잠정모형으로 선택하였다.
fit1 = arima(tmp.dat$log, order = c(0,1,0), seasonal = list(order = c(0,1,1), period = 12))
summary(fit1)
coeftest(fit1)
- AIC 값은 -510.35이 나왔다.
- log likelihood는 257.18 이 나왔고,
- 모형 적합 결과에서 coef에 비해 se가 커 유의하지 않다는 근거가 생겼다.
- 모수 추정값은 sma1=-1.0000 이 나왔다.
fit2 = arima(tmp.dat$log, order = c(0,1,1), seasonal = list(order = c(1,0,0), period = 12))
summary(fit2)
coeftest(fit2)
- AIC 값은 -455.08가 나왔다.
- log likelihood 는 230.54 이 나왔다.
- 모형 적합 결과에서 ma1 은 coef에 비해 se가 커 유의하지 않다는 근거가 생겼지만 sar1은 유의하였다.
- 모수 추정값은 ma1=-0.0159, sar1= 0.5568 가 나왔다.
fit3 = arima(tmp.dat$log, order = c(0,1,1), seasonal = list(order = c(0,1,1), period = 12))
summary(fit3)
coeftest(fit3)
- AIC 값은 -511.21가 나왔다.
- log likelihood 는 258.6 이 나왔다.
- 모형 적합 결과에서 모두 coef에 비해 se가 커 유의하지 않다는 근거가 생겼다.
- 모수 추정값은 ma1=-0.1111, sma1=-1.0000 이 나왔다.
fit4 = arima(tmp.dat$log, order = c(0,1,2), seasonal = list(order = c(1,0,0), period = 12))
summary(fit4)
coeftest(fit4)
- AIC 값은 -454.37가 나왔다.
- log likelihood 는 231.18 이 나왔다.
- 모형 적합 결과에서 ma1,ma2 은 coef에 비해 se가 커 유의하지 않다는 근거가 생겼다. 하지만 sar1은 유의했다.
- 모수 추정값은 ma1= -0.0351, ma2=-0.0854, sar1= 0.5696 이 나왔다.
- $ARIMA(0,1,1)(0,1,1)_{12}$
- 모형의 AIC 값이 가장 작게 나왔고, log liklihood 도 가장 크게 나왔다.
- 또한 coeff 도 유의하지 않았다.
- 따라서 fit3 모형을 선택했다.
tmp.dat[, res := as.numeric(resid(fit3))]
p3 <- ggplot(tmp.dat, aes(t, res)) + geom_line(col='steelblue') +
xlab("")+ylab('')+ ggtitle('잔차의 시계열그림')+ theme_bw()
p1 <- ggAcf(tmp.dat$res) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(tmp.dat$res) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 잔차 plot을 보니 평균이 0인 것 같지만 분산이 정말 안정한지 애매하다.
- ACF, PACF 에서 유의한 값은 보이지 않았다.
dwtest(tmp.dat$res~1)
- 더빈왓슨 검정 결과 p값은 유의하지 않아 자기상관관계가 없다고 할 수 있다.
LjungBox(fit3, lags=seq(6,24,6))
- 잔차의 포트맨토검정 결과 6시차를 제외하고 유의하지 않은 모습이었다.
shapiro.test(tmp.dat$res)
- 정규성 검정 결과 p값이 0.0249로 정규성 가정을 만족하는 모습이다.
qqnorm(tmp.dat$res)
qqline(tmp.dat$res, col = 2)
- qqplot을 보니 가운데는 직선에 잘 맞는 모습이었다.
Warning: 계절성분 지정하지 않음!!!
sarima.for(tmp.dat$log, 25, 0,1,1)
- hsales 데이터는 1972년부터 달마다 데이터가 있기 때문에 24 이상 써서 예측값을 구해보았다.
sarima.for(dt$df1_lnz, 25, 0,0,1)
- 차분한 값을 적용하여서도 예측값을 구해보았다. 표본평균(0)에 수렴하는 모습이었다.
Warning: 변수 변환의 뜻은 로그변환을 의미하는 것이었지, 차분 및 계절차분을 의미한 것이 아니었습니다! 또한, 계절차분 적용하려변 분기 데이터니까 4가 적용되어야 겠죠!
z=as.numeric(ukcars)
dt <- data.table(t=seq.Date(as.Date("1977-01-01"), by='quarter', length.out=length(ukcars)), z=z)
p3 <- ggplot(dt, aes(t, z)) + geom_line(col='steelblue') +xlab("")+ylab('')+ ggtitle('Simulated AR(1) Process')+ theme_bw()
p1 <- ggAcf(dt$z) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(dt$z) + theme_bw() +ylim(-1,1) + theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
- 분산이 커지고 있지는 않다. 그래서 log 변환은 필요하지 않아 보인다.
dt[, lnz := log(z)]
dt[, sqrtz := sqrt(z)]
dt[, boxcoxz := BoxCox(z,lambda= BoxCox.lambda(z))]
melt.dt <- melt(dt, id=1)
ggplot(melt.dt, aes(t, value)) + geom_line(col='steelblue') + xlab("")+ylab('')+ facet_wrap(variable~.,nrow=2, scales = "free_y")+ theme_bw()
adfTest(dt$z, lags = 0, type = "ct")
adfTest(dt$z, lags = 1, type = "ct")
adfTest(dt$z, lags = 2, type = "ct")
- 단위근 검정 결과 모두 귀무가설 기각 못해서 단위근 있다 할 수 있음
- 즉 아직 정상성을 만족하지 못한다.
dt[, df8_z := c(rep(0,8), diff(z,8))]
sdt <- dt[-(1:8)]
p3 <- ggplot(sdt, aes(t, df8_z)) + geom_line(col='steelblue') +xlab("")+ylab('')+ ggtitle('계절차분된 자료의 시계열그림')+theme_bw()
p1 <- ggAcf(sdt$df8_z) + theme_bw() + ylim(-1,1) + theme(plot.title = element_blank())
p2 <- ggPacf(sdt$df8_z) + theme_bw() +ylim(-1,1) +theme(plot.title = element_blank())
grid.arrange(p3, p1, p2, nrow = 2, layout_matrix = rbind(c(1,1), c(2,3)))
adfTest(sdt$df8_z, lags = 0, type = "c")
adfTest(sdt$df8_z, lags = 1, type = "c")
adfTest(sdt$df8_z, lags = 2, type = "c")
- 단위근 검정 귀무가설 기각하며, 단위근이 없다는 결과가 나오고, 차분은 필요 없다.
- 정상성을 만족한다.
- PACF 1시차에서 절단되며, ACF 가 지수적으로 빠르게 감소하고 있었다.
dt_train <- dt[1:(length(z)-8),]
dt_test <- dt[(length(z)-7):length(z),]
head(dt_train)
dt_test
mean_dt <- rollmean(dt_train[,6], 10, fill = list(NA, NULL, NA))
colnames(mean_dt)=c("mean_z")
head(cbind(dt_train[,c(1,6)],mean_dt))
ggplot(data = cbind(dt_train[,c(1,6)],mean_dt), aes(x = t, y = df8_z))+
geom_line(color = "black", size = 0.7)+
geom_line(aes(t, mean_z), color = 'red', size = 1.4)
fit1 <- forecast(ts(as.numeric(mean_dt),frequency=4,start=c(1978,1)) , h=9)
fit1
plot(fit1, main="이동평균 이용한 2년 예측")
ukcars_series <- ts(dt_train[,6], start = c(1977, 1), frequency = 4)
fit2=HoltWinters(ukcars_series, seasonal="additive")
fit2
plot(fit2)
ts.plot(resid(fit2), ylab="residual", main="이중지수평활법에서의 예측오차"); abline(h=0)
fit2_2=forecast(fit2, h=8)
plot(fit2_2)
- (1)의 계절차분한 데이터에서 AR(1)이 적절하다는 것을 PACF가 1시차에서 절단되고, ACF가 빠르게 감소한다는 것을 보고 예상했다.
fit3=sarima.for(dt$df8_z, 8, 1,1,0)
head(fit3$pred + qnorm(0.975)*fit3$se) ##95% 신뢰구간 상한
head(fit3$pred - qnorm(0.975)*fit3$se) ##95% 신뢰구간 하한
dt_test
fit1
fit1_1=data.frame(fit1)
fit1_1[c(2,3,4,5,6,7,8,9),1]
diff_fit1=sum(abs((dt_test[,6] - fit1_1[c(2,3,4,5,6,7,8,9),1])/dt_test[,6]))/8*100
RMSE_fit1=sqrt(sum((dt_test[,6] - fit1_1[c(2,3,4,5,6,7,8,9),1])**2)/8)
plot.ts(dt_test[,6])
lines(fit1_1$Point.Forecast)
title(paste0("MAPE : ",diff_fit1," RMSE : ",RMSE_fit1))
- 이동 평균 이용한 2년 예측값
fit2_2
fit_2_2=data.frame(fit2_2)
diff_fit2=sum(abs((dt_test[,6] - fit_2_2$Point.Forecast)/dt_test[,6]))/8*100
RMSE_fit2=sqrt(sum((dt_test[,6] - fit_2_2$Point.Forecast)**2)/8)
plot.ts(dt_test[,6])
lines(fit_2_2$Point.Forecast)
title(paste0("MAPE : ",diff_fit2," RMSE : ",RMSE_fit2))
- 계절지수평활법을 활용한 예측값
fit3$pred
fit3$se
- 계절형 ARIMA 모형을 적합한 예측값
diff_fit3=sum(abs((dt_test[,6] - as.numeric(fit3$pred))/dt_test[,6]))/8*100
RMSE_fit3=sqrt(sum((dt_test[,6] - as.numeric(fit3$pred))**2)/8)
plot.ts(dt_test[,6])
lines(as.numeric(fit3$pred))
title(paste0("MAPE : ",diff_fit3," RMSE : ",RMSE_fit3))
- 계절형 ARIMA 에서의 2년간 예측값의 MAPE 값이 가장 작다.
- (5) 가 가장 좋은 모형으로 선택하겠다.