library(readr)
library(dplyr)
library(lubridate)
library(purrr)
library(zoo)
library(recipes)
library(imputeTS)
library(tidyr)
# Data Set
library(fpp2)
# model and evaluation
library(forecast)
library(TTR)
library(tseries)
# visualization
library(ggplot2)
library(TSstudio)
library(plotly)
options(scipen = 999)candy_ts <- ts(data = candy$IPG3113N,
start = c(1972, 1),
end = c(2017,8),# opsional
frequency = 12 # sesuai pola musiman
)#Cross Validation.
# data test
candy_test <- tail(candy_ts, 12)
# data train
candy_train <- head(candy_ts, length(candy_ts) - 12)
candy_train %>%
autoplot() +
autolayer(candy_test, series = "Data Test") +
theme(legend.position = "top")Terlihat pola multi seasonal ketika di lakukan decompose pola trend penjualan naik selalu terlihat ketika ingin tahun baru.
## Holt-Winters exponential smoothing without trend and without seasonal component.
##
## Call:
## HoltWinters(x = candy_train, beta = F, gamma = F)
##
## Smoothing parameters:
## alpha: 0.9999339
## beta : FALSE
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 104.6976
Membuat model SES menggunakan function HoltWinters() dari package stats.
alpha : koefisien untuk komponen random/residual.
beta : koefisien untuk komponen trend.gamma : koefisien untuk komponen seasonality.seasonality : menentukan jenis model seasonality (additive/multiplicative).forecast_ses1 <- forecast(candy_ses, # nama model
h = 12 # meramal data untuk 12 bulan ke depan (1 tahun)
)
forecast_ses1 %>%
autoplot()## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03552213 9.078150 6.387317 -0.3747221 6.419526 1.232895
## Test set 5.30428212 7.748825 6.201541 4.5710061 5.447342 1.197037
## ACF1 Theil's U
## Training set 0.2634750 NA
## Test set 0.4462207 1.268245
dengan menggunakan model ses MAE yang didapat cukup besar.
Boleh juga dicoba bandingkan seasonal additive dan multiplicative
Holt Linear Method (hanya menggunakan trend)
Jika seasonal tidak ditulis, by default seasonal = “additive”
# dengan seasonal = "additive"
candy_seasonal <- HoltWinters(candy_train)
forecast_candy_seasonal <- forecast(candy_seasonal, 12)
accuracy(forecast_candy_seasonal, candy_test)## ME RMSE MAE MPE MAPE MASE
## Training set -0.2265730 3.878871 2.972647 -0.2802264 3.029201 0.5737876
## Test set 0.2096428 6.018426 5.343807 0.3599105 4.800096 1.0314747
## ACF1 Theil's U
## Training set 0.1076271 NA
## Test set 0.6409968 0.9945754
# dengan seasonal = "multiplicative"
candy_seasonal <- HoltWinters(candy_train, seasonal = "multiplicative")
forecast_candy_seasonal <- forecast(candy_seasonal, 12)
accuracy(forecast_candy_seasonal, candy_test)## ME RMSE MAE MPE MAPE MASE
## Training set -0.3078917 4.220722 3.189807 -0.3479162 3.223621 0.6157043
## Test set -0.5221824 7.650147 6.746691 -0.2419717 6.049466 1.3022627
## ACF1 Theil's U
## Training set 0.1791895 NA
## Test set 0.7126994 1.25342
Kesimpulannya Model terbaik ada pada Model Additive dikarnakan memiliki nilai MAE yang kecil maka model dapat disimpulkan mengalami sedikit kehilangan informasi, maka hasil forecast nya akan cukup akurat.