library(pageviews)
library(dplyr)
library(forecast)
library(plotly)
library(TTR)
library(MLmetrics)
library(tseries)
options(scipen = 100, max.print = 1e+06)Pada LBB (Learning by Building) ini akan dilakukan forecasting dari data wikipedia tahun 2020 sampai dengan 3 Juli 2022. Data wikipedia ini menginformasikan jumlah viewers yang mengakses wikipedia dengan artikel mengenai Indonesia. Saya melakukan perubahan data input dari Rpubs milik saudara Wahyudi Tri (https://rpubs.com/wahyuditr/ts).
wiki <- article_pageviews(project = "en.wikipedia",
article = "Indonesia",
start =as.Date('2020-01-01'), end = as.Date("2022-07-03"))
str(wiki)#> 'data.frame': 915 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: "2020-01-01" "2020-01-02" ...
#> $ views : num 10174 12289 11914 12534 12074 ...
head(wiki,3)Karena dalam Time Series variabel yang digunakan adalah time dan y, data yang digunakan yaitu date dan views
wiki1 <- wiki %>% select(date, views)
head(wiki1,3)dim (wiki1)#> [1] 915 2
Terlihat bahwa data wiki1 terdiri dari 915 baris dan 2 kolom. Kemudian, cek missing value apakah ada atau tidak
anyNA(wiki1)#> [1] FALSE
colSums(is.na(wiki1))#> date views
#> 0 0
Terlihat bahwa tidak ada missing value, sehingga data siap diolah ke tahap selanjutnya.
Data Time Series
Untuk membuat object time series, digunakan fungsi ‘ts()’, yang didalamnya terdapat beberapa parameter:
wiki_ts <- ts(wiki1$views, start = c(2020,1), frequency = 365.25)
autoplot(wiki_ts, series = "Actual")
Decompose Data Time Series
wiki_dec <- decompose(wiki_ts)
autoplot(wiki_dec)
Untuk Melihat Pola/Seasonal:
autoplot(wiki_dec$x - wiki_dec$trend)
Kesimpulan: Seasonal datanya adalah acak atau random (tidak memiliki
seasonal).
Untuk Melihat Trend Naik atau Turun: menggunakan adjusted seasonal (buang efek seasonal data)
autoplot(wiki_dec$x - wiki_dec$seasonal)
Kesimpulan: Trend tidak naik ataupun turun.
Bagi data menjadi data train dan data test:
wiki_train <- wiki_ts %>%
head(-365.25)
wiki_test <- wiki_ts %>%
tail(365.25)Simple Exponential Smoothing
wiki_ses <- ets(wiki_train, model = "ANN")
summary(wiki_ses)#> ETS(A,N,N)
#>
#> Call:
#> ets(y = wiki_train, model = "ANN")
#>
#> Smoothing parameters:
#> alpha = 0.2349
#>
#> Initial states:
#> l = 11956.7147
#>
#> sigma: 2317.196
#>
#> AIC AICc BIC
#> 11974.57 11974.61 11987.49
#>
#> Training set error measures:
#> ME RMSE MAE MPE MAPE MASE ACF1
#> Training set -3.496463 2312.971 1016.011 -1.641239 7.645228 0.6124478 0.1666354
autoplot(wiki_ses$fitted, series = "ANN") +
autolayer(wiki_train, series = "Actual")Double Exponential Smoothing (Holt)
wiki_holt <- ets(wiki_train, model = "AAN")
autoplot(wiki_holt$fitted, series = "AAN") +
autolayer(wiki_train, series = "Actual")summary(wiki_holt)#> ETS(A,Ad,N)
#>
#> Call:
#> ets(y = wiki_train, model = "AAN")
#>
#> Smoothing parameters:
#> alpha = 0.2339
#> beta = 0.0001
#> phi = 0.8
#>
#> Initial states:
#> l = 11495.0792
#> b = 431.5964
#>
#> sigma: 2322.702
#>
#> AIC AICc BIC
#> 11980.16 11980.31 12006.01
#>
#> Training set error measures:
#> ME RMSE MAE MPE MAPE MASE ACF1
#> Training set -13.33763 2312.101 1014.708 -1.72055 7.638419 0.6116624 0.1669997
Triple Exponential Smoothing (Holtwinter)
wiki_hw <- HoltWinters(wiki_train, beta = F, gamma = F)
summary(wiki_hw)#> Length Class Mode
#> fitted 1096 mts numeric
#> x 549 ts numeric
#> alpha 1 -none- numeric
#> beta 1 -none- logical
#> gamma 1 -none- logical
#> coefficients 1 -none- numeric
#> seasonal 1 -none- character
#> SSE 1 -none- numeric
#> call 4 -none- call
AUTO ARIMA
Model ARIMA juga bisa dibuat dengan cara automatis, yaitu dengan fungsi auto.arima()
wiki_auto <- auto.arima(wiki_train, seasonal = F)
summary(wiki_auto)#> Series: wiki_train
#> ARIMA(2,1,1)
#>
#> Coefficients:
#> ar1 ar2 ma1
#> 0.3295 0.0692 -0.9716
#> s.e. 0.0455 0.0452 0.0159
#>
#> sigma^2 = 4961046: log likelihood = -5001.39
#> AIC=10010.79 AICc=10010.86 BIC=10028.01
#>
#> Training set error measures:
#> ME RMSE MAE MPE MAPE MASE
#> Training set -4.813909 2219.212 940.9296 -1.74357 7.058432 0.567189
#> ACF1
#> Training set -0.0005259233
BANDINGKAN ERRORNYA MASING - MASING
sqrt(wiki_ses$mse)#> [1] 2312.971
sqrt(wiki_holt$mse)#> [1] 2312.101
sqrt(MSE(wiki_hw$fitted[,1], wiki_train))#> [1] 2318
sqrt(MSE(wiki_auto$fitted, wiki_train)) #> [1] 2219.212
KESIMPULAN: Dari hasil RMSE diatas dapat dikatakan bahwa MODEL AUTO ARIMA adalah model yang memiliki nilai error paling kecil dibanding dengan model lainnya. Sehingga saya akan menggunakan ini untuk untuk memprediksi data.
Menggunakan Model Auto Arima
forecasting_auto <- forecast(wiki_auto, h = 365.25)
forecasting_auto %>%
autoplot() +
autolayer(wiki_test)Cek Distribusi Normal
shapiro.test(wiki_auto$residuals)#>
#> Shapiro-Wilk normality test
#>
#> data: wiki_auto$residuals
#> W = 0.44407, p-value < 0.00000000000000022
hist(wiki_auto$residuals, breaks = 100)plot(wiki_auto$residuals)
Kesimpulan: p-value < 0.05, forecast’s residuals tidak berdistribusi
normal.
Autocorrelation: Box.test - Ljng-Box
Box.test(wiki_auto$residuals, type = "Ljung-Box")#>
#> Box-Ljung test
#>
#> data: wiki_auto$residuals
#> X-squared = 0.00015268, df = 1, p-value = 0.9901
Kesimpulan: p-value > 0.05, No Autocorrelation.
Dari 4 model yang digunakan yaitu Simple Exponential Smoothing (SES), Holt, Holtwinter, dan Auto Arima, Model Auto Arima merupakan model yang terbaik dengan nilai error paling kecil, dan Box.test - Ljng-Box nya dengan p-value > 0.05, No Autocorrelation.