library("readxl")
library("tseries")
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library("forecast")
## Warning: package 'forecast' was built under R version 4.5.1
library("TTR")
library("TSA")
## Warning: package 'TSA' was built under R version 4.5.2
## Registered S3 methods overwritten by 'TSA':
## method from
## fitted.Arima forecast
## plot.Arima forecast
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
library("graphics")
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(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.2
library(psych)
## Warning: package 'psych' was built under R version 4.5.3
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
suntik <- read_excel("D:/MAGANG BKKBN/DATA FIKS/SUNTIK.xlsx")
data.table::data.table(suntik)
## PERIODE SUNTIK
## <char> <num>
## 1: 2020M1 988
## 2: 2020M2 1189
## 3: 2020M3 1011
## 4: 2020M4 1031
## 5: 2020M5 1021
## 6: 2020M6 1653
## 7: 2020M7 1102
## 8: 2020M8 1180
## 9: 2020M9 1071
## 10: 2020M10 999
## 11: 2020M11 1310
## 12: 2020M12 929
## 13: 2021M1 894
## 14: 2021M2 884
## 15: 2021M3 963
## 16: 2021M4 821
## 17: 2021M5 1015
## 18: 2021M6 1030
## 19: 2021M7 859
## 20: 2021M8 1009
## 21: 2021M9 1168
## 22: 2021M10 1030
## 23: 2021M11 957
## 24: 2021M12 981
## 25: 2022M1 456
## 26: 2022M2 413
## 27: 2022M3 414
## 28: 2022M4 362
## 29: 2022M5 413
## 30: 2022M6 294
## 31: 2022M7 253
## 32: 2022M8 301
## 33: 2022M9 271
## 34: 2022M10 324
## 35: 2022M11 276
## 36: 2022M12 358
## 37: 2023M1 680
## 38: 2023M2 571
## 39: 2023M3 544
## 40: 2023M4 404
## 41: 2023M5 533
## 42: 2023M6 559
## 43: 2023M7 573
## 44: 2023M8 543
## 45: 2023M9 643
## 46: 2023M10 579
## 47: 2023M11 575
## 48: 2023M12 601
## 49: 2024M1 586
## 50: 2024M2 635
## 51: 2024M3 551
## 52: 2024M4 577
## 53: 2024M5 562
## 54: 2024M6 626
## 55: 2024M7 669
## 56: 2024M8 520
## 57: 2024M9 473
## 58: 2024M10 526
## 59: 2024M11 509
## 60: 2024M12 636
## 61: 2025M1 603
## 62: 2025M2 478
## 63: 2025M3 437
## 64: 2025M4 447
## 65: 2025M5 427
## 66: 2025M6 453
## 67: 2025M7 382
## 68: 2025M8 376
## 69: 2025M9 440
## 70: 2025M10 261
## 71: 2025M11 311
## 72: 2025M12 240
## 73: 2026M1 211
## 74: 2026M2 362
## 75: 2026M3 225
## PERIODE SUNTIK
suntik.ts<-ts(suntik$SUNTIK)
suntik.ts.month<-ts(suntik$SUNTIK,start = c(2020,1),frequency = 12)
#Statistik Deskriptif
describe(suntik$SUNTIK)
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 75 647.44 310.42 571 625.38 309.86 211 1653 1442 0.76 -0.08
## se
## X1 35.84
autoplot(suntik.ts) +
ggtitle("Plot Time Series suntik (2020–2026)") +
xlab("Bulan") +
ylab("Jumlah suntik") +
theme_minimal()

#Partisi Data (Train-Test)
suntik.training<-subset(suntik.ts, start = 1, end =52 )
suntik.training
## Time Series:
## Start = 1
## End = 52
## Frequency = 1
## [1] 988 1189 1011 1031 1021 1653 1102 1180 1071 999 1310 929 894 884 963
## [16] 821 1015 1030 859 1009 1168 1030 957 981 456 413 414 362 413 294
## [31] 253 301 271 324 276 358 680 571 544 404 533 559 573 543 643
## [46] 579 575 601 586 635 551 577
suntik.test<-subset(suntik.ts, start = 53, end = 75)
suntik.test
## Time Series:
## Start = 53
## End = 75
## Frequency = 1
## [1] 562 626 669 520 473 526 509 636 603 478 437 447 427 453 382 376 440 261 311
## [20] 240 211 362 225
# data training
plot.ts(suntik.training, main="Data Training suntik", xlab="Bulan", ylab="Jumlah suntik")

# data testing
plot.ts(suntik.test, main="Data Testing suntik", xlab="Bulan", ylab="Jumlah suntik")

#Stasioneritas Data
acf(suntik.training,lag.max=20, main="Plot ACF Data suntik")

adf.test(suntik.training) # Augmented Dickey-Fuller
##
## Augmented Dickey-Fuller Test
##
## data: suntik.training
## Dickey-Fuller = -1.633, Lag order = 3, p-value = 0.722
## alternative hypothesis: stationary
# Differencing
# Differencing Ordo 1
suntik.dif1 <- diff(suntik.training, difference=1)
plot.ts(suntik.dif1, lty=1, xlab="Waktu", ylab="Data Ekspor Diff Ordo 1")
points(suntik.dif1)

# Cek Kestasioneran
acf(suntik.dif1, main="Plot ACF Data suntik setelah Diff 1", lag.max = 20)

adf.test(suntik.dif1) # Augmented Dickey-Fuller
##
## Augmented Dickey-Fuller Test
##
## data: suntik.dif1
## Dickey-Fuller = -3.8429, Lag order = 3, p-value = 0.02316
## alternative hypothesis: stationary
#Plot ACF
acf(suntik.dif1, main="Plot ACF Data suntik", lag.max=20)

#Plot PACF
pacf(suntik.dif1, main="Plot PACF Data suntik", lag.max=20)

#EACF
eacf(suntik.dif1)
## AR/MA
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x o o o o o o o o o o o o o
## 1 x o o o o o o o o o o o o o
## 2 o o o o o o o o o o o o o o
## 3 x o o o o o o o o o o o o o
## 4 x x x o o o o o o o o o o o
## 5 x o o o o o o o o o o o o o
## 6 o o o o o o o o o o o o o o
## 7 o o o o o o o o o o o o o o
#Pendugaan Parameter dan Penentuan Model Terbaik
arima110<-arima(suntik.dif1, order=c(1,1,0),include.mean=FALSE, method="ML") #ARIMA (1,1,0)
arima011<-arima(suntik.dif1, order=c(0,1,1),include.mean=FALSE, method="ML") #ARIMA (0,1,1)
arima111<-arima(suntik.dif1, order=c(1,1,1),include.mean=FALSE, method="ML") #ARIMA (1,1,1)
#Uji signifikansi
arima110
##
## Call:
## arima(x = suntik.dif1, order = c(1, 1, 0), include.mean = FALSE, method = "ML")
##
## Coefficients:
## ar1
## -0.6499
## s.e. 0.1065
##
## sigma^2 estimated as 53796: log likelihood = -343.54, aic = 689.09
lmtest::coeftest(arima110)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.64985 0.10650 -6.1019 1.048e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
arima011
##
## Call:
## arima(x = suntik.dif1, order = c(0, 1, 1), include.mean = FALSE, method = "ML")
##
## Coefficients:
## ma1
## -1.0000
## s.e. 0.0546
##
## sigma^2 estimated as 33960: log likelihood = -333.74, aic = 669.47
lmtest::coeftest(arima011)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.999999 0.054558 -18.329 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
arima111
##
## Call:
## arima(x = suntik.dif1, order = c(1, 1, 1), include.mean = FALSE, method = "ML")
##
## Coefficients:
## ar1 ma1
## -0.3816 -1.0000
## s.e. 0.1306 0.0658
##
## sigma^2 estimated as 28642: log likelihood = -329.88, aic = 663.75
lmtest::coeftest(arima111)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.38159 0.13059 -2.9221 0.003477 **
## ma1 -1.00000 0.06578 -15.2021 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#AIC
aic.arima<-data.frame(
"Model"=c("ARIMA(1,1,0)", "ARIMA(0,1,1)", "ARIMA(1,1,1)"),
"AIC"=c(arima110$aic, arima011$aic, arima111$aic))
aic.arima
## Model AIC
## 1 ARIMA(1,1,0) 689.0898
## 2 ARIMA(0,1,1) 669.4728
## 3 ARIMA(1,1,1) 663.7502
auto.arima(suntik.training, trace = TRUE)
##
## ARIMA(2,1,2) with drift : 680.1253
## ARIMA(0,1,0) with drift : 680.0519
## ARIMA(1,1,0) with drift : 673.775
## ARIMA(0,1,1) with drift : 672.9251
## ARIMA(0,1,0) : 677.9829
## ARIMA(1,1,1) with drift : 675.1286
## ARIMA(0,1,2) with drift : 675.1175
## ARIMA(1,1,2) with drift : Inf
## ARIMA(0,1,1) : 671.143
## ARIMA(1,1,1) : 673.2111
## ARIMA(0,1,2) : 673.1881
## ARIMA(1,1,0) : 671.8217
## ARIMA(1,1,2) : Inf
##
## Best model: ARIMA(0,1,1)
## Series: suntik.training
## ARIMA(0,1,1)
##
## Coefficients:
## ma1
## -0.4135
## s.e. 0.1188
##
## sigma^2 = 28412: log likelihood = -333.45
## AIC=670.89 AICc=671.14 BIC=674.76
arima.111y<-arima(suntik.training, order=c(1,1,1), include.mean = FALSE,method="ML") #ARIMA (1,1,1)
sisaan111 <- arima.111y$residuals
# Eksplorasi
par(mfrow=c(2,2))
qqnorm(sisaan111)
qqline(sisaan111, col = "blue", lwd = 2)
plot(c(1:length(sisaan111)),sisaan111)
acf(sisaan111,lag.max = 10)
pacf(sisaan111,lag.max = 10)

par(mfrow=c(1,1))
#Uji Non-Autokorelasi dengan Ljung-Box test
Box.test(sisaan111, type = "Ljung")
##
## Box-Ljung test
##
## data: sisaan111
## X-squared = 0.0036575, df = 1, p-value = 0.9518
#Uji Normalitas dengan Kolmogorov-Smirnov test
shapiro.test(sisaan111)
##
## Shapiro-Wilk normality test
##
## data: sisaan111
## W = 0.90075, p-value = 0.0003905
ks.test(sisaan111,"pnorm")
##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: sisaan111
## D = 0.59615, p-value < 2.2e-16
## alternative hypothesis: two-sided
#plot dugaan dengan data asli
dugaan <- fitted(arima.111y)
cbind(suntik.training,dugaan)
## Time Series:
## Start = 1
## End = 52
## Frequency = 1
## suntik.training dugaan
## 1 988 987.0120
## 2 1189 1005.4067
## 3 1011 1109.6668
## 4 1031 1065.1094
## 5 1021 1038.6846
## 6 1653 1027.7653
## 7 1102 1376.0292
## 8 1180 1260.6962
## 9 1071 1194.0229
## 10 999 1123.4074
## 11 1310 1046.7928
## 12 929 1187.2832
## 13 894 1059.7433
## 14 884 949.3782
## 15 963 905.3260
## 16 821 934.6326
## 17 1015 875.0326
## 18 1030 945.8460
## 19 859 1002.2597
## 20 1009 926.0281
## 21 1168 963.2411
## 22 1030 1083.8256
## 23 957 1065.2248
## 24 981 999.9872
## 25 456 983.5307
## 26 413 688.5684
## 27 414 503.0047
## 28 362 441.0433
## 29 413 393.2170
## 30 294 400.0155
## 31 253 342.5752
## 32 301 285.9356
## 33 271 289.8648
## 34 324 280.8451
## 35 276 303.6061
## 36 358 290.9650
## 37 680 326.3656
## 38 571 528.1718
## 39 544 572.7613
## 40 404 556.4588
## 41 533 469.6167
## 42 559 496.0819
## 43 573 536.2469
## 44 543 559.8707
## 45 643 552.2361
## 46 579 601.6689
## 47 575 594.6357
## 48 601 581.5407
## 49 586 591.5179
## 50 635 589.7272
## 51 551 614.5039
## 52 577 581.8284
plot.ts(suntik.training, xlab="Month", ylab="Data")
points(suntik.training)
par(col="red")
lines(dugaan)

par(col="black")
#forecast
ramalan_arima111<- forecast::forecast(suntik.training,model=arima.111y, h=23)
ramalan_arima111
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 53 574.9347 361.470031 788.3993 248.468671 901.4007
## 54 575.2159 330.716818 819.7149 201.286842 949.1449
## 55 575.1776 297.299043 853.0561 150.199029 1000.1561
## 56 575.1828 268.270954 882.0946 105.801640 1044.5639
## 57 575.1821 241.662506 908.7017 65.107906 1085.2563
## 58 575.1822 217.037953 933.3264 27.447851 1122.9165
## 59 575.1822 193.999249 956.3651 -7.786799 1158.1511
## 60 575.1822 172.275989 978.0884 -41.009660 1191.3740
## 61 575.1822 151.665482 998.6989 -72.530711 1222.8951
## 62 575.1822 132.012477 1018.3519 -102.587387 1252.9517
## 63 575.1822 113.194758 1037.1696 -131.366605 1281.7309
## 64 575.1822 95.114091 1055.2502 -159.018599 1309.3829
## 65 575.1822 77.690108 1072.6742 -185.666282 1336.0306
## 66 575.1822 60.856064 1089.5083 -211.411731 1361.7761
## 67 575.1822 44.555808 1105.8085 -236.340820 1386.7052
## 68 575.1822 28.741572 1121.6228 -260.526608 1410.8909
## 69 575.1822 13.372310 1136.9920 -284.031866 1434.3962
## 70 575.1822 -1.587551 1151.9519 -306.910998 1457.2753
## 71 575.1822 -16.169081 1166.5334 -329.211525 1479.5759
## 72 575.1822 -30.399612 1180.7640 -350.975243 1501.3396
## 73 575.1822 -44.303331 1194.6677 -372.239147 1522.6035
## 74 575.1822 -57.901772 1208.2661 -393.036168 1543.4005
## 75 575.1822 -71.214202 1221.5785 -413.395772 1563.7601
plot(ramalan_arima111)

gabungan<- cbind(suntik.test,ramalan_arima111)
df.gab<- as.data.frame(gabungan, digits=3)
df.gab %>%
rename(
"Data Aktual suntik"=suntik.test,
Ramalan="ramalan_arima111.Point Forecast",
"Lo 80"="ramalan_arima111.Lo 80",
"Hi 80"="ramalan_arima111.Hi 80",
"Lo 95"="ramalan_arima111.Lo 95",
"Hi 95"="ramalan_arima111.Hi 95"
)
## Data Aktual suntik Ramalan Lo 80 Hi 80 Lo 95 Hi 95
## 1 562 574.9347 361.470031 788.3993 248.468671 901.4007
## 2 626 575.2159 330.716818 819.7149 201.286842 949.1449
## 3 669 575.1776 297.299043 853.0561 150.199029 1000.1561
## 4 520 575.1828 268.270954 882.0946 105.801640 1044.5639
## 5 473 575.1821 241.662506 908.7017 65.107906 1085.2563
## 6 526 575.1822 217.037953 933.3264 27.447851 1122.9165
## 7 509 575.1822 193.999249 956.3651 -7.786799 1158.1511
## 8 636 575.1822 172.275989 978.0884 -41.009660 1191.3740
## 9 603 575.1822 151.665482 998.6989 -72.530711 1222.8951
## 10 478 575.1822 132.012477 1018.3519 -102.587387 1252.9517
## 11 437 575.1822 113.194758 1037.1696 -131.366605 1281.7309
## 12 447 575.1822 95.114091 1055.2502 -159.018599 1309.3829
## 13 427 575.1822 77.690108 1072.6742 -185.666282 1336.0306
## 14 453 575.1822 60.856064 1089.5083 -211.411731 1361.7761
## 15 382 575.1822 44.555808 1105.8085 -236.340820 1386.7052
## 16 376 575.1822 28.741572 1121.6228 -260.526608 1410.8909
## 17 440 575.1822 13.372310 1136.9920 -284.031866 1434.3962
## 18 261 575.1822 -1.587551 1151.9519 -306.910998 1457.2753
## 19 311 575.1822 -16.169081 1166.5334 -329.211525 1479.5759
## 20 240 575.1822 -30.399612 1180.7640 -350.975243 1501.3396
## 21 211 575.1822 -44.303331 1194.6677 -372.239147 1522.6035
## 22 362 575.1822 -57.901772 1208.2661 -393.036168 1543.4005
## 23 225 575.1822 -71.214202 1221.5785 -413.395772 1563.7601
accuracy(ramalan_arima111, suntik.test) #arima
## ME RMSE MAE MPE MAPE MASE
## Training set -13.55395 164.9580 109.8078 -5.222276 16.08957 0.9347684
## Test set -132.82487 185.9152 153.1068 -44.749309 47.90692 1.3033629
## ACF1 Theil's U
## Training set -0.008150368 NA
## Test set 0.714925200 2.601475
#forecast
(ramalan_arima111<- forecast::forecast(suntik.ts,model=arima.111y, h=9))
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 76 267.2134 53.74873 480.6780 -59.25263 593.6794
## 77 261.4662 16.96720 505.9653 -112.46278 635.3953
## 78 262.2487 -15.62985 540.1272 -162.72987 687.2272
## 79 262.1422 -44.76968 569.0540 -207.23900 731.5233
## 80 262.1567 -71.36292 595.6762 -247.91752 772.2308
## 81 262.1547 -95.98954 620.2989 -285.57964 809.8890
## 82 262.1550 -119.02796 643.3379 -320.81401 845.1239
## 83 262.1549 -140.75126 665.0611 -354.03691 878.3468
## 84 262.1549 -161.36176 685.6716 -385.55796 909.8678
plot(ramalan_arima111)
