library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readxl)
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(TTR)
library(graphics)
require(smooth)
## Loading required package: smooth
## Warning: package 'smooth' was built under R version 4.2.3
## Loading required package: greybox
## Warning: package 'greybox' was built under R version 4.2.3
## Package "greybox", v1.0.8 loaded.
## This is package "smooth", v3.2.1
##
## Attaching package: 'smooth'
## The following object is masked from 'package:TTR':
##
## lags
require(Mcomp)
## Loading required package: Mcomp
## Warning: package 'Mcomp' was built under R version 4.2.3
library(tseries)
library(readr)
library(TSA)
## Registered S3 methods overwritten by 'TSA':
## method from
## fitted.Arima forecast
## plot.Arima forecast
##
## Attaching package: 'TSA'
## The following object is masked from 'package:readr':
##
## spec
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
library(ggplot2)
library(cowplot)
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
library(gtable)
library(grid)
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
#Input Data
data<- read_xlsx("C:/SEM6/SIC/Jumlah Korban Mati Kecelakaan 1992-2021.xlsx")
head(data)
## # A tibble: 6 × 2
## Tahun `Korban Mati`
## <dttm> <dbl>
## 1 1992-01-01 00:00:00 9819
## 2 1993-01-01 00:00:00 10038
## 3 1994-01-01 00:00:00 11004
## 4 1995-01-01 00:00:00 10990
## 5 1996-01-01 00:00:00 10869
## 6 1997-01-01 00:00:00 12308
str(data)
## tibble [30 × 2] (S3: tbl_df/tbl/data.frame)
## $ Tahun : POSIXct[1:30], format: "1992-01-01" "1993-01-01" ...
## $ Korban Mati: num [1:30] 9819 10038 11004 10990 10869 ...
Yt <- data$`Korban Mati`
plot(x = data$Tahun,
y = Yt,
col = "black",
lwd = 1,
type = "o",
xlab = "Tahun",
ylab = "Korban Mati",
main = "Time Series Plot of Harga Gula Dunia")
summary(data)
## Tahun Korban Mati
## Min. :1992-01-01 00:00:00 Min. : 8762
## 1st Qu.:1999-04-02 06:00:00 1st Qu.:10899
## Median :2006-07-02 12:00:00 Median :16535
## Mean :2006-07-02 12:00:00 Mean :18330
## 3rd Qu.:2013-10-01 18:00:00 3rd Qu.:25545
## Max. :2021-01-01 00:00:00 Max. :31262
train <- data[1:23, 2]
test <- data[24:30, 2]
data.ts <- ts(data)
train.ts <- ts(train)
test.ts <- ts(test)
# Parameter Optimum
#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)))
}
pemulusan(train.ts, min = 2, max = 10, method = "DMA", metrik = "RMSE")
## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 268926428 13446321 3666.923 2334.075 12.34473
## 2 3 216076690 12004261 3464.717 2334.185 12.88494
## 3 4 216056591 13503537 3674.716 2779.602 15.76814
## 4 5 229315379 16379670 4047.180 3273.729 17.79996
## 5 6 230880655 19240055 4386.349 3767.181 19.14636
## 6 7 241097032 24109703 4910.163 4385.727 20.65743
## 7 8 203074367 25384296 5038.283 4254.410 17.74540
## 8 9 172477644 28746274 5361.555 4375.720 15.92533
## 9 10 162851960 40712990 6380.673 5796.140 19.77973
##
## $n.optimum
## [1] "n optimum adalah 3"
# SMA
df_ts_sma <- SMA(train.ts, n=3)
# DMA
df_ts_dma <- SMA(df_ts_sma, n=3)
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,] 9819 NA NA
## [2,] 10038 NA NA
## [3,] 11004 NA NA
## [4,] 10990 NA NA
## [5,] 10869 11583.89 NA
## [6,] 12308 12153.22 11583.89
# Akurasi 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)
#Plot
ts.plot(train.ts, xlab = "periode waktu", ylab="Yt", col="blue", lty=3)
points(train.ts)
lines(pemulusan_dma , col = "red",lwd = 1.5)
lines(ramal_dma,col = "black",lwd = 2)
title("Rataan Bergerak Berganda N=3", cex.main = 1, font.main=4 ,col.main = "black")
legend("topleft", c("Data Aktual","Pemulusan","Ramalan"),lty=1:3,col=c ("blue","red","black"))
# Mencari Parameter Optimum
pemulusan2 <- function(x,alfa=NULL,beta=NULL,method=c("SES","DES"),
metrik=c("SSE","MSE","RMSE")){
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)))
}
}
# Double Exponential Smoothing
pemulusan2(train.ts,alfa=c(seq(0.1, 0.9, by = 0.1)),
beta=c(seq(0.1, 0.9, by = 0.1)),method = "DES",metrik = "RMSE")
## $Akurasi
## Alpha Beta SSE MSE RMSE
## 1 0.1 0.1 604790486 26295239 5127.888
## 2 0.1 0.2 555592324 24156188 4914.895
## 3 0.1 0.3 510847958 22210781 4712.832
## 4 0.1 0.4 470727526 20466414 4523.982
## 5 0.1 0.5 435672634 18942288 4352.274
## 6 0.1 0.6 406091405 17656148 4201.922
## 7 0.1 0.7 382174495 16616282 4076.307
## 8 0.1 0.8 363810469 15817846 3977.166
## 9 0.1 0.9 350578049 15242524 3904.168
## 10 0.2 0.1 374096937 16265084 4032.999
## 11 0.2 0.2 326832544 14210111 3769.630
## 12 0.2 0.3 293732227 12770966 3573.649
## 13 0.2 0.4 273026481 11870717 3445.391
## 14 0.2 0.5 261627621 11375114 3372.701
## 15 0.2 0.6 255883661 11125377 3335.472
## 16 0.2 0.7 252515693 10978943 3313.449
## 17 0.2 0.8 249243031 10836654 3291.907
## 18 0.2 0.9 244963356 10650581 3263.523
## 19 0.3 0.1 266012919 11565779 3400.850
## 20 0.3 0.2 236723491 10292326 3208.165
## 21 0.3 0.3 222236976 9662477 3108.453
## 22 0.3 0.4 216004158 9391485 3064.553
## 23 0.3 0.5 212881387 9255712 3042.320
## 24 0.3 0.6 210252310 9141405 3023.476
## 25 0.3 0.7 207666707 9028987 3004.827
## 26 0.3 0.8 205801676 8947899 2991.304
## 27 0.3 0.9 205531314 8936144 2989.338
## 28 0.4 0.1 215979826 9390427 3064.380
## 29 0.4 0.2 200824663 8731507 2954.912
## 30 0.4 0.3 196063384 8524495 2919.674
## 31 0.4 0.4 195230387 8488278 2913.465
## 32 0.4 0.5 195689745 8508250 2916.890
## 33 0.4 0.6 197288395 8577756 2928.781
## 34 0.4 0.7 200618186 8722530 2953.393
## 35 0.4 0.8 206041293 8958317 2993.045
## 36 0.4 0.9 213461302 9280926 3046.461
## 37 0.5 0.1 192622304 8374883 2893.939
## 38 0.5 0.2 186489552 8108241 2847.497
## 39 0.5 0.3 187230758 8140468 2853.150
## 40 0.5 0.4 190393961 8277998 2877.151
## 41 0.5 0.5 195035675 8479812 2912.012
## 42 0.5 0.6 201330272 8753490 2958.630
## 43 0.5 0.7 209302962 9100129 3016.642
## 44 0.5 0.8 218593182 9504051 3082.864
## 45 0.5 0.9 228622911 9940127 3152.797
## 46 0.6 0.1 182297260 7925968 2815.310
## 47 0.6 0.2 182107011 7917696 2813.840
## 48 0.6 0.3 186744084 8119308 2849.440
## 49 0.6 0.4 193301235 8404402 2899.035
## 50 0.6 0.5 201318044 8752958 2958.540
## 51 0.6 0.6 210694682 9160638 3026.655
## 52 0.6 0.7 221113310 9613622 3100.584
## 53 0.6 0.8 232145025 10093262 3176.989
## 54 0.6 0.9 243456988 10585086 3253.473
## 55 0.7 0.1 179002583 7782721 2789.753
## 56 0.7 0.2 183057048 7959002 2821.170
## 57 0.7 0.3 190794762 8295424 2880.178
## 58 0.7 0.4 200215987 8705043 2950.431
## 59 0.7 0.5 210981363 9173103 3028.713
## 60 0.7 0.6 222918215 9692096 3113.213
## 61 0.7 0.7 235821298 10253100 3202.046
## 62 0.7 0.8 249592484 10851847 3294.214
## 63 0.7 0.9 264327015 11492479 3390.056
## 64 0.8 0.1 179990863 7825690 2797.443
## 65 0.8 0.2 187415088 8148482 2854.555
## 66 0.8 0.3 197953702 8606683 2933.715
## 67 0.8 0.4 210184554 9138459 3022.988
## 68 0.8 0.5 223904988 9734999 3120.096
## 69 0.8 0.6 239085761 10395033 3224.133
## 70 0.8 0.7 255781653 11120941 3334.808
## 71 0.8 0.8 274177870 11920777 3452.648
## 72 0.8 0.9 294562007 12807044 3578.693
## 73 0.9 0.1 183916399 7996365 2827.785
## 74 0.9 0.2 194339136 8449528 2906.807
## 75 0.9 0.3 207721951 9031389 3005.227
## 76 0.9 0.4 223055826 9698079 3114.174
## 77 0.9 0.5 240288453 10447324 3232.232
## 78 0.9 0.6 259530600 11283939 3359.158
## 79 0.9 0.7 280951176 12215269 3495.035
## 80 0.9 0.8 304734659 13249333 3639.963
## 81 0.9 0.9 331002001 14391391 3793.599
##
## $n.optimum
## [1] "Alpha optimum adalah 0.7 ,Beta optimum adalah 0.1"
df_des <- HoltWinters(train.ts, alpha = 0.7, beta = 0.1, gamma = F)
df_des
## Holt-Winters exponential smoothing with trend and without seasonal component.
##
## Call:
## HoltWinters(x = train.ts, alpha = 0.7, beta = 0.1, gamma = F)
##
## Smoothing parameters:
## alpha: 0.7
## beta : 0.1
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 28483.315
## b 1084.889
datades <- data.frame(train.ts, c(NA,NA, df_des$fitted[,1]))
colnames(datades) <- c("y","yhat")
head(datades)
## y yhat
## 1 9819 NA
## 2 10038 NA
## 3 11004 10257.00
## 4 10990 11051.19
## 5 10869 11275.36
## 6 12308 11229.47
fore.des <- forecast(df_des, h = 5)
# Menghitung SSE (Sum of Squared Errors)
sse.des <- sum((datades$y - datades$yhat)^2)
# Menghitung MSE (Mean Squared Error)
mse.des <- mean((datades$y - datades$yhat)^2)
# Menghitung RMSE (Root Mean Squared Error)
rmse.des <- sqrt(mean((datades$y - datades$yhat)^2))
# Plot
plot(train.ts, xlab="periode waktu", ylab="Yt", col="blue", lty=3)
points(train.ts)
lines(datades[,2], col = "red",lwd = 1.5, lty = 1)
title("Double Exponential Smoothing (Alpha = 0.7 dan Beta = 0.1)", cex.main=1, font.main=4
,col.main="black")
legend("topleft", c("Data aktual","Fitted DES"), lty=1:3,col=c ("blue","red"))
tabel1 <- matrix(c(sse.dma, mse.dma, rmse.dma, sse.des, mse.des, rmse.des), ncol = 3, byrow = T)
colnames(tabel1) <- c("SSE","MSE","RMSE")
rownames(tabel1) <- c("DMA","DES")
library(kableExtra)
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
kable(tabel1)
| SSE | MSE | RMSE | |
|---|---|---|---|
| DMA | 216076690 | 12004261 | 3464.717 |
| DES | NA | NA | NA |
acf(data.ts[,2], lag.max = 35)
adf.test(data.ts[,2])
##
## Augmented Dickey-Fuller Test
##
## data: data.ts[, 2]
## Dickey-Fuller = -1.7871, Lag order = 3, p-value = 0.6545
## alternative hypothesis: stationary
Uji Statistik menghasilkan p-value yang lebih besar dari 0.05 yang berarti pada taraf nyata 5% dapat dikatakan data tidak stasioner sehingga diperlukan penanganan ketidakstasioneran data sebelum meentukan model.
data.diff <- diff(data.ts[,2], differences = 2)
# cek Stasioner Eksploratif
plot(data.diff, type = "l")
# Uji Statistik
adf.test(data.diff)
## Warning in adf.test(data.diff): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data.diff
## Dickey-Fuller = -4.86, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
acf(data.diff, lag.max = 20)
pacf(data.diff, lag.max = 20)
ARIMA 1,2,1 ARIMA 1,2,2 ARIMA 1,2,4
model1 <- Arima(data.diff, order = c(1,2,1))
summary(model1)
## Series: data.diff
## ARIMA(1,2,1)
##
## Coefficients:
## ar1 ma1
## -0.6282 -1.0000
## s.e. 0.1425 0.1008
##
## sigma^2 = 45403517: log likelihood = -267.43
## AIC=540.86 AICc=541.95 BIC=544.63
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 253.6855 6238.373 4384.8 101.8552 187.0319 0.733435 -0.4254442
model2 <- Arima(data.diff, order = c(1,2,2))
summary(model2)
## Series: data.diff
## ARIMA(1,2,2)
##
## Coefficients:
## ar1 ma1 ma2
## -0.4806 -1.9722 1.0000
## s.e. 0.1672 0.1539 0.1526
##
## sigma^2 = 20582572: log likelihood = -259.51
## AIC=527.03 AICc=528.93 BIC=532.06
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -47.77289 4111.826 3034.041 30.69171 207.9522 0.5074967 -0.264613
model3 <- Arima(data.diff, order = c(1,2,4))
summary(model3)
## Series: data.diff
## ARIMA(1,2,4)
##
## Coefficients:
## ar1 ma1 ma2 ma3 ma4
## -0.8164 -1.7957 0.0001 1.7955 -0.9999
## s.e. 0.1246 0.2238 0.3390 0.3385 0.2245
##
## sigma^2 = 13805548: log likelihood = -255.01
## AIC=522.01 AICc=526.43 BIC=529.56
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -10.92311 3217.788 2182.375 -71.16775 202.228 0.3650406 -0.2483874
model4 <- auto.arima(data.diff)
summary(model4)
## Series: data.diff
## ARIMA(2,0,0) with zero mean
##
## Coefficients:
## ar1 ar2
## -0.7864 -0.4590
## s.e. 0.1669 0.1621
##
## sigma^2 = 13466115: log likelihood = -268.92
## AIC=543.84 AICc=544.84 BIC=547.84
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -92.58338 3536.135 2482.085 53.60804 183.6667 0.4151723
## ACF1
## Training set -0.09479376
aic1 <- model1$aic
aic2 <- model2$aic
aic3 <- model3$aic
aic4 <- model4$aic
bic1 <- model1$bic
bic2 <- model2$bic
bic3 <- model3$bic
bic4 <- model4$bic
tabel <- matrix(c(aic1,aic2,aic3,aic4,bic1,bic2,bic3,bic4), ncol = 4, byrow = T)
colnames(tabel) <- c("Model 1","Model 2","Model 3","Model 4")
rownames(tabel) <- c("AIC","BIC")
kable(tabel)
| Model 1 | Model 2 | Model 3 | Model 4 | |
|---|---|---|---|---|
| AIC | 540.8560 | 527.0280 | 522.0126 | 543.8412 |
| BIC | 544.6303 | 532.0604 | 529.5611 | 547.8378 |
## Forecasting
ramalan <- forecast(model3, h = 5)
ramalan
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 31 -3177.4413 -8223.201 1868.319 -10894.265 4539.383
## 32 665.6866 -5098.505 6429.878 -8149.883 9481.256
## 33 214.8347 -5550.493 5980.163 -8602.474 9032.143
## 34 667.9969 -5510.594 6846.588 -8781.343 10117.337
## 35 383.1550 -5802.209 6568.519 -9076.543 9842.853
data.ramalan <- ramalan$mean
plot(ramalan)