library(pageviews)
library(dplyr)
library(forecast)
library(plotly)
library(TTR)
library(MLmetrics)
library(tseries)
Pada LBB kali ini, saya akan melakukan forecasting dari data wikipedia tahun 2015 sampai dengan 2019, data wikipedia ini menginformasikan jumlah viewers yang mengakses wikipedia dengan artikel mengenai Indonesia. Saya mendapatkan data wikipedia ini dengan menggunakan fungsi article_pageviews() dari library(pageviews). Berikut adalah syntax yang saya gunakan :
wiki_ina <- article_pageviews(project = "en.wikipedia",
article = "Indonesia",
start =as.Date('2015-01-01'), end = as.Date("2019-09-20"))
str(wiki_ina)
## 'data.frame': 1543 obs. of 8 variables:
## $ project : chr "wikipedia" "wikipedia" "wikipedia" "wikipedia" ...
## $ language : chr "en" "en" "en" "en" ...
## $ article : chr "Indonesia" "Indonesia" "Indonesia" "Indonesia" ...
## $ access : chr "all-access" "all-access" "all-access" "all-access" ...
## $ agent : chr "all-agents" "all-agents" "all-agents" "all-agents" ...
## $ granularity: chr "daily" "daily" "daily" "daily" ...
## $ date : POSIXct, format: "2015-07-01" "2015-07-02" ...
## $ views : num 11299 10467 9773 8889 9218 ...
Karena dalam Time Series variabel yang digunakan adalah time dan y, maka saya akan menyeleksi data yang digunakan yaitu date dan views
## date views
## 1 2015-07-01 11299
## 2 2015-07-02 10467
## 3 2015-07-03 9773
## 4 2015-07-04 8889
## 5 2015-07-05 9218
## 6 2015-07-06 9933
Ketentuan data yang harus diperlakukan didalam Time Series, antara lain :
## date views
## 0 0
Hasil cek menyatakan bahwa data wikipedia tidak memiliki data NA, dan data date pada wikipedia ini sudah berurutan dan tidak ada yang hilang, langkah selanjutkan adalah mengubah tipe data atau class wikipedia menjadi tipe data ts.
Fungsi untuk membuat object time series adalah ‘ts()’, parameter didalamnya ada :
wiki_ina_ts <- ts(wiki_ina2$views, start = c(2015,1), frequency = 365.25)
autoplot(wiki_ina_ts, series = "Actual")
Fungsi decompose untuk memecah komponen ts menjadi beberapa komponen, yaitu :
Dari hasil plot diatas, dapat dikatakan bahwa pola seasonal data wikipedia adalah acak atau random, sehingga saya dapat mengasumsikan bahwa data wikipedia tidak memiliki seasonal, sedangkan untuk pola trend data wikipedia juga tidak memiliki trend naik atau turun.
Bagi data menjadi data train dan data test.
Fungsi yang digunakan untuk membuat model exponential smooting adalah ‘ets’ ( error, trend, seasonal ) parameter didalam fungsi tsb adalah 1. y = object time series 2. model = terdiri dari 3 huruf
A = additive M = multiplicative N = None Z = auto
error = Additive trend = None seasonal = None
SES ini baik untuk data yang tidak punya trend dan tidak punya seasonal, karena SES akan melakukan smoothing terhadapa error nya. Koefisien untuk smoothing error disebut dengan alpha.
wiki_ina_SES <- ets(wiki_ina_train, model = "ANN")
autoplot(wiki_ina_SES$fitted, series = "ANN") +
autolayer(wiki_ina_train, series = "Actual")
wiki_ina_holt <- ets(wiki_ina_train, model = "AAN")
autoplot(wiki_ina_holt$fitted, series = "AAN") +
autolayer(wiki_ina_train, series = "Actual")
## [1] 2194.183
## [1] 2194.708
## [1] 2195.095
Arima adalah salah satu model forecast yang sering dipakai, salah satu syarat ARIMA adalah data stationer atau mengacak, data yang bergerak disekitar mean atau tidak mempunyai tren dan seasonal.
Model ARIMA :
AR(p) = nilai p menunjukkan berapa banyak data variable y sebelumnya yang digunakan oleh AutoRegressive
I(d) = nilai d menunjukkan berapa kali data dilakukan differencing hingga stationer
MA(q) = nilai q menunjukkan berapa banyak error yang dilakukan smoothing
## Warning in adf.test(.): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: .
## Dickey-Fuller = -4.9862, Lag order = 10, p-value = 0.01
## alternative hypothesis: stationary
PACF bertujuan untuk melihat seberapa besar korelasi data terhadap lag.
# AR= 6, I=0, MA=0
wiki_ina_train_600 <- arima(wiki_ina_train, order = c(6,0,0))
wiki_ina_train_600$residuals %>%
pacf()
# AR= 6, I=0, MA=10
wiki_ina_train_6010 <- arima(wiki_ina_train, order = c(6,0,10))
wiki_ina_train_6010$residuals %>%
pacf()
Dari hasil tuning diatas, maka dapat digunakan model ARIMA : 6,0,10 yang memberikan banyak lag yang tidak memiliki autocol .
Model ARIMA juga bisa dibuat dengan cara automatis, yaitu dengan fungsi auto.arima()
wiki_ina_auto <- auto.arima(wiki_ina_train, seasonal = F)
sqrt(MSE(wiki_ina_auto$fitted, wiki_ina_train))
## [1] 2053.8
## [1] 0.08235867
## [1] 21230.81
## [1] 21285.32
Hasil nya dapat dikatakan bahwa model ARIMA 6,0,10 adalah model yang memiliki nilai AIC paling kecil, namun saya tidak akan menggunakan model ARIMA ini karena nilai AIC yang kecil membuang banyak informasi dari data training. Sehingga saya akan menggunakan model Auto ARIMA yang memiliki AIC lebih besar.
Selanjutnya saya akan membandingkan nilai RMSE dari model yang telah dibuat, dan akan dipilih yang terbaik untuk prediksi data
## [1] 2194.183
## [1] 2194.708
## [1] 2195.095
## [1] 2053.8
##
## Box-Ljung test
##
## data: wiki_ina_auto$residuals
## X-squared = 0.24516, df = 1, p-value = 0.6205
Dari hasil evaluasi model yang telah dilakukan, dapat disimpulkan bahwa model Auto Arima merupakan model yang terbaik, dan hasil cek autokol didapat pvalue > 0.5, menandakan tidak ada autokol pada model Auto Arima.