library(readxl)
library(forecast)
library(TTR)
library(imputeTS)
library(tseries)
library(ggplot2)
library(dplyr)
library(graphics)
library(TSA)
library(tidyverse)
library(lubridate)
library(gridExtra)
library(ggfortify)
library(cowplot)
library(graphics)
library(lmtest)
library(stats)
library(MASS)
library(fpp2)
library(hrbrthemes)## Warning: package 'hrbrthemes' was built under R version 4.1.3
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
## Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
## if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
setwd("D:/SATRIA DATA")
mpdw <- read_xlsx("Data CO.xlsx")## New names:
## * `` -> `...4`
## * `` -> `...5`
## * `` -> `...6`
## * `` -> `...7`
## * `` -> `...8`
## * `` -> `...9`
## * `` -> `...10`
## * `` -> `...11`
## * `` -> `...12`
## * `` -> `...13`
mpdw <- mpdw[,2]
mpdw$`Data CO`<- as.numeric(mpdw$`Data CO`)
ts.mpdw <- ts(mpdw)
kableExtra::kable(head(mpdw) ,caption = 'Subset Data CO DKI Jakarta 2021-2022')| Data CO |
|---|
| 0.38 |
| 0.41 |
| 0.30 |
| 0.35 |
| 0.76 |
| 0.40 |
view(mpdw)# Train-test Split (80/20)
train <- mpdw[1:363,]
test <- mpdw[364:454,]# Time-Series Object
data.ts <- ts(mpdw, start = 2020, frequency = 91)
train.ts <- ts(train)
test.ts <- ts(test)Eksplorasi
Kestasioneran Data
plot(data.ts, col = "blue", type = "o", lwd = 1.5, main = "Time Series Polusi Udara DKI Jakarta 2020-2022",
cex = 0.8)#Fungsi Mencari Parameter Optimum
pemulusan <- function(x,min,max,method=c("SMA","DMA"),
metrik=c("SSE","MSE","RMSE","MAD","MAPE")){
df.master <- data.frame()
if(method=="SMA"){
for(i in min:max) {
sma <- TTR::SMA(x,i)
ramal <- c(NA,sma)
df <- cbind(aktual=c(x,NA),mulus=c(sma,NA),ramal)
error <- df[,1]-df[,3]
sse <- sum(error^2,na.rm=T)
mse <- mean(error^2,na.rm=T)
rmse <- sqrt(mse)
mad <- mean(abs(error),na.rm=T)
rerror <- error/df[,1]*100
mape <- mean(abs(rerror),na.rm=T)
ak <- data.frame(n=i,SSE=sse,MSE=mse,RMSE=rmse,MAD=mad,MAPE=mape)
df.master <- rbind(df.master,ak)
}
}
else if(method=="DMA") {
for(i in min:max) {
df_ts_sma <- TTR::SMA(x, n=i)
df_ts_dma <- TTR::SMA(df_ts_sma, n=i)
At <- 2*df_ts_sma-df_ts_dma
Bt <- df_ts_sma-df_ts_dma
pemulusan_dma <- At+Bt
ramal_dma <- c(NA, pemulusan_dma)
df_dma <- cbind(df_aktual=c(x,NA), pemulusan_dma=c(pemulusan_dma,NA), ramal_dma)
error.dma <- df_dma[, 1] - df_dma[, 3]
SSE.dma <- sum(error.dma^2, na.rm = T)
MSE.dma <- mean(error.dma^2, na.rm = T)
RMSE.dma <- sqrt(mean(error.dma^2, na.rm = T))
MAD.dma <- mean(abs(error.dma), na.rm = T)
r.error.dma <- (error.dma/df_dma[, 1])*100
MAPE.dma <- mean(abs(r.error.dma), na.rm = T)
ak <- data.frame(n=i,SSE=SSE.dma,MSE=MSE.dma,RMSE=RMSE.dma,
MAD=MAD.dma,MAPE=MAPE.dma)
df.master <- rbind(df.master,ak)
}
}
opt <- df.master$n[which.min(df.master[,metrik])]
return(list(Akurasi=df.master,n.optimum=paste("n optimum adalah",opt)))
}SMA
pemulusan(test.ts,min=2,max=10,method = "SMA",metrik = "MSE")## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 11.649900 0.1308978 0.3617979 0.2637079 26.97370
## 2 3 11.112856 0.1262824 0.3553624 0.2691288 26.90669
## 3 4 10.301725 0.1184106 0.3441085 0.2599425 25.43789
## 4 5 10.179308 0.1183640 0.3440408 0.2556977 25.06402
## 5 6 10.165919 0.1195991 0.3458310 0.2583725 25.53401
## 6 7 10.351978 0.1232378 0.3510525 0.2628741 26.13185
## 7 8 9.929719 0.1196352 0.3458832 0.2585843 26.01712
## 8 9 9.737502 0.1187500 0.3446013 0.2595528 26.21553
## 9 10 9.741168 0.1202613 0.3467872 0.2624444 26.59527
##
## $n.optimum
## [1] "n optimum adalah 5"
pemulusan(train.ts,min=2,max=10,method = "SMA",metrik = "MSE")## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 31.91530 0.08840803 0.2973349 0.2343213 24.58340
## 2 3 32.81743 0.09115954 0.3019264 0.2413981 25.33014
## 3 4 32.21861 0.08974542 0.2995754 0.2412326 25.16146
## 4 5 33.00971 0.09220589 0.3036542 0.2421285 25.09973
## 5 6 33.27291 0.09320142 0.3052891 0.2432960 25.22390
## 6 7 32.62904 0.09165461 0.3027451 0.2406942 24.94686
## 7 8 31.39455 0.08843537 0.2973808 0.2379683 24.74533
## 8 9 31.18505 0.08809337 0.2968053 0.2376962 24.80928
## 9 10 31.32687 0.08874467 0.2979004 0.2393144 25.10488
##
## $n.optimum
## [1] "n optimum adalah 9"
Terkecil n = 5 DAN n = 2
DMA
pemulusan(test.ts,min=2,max=10,method = "DMA",metrik = "MSE")## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 13.06147 0.1484259 0.3852608 0.2897159 28.40301
## 2 3 17.85584 0.2076260 0.4556600 0.3395220 33.59611
## 3 4 16.22562 0.1931621 0.4395022 0.3342113 32.77488
## 4 5 15.76191 0.1922184 0.4384272 0.3360927 33.96116
## 5 6 16.11703 0.2014629 0.4488462 0.3493403 34.73170
## 6 7 16.57016 0.2124380 0.4609100 0.3576949 35.59723
## 7 8 15.71507 0.2067773 0.4547277 0.3491982 34.74398
## 8 9 14.97863 0.2024139 0.4499043 0.3532616 35.67812
## 9 10 14.69351 0.2040766 0.4517483 0.3569444 36.75386
##
## $n.optimum
## [1] "n optimum adalah 2"
pemulusan(train.ts,min=2,max=10,method = "DMA",metrik = "MSE")## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 43.87227 0.1218674 0.3490952 0.2783472 29.22435
## 2 3 51.99775 0.1452451 0.3811104 0.2991589 31.28305
## 3 4 51.64412 0.1450677 0.3808776 0.3036833 31.47498
## 4 5 55.08291 0.1556014 0.3944635 0.3126576 32.37333
## 5 6 54.20414 0.1539890 0.3924144 0.3139804 32.18633
## 6 7 50.94212 0.1455489 0.3815087 0.3052950 31.07811
## 7 8 47.25780 0.1357983 0.3685082 0.2964592 30.15969
## 8 9 45.61789 0.1318436 0.3631028 0.2857928 29.21157
## 9 10 44.64222 0.1297739 0.3602415 0.2836250 29.32181
##
## $n.optimum
## [1] "n optimum adalah 2"
Parameter optimum pada data training yang didapat untuk double moving average (DMA) berdasarkan nilai MSE terkecil adalah n = 2.
Berdasarkan perbandingan kedua metode, parameter optimum didapatkan nilai MSE dari DMA lebih kecil daripada nilai MSE SMA, sehingga metode pemulusan moving average akan dilanjutkan menggunakan metode DMA.
Untuk mencari parameter optimum single exponential smoothing (SES) dan double exponential smoothing (DES) dibuat sebuah fungsi optimasi dengan memanfaatkan iterasi dan evaluasi metrik tiap-tiap parameter (alpha dan beta).
#Fungsi Mencari Parameter Optimum
pemulusan2 <- function(x,alfa=NULL,beta=NULL,method=c("SES","DES"),
metrik=c("SSE","MSE","MAPE")){
df.master <- data.frame()
if(method=="SES"){
for(i in alfa){
df_ses <- HoltWinters(x, alpha = i, beta=F, gamma=F)
sse <- df_ses$SSE
mse <- sse/length(x)
rmse <-sqrt(mse)
ak <- data.frame(Alpha=i,SSE=sse,MSE=mse,RMSE=rmse)
df.master <- rbind(df.master,ak)
datases <- data.frame(x, c(NA, df_ses$fitted[,1]))
colnames(datases) = c("y","yhat")
}
}
else if(method=="DES"){
for (i in alfa) {
for (j in beta) {
df_des <- HoltWinters(x, alpha = i, beta=j, gamma=F)
sse <- df_des$SSE
mse <- sse/length(x)
rmse <-sqrt(mse)
ak <- data.frame(Alpha=i,Beta=j,SSE=sse,MSE=mse,RMSE=rmse)
df.master <- rbind(df.master,ak)
datades <- data.frame(x, c(NA, NA, df_des$fitted[,1]))
colnames(datades) = c("y","yhat")
}
}
}
if(method=="SES"){
opt <- df.master$Alpha[which.min(df.master[,metrik])]
return(list(Akurasi=df.master,n.optimum=paste("Alpha optimum adalah",opt)))
}
else if(method=="DES"){
opt <- df.master$Alpha[which.min(df.master[,metrik])]
opt2 <- df.master$Beta[which.min(df.master[,metrik])]
return(list(Akurasi=df.master,n.optimum=paste("Alpha optimum adalah",opt,
",Beta optimum adalah",opt2)))
}
}SES
pemulusan2(test.ts,alfa=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),
method="SES",metrik="MSE")## $Akurasi
## Alpha SSE MSE RMSE
## 1 0.1 12.829111 0.1409792 0.3754720
## 2 0.2 11.367727 0.1249201 0.3534403
## 3 0.3 10.742184 0.1180460 0.3435782
## 4 0.4 10.351219 0.1137497 0.3372679
## 5 0.5 10.078352 0.1107511 0.3327929
## 6 0.6 9.882760 0.1086018 0.3295478
## 7 0.7 9.748028 0.1071212 0.3272937
## 8 0.8 9.669146 0.1062544 0.3259668
## 9 0.9 9.649307 0.1060363 0.3256322
##
## $n.optimum
## [1] "Alpha optimum adalah 0.9"
pemulusan2(train.ts,alfa=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),
method="SES",metrik="MSE")## $Akurasi
## Alpha SSE MSE RMSE
## 1 0.1 32.61816 0.08985719 0.2997619
## 2 0.2 29.57856 0.08148365 0.2854534
## 3 0.3 28.58694 0.07875190 0.2806277
## 4 0.4 28.23120 0.07777189 0.2788761
## 5 0.5 28.20486 0.07769934 0.2787460
## 6 0.6 28.43188 0.07832474 0.2798656
## 7 0.7 28.90396 0.07962524 0.2821794
## 8 0.8 29.64031 0.08165375 0.2857512
## 9 0.9 30.68155 0.08452217 0.2907270
##
## $n.optimum
## [1] "Alpha optimum adalah 0.5"
DMA
pemulusan2(test.ts,alfa=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),
beta=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),method="DES",metrik="MSE")## $Akurasi
## Alpha Beta SSE MSE RMSE
## 1 0.1 0.1 20.83535 0.2289599 0.4784975
## 2 0.1 0.2 19.19865 0.2109742 0.4593193
## 3 0.1 0.3 18.95263 0.2082707 0.4563668
## 4 0.1 0.4 19.73210 0.2168362 0.4656568
## 5 0.1 0.5 21.57287 0.2370645 0.4868927
## 6 0.1 0.6 23.18390 0.2547681 0.5047456
## 7 0.1 0.7 23.67742 0.2601914 0.5100896
## 8 0.1 0.8 23.42582 0.2574266 0.5073722
## 9 0.1 0.9 23.23540 0.2553340 0.5053059
## 10 0.2 0.1 14.45127 0.1588052 0.3985037
## 11 0.2 0.2 14.89695 0.1637028 0.4046020
## 12 0.2 0.3 15.83202 0.1739783 0.4171070
## 13 0.2 0.4 16.58054 0.1822038 0.4268533
## 14 0.2 0.5 17.21588 0.1891855 0.4349546
## 15 0.2 0.6 17.95736 0.1973336 0.4442225
## 16 0.2 0.7 18.84234 0.2070587 0.4550370
## 17 0.2 0.8 19.81244 0.2177191 0.4666038
## 18 0.2 0.9 20.80615 0.2286390 0.4781621
## 19 0.3 0.1 12.78734 0.1405202 0.3748603
## 20 0.3 0.2 13.52042 0.1485760 0.3854556
## 21 0.3 0.3 14.37507 0.1579678 0.3974516
## 22 0.3 0.4 15.25421 0.1676287 0.4094249
## 23 0.3 0.5 16.20567 0.1780843 0.4220004
## 24 0.3 0.6 17.20921 0.1891122 0.4348703
## 25 0.3 0.7 18.23381 0.2003715 0.4476287
## 26 0.3 0.8 19.25846 0.2116315 0.4600342
## 27 0.3 0.9 20.25796 0.2226149 0.4718209
## 28 0.4 0.1 11.98693 0.1317245 0.3629387
## 29 0.4 0.2 12.80041 0.1406639 0.3750519
## 30 0.4 0.3 13.70517 0.1506062 0.3880802
## 31 0.4 0.4 14.64938 0.1609822 0.4012258
## 32 0.4 0.5 15.61287 0.1715700 0.4142101
## 33 0.4 0.6 16.56761 0.1820617 0.4266868
## 34 0.4 0.7 17.49409 0.1922427 0.4384549
## 35 0.4 0.8 18.38328 0.2020141 0.4494598
## 36 0.4 0.9 19.23408 0.2113635 0.4597429
## 37 0.5 0.1 11.50103 0.1263849 0.3555066
## 38 0.5 0.2 12.34556 0.1356655 0.3683280
## 39 0.5 0.3 13.25083 0.1456135 0.3815934
## 40 0.5 0.4 14.16702 0.1556815 0.3945650
## 41 0.5 0.5 15.07008 0.1656052 0.4069462
## 42 0.5 0.6 15.94315 0.1751995 0.4185684
## 43 0.5 0.7 16.77696 0.1843622 0.4293742
## 44 0.5 0.8 17.56527 0.1930250 0.4393461
## 45 0.5 0.9 18.30373 0.2011399 0.4484862
## 46 0.6 0.1 11.17218 0.1227712 0.3503873
## 47 0.6 0.2 12.02119 0.1321010 0.3634571
## 48 0.6 0.3 12.90441 0.1418067 0.3765723
## 49 0.6 0.4 13.78056 0.1514347 0.3891462
## 50 0.6 0.5 14.63236 0.1607951 0.4009927
## 51 0.6 0.6 15.45058 0.1697866 0.4120517
## 52 0.6 0.7 16.23280 0.1783824 0.4223534
## 53 0.6 0.8 16.98383 0.1866354 0.4320132
## 54 0.6 0.9 17.71651 0.1946870 0.4412335
## 55 0.7 0.1 10.94534 0.1202784 0.3468118
## 56 0.7 0.2 11.79089 0.1295702 0.3599586
## 57 0.7 0.3 12.65397 0.1390546 0.3729003
## 58 0.7 0.4 13.50333 0.1483882 0.3852119
## 59 0.7 0.5 14.32890 0.1574604 0.3968128
## 60 0.7 0.6 15.12910 0.1662538 0.4077423
## 61 0.7 0.7 15.90944 0.1748290 0.4181256
## 62 0.7 0.8 16.68016 0.1832984 0.4281337
## 63 0.7 0.9 17.45162 0.1917760 0.4379224
## 64 0.8 0.1 10.80148 0.1186976 0.3445252
## 65 0.8 0.2 11.64678 0.1279866 0.3577521
## 66 0.8 0.3 12.50149 0.1373790 0.3706467
## 67 0.8 0.4 13.34330 0.1466296 0.3829225
## 68 0.8 0.5 14.16824 0.1556949 0.3945819
## 69 0.8 0.6 14.97949 0.1646098 0.4057213
## 70 0.8 0.7 15.78417 0.1734524 0.4164762
## 71 0.8 0.8 16.58957 0.1823030 0.4269696
## 72 0.8 0.9 17.40039 0.1912131 0.4372792
## 73 0.9 0.1 10.73963 0.1180179 0.3435373
## 74 0.9 0.2 11.59603 0.1274289 0.3569718
## 75 0.9 0.3 12.46123 0.1369366 0.3700494
## 76 0.9 0.4 13.32075 0.1463818 0.3825988
## 77 0.9 0.5 14.17581 0.1557782 0.3946874
## 78 0.9 0.6 15.03327 0.1652007 0.4064489
## 79 0.9 0.7 15.90252 0.1747529 0.4180346
## 80 0.9 0.8 16.79386 0.1845479 0.4295904
## 81 0.9 0.9 17.71903 0.1947146 0.4412648
##
## $n.optimum
## [1] "Alpha optimum adalah 0.9 ,Beta optimum adalah 0.1"
pemulusan2(train.ts,alfa=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),
beta=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),method="DES",metrik="MSE")## $Akurasi
## Alpha Beta SSE MSE RMSE
## 1 0.1 0.1 36.40236 0.10028198 0.3166733
## 2 0.1 0.2 37.55930 0.10346915 0.3216662
## 3 0.1 0.3 38.85652 0.10704276 0.3271739
## 4 0.1 0.4 40.39196 0.11127262 0.3335755
## 5 0.1 0.5 41.94999 0.11556470 0.3399481
## 6 0.1 0.6 43.94310 0.12105538 0.3479301
## 7 0.1 0.7 46.26070 0.12743993 0.3569873
## 8 0.1 0.8 49.11181 0.13529424 0.3678237
## 9 0.1 0.9 52.31800 0.14412671 0.3796402
## 10 0.2 0.1 32.01798 0.08820381 0.2969913
## 11 0.2 0.2 33.93299 0.09347932 0.3057439
## 12 0.2 0.3 36.11635 0.09949408 0.3154268
## 13 0.2 0.4 38.61296 0.10637178 0.3261469
## 14 0.2 0.5 41.25954 0.11366265 0.3371389
## 15 0.2 0.6 43.91831 0.12098709 0.3478320
## 16 0.2 0.7 46.59479 0.12836031 0.3582741
## 17 0.2 0.8 49.30105 0.13581558 0.3685316
## 18 0.2 0.9 51.93202 0.14306343 0.3782373
## 19 0.3 0.1 30.96611 0.08530609 0.2920721
## 20 0.3 0.2 33.23710 0.09156225 0.3025925
## 21 0.3 0.3 35.70322 0.09835599 0.3136176
## 22 0.3 0.4 38.26222 0.10540555 0.3246622
## 23 0.3 0.5 40.82679 0.11247049 0.3353662
## 24 0.3 0.6 43.34846 0.11941723 0.3455680
## 25 0.3 0.7 45.81578 0.12621428 0.3552665
## 26 0.3 0.8 48.30703 0.13307721 0.3647975
## 27 0.3 0.9 50.94911 0.14035567 0.3746407
## 28 0.4 0.1 30.63575 0.08439602 0.2905099
## 29 0.4 0.2 33.02667 0.09098256 0.3016332
## 30 0.4 0.3 35.51646 0.09784148 0.3127962
## 31 0.4 0.4 38.02892 0.10476285 0.3236709
## 32 0.4 0.5 40.53124 0.11165630 0.3341501
## 33 0.4 0.6 43.03670 0.11855841 0.3443231
## 34 0.4 0.7 45.56386 0.12552027 0.3542884
## 35 0.4 0.8 48.07794 0.13244612 0.3639315
## 36 0.4 0.9 50.48389 0.13907407 0.3729264
## 37 0.5 0.1 30.63504 0.08439405 0.2905065
## 38 0.5 0.2 33.06703 0.09109373 0.3018174
## 39 0.5 0.3 35.54402 0.09791741 0.3129176
## 40 0.5 0.4 38.01428 0.10472254 0.3236086
## 41 0.5 0.5 40.45493 0.11144608 0.3338354
## 42 0.5 0.6 42.84321 0.11802537 0.3435482
## 43 0.5 0.7 45.13590 0.12434132 0.3526207
## 44 0.5 0.8 47.28982 0.13027498 0.3609363
## 45 0.5 0.9 49.29542 0.13580005 0.3685106
## 46 0.6 0.1 30.89944 0.08512243 0.2917575
## 47 0.6 0.2 33.36709 0.09192036 0.3031837
## 48 0.6 0.3 35.84894 0.09875741 0.3142569
## 49 0.6 0.4 38.30334 0.10551884 0.3248366
## 50 0.6 0.5 40.70552 0.11213641 0.3348677
## 51 0.6 0.6 43.03671 0.11855842 0.3443231
## 52 0.6 0.7 45.29262 0.12477306 0.3532323
## 53 0.6 0.8 47.49591 0.13084272 0.3617219
## 54 0.6 0.9 49.69237 0.13689358 0.3699913
## 55 0.7 0.1 31.44295 0.08661970 0.2943123
## 56 0.7 0.2 33.98600 0.09362535 0.3059826
## 57 0.7 0.3 36.53866 0.10065746 0.3172656
## 58 0.7 0.4 39.07464 0.10764362 0.3280909
## 59 0.7 0.5 41.58836 0.11456849 0.3384797
## 60 0.7 0.6 44.09268 0.12146744 0.3485218
## 61 0.7 0.7 46.62041 0.12843088 0.3583725
## 62 0.7 0.8 49.21901 0.13558956 0.3682249
## 63 0.7 0.9 51.93944 0.14308386 0.3782643
## 64 0.8 0.1 32.30642 0.08899840 0.2983260
## 65 0.8 0.2 34.99786 0.09641283 0.3105042
## 66 0.8 0.3 37.72539 0.10392670 0.3223766
## 67 0.8 0.4 40.48456 0.11152771 0.3339577
## 68 0.8 0.5 43.29422 0.11926782 0.3453517
## 69 0.8 0.6 46.19110 0.12724820 0.3567187
## 70 0.8 0.7 49.22306 0.13560073 0.3682400
## 71 0.8 0.8 52.43984 0.14446237 0.3800821
## 72 0.8 0.9 55.88523 0.15395380 0.3923695
## 73 0.9 0.1 33.55291 0.09243227 0.3040268
## 74 0.9 0.2 36.49502 0.10053725 0.3170761
## 75 0.9 0.3 39.53262 0.10890529 0.3300080
## 76 0.9 0.4 42.68552 0.11759097 0.3429154
## 77 0.9 0.5 45.99566 0.12670980 0.3559632
## 78 0.9 0.6 49.51890 0.13641571 0.3693450
## 79 0.9 0.7 53.31782 0.14688105 0.3832506
## 80 0.9 0.8 57.45758 0.15828533 0.3978509
## 81 0.9 0.9 62.00782 0.17082044 0.4133043
##
## $n.optimum
## [1] "Alpha optimum adalah 0.5 ,Beta optimum adalah 0.1"
Metode SES lebih baik
Forecasting
Double Moving Average
#Single Moving Average dengan n=2
df_ts_sma <- TTR::SMA(train.ts, n=2)
#Double Moving Average dengan n=2
df_ts_dma <- TTR::SMA(df_ts_sma, n=2)
At <- 2*df_ts_sma-df_ts_dma
Bt <- df_ts_sma-df_ts_dma
pemulusan_dma <- At+Bt
ramal_dma <- c(NA, pemulusan_dma)
df_dma <- cbind(df_aktual=c(train.ts,NA), pemulusan_dma=c(pemulusan_dma,NA), ramal_dma)
head(df_dma)## df_aktual pemulusan_dma ramal_dma
## [1,] 0.38 NA NA
## [2,] 0.41 NA NA
## [3,] 0.30 0.315 NA
## [4,] 0.35 0.295 0.315
## [5,] 0.76 0.785 0.295
## [6,] 0.40 0.605 0.785
Eksploratif: DMA Plot
par(bg = '#141415')
ts.plot(mpdw$`Data CO`, xlab="periode waktu", ylab="Yt", col="blue", lty=1,
gpars = list(col.main="white",col.axis="white",col.sub="white"))
points(mpdw$`Data CO`,col="white")
par(col = "white")
lines(pemulusan_dma,col="red",lwd=2,lty=1)
par(col = "white")
lines(ramal_dma,col="green",lwd= 2,lty=1)
title("Rataan Bergerak Berganda N=2", cex.main=1, font.main=4 ,col.main="white")
legend("topright", c("Data Aktual","Pemulusan","Ramalan"),lty=1,col=c ("blue","red","green"))
box(col="white",lwd=2) n = 2 lebih mendekati sebaran pola dari data aktual
Single Exponential Smoothing
#SES alpha=0.5
df_des <- HoltWinters(train.ts, alpha = 0.5,gamma=F)
datades <- data.frame(train.ts, c(NA, NA, df_des$fitted[,1]))
colnames(datades) = c("y","yhat")
head(datades)## y yhat
## 1 0.38 NA
## 2 0.41 NA
## 3 0.30 0.4400000
## 4 0.35 0.3994217
## 5 0.76 0.4039284
## 6 0.40 0.6126526
ramal_des <- forecast::forecast(df_des,h=3)
(df_ramal_des <- data.frame(ramal_des))## Point.Forecast Lo.80 Hi.80 Lo.95 Hi.95
## 364 1.055251 0.6950855 1.415416 0.5044255 1.606076
## 365 1.057279 0.6539340 1.460623 0.4404163 1.674141
## 366 1.059306 0.6163650 1.502248 0.3818860 1.736727
Eksploratif: DES Plot
Plot
par(bg = '#141415')
ts.plot(mpdw$`Data CO`, xlab="periode waktu", ylab="Yt", col="blue", lty=1)
points(mpdw$`Data CO`,col="white")
par(col="white")
lines(datades$yhat, col="red",lwd=2) #nilai dugaan
par(col="white")
lines(ts(df_ramal_des$Point.Forecast,start = 101), col="green",lwd=2) #nilai dugaan
title("Single Exponential Smoothing Alpha=0.5 ",cex.main=1, font.main=4 ,col.main="white")
legend("bottomright", c("Data aktual", "Fitted SES","Ramalan"), lty=1,col=c ("blue","red","green"))
box(col="white",lwd=2) # ARIMA ## CEK TAILS OFF/CUT OFF
ggAcf(ts(mpdw$`Data CO`),col="white",lwd=2)+labs( x="Lag",y = "ACF",
title="Plot ACF Data CO DKI Jakarta ",
subtitle = "(Polusi udara 2021-2022)")+
theme_ft_rc()+
theme(
plot.title = element_text(size = 14L,
face = "bold",
hjust = 0.5),
plot.subtitle = element_text(size = 11L,
face = "plain",
hjust = 0.5),plot.background=element_rect(fill="#141415",color="#141415"),panel.background=element_rect(fill="#141415",color="#141415"),
axis.title = element_text(color="white"),axis.text = element_text(color="white")
)## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
ggPacf(ts(mpdw$`Data CO`),col="white",lwd=2)+labs( x="Lag",y = "PACF",
title="Plot PACF Kadar CO DKI Jakarta ",
subtitle = "(Juli 2012-2022)",col="white")+
theme_ft_rc()+
theme(
plot.title = element_text(size = 14L,
face = "bold",
hjust = 0.5),
plot.subtitle = element_text(size = 11L,
face = "plain",
hjust = 0.5),plot.background=element_rect(fill="#141415",color="#141415"),panel.background=element_rect(fill="#141415",color="#141415"),
axis.title = element_text(color="white"),axis.text = element_text(color="white")
)## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
Uji Statistik
adf.test(data.ts)## Warning in adf.test(data.ts): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data.ts
## Dickey-Fuller = -4.8343, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
SUdah Stasioner
EACF
eacf(data.ts)## AR/MA
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x x x x x x x x x x o o o o
## 1 o o x x x o o o o x o o o o
## 2 x o x o x o o o o o x o o o
## 3 x x x o o o o o o o x o o o
## 4 x x x x x o o o o o x o o o
## 5 x x x x x x o o o o x o o o
## 6 x x x o o x o o o o x o o o
## 7 x x x x o x o o o o o o o o
ARIMA (1,0,5) ARIMA (1,0,6) ARIMA (0,0,10) ARIMA (1,0,10)
Perbandingan Kebaikan Model Tentatif
model1 <- Arima(data.ts,order = c(1,0,5),method ="ML")
model2 <- Arima(data.ts,order = c(1,0,6),method ="ML")
model3 <- Arima(data.ts,order = c(0,0,10),method ="ML")
Model <- c("ARIMA (1,0,5)","ARIMA (1,0,6)","ARIMA (0,0,10)")
AIC <- c(model1$aic,model2$aic,model3$aic)
BIC <- c(model1$bic,model2$bic,model3$bic)
Akurasi <- data.frame(Model,AIC,BIC)
kableExtra::kable(Akurasi)| Model | AIC | BIC |
|---|---|---|
| ARIMA (1,0,5) | 105.2526 | 138.1974 |
| ARIMA (1,0,6) | 107.1280 | 144.1908 |
| ARIMA (0,0,10) | 105.6776 | 155.0947 |
paste("Model yang terbaik adalah model",Akurasi$Model[which.min(Akurasi[,"AIC"])])## [1] "Model yang terbaik adalah model ARIMA (1,0,5)"
coeftest(model1)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.922349 0.052995 17.4045 < 2.2e-16 ***
## ma1 -0.337115 0.071384 -4.7225 2.329e-06 ***
## ma2 -0.248415 0.057858 -4.2935 1.759e-05 ***
## ma3 -0.153593 0.052832 -2.9072 0.003647 **
## ma4 0.108716 0.050292 2.1617 0.030642 *
## ma5 -0.093699 0.054761 -1.7110 0.087073 .
## intercept 1.036335 0.043863 23.6266 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Signifikan semua
Uji Diagnostik
Diagnostik Model: Eksploratif
sisaan <- model1$residuals
par(mfrow=c(2,2))
par(bg = '#141415')
qqnorm(sisaan)
box(col="white",lwd=2)
qqline(sisaan, col = "red", lwd =1, col.lab="white",
col.axis="white",col.sub = "white")
box(col="white",lwd=2)
plot(c(1:length(sisaan)),sisaan,col="white",col.lab="white",col.axis="white")
box(col="white",lwd=2)
acf(sisaan,col="white",col.sub = "white",col.axis="white", col.lab="white")
box(col="white",lwd=2)
pacf(sisaan,col="white",col.sub = "white",col.axis="white", col.lab="white",col.main="white")
box(col="white",lwd=2) Berdasarkan hasil eksplorasi menggunakan Q-Q plot, terlihat bahwa sisaan berdistribusi mengikuti garis normal, sehingga dapat dikatakan bahwa sisaan menyebar normal. Kemudian, plot sisaan yang diperoleh menunjukkan bahwa sisaan memiliki pola acak dan tersebar di sekitar nilai nol. Sedangkan pada plot ACF dan PACF, nilai awal amatan tidak melewati garis signifikan, atau dapat dikatakan bahwa sisaan saling bebas.
Diagnostik Model: Uji Formal
1. Sisaan Menyebar Normal
Uji formal ini dilakukan dengan Jarque Bera test dan Shapiro-Wilk test.
Hipotesis yang diuji: H0 : Sisaan Menyebar Normal H1: Sisaan Tidak Menyebar Normal
jarque.bera.test(sisaan)##
## Jarque Bera Test
##
## data: sisaan
## X-squared = 12.305, df = 2, p-value = 0.002128
shapiro.test(sisaan)##
## Shapiro-Wilk normality test
##
## data: sisaan
## W = 0.98896, p-value = 0.001686
2. Sisaan Saling Bebas
Uji formal ini dilakukan dengan LJung-Box test.
Hipotesis yang diuji: H0 : Sisaan antara lag saling bebas H1: Sisaan antara lag tidak saling bebas
Box.test(sisaan, type = "Ljung")##
## Box-Ljung test
##
## data: sisaan
## X-squared = 0.013066, df = 1, p-value = 0.909
3. Nilai Tengah Sisaan Sama dengan Nol
Uji formal ini dilakukan dengan t-test.
Hipotesis yang diuji: H0 : Nilai tengah sisaan sama dengan nol H1: Nilai tengah sisaan tidak sama dengan nol
t.test(sisaan, mu = 0, conf.level = 0.95)##
## One Sample t-test
##
## data: sisaan
## t = 0.23454, df = 453, p-value = 0.8147
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.02169267 0.02757237
## sample estimates:
## mean of x
## 0.002939849
FORECASTING
ramalan <- forecast::forecast(Arima(train.ts, order=c(1,0,5),method="ML",include.drift = TRUE), h=8)
data.ramalan <- ramalan$mean
par(bg = '#141415')
plot(ramalan,col="white",col.sub ="white",col.axis="white",
col.lab="white",col.main="white",lwd=2)
box(col="white",lwd=2)par(bg = '#141415')
ts.plot(mpdw$`Data CO`,col="white",lwd=2,main="Perbandingan Peramalan dan Aktual",gpars = list(col.main="white",col.axis="white",col.sub="white"))
lines(data.ramalan, col = "red",lwd=2)
box(col="white",lwd=2)perbandingan.temp<-matrix(data=c(test.ts[1:5], data.ramalan[1:5]), nrow = 5, ncol = 2)
colnames(perbandingan.temp)<-c("Aktual","Hasil Forecast")
head(perbandingan.temp)## Aktual Hasil Forecast
## [1,] 1.80 0.9611172
## [2,] 1.91 1.0259902
## [3,] 0.65 1.0004032
## [4,] 0.63 0.9623544
## [5,] 0.90 0.9736433