# 1. INSTALL PACKAGE
packages <- c(
"readxl",
"forecast",
"tseries",
"openxlsx"
)
installed <- rownames(installed.packages())
for (p in packages) {
if (!(p %in% installed)) {
install.packages(p)
}
}
# 2. LOAD PACKAGE
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.2
library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(openxlsx)
## Warning: package 'openxlsx' was built under R version 4.5.3
# 3. MEMBACA DATA EXCEL
data_raw <- read_excel(
"C:/Users/ASUS/Downloads/Analisis Deret Waktu/Data UTS ADW.xlsx",
col_names = FALSE
)
## New names:
## • `` -> `...1`
## • `` -> `...2`
## • `` -> `...3`
# 4. MENGAMBIL DATA YANG DIPERLUKAN
data <- data_raw[4:nrow(data_raw), c(2, 3)]
colnames(data) <- c(
"Tanggal",
"Y"
)
# 5. MEMBERSIHKAN DATA
data$Tanggal <- as.Date(
data$Tanggal,
format = "%d-%b-%y"
)
data$Y <- as.numeric(data$Y)
data <- data[
!is.na(data$Tanggal) &
!is.na(data$Y),
]
rownames(data) <- NULL
cat(
"Jumlah observasi =",
nrow(data),
"\n"
)
## Jumlah observasi = 220
# 6. MEMBAGI DATA TRAINING DAN TESTING
TRAIN_SIZE <- 176
train <- data[
1:TRAIN_SIZE,
]
test <- data[
(TRAIN_SIZE + 1):nrow(data),
]
cat(
"Jumlah data training =",
nrow(train),
"\n"
)
## Jumlah data training = 176
cat(
"Jumlah data testing =",
nrow(test),
"\n"
)
## Jumlah data testing = 44
# 7. GRAFIK DATA AKTUAL
plot(
data$Tanggal,
data$Y,
type = "l",
xlab = "Tanggal",
ylab = "Y",
main = "Data Aktual",
lwd = 2
)
abline(
v = train$Tanggal[nrow(train)],
lty = 2
)

# 8. TRANSFORMASI PANGKAT
LAMBDA <- 0.256958404
train$Transformasi <- (
train$Y ^ LAMBDA
)
print(
head(
train[
,
c(
"Tanggal",
"Y",
"Transformasi"
)
],
10
)
)
## # A tibble: 10 × 3
## Tanggal Y Transformasi
## <date> <dbl> <dbl>
## 1 2021-01-02 6 1.58
## 2 2021-01-03 5 1.51
## 3 2021-01-04 2 1.19
## 4 2021-01-05 2 1.19
## 5 2021-01-06 1 1
## 6 2021-01-08 6 1.58
## 7 2021-01-09 7 1.65
## 8 2021-01-10 3 1.33
## 9 2021-01-13 9 1.76
## 10 2021-01-16 8 1.71
# 9. DIFFERENCING
train$Differencing <- c(
NA,
diff(train$Transformasi)
)
diff_train <- na.omit(
train$Differencing
)
print(
head(
train[
,
c(
"Tanggal",
"Y",
"Transformasi",
"Differencing"
)
],
15
)
)
## # A tibble: 15 × 4
## Tanggal Y Transformasi Differencing
## <date> <dbl> <dbl> <dbl>
## 1 2021-01-02 6 1.58 NA
## 2 2021-01-03 5 1.51 -0.0725
## 3 2021-01-04 2 1.19 -0.317
## 4 2021-01-05 2 1.19 0
## 5 2021-01-06 1 1 -0.195
## 6 2021-01-08 6 1.58 0.585
## 7 2021-01-09 7 1.65 0.0640
## 8 2021-01-10 3 1.33 -0.323
## 9 2021-01-13 9 1.76 0.433
## 10 2021-01-16 8 1.71 -0.0524
## 11 2021-01-17 1 1 -0.706
## 12 2021-01-18 6 1.58 0.585
## 13 2021-01-20 9 1.76 0.174
## 14 2021-01-21 5 1.51 -0.247
## 15 2021-01-23 8 1.71 0.194
# 10. GRAFIK DIFFERENCING
plot(
train$Tanggal[-1],
diff_train,
type = "l",
xlab = "Tanggal",
ylab = "Differencing",
main = "Data Setelah Differencing",
lwd = 2
)
abline(
h = 0,
lty = 2
)

# 11. UJI AUGMENTED DICKEY-FULLER (ADF)
adf_test <- adf.test(
diff_train
)
## Warning in adf.test(diff_train): p-value smaller than printed p-value
print(adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: diff_train
## Dickey-Fuller = -8.4233, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
if (
adf_test$p.value < 0.05
) {
cat(
"Kesimpulan ADF: Data stasioner\n"
)
} else {
cat(
"Kesimpulan ADF: Data belum stasioner\n"
)
}
## Kesimpulan ADF: Data stasioner
# 12. UJI KPSS
kpss_test <- kpss.test(
diff_train,
null = "Level"
)
## Warning in kpss.test(diff_train, null = "Level"): p-value greater than printed
## p-value
print(kpss_test)
##
## KPSS Test for Level Stationarity
##
## data: diff_train
## KPSS Level = 0.061574, Truncation lag parameter = 4, p-value = 0.1
if (
kpss_test$p.value > 0.05
) {
cat(
"Kesimpulan KPSS: Data stasioner\n"
)
} else {
cat(
"Kesimpulan KPSS: Data belum stasioner\n"
)
}
## Kesimpulan KPSS: Data stasioner
# 13. ACF
acf(
diff_train,
lag.max = 30,
main = "ACF Data Setelah Differencing"
)

# 14. PACF
pacf(
diff_train,
lag.max = 30,
main = "PACF Data Setelah Differencing"
)

# 15. MEMBENTUK MODEL ARIMA(0,1,1)
model_arima <- Arima(
train$Transformasi,
order = c(
0,
1,
1
),
include.drift = FALSE
)
print(
summary(model_arima)
)
## Series: train$Transformasi
## ARIMA(0,1,1)
##
## Coefficients:
## ma1
## -0.7682
## s.e. 0.0425
##
## sigma^2 = 0.04982: log likelihood = 14.18
## AIC=-24.36 AICc=-24.29 BIC=-18.03
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.02882704 0.2219338 0.1748295 -0.08402798 10.08546 0.7884469
## ACF1
## Training set -0.0280261
# 16. KOEFISIEN MODEL
cat(
"Koefisien model:\n"
)
## Koefisien model:
print(
coef(model_arima)
)
## ma1
## -0.768157
# 17. AIC DAN BIC
cat(
"AIC =",
AIC(model_arima),
"\n"
)
## AIC = -24.36424
cat(
"BIC =",
BIC(model_arima),
"\n"
)
## BIC = -18.03467
# 18. RESIDUAL MODEL
residual <- residuals(
model_arima
)
print(
head(
residual,
10
)
)
## Time Series:
## Start = 1
## End = 10
## Frequency = 1
## [1] 0.001584719 -0.057518195 -0.319066274 -0.211085059 -0.339665572
## [6] 0.325777569 0.307652346 -0.087899336 0.364280789 0.226136887
# 19. GRAFIK RESIDUAL
plot(
residual,
type = "l",
xlab = "Observasi",
ylab = "Residual",
main = "Residual ARIMA(0,1,1)"
)
abline(
h = 0,
lty = 2
)

# 20. UJI LJUNG-BOX
lb6 <- Box.test(
residual,
lag = 6,
type = "Ljung-Box"
)
lb12 <- Box.test(
residual,
lag = 12,
type = "Ljung-Box"
)
lb18 <- Box.test(
residual,
lag = 18,
type = "Ljung-Box"
)
lb24 <- Box.test(
residual,
lag = 24,
type = "Ljung-Box"
)
cat(
"Ljung-Box lag 6:\n"
)
## Ljung-Box lag 6:
print(lb6)
##
## Box-Ljung test
##
## data: residual
## X-squared = 1.8715, df = 6, p-value = 0.9311
cat(
"Ljung-Box lag 12:\n"
)
## Ljung-Box lag 12:
print(lb12)
##
## Box-Ljung test
##
## data: residual
## X-squared = 3.67, df = 12, p-value = 0.9887
cat(
"Ljung-Box lag 18:\n"
)
## Ljung-Box lag 18:
print(lb18)
##
## Box-Ljung test
##
## data: residual
## X-squared = 6.3297, df = 18, p-value = 0.9947
cat(
"Ljung-Box lag 24:\n"
)
## Ljung-Box lag 24:
print(lb24)
##
## Box-Ljung test
##
## data: residual
## X-squared = 17.599, df = 24, p-value = 0.822
# 21. FORECAST DATA TESTING
jumlah_testing <- nrow(test)
forecast_model <- forecast(
model_arima,
h = jumlah_testing
)
forecast_transformasi <- as.numeric(
forecast_model$mean
)
# 22. MENGEMBALIKAN FORECAST KE SKALA ASLI
forecast_y <- (
forecast_transformasi ^
(1 / LAMBDA)
)
# 23. MEMBUAT TABEL AKTUAL VS FORECAST
hasil_testing <- data.frame(
Tanggal = test$Tanggal,
Aktual = test$Y,
Forecast = forecast_y
)
hasil_testing$Error <- (
hasil_testing$Aktual -
hasil_testing$Forecast
)
hasil_testing$Absolute_Error <- abs(
hasil_testing$Error
)
hasil_testing$APE <- (
abs(
hasil_testing$Error /
hasil_testing$Aktual
) * 100
)
print(
hasil_testing
)
## Tanggal Aktual Forecast Error Absolute_Error APE
## 1 2021-08-11 55 45.02159 9.97841 9.97841 18.142564
## 2 2021-08-12 53 45.02159 7.97841 7.97841 15.053605
## 3 2021-08-13 37 45.02159 -8.02159 8.02159 21.679972
## 4 2021-08-14 52 45.02159 6.97841 6.97841 13.420020
## 5 2021-08-15 56 45.02159 10.97841 10.97841 19.604304
## 6 2021-08-16 55 45.02159 9.97841 9.97841 18.142564
## 7 2021-08-17 35 45.02159 -10.02159 10.02159 28.633113
## 8 2021-08-18 40 45.02159 -5.02159 5.02159 12.553974
## 9 2021-08-19 31 45.02159 -14.02159 14.02159 45.230934
## 10 2021-08-20 52 45.02159 6.97841 6.97841 13.420020
## 11 2021-08-21 42 45.02159 -3.02159 3.02159 7.194261
## 12 2021-08-22 33 45.02159 -12.02159 12.02159 36.429059
## 13 2021-08-23 56 45.02159 10.97841 10.97841 19.604304
## 14 2021-08-24 42 45.02159 -3.02159 3.02159 7.194261
## 15 2021-08-25 37 45.02159 -8.02159 8.02159 21.679972
## 16 2021-08-26 59 45.02159 13.97841 13.97841 23.692221
## 17 2021-08-27 56 45.02159 10.97841 10.97841 19.604304
## 18 2021-08-28 40 45.02159 -5.02159 5.02159 12.553974
## 19 2021-08-29 43 45.02159 -2.02159 2.02159 4.701371
## 20 2021-08-30 42 45.02159 -3.02159 3.02159 7.194261
## 21 2021-08-31 58 45.02159 12.97841 12.97841 22.376570
## 22 2021-09-01 44 45.02159 -1.02159 1.02159 2.321794
## 23 2021-09-02 40 45.02159 -5.02159 5.02159 12.553974
## 24 2021-09-03 56 45.02159 10.97841 10.97841 19.604304
## 25 2021-09-04 55 45.02159 9.97841 9.97841 18.142564
## 26 2021-09-05 55 45.02159 9.97841 9.97841 18.142564
## 27 2021-09-06 38 45.02159 -7.02159 7.02159 18.477867
## 28 2021-09-07 52 45.02159 6.97841 6.97841 13.420020
## 29 2021-09-08 33 45.02159 -12.02159 12.02159 36.429059
## 30 2021-09-09 30 45.02159 -15.02159 15.02159 50.071965
## 31 2021-09-10 43 45.02159 -2.02159 2.02159 4.701371
## 32 2021-09-11 51 45.02159 5.97841 5.97841 11.722373
## 33 2021-09-12 30 45.02159 -15.02159 15.02159 50.071965
## 34 2021-09-13 53 45.02159 7.97841 7.97841 15.053605
## 35 2021-09-14 25 45.02159 -20.02159 20.02159 80.086358
## 36 2021-09-15 30 45.02159 -15.02159 15.02159 50.071965
## 37 2021-09-16 28 45.02159 -17.02159 17.02159 60.791391
## 38 2021-09-17 30 45.02159 -15.02159 15.02159 50.071965
## 39 2021-09-18 47 45.02159 1.97841 1.97841 4.209384
## 40 2021-09-19 32 45.02159 -13.02159 13.02159 40.692467
## 41 2021-09-20 38 45.02159 -7.02159 7.02159 18.477867
## 42 2021-09-21 28 45.02159 -17.02159 17.02159 60.791391
## 43 2021-09-22 42 45.02159 -3.02159 3.02159 7.194261
## 44 2021-09-23 38 45.02159 -7.02159 7.02159 18.477867
# 24. MENGHITUNG MAE
MAE <- mean(
abs(
hasil_testing$Aktual -
hasil_testing$Forecast
)
)
# 25. MENGHITUNG MSE
MSE <- mean(
(
hasil_testing$Aktual -
hasil_testing$Forecast
)^2
)
# 26. MENGHITUNG RMSE
RMSE <- sqrt(
MSE
)
# 27. MENGHITUNG MAPE
MAPE <- mean(
abs(
(
hasil_testing$Aktual -
hasil_testing$Forecast
) /
hasil_testing$Aktual
)
) * 100
# 28. HASIL EVALUASI MODEL
cat(
"MAE =",
round(MAE, 4),
"\n"
)
## MAE = 9.0958
cat(
"MSE =",
round(MSE, 4),
"\n"
)
## MSE = 104.405
cat(
"RMSE =",
round(RMSE, 4),
"\n"
)
## RMSE = 10.2179
cat(
"MAPE =",
round(MAPE, 4),
"%\n"
)
## MAPE = 23.8565 %
# 29. INTERPRETASI MAPE
if (
MAPE < 10
) {
cat(
"Interpretasi MAPE: Sangat baik\n"
)
} else if (
MAPE < 20
) {
cat(
"Interpretasi MAPE: Baik\n"
)
} else if (
MAPE < 50
) {
cat(
"Interpretasi MAPE: Layak / reasonable\n"
)
} else {
cat(
"Interpretasi MAPE: Kurang baik\n"
)
}
## Interpretasi MAPE: Layak / reasonable
# 30. GRAFIK AKTUAL VS FORECAST
plot(
train$Tanggal,
train$Y,
type = "l",
xlim = range(data$Tanggal),
ylim = range(
c(
data$Y,
forecast_y
)
),
xlab = "Tanggal",
ylab = "Y",
main = "Aktual vs Forecast ARIMA(0,1,1)",
lwd = 2
)
lines(
test$Tanggal,
test$Y,
lwd = 2
)
lines(
test$Tanggal,
forecast_y,
lty = 2,
lwd = 2
)
abline(
v = train$Tanggal[nrow(train)],
lty = 2
)
legend(
"topright",
legend = c(
"Training",
"Aktual Testing",
"Forecast"
),
lty = c(
1,
1,
2
),
lwd = c(
2,
2,
2
)
)

# 31. PERBANDINGAN BEBERAPA MODEL ARIMA
model_011 <- Arima(
train$Transformasi,
order = c(
0,
1,
1
),
include.drift = FALSE
)
model_110 <- Arima(
train$Transformasi,
order = c(
1,
1,
0
),
include.drift = FALSE
)
model_111 <- Arima(
train$Transformasi,
order = c(
1,
1,
1
),
include.drift = FALSE
)
model_210 <- Arima(
train$Transformasi,
order = c(
2,
1,
0
),
include.drift = FALSE
)
model_012 <- Arima(
train$Transformasi,
order = c(
0,
1,
2
),
include.drift = FALSE
)
perbandingan_model <- data.frame(
Model = c(
"ARIMA(0,1,1)",
"ARIMA(1,1,0)",
"ARIMA(1,1,1)",
"ARIMA(2,1,0)",
"ARIMA(0,1,2)"
),
AIC = c(
AIC(model_011),
AIC(model_110),
AIC(model_111),
AIC(model_210),
AIC(model_012)
),
BIC = c(
BIC(model_011),
BIC(model_110),
BIC(model_111),
BIC(model_210),
BIC(model_012)
)
)
perbandingan_model <- perbandingan_model[
order(
perbandingan_model$AIC
),
]
print(
perbandingan_model
)
## Model AIC BIC
## 1 ARIMA(0,1,1) -24.364237 -18.034665
## 5 ARIMA(0,1,2) -22.400545 -12.906188
## 3 ARIMA(1,1,1) -22.396172 -12.901815
## 4 ARIMA(2,1,0) -2.804853 6.689505
## 2 ARIMA(1,1,0) 13.804190 20.133762
# 32. FORECAST 10 PERIODE KE DEPAN
forecast_10 <- forecast(
model_arima,
h = 10
)
forecast_10_transformasi <- as.numeric(
forecast_10$mean
)
forecast_10_y <- (
forecast_10_transformasi ^
(1 / LAMBDA)
)
# 33. TABEL FORECAST 10 PERIODE
forecast_masa_depan <- data.frame(
Periode = 1:10,
Forecast = forecast_10_y
)
print(
forecast_masa_depan
)
## Periode Forecast
## 1 1 45.02159
## 2 2 45.02159
## 3 3 45.02159
## 4 4 45.02159
## 5 5 45.02159
## 6 6 45.02159
## 7 7 45.02159
## 8 8 45.02159
## 9 9 45.02159
## 10 10 45.02159
# 34. GRAFIK FORECAST MASA DEPAN
plot(
forecast_10,
main = "Forecast 10 Periode ke Depan"
)

# 35. MENYIAPKAN HASIL EVALUASI
hasil_ringkas <- data.frame(
Ukuran = c(
"MAE",
"MSE",
"RMSE",
"MAPE"
),
Nilai = c(
MAE,
MSE,
RMSE,
MAPE
)
)
# 36. MENYIAPKAN HASIL LJUNG-BOX
ljung_box <- data.frame(
Lag = c(
6,
12,
18,
24
),
P_Value = c(
lb6$p.value,
lb12$p.value,
lb18$p.value,
lb24$p.value
)
)
# 37. MENYIMPAN HASIL KE EXCEL
wb <- createWorkbook()
addWorksheet(
wb,
"Data"
)
writeData(
wb,
"Data",
data
)
addWorksheet(
wb,
"Training"
)
writeData(
wb,
"Training",
train
)
addWorksheet(
wb,
"Testing"
)
writeData(
wb,
"Testing",
test
)
addWorksheet(
wb,
"Forecast Testing"
)
writeData(
wb,
"Forecast Testing",
hasil_testing
)
addWorksheet(
wb,
"Evaluasi"
)
writeData(
wb,
"Evaluasi",
hasil_ringkas
)
addWorksheet(
wb,
"Perbandingan Model"
)
writeData(
wb,
"Perbandingan Model",
perbandingan_model
)
addWorksheet(
wb,
"Forecast 10 Periode"
)
writeData(
wb,
"Forecast 10 Periode",
forecast_masa_depan
)
addWorksheet(
wb,
"Ljung Box"
)
writeData(
wb,
"Ljung Box",
ljung_box
)
saveWorkbook(
wb,
"Hasil_Pengujian_ARIMA_011.xlsx",
overwrite = TRUE
)
cat(
"Hasil berhasil disimpan sebagai Hasil_Pengujian_ARIMA_011.xlsx\n"
)
## Hasil berhasil disimpan sebagai Hasil_Pengujian_ARIMA_011.xlsx