Analisis Deret Waktu Data Harga Emas 2010-2022
Kelompok 1
Paralel 2 - MPDW 2022
Anggota:
# Berliana Apriyanti
# Kenia Mauilidia
# Mohammad Abror Gustiansyah
# Oksi Al Hadi
# Raffael Julio RogerA. Analisis Data
Library
library(googlesheets4)
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(googlesheets4)
library(tseries)
library(forecast)
library(TTR)
library(TSA)
library(imputeTS)
library(ggplot2)
library(lmtest)
library(FinTS)Import Data
dataemas <- read.csv("D:/Kuliah/Semester 5/MPDW/Data Emas Fixx.csv")
ts.dataemas <- ts(dataemas)
kableExtra::kable(head(dataemas) ,caption = 'Data Rata-Rata Harga Emas Global 2010-2022')| Waktu | USD |
|---|---|
| 1/29/2010 | 1078.50 |
| 2/26/2010 | 1108.25 |
| 3/31/2010 | 1115.50 |
| 4/30/2010 | 1179.25 |
| 5/31/2010 | 1207.50 |
| 6/30/2010 | 1244.00 |
str(dataemas)## 'data.frame': 146 obs. of 2 variables:
## $ Waktu: chr "1/29/2010" "2/26/2010" "3/31/2010" "4/30/2010" ...
## $ USD : num 1078 1108 1116 1179 1208 ...
Plot Time Series
Splitting Data
y <- dataemas$USD
training<-y[1:117]
testing<-y[118:146]
training.ts<-ts(training)
testing.ts<-ts(testing,start=118)plot(training.ts, col="blue",main="Plot Data Training")
points(training.ts)plot(testing.ts, col="blue",main="Plot data Testing")
points(testing.ts)B. Pemulusan Data
DMA
Metode pemulusan Double Moving Average (DMA) merupakan metode yang tepat untuk data penjualan emas karena data tersebut memiliki pola data tren. Fungsi di bawah ini akan me-looping nilai n dari 2 sampai dengan 11 sehingga didapatkan n optimum.
akurasi = data.frame()
for(n in 2:11){
data.sma<-SMA(training.ts, n=n)
dma <- SMA(data.sma, n=n)
At <- 2*data.sma - dma
Bt <- 2/(n-1)*(data.sma - dma)
data.ramal<- c(NA, At+Bt)
error.dma = training.ts-data.ramal[1:length(training.ts)]
SSE.dma = sum(error.dma[(2*n):length(training.ts)]^2, na.rm = T)
RMSE.dma = sqrt(mean(error.dma[(2*n):length(training.ts)]^2, na.rm = T))
MAPE.dma = mean(abs((error.dma[(2*n):length(training.ts)]/training.ts[(2*n):length(training.ts)])*100), na.rm = T)
akurasi.dma <- matrix(c(SSE.dma, RMSE.dma, MAPE.dma))
row.names(akurasi.dma)<- c("SSE", "RMSE", "MAPE")
colnames(akurasi.dma) <- c(paste("Akurasi m =", n))
akurasi = rbind(akurasi, c(n=n, RMSE=akurasi.dma[2], MAPE=akurasi.dma[3]))
}
colnames(akurasi) = c("n", "RMSE", "MAPE")
akurasi[order(akurasi[,2]),]## n RMSE MAPE
## 2 3 83.51942 4.938363
## 4 5 84.28369 4.787540
## 3 4 85.47429 4.841119
## 5 6 85.50707 4.737835
## 1 2 89.76499 4.732633
## 6 7 91.45361 5.097534
## 7 8 97.75974 5.412382
## 8 9 103.57142 5.662378
## 9 10 107.28141 5.891334
## 10 11 107.80972 6.071765
Berdasarkan tabel di atas, nilai RMSE dan MAPE terkecil dimiliki oleh metode pemulusan DMA pada n = 3 yang dapat dijadikan n optimum dalam rentang nilai n dari 2 sampai 11. Dengan nilai MSE terkecil sebesar 83.29561 dan MAPE terkecil sebesar 4.918893 . Syntax di bawah ini akan memodelkan pemulusan DMA dengan n optimum.
Pemulusan Double Moving Average dengan N Optimum (3)
n=3
data.sma<-SMA(training.ts, n=n)
dma <- SMA(data.sma, n=n)
At <- 2*data.sma - dma
Bt <- 2/(n-1)*(data.sma - dma)
data.ramal<- c(NA, At+Bt)
fcast = c()
for (i in 1:20) {
fcast[i] = At[length(At)] + Bt[length(Bt)]*(i)
} # Ramalan DMA
data.gab <- cbind(aktual = c(training.ts,rep(NA,21)), pemulusan = c(dma, rep(NA,21)), At = c(At, rep(NA,21)), Bt = c(Bt,rep(NA,21)), ramalan = c(data.ramal, fcast[-1]))## Warning in cbind(aktual = c(training.ts, rep(NA, 21)), pemulusan = c(dma, :
## number of rows of result is not a multiple of vector length (arg 5)
tail(data.gab)## aktual pemulusan At Bt ramalan
## [133,] NA NA NA NA 2208.489
## [134,] NA NA NA NA 2251.317
## [135,] NA NA NA NA 2294.144
## [136,] NA NA NA NA 2336.972
## [137,] NA NA NA NA 2379.800
## [138,] NA NA NA NA NA
Plot DMA
# Plot
plot.ts(dataemas$USD, xlab="Waktu", ylab="USD", main="Plot Pemulusan dan Peramalan dengan Metode DMA N Optimum (3)", ylim=c(1000,2500), type="l")
points(data.gab[,1])
lines(data.gab[,2],col="green",lwd=2)
lines(data.gab[,5],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan DMA","data peramalan"), lty=1, col=c("black","green","red"), cex=0.8)Plot di atas menunjukkan hasil pemulusan dan peramalan metode DMA pada n = 3. Dapat dilihat bahwa hasil pemulusan, dapat dilihat pada garis pemulusan yang masih cukup menggambarkan pola data penjualan emas aktual. Kemudian, hasil peramalan menunjukkan pola naik yang nilainya berbeda jauh dengan data aktual (data testing).
Nilai Akurasi DMA
RMSE_DMA_train <- sqrt(mean((training.ts-data.ramal[-88])^2, na.rm = T))
RMSE_DMA_test <- sqrt(mean((testing.ts-fcast)^2))## Warning in `-.default`(testing.ts, fcast): longer object length is not a
## multiple of shorter object length
MAPE_DMA_train <- mean(abs((training.ts-data.ramal[-88])/training.ts)*100, na.rm = T)
MAPE_DMA_test <- mean(abs((testing.ts-fcast)/testing.ts)*100)## Warning in `-.default`(testing.ts, fcast): longer object length is not a
## multiple of shorter object length
Akurasi_DMA <- data.frame("DMA_Train"=c(RMSE_DMA_train,MAPE_DMA_train), "DMA_Test"=c(RMSE_DMA_test,MAPE_DMA_test))
rownames(Akurasi_DMA) <- c("RMSE","MAPE")
Akurasi_DMA## DMA_Train DMA_Test
## RMSE 80.810628 252.05395
## MAPE 4.586484 10.73407
Dari syntax di atas, didapatkan bahwa nilai RMSE DMA testing sebesar 503.43018 dan MAPE DMA testing sebesar 23.17036. Kedua nilai error ini cukup besar jika dibandingkan data trainingnya.
Double Exponential Smoothing (DES)
Selain DMA, Metode pemulusan lain yang cocok untuk data yang memiliki pola data tren adalah DES. Metode ini memandang bahwa semakin besar lag, maka semakin tidak berpengaruh data tersebut terhadap data aktual saat ini. Fungsi di bawah ini akan me-looping parameter DES, yaitu alpha dan beta (dari 0.1 hingga 0.9) sehingga didapatkan parameter optimum.
#Pengulangan Melihat Nilai Keakuratan
a = seq(.1,.9,.1)
b = seq(.1, .9,.1)
output = data.frame()
for (i in a) {
for (j in b) {
des <- HoltWinters(training.ts, alpha = i, beta=j, gamma=F)
sse <- des$SSE
rmse <- sqrt(sse/length(training.ts))
mape <- mean(abs((des$fitted[,1]-training.ts)/training.ts)*100)
akurasi <- cbind("SSE"=sse, "RMSE"=rmse, "MAPE"=mape)
output <- rbind(output, akurasi)
}
}
output <- cbind("Alpha" = rep(a,each=9), "Beta"=b, output)
dplyr::arrange(.data=output,RMSE) #Mengurutkan data dari nilai SSE/MSE terkecil## Alpha Beta SSE RMSE MAPE
## 1 0.8 0.1 539003.5 67.87391 3.619096
## 2 0.7 0.1 540056.5 67.94017 3.634656
## 3 0.9 0.1 548572.9 68.47377 3.635503
## 4 0.6 0.1 553627.6 68.78852 3.667440
## 5 0.7 0.2 560533.4 69.21621 3.746367
## 6 0.8 0.2 565512.7 69.52296 3.731267
## 7 0.6 0.2 568092.9 69.68138 3.809709
## 8 0.9 0.2 581832.0 70.51896 3.751041
## 9 0.5 0.1 584581.7 70.68539 3.702540
## 10 0.7 0.3 587644.1 70.87030 3.870450
## 11 0.6 0.3 590248.5 71.02717 3.932039
## 12 0.5 0.2 592576.2 71.16708 3.880367
## 13 0.8 0.3 598118.7 71.49913 3.858005
## 14 0.5 0.3 610657.3 72.24468 4.019681
## 15 0.6 0.4 614374.3 72.46421 4.037684
## 16 0.7 0.4 617473.8 72.64678 3.971655
## 17 0.9 0.3 621224.9 72.86710 3.886459
## 18 0.5 0.4 629016.2 73.32262 4.113274
## 19 0.8 0.4 633834.3 73.60290 3.990484
## 20 0.6 0.5 641036.3 74.01988 4.117440
## 21 0.4 0.2 643400.5 74.15625 3.965442
## 22 0.4 0.1 643543.3 74.16448 3.819144
## 23 0.5 0.5 648303.5 74.43826 4.194941
## 24 0.7 0.5 650106.0 74.54168 4.104403
## 25 0.4 0.3 660499.6 75.13518 4.168900
## 26 0.9 0.4 664514.7 75.36321 4.020308
## 27 0.5 0.6 670253.8 75.68794 4.274529
## 28 0.6 0.6 670917.0 75.72538 4.215837
## 29 0.8 0.5 672462.3 75.81254 4.129900
## 30 0.4 0.4 675741.3 75.99715 4.264309
## 31 0.7 0.6 685454.4 76.54139 4.259563
## 32 0.4 0.5 687901.3 76.67789 4.327123
## 33 0.5 0.7 695871.0 77.12078 4.356090
## 34 0.4 0.6 699491.7 77.32116 4.376990
## 35 0.6 0.7 704024.8 77.57130 4.358606
## 36 0.9 0.5 711691.0 77.99249 4.145860
## 37 0.4 0.7 713233.9 78.07699 4.424980
## 38 0.8 0.6 713732.4 78.10427 4.270901
## 39 0.7 0.7 722935.5 78.60621 4.407928
## 40 0.5 0.8 725458.4 78.74325 4.452544
## 41 0.4 0.8 730523.3 79.01765 4.483542
## 42 0.3 0.2 737446.8 79.39121 4.205519
## 43 0.6 0.8 739807.5 79.51818 4.519839
## 44 0.4 0.9 751777.5 80.15890 4.555915
## 45 0.3 0.1 755609.9 80.36295 4.168468
## 46 0.8 0.7 757275.2 80.45146 4.373580
## 47 0.5 0.9 758923.0 80.53894 4.562420
## 48 0.3 0.3 760150.6 80.60405 4.355843
## 49 0.7 0.8 761702.5 80.68629 4.531071
## 50 0.9 0.6 762954.4 80.75257 4.256133
## 51 0.6 0.9 777304.8 81.50847 4.668990
## 52 0.3 0.4 782560.0 81.78354 4.566110
## 53 0.3 0.5 797882.0 82.58029 4.663659
## 54 0.7 0.9 800942.1 82.73850 4.622105
## 55 0.8 0.8 802935.6 82.84140 4.449691
## 56 0.3 0.6 805087.4 82.95233 4.681934
## 57 0.3 0.8 805966.1 82.99759 4.737793
## 58 0.3 0.7 806091.7 83.00405 4.677841
## 59 0.3 0.9 808743.5 83.14047 4.759417
## 60 0.9 0.7 818800.9 83.65583 4.365983
## 61 0.8 0.9 851031.6 85.28643 4.505795
## 62 0.9 0.8 880237.1 86.73750 4.471834
## 63 0.2 0.2 910372.7 88.20977 4.734341
## 64 0.2 0.3 931617.5 89.23308 4.938248
## 65 0.9 0.9 948853.7 90.05477 4.608772
## 66 0.2 0.4 984065.0 91.71048 5.103562
## 67 0.2 0.1 1010835.5 92.94955 4.921396
## 68 0.2 0.5 1027445.9 93.71013 5.249791
## 69 0.2 0.6 1058656.0 95.12277 5.497555
## 70 0.2 0.7 1086746.4 96.37650 5.602457
## 71 0.2 0.8 1106589.5 97.25240 5.638832
## 72 0.2 0.9 1107906.6 97.31026 5.562416
## 73 0.1 0.4 1277729.4 104.50246 5.947659
## 74 0.1 0.5 1294114.1 105.17036 6.175418
## 75 0.1 0.3 1314939.0 106.01318 5.978746
## 76 0.1 0.6 1381545.1 108.66498 6.496542
## 77 0.1 0.7 1532968.3 114.46525 6.872032
## 78 0.1 0.2 1537704.9 114.64195 6.555855
## 79 0.1 0.8 1694500.5 120.34496 7.299353
## 80 0.1 0.9 1803994.1 124.17227 7.539577
## 81 0.1 0.1 2198413.0 137.07609 7.321322
Setelah diurutkan berdasarkan nilai RMSE, dapat terlihat bahwa nilai alpha optimum 0.8 dan beta optimum 0.1, dengan nilai RMSE terkecilnya yaitu sebesar 68.03389. Kedua parameter ini yang kemudian akan digunakan untuk pemulusan.
Pemulusan Double Exponential Smoothing dengan alpha dan beta optimum (0.8, 0.1)
df_des <- HoltWinters(training.ts, alpha = .8, beta=.1, gamma=F)
datades <- data.frame(training.ts, c(NA, NA, df_des$fitted[,1]))
colnames(datades) = c("y_train","y_train_hat")
datades## y_train y_train_hat
## 1 1078.50 NA
## 2 1108.25 NA
## 3 1115.50 1138.000
## 4 1179.25 1147.950
## 5 1207.50 1203.444
## 6 1244.00 1237.467
## 7 1169.00 1273.995
## 8 1246.00 1212.900
## 9 1307.00 1264.930
## 10 1346.75 1327.501
## 11 1383.50 1373.355
## 12 1405.50 1412.738
## 13 1327.00 1437.635
## 14 1411.00 1370.964
## 15 1439.00 1428.032
## 16 1535.50 1462.724
## 17 1536.50 1552.684
## 18 1505.50 1570.181
## 19 1628.50 1543.706
## 20 1813.50 1643.595
## 21 1620.00 1825.165
## 22 1722.00 1690.266
## 23 1746.00 1747.425
## 24 1531.00 1777.942
## 25 1744.00 1592.291
## 26 1770.00 1737.697
## 27 1662.50 1790.162
## 28 1651.25 1704.443
## 29 1558.00 1674.043
## 30 1598.50 1584.080
## 31 1622.00 1599.641
## 32 1648.50 1623.342
## 33 1776.00 1651.295
## 34 1719.00 1768.862
## 35 1726.00 1742.786
## 36 1657.50 1741.828
## 37 1664.75 1680.090
## 38 1588.50 1672.315
## 39 1598.25 1603.055
## 40 1469.00 1596.619
## 41 1394.50 1481.722
## 42 1192.00 1392.165
## 43 1314.50 1196.240
## 44 1394.75 1264.516
## 45 1326.50 1352.790
## 46 1324.00 1313.742
## 47 1253.00 1304.753
## 48 1204.50 1242.015
## 49 1251.00 1187.666
## 50 1326.50 1219.063
## 51 1291.75 1294.337
## 52 1288.50 1281.385
## 53 1250.50 1276.764
## 54 1315.00 1243.338
## 55 1285.25 1293.986
## 56 1285.75 1279.617
## 57 1216.50 1277.634
## 58 1164.25 1216.946
## 59 1182.75 1158.793
## 60 1206.00 1163.879
## 61 1260.25 1186.866
## 62 1214.00 1240.734
## 63 1187.00 1212.369
## 64 1180.25 1183.066
## 65 1191.40 1171.581
## 66 1171.00 1179.789
## 67 1098.40 1164.408
## 68 1135.00 1097.971
## 69 1114.00 1116.926
## 70 1142.35 1103.683
## 71 1061.90 1126.807
## 72 1060.00 1061.880
## 73 1111.80 1047.224
## 74 1234.90 1090.899
## 75 1237.00 1209.634
## 76 1285.65 1237.250
## 77 1212.10 1285.565
## 78 1320.75 1230.511
## 79 1342.00 1313.639
## 80 1309.25 1349.534
## 81 1322.50 1327.290
## 82 1272.00 1333.058
## 83 1178.10 1288.927
## 84 1145.90 1196.115
## 85 1212.80 1147.775
## 86 1255.60 1196.829
## 87 1244.85 1245.582
## 88 1266.45 1246.674
## 89 1266.20 1265.754
## 90 1242.25 1269.406
## 91 1267.55 1248.804
## 92 1311.75 1266.423
## 93 1283.10 1308.933
## 94 1270.15 1292.448
## 95 1280.20 1277.008
## 96 1291.00 1282.215
## 97 1345.05 1292.599
## 98 1317.85 1342.112
## 99 1323.85 1328.314
## 100 1313.20 1329.997
## 101 1305.35 1320.470
## 102 1250.45 1311.075
## 103 1220.95 1260.426
## 104 1202.45 1223.538
## 105 1187.25 1199.673
## 106 1214.95 1181.747
## 107 1217.55 1202.977
## 108 1279.00 1210.469
## 109 1323.25 1266.610
## 110 1319.15 1317.770
## 111 1295.40 1324.832
## 112 1282.30 1304.890
## 113 1295.55 1288.614
## 114 1409.00 1296.514
## 115 1427.55 1397.853
## 116 1528.40 1435.336
## 117 1485.30 1530.958
ramal_des <- forecast::forecast(df_des,h=21)
data.frame(ramal_des)## Point.Forecast Lo.80 Hi.80 Lo.95 Hi.95
## 118 1511.950 1423.845 1600.054 1377.2058 1646.694
## 119 1529.468 1412.107 1646.829 1349.9801 1708.956
## 120 1546.986 1402.323 1691.649 1325.7433 1768.229
## 121 1564.505 1393.264 1735.745 1302.6154 1826.394
## 122 1582.023 1384.386 1779.660 1279.7633 1884.282
## 123 1599.541 1375.402 1823.680 1256.7505 1942.331
## 124 1617.059 1366.149 1867.970 1233.3248 2000.794
## 125 1634.577 1356.525 1912.630 1209.3324 2059.822
## 126 1652.096 1346.466 1957.725 1184.6756 2119.516
## 127 1669.614 1335.932 2003.296 1159.2914 2179.936
## 128 1687.132 1324.896 2049.369 1133.1391 2241.125
## 129 1704.650 1313.340 2095.961 1106.1926 2303.108
## 130 1722.169 1301.254 2143.083 1078.4361 2365.901
## 131 1739.687 1288.634 2190.740 1049.8605 2429.513
## 132 1757.205 1275.475 2238.935 1020.4619 2493.948
## 133 1774.723 1261.777 2287.669 990.2398 2559.207
## 134 1792.241 1247.543 2336.940 959.1963 2625.287
## 135 1809.760 1232.773 2386.746 927.3354 2692.184
## 136 1827.278 1217.473 2437.082 894.6623 2759.893
## 137 1844.796 1201.646 2487.946 861.1831 2828.409
## 138 1862.314 1185.296 2539.332 826.9049 2897.724
Plot DES
plot(ramal_des, xlab="periode waktu", ylab="Yt",
main="Forecasting Using Double Exponential Smoothing (0.8, 0.1)")
lines(testing.ts, col = "black", lwd=1.8)
lines (datades[,2], col="green",lwd=1)
legend("topleft", legend = c("Data aktual", "Fitted DES", "Ramalan"), lty=1, col= c("black", "green", "blue"))Dari plot di atas, dapat terlihat garis data ramalan DES relatif mendekati garis data aktualnya (data testing). Selain itu, hampir seluruh data aktual masuk ke dalam selang kepercayaan 95% data ramalan DES. Hal ini mengindikasikan bahwa tingkat akurasi dari pemulusan DES sudah cukup baik dalam meramalkan data.
Nilai Akurasi DES
RMSE_DES_train <- sqrt(df_des$SSE/length(training.ts))
RMSE_DES_test <- sqrt(mean((testing.ts-ramal_des$mean)^2))
MAPE_DES_train <- mean(abs((df_des$fitted[,1]-training.ts)/training.ts)*100)
MAPE_DES_test <- mean(abs((testing.ts-ramal_des$mean)/testing.ts)*100)
Akurasi_DES <- data.frame("DES_Train"=c(RMSE_DES_train,MAPE_DES_train), "DES_Test"=c(RMSE_DES_test,MAPE_DES_test))
rownames(Akurasi_DES) <- c("RMSE","MAPE")
Akurasi_DES## DES_Train DES_Test
## RMSE 67.873907 122.299878
## MAPE 3.619096 5.202502
Dari syntax di atas, didapatkan bahwa nilai RMSE DES testing sebesar 113.463494 dan MAPE DES testing sebesar 5.261905 . Kedua nilai error ini juga cukup besar jika dibandingkan data trainingnya.
Perbandingan DMA vs DES
plot(ramal_des, xlab="periode waktu", ylab="Yt",
main="Forecasting DMA vs DES")
lines(testing.ts, col = "black", lwd=1.8)
lines (datades[,2], col="green",lwd=1.5)
lines(data.gab[,5],col="red",lwd=1.5)
legend("topleft", legend = c("Aktual", "Fitted DES", "Ramalan DES", "Ramalan DMA"), lty=1, col= c("black", "green", "blue", "red"))Plot di atas menunjukkan hasil peramalan dengan dua metode yang berbeda, yaitu DMA dan DES. Peramalan pada metode DMA yang ditunjukkan oleh garis merah memiliki pola ramalan yang naik, begitu juga peramalan pada metode DES yang ditunjukkan oleh garis biru memiliki pola naik dan terdapat daerah yang merupakan selang kepercayaan 80% dan 95%. Dari kedua metode tersebut, dapat dilihat bahwa secara eksploratif hasil ramalan metode DES cenderung lebih mendekati pola data test dibandingkan hasil ramalan data DMA yang sangat naik dan menjauhi pola data test.
Nilai akurasi DMA vs DES
Akurasi <- data.frame("DMA"=Akurasi_DMA[,2], "DES"=Akurasi_DES[,2])
rownames(Akurasi) <- c("RMSE","MAPE")
Akurasi## DMA DES
## RMSE 252.05395 122.299878
## MAPE 10.73407 5.202502
Dari perbandingan nilai keakuratan kedua model di atas, terbukti bahwa model DES menunjukkan nilai error yang lebih kecil daripada model DMA. Hal ini sesuai dengan hasil eksplorasi yang juga menyatakan bahwa model DES lebih baik untuk memprediksi data bila dibandingkan model DMA.
C. Cek Kestasioneran data
Secara Eksploratif
Secara eksploratif, kestasioneran data dapat terlihat dari plot deret waktu atau melihat plot acf dari peubah yang akan diuji. Jika pada plot deret waktu menunjukan pola tren naik/turun pada kurun waktu tertentu (tidak stabil), atau, jika plot acf menunjukkan pola tails off slowly, maka data tersebut tidak stasioner.
plot.ts(training.ts, ylab=expression(Y[t]), main = "Plot Time Series Data Penjualan Emas Bulanan")acf(training.ts)Terlihat dari plot deret waktu dan plot acf peubah data training di atas, bahwa secara eksploratif dapat disimpulkan data tersebut tidak stasioner karena menunjukkan pola tails off slowly. Uji ADF akan dilakukan untuk meyakinkan kesimpulan tersebut.
Uji Formal
Secara formal, metode Augmented Dickey-Fuller (ADF) dapat memberikan hasil uji secara akurat untuk menentukan apakah sebuah data stasioner atau tidak. Dengan hipotesis sebagai berikut:
H0 : Data tidak stasioner
H1 : Data stasioner
adf.test(training.ts)##
## Augmented Dickey-Fuller Test
##
## data: training.ts
## Dickey-Fuller = -1.9116, Lag order = 4, p-value = 0.6133
## alternative hypothesis: stationary
Didapat nilai P−value > 0.05 maka tak tolak H0 pada taraf nyata 5%. Artinya, cukup bukti untuk mengatakan bahwa data tidak stasioner. Untuk mengatasi ketidakstasioneran ini, perlu dilakukan differencing atau pembedaan.
Differencing
y_diff <- diff(training.ts, differences = 1)
y_diff## Time Series:
## Start = 2
## End = 117
## Frequency = 1
## [1] 29.75 7.25 63.75 28.25 36.50 -75.00 77.00 61.00 39.75
## [10] 36.75 22.00 -78.50 84.00 28.00 96.50 1.00 -31.00 123.00
## [19] 185.00 -193.50 102.00 24.00 -215.00 213.00 26.00 -107.50 -11.25
## [28] -93.25 40.50 23.50 26.50 127.50 -57.00 7.00 -68.50 7.25
## [37] -76.25 9.75 -129.25 -74.50 -202.50 122.50 80.25 -68.25 -2.50
## [46] -71.00 -48.50 46.50 75.50 -34.75 -3.25 -38.00 64.50 -29.75
## [55] 0.50 -69.25 -52.25 18.50 23.25 54.25 -46.25 -27.00 -6.75
## [64] 11.15 -20.40 -72.60 36.60 -21.00 28.35 -80.45 -1.90 51.80
## [73] 123.10 2.10 48.65 -73.55 108.65 21.25 -32.75 13.25 -50.50
## [82] -93.90 -32.20 66.90 42.80 -10.75 21.60 -0.25 -23.95 25.30
## [91] 44.20 -28.65 -12.95 10.05 10.80 54.05 -27.20 6.00 -10.65
## [100] -7.85 -54.90 -29.50 -18.50 -15.20 27.70 2.60 61.45 44.25
## [109] -4.10 -23.75 -13.10 13.25 113.45 18.55 100.85 -43.10
Cek ulang kestasioneran data
adf.test(y_diff)## Warning in adf.test(y_diff): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: y_diff
## Dickey-Fuller = -4.8468, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
Didapat nilai P−value = 0.01 < 0.05 maka tolak H0 pada taraf nyata 5% atau cukup bukti untuk mengatakan bahwa data sudah stasioner. Artinya, differencing pertama sukses untuk membuat data stasioner.
D. Identifikasi model Arima
Untuk mengidentifikasi model arima, nilai ACF dan PACF dapat digunakan untuk menentukan nilai q pada nilai MA(q) dan nilai p pada model AR(p). Namun, kedua nilai ini p dan q pada model campuran ARMA(p,q). Oleh karena itu, dikembangkan metode extended autocorrelation function (EACF) untuk mengindentifikasi model campuran ARMA(p,q). Pada tabel EACF, triangle of zeros akan terbentuk, dan nilai pada pojok kiri atas akan bersesuaian dengan ordo ARMA.
ACF
acf(y_diff)Dari plot ACF di atas, dapat terlihat bahwa terdapat cuts off setelah lag 2. Oleh karena itu, model yang terbentuk adalah ARIMA(0,2,2).
PACF
pacf(y_diff)Dari plot PACF di atas, dapat terlihat bahwa terdapat cuts off setelah lag 3. Oleh karena itu, model yang terbentuk adalah ARIMA(3,2,0).
EACF
eacf(y_diff)## AR/MA
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o x o o o o x o o o
## 1 x o o o o x o o o o x o o o
## 2 x o o o o x o o o o x o o o
## 3 x x o o o o o o o o x o o o
## 4 x x o x o o o o o o o o o o
## 5 o x x x o o o o o o x o o o
## 6 o o x o x o o o o o x o o o
## 7 o o x o o o o o o o o o o o
Dari tabel EACF di atas, dapat terlihat bahwa terdapat triangle of zero dengan titik kiri atasnya yaitu pada 0,0; 0,1; 0,2; 1,1. Maka model yang terbentuk menurut EACF adalah ARIMA(0,1,0), ARIMA(0,1,1), ARIMA(0,1,2), ARIMA(1,1,1)
Pemilihan Model Terbaik
arima010 <- Arima(training.ts, order=c(0,1,0), method="ML")
arima011 <- Arima(training.ts, order=c(0,1,1), method="ML")
arima012 <- Arima(training.ts, order=c(0,1,2), method="ML")
arima111 <- Arima(training.ts, order=c(1,1,1), method="ML")Keakuratan Model
akurasi_model = data.frame("Model" = c("ARIMA(0,1,0)", "ARIMA(0,1,1)", "ARIMA(0,1,2)", "ARIMA(1,1,1)"),
"AIC" = c(arima010$aic, arima011$aic, arima012$aic,arima111$aic),
"BIC" = c(arima010$bic, arima011$bic, arima012$bic,arima111$bic))
akurasi_model[order(akurasi_model[,3]),]## Model AIC BIC
## 1 ARIMA(0,1,0) 1310.662 1313.415
## 2 ARIMA(0,1,1) 1309.833 1315.341
## 3 ARIMA(0,1,2) 1311.714 1319.975
## 4 ARIMA(1,1,1) 1311.767 1320.028
Perbandingan Ramalan Dua Model Terbaik
ramalan010 <- forecast(arima010, h = 21)
ramalan011 <- forecast(arima011, h = 21)
plot(ramalan010); lines(testing.ts)plot(ramalan011); lines(testing.ts)Berdasarkan perbandingan kedua plot di atas, dapat terlihat bahwa model ARIMA(0,1,0) jauh lebih baik dalam menduga harga emas 21 pekan setelah data training. Oleh karena itu, secara eksploratif dapat dikatakan bahwa ARIMA(0,1,0) merupakan model terbaik.
Nilai Akurasi
akurasi010 <- accuracy(ramalan010, testing.ts)
akurasi011 <- accuracy(ramalan011, testing.ts)
akurasi_model = data.frame("Model" = c("ARIMA(0,1,0)", "ARIMA(0,1,1)"),
"RMSE" = c(akurasi010[2,2], akurasi011[2,2]),
"MAPE" = c(akurasi010[2,5], akurasi011[2,5]))
akurasi_model[order(akurasi_model[,3]),]## Model RMSE MAPE
## 2 ARIMA(0,1,1) 290.7865 14.00509
## 1 ARIMA(0,1,0) 294.4020 14.21936
Dari ukuran RMSE dan MAPE, terlihat bahwa model ramalan yang memiliki nilai RMSE dan MAPE terkecil adalah ARIMA(0,1,0), yaitu sebesar 245.4816 dan 11.31409.
Kesimpulan Model terbaik
Berdasarkan hasil yang telah didapat di atas, dapat disimpulkan bahwa model terbaik untuk melakukan ramalan data harga emas bulanan adalah ARIMA(0,1,0)
D. Overfitting
ARIMA(1,1,0)
arima110 <- Arima(training.ts, order=c(1,1,0), method="ML")
summary(arima110)## Series: training.ts
## ARIMA(1,1,0)
##
## Coefficients:
## ar1
## -0.1472
## s.e. 0.0917
##
## sigma^2 = 4583: log likelihood = -653.06
## AIC=1310.11 AICc=1310.22 BIC=1315.62
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 4.049471 67.11879 50.38363 0.1903495 3.685552 1.001611 -0.0153007
coeftest(arima110)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.147219 0.091658 -1.6062 0.1082
Dari model overfitting ARIMA(1,1,0), dapat terlihat bahwa tidak ada parameter yang signifikan. Dapat terlihat jelas bahwa model ini tidak lebih baik daripada model awal.
ARIMA(0,1,1)
arima011 <- Arima(training.ts, order=c(0,1,1))
summary(arima011)## Series: training.ts
## ARIMA(0,1,1)
##
## Coefficients:
## ma1
## -0.1615
## s.e. 0.0935
##
## sigma^2 = 4572: log likelihood = -652.92
## AIC=1309.83 AICc=1309.94 BIC=1315.34
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 4.193709 67.03728 50.26426 0.1979633 3.678215 0.999238
## ACF1
## Training set -0.000460097
coeftest(arima011)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.161479 0.093493 -1.7272 0.08413 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dari model overfitting ARIMA(0,1,1), dapat terlihat bahwa parameter ma1 yang ditambahkan tidak signifikan. Artinya, model ini juga tidak lebih baik daripada model awal.
Nilai AIC dan BIC Model
akurasi_ovrfit = data.frame("Model" = c("ARIMA(0,1,0)", "ARIMA(1,1,0)", "ARIMA(0,1,1)"),
"AIC" = c(arima010$aic, arima110$aic, arima011$aic),
"BIC" = c(arima010$bic, arima110$bic, arima011$bic))
akurasi_ovrfit[order(akurasi_ovrfit[,3]),]## Model AIC BIC
## 1 ARIMA(0,1,0) 1310.662 1313.415
## 3 ARIMA(0,1,1) 1309.833 1315.341
## 2 ARIMA(1,1,0) 1310.111 1315.618
Dari ukuran AIC, terlihat bahwa model yang memiliki nilai AIC terkecil adalah ARIMA(0,1,1), yaitu sebesar 1299.422 . Sedangkan, model yang memiliki nilai BIC terkecil adalah ARIMA(0,1,0).
Kesimpulan
Dari signifikansi model terbaik dan ukuran BIC, dapat disimpulkan bahwa model terbaiknya adalah model awal yaitu ARIMA(0,1,0).
E. Diagnostik Model
Prosedur Eksploratif
best_model <- arima010
sisaan <- best_model$residuals
par(mfrow=c(2,2))
qqnorm(sisaan)
qqline(sisaan, col = "blue", lwd = 2)
plot(as.numeric(best_model$fitted), as.numeric(sisaan), xlab="Fitted", ylab="Sisaan",
ylim=c(-500,500), main="Residuals vs Fitted"); abline(h=0, col="red")
acf(sisaan)
plot(1:length(sisaan),sisaan,type='o', xlab="Order", ylim=c(-500,500),
main="Residuals vs Order"); abline(h=0, col="red")Normal Q-Q Plot Berdasarkan hasil eksplorasi di atas, terlihat bahwa banyak amatan sisaan cenderung menjauhi garis qq-plot distribusi normal. Oleh karena itu, secara eksploratif dapat disimpulkan bahwa sisaan belum cukup menyebar normal.
Plot Residual vs Fitted Berdasarkan hasil eksplorasi di atas, mayoritas titik amatan berada disekitar nol meskipun ada beberapa titik amatan yang terletak jauh dari titik nol. Selain itu, dapat terlihat bahwa lebar pita dari sisaan tidak terlalu berbeda jauh dari kiri hingga ke kanan, hal ini mengindikasikan bahwa ragam dari sisaan cukup homogen.
Plot ACF Berdasarkan hasil eksplorasi di atas, pada plot ACF terdapat garis vertikal di lag tertentu yang melebihi tinggi garis biru horizontal.Oleh karena itu, secara eksploratif plot ACF dapat disimpulkan terdapat autokorelasi pada model.
Residual vs Order Berdasarkan hasil eksplorasi di atas, titik amatan pada plot kebebasan sisaan mayoritas bergerak di sekitar titik nol. Namun, terdapat beberapa titik amatan yang terletak cukup jauh dari titik nol. Oleh karena itu, secara eksploratif plot residual vs order belum dapat disimpulkan apakah sisaan tersebut terdapat autokorelasi atau tidak.
Uji Formal
Kolmogrov-Smirnov Test H0: Sisaan menyebar secara normal
H1: Sisaan tidak menyebar secara normal
ks.test(sisaan,"pnorm")## Warning in ks.test(sisaan, "pnorm"): ties should not be present for the
## Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: sisaan
## D = 0.50816, p-value < 2.2e-16
## alternative hypothesis: two-sided
Berdasarkan uji normalitas dengan Kolmogorov-Smirnov Test diperoleh nilai P−value=2.2e−16 < 0.05. Sehingga dapat disimpulkan bahwa data tidak menyebar secara normal.
L-Jung Box Test H0: Sisaan saling bebas (tidak terdapat korelasi)
H1: Sisaan tidak saling bebas (terdapat korelasi)
Box.test(sisaan,type = "Ljung-Box")##
## Box-Ljung test
##
## data: sisaan
## X-squared = 2.737, df = 1, p-value = 0.09805
Berdasarkan uji autokorelasi dengan L-Jung Box Test diperoleh nilai P−value=0.09805 > 0.05. Sehingga, dapat disimpulkan bahwa tidak terdapat korelasi sisaan antar lagnya.
T-Test H0: Rataan sisaan sama dengan 0
H1: Rataan sisaan tidak sama dengan 0
t.test(sisaan, mu = 0, conf.level = 0.95)##
## One Sample t-test
##
## data: sisaan
## t = 0.55397, df = 116, p-value = 0.5807
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -8.977942 15.950224
## sample estimates:
## mean of x
## 3.486141
Berdasarkan uji rataan dengan T-Test diperoleh nilai P−value=0.5807 > 0.05, sehingga dapat disimpulkan bahwa sisasaannya sama dengan 0.
Peramalan
Plot
ramalan_best <- forecast(best_model, h = 21)
plot(ramalan_best); lines(testing.ts)Nilai Akurasi
accuracy(ramalan_best, testing.ts)## ME RMSE MAE MPE MAPE MASE
## Training set 3.486141 67.8673 49.88187 0.1598729 3.640099 0.9916362
## Test set 255.557143 294.4020 257.95238 14.0553234 14.219364 5.1280143
## ACF1 Theil's U
## Training set -0.1510093 NA
## Test set 0.7670305 3.324298