Pendugaan Model Data Harga Gula Dunia 2012-2022
Kelompok 6 P2 MPDW
Anggota:
- Andriansyah (G1401201048)
- Rosy Rosita (G1401201016)
- Arsyfia Chairunnisa Azmy (G1401201071)
- Abdussalam Ahmad (G1401201075)
- M. Dylan Pahlevi (G1401201063)
Pendahuluan
Latar Belakang
Gula merupakan salah satu pemegang peranan penting dan merupakan komoditas strategis pada bidang pertanian (Sugiyanto 2017). Gula juga digunakan sebagai bahan baku pembuat alkohol, bahan pengawet makanan dan pencampur obat - obatan (Syafa’at 2005). Konsumsi gula diperkirakan cenderung bertambah tahun ke tahun seiring meningkatnya jumlah penduduk, pertumbuhan ekonomi, dan pertumbuhan industri makanan dan minuman ( Maria 2009).
Produksi gula mengalami fluktuasi karena permintaan yang cenderung meningkat, oleh karena itu untuk memenuhi kebutuhan permintaan gula pemerintah melakukan opsi untuk impor gula (Safrida 2004). Permintaan gula dipengaruhi oleh harga gula yang berkaitan dengan daya beli masyarakat (Kurniawati 2005).
Di pasar produk pertanian, harga gula menjadi salah satu indikator terbaik untuk mengukur dan mengetahui kondisi pasar dunia, regional, dan domestik. Harga gula menjadi sangat penting dalam membantu menguraikan strategi ekonomi serta membuat keputusan yang tepat dan tepat waktu mengenai produksi (untuk petani), pemasaran, serta konsumsi terutama untuk negara-negara dengan rasio produk pertanian terhadap total impor sangat tinggi (Apergis dan Rezitis 2011).
Harga gula dari tahun ke tahun mengalami kenaikkan dan penurunan yang cukup bervariatif sehingga memengaruhi daya jual beli masyarakat terhadap gula. Untuk itu sangat penting untuk mengetahui prediksi dari harga gula yang akan datang pada periode tertentu. Salah satu metode yang digunakan untuk memprediksi harga gula adalah Metode Double Exponential Smoothing (DES).
Double Exponential Smoothing (DES) merupakan suatu metode prediksi dengan memberi nilai pembobot pada beberapa periode atau pengamatan sebelumnya untuk memprediksi nilai pada periode yang akan datang (Hilmy et al. 2021).
Tujuan Penelitian
Tujuan dari penelitian ini adalah sebagai berikut:
- Membangun model ARIMA yang menjelaskan hubungan antara harga gula dunia saat ini dengan harga gula dunia pada periode-periode sebelumnya
- Melakukan peramalan harga gula dunia untuk periode Agustus 2022 - Juli 2023 berdasarkan model terbaik
Tinjauan Pustaka
Gula
Gula merupakan suatu karbohidrat sederhana karena dapat larut dalam air dan langsung diserap tubuh untuk diubah menjadi energi. Secara umum, gula dapat dibedakan menjadi dua, yaitu monosakarida dan disakarida (Darwin 2013). Gula merupakan komoditas utama perdagangan di Indonesia. Gula merupakan salah satu pemanis yang umum dikonsumsi masyarakat. Gula biasa digunakan sebagai pemanis di makanan maupun minuman, dalam bidang makanan, selain sebagai pemanis, gula juga digunakan sebagai stabilizer dan pengawet. Kebutuhan akan gula setiap tahunnya meningkat, selain karena pertamabahan jumlah penduduk juga karena semakin banyak industry yang memerlukan gula sebagai bahan baku sehingga harga gula pasir terus mengalami perubahan setiap tahunnya.
Analisis Deret Waktu
Analisis deret waktu adalah suatu metode kuantitatif untuk menentukan pola data masa lalu yang telah dikumpulkan secara teratur. Data dapat berupa data harian, mingguan, bulanan, kuartal, dan tahunan. Analisis deret waktu adalah salah satu prosedur statistika yang ditetapkan untuk meramalkan struktur probalistik keadaan yang akan terjadi pada masa akan datang dalam pengambilan keputusan (Aswi dan Sukarna 2006).
Analis deret waktu didasarkan dua domain yaitu domain waktu dan domain frekuensi. Model dalam domain waktu antara lain Autoregressive Integrated Moving Average (ARIMA). Analisis pada domain frekuensi yaitu analisis deret waktu yang dianggap sebagai akibat dari adanya komponen siklus pada frekuensi berbeda yang sulit diperoleh dalam domain waktu (Habinuddin et al. 2019).
Kestasioneran
Asumsi yang paling penting pada analisis deret waktu adalah stasioneritas data. Data yang stasioner adalah data yang nilai rata-rata dan variannya tidak mengalami perubahan secara sistematik sepanjang waktu atau yang memiliki rata- rata dan variannya konstan. Untuk melihat adanya stasioneritas tersebut, dapat dilihat dengan grafik atau plot time series menggunakan Scatter Plot. Grafik tersebut menjelaskan observasi dengan waktu. Jika terlihat memiliki rata-rata dan varians konstan, data tersebut dapat disimpulkan stasioner. Jika kondisi stasioner dalam rata-rata tidak terpenuhi, maka dilakukan proses pembedaan (differencing). Apabila kondisi stasioner dalam variansi tidak terpenuhi, maka dilakukan transformasi pangkat (Power Transformation) (Aswi dan Sukarna, 2006).
Autokorelasi dan Autokorelasi Parsial
Metode grafik dengan Scatter Plot memiliki kelemahan dalam objektivitas peneliti. Setiap peneliti dapat memiliki pandangan yang berbeda-beda sehingga dibutuhkan uji formal yang akan menguatkan keputusan secara ilmiah. Salah satu uji formal tersebut adalah korelogram. Korelogram merupakan teknik identifikasi stasioner data deret waktu melalui fungsi autokorelasi (ACF) dan fungsi autokorelasi parsial (PACF) (Habinuddin et al. 2019).
Model Deret Waktu ARIMA
Model deret waktu ARIMA (Autoregressive Integrated Moving Average) merupakan gabungan dari model AutoregressiveI (AR) ordo p, model Moving Average (MA) ordo q, dan diikuti proses differencing ordo d. Model ini dapat digunakan untuk data deret waktu yang bersifat univariat. Model ARIMA (p, q, d) dapat ditulis dalam persamaan (Wei 2006):
Data dan Analisis Eksplorasi
Metodologi
library(dplyr)
library(readxl)
library(forecast)
library(TTR)
library(graphics)
require(smooth)
require(Mcomp)
library(fpp2)
library(tseries)
library(readr)
library(TSA)
library(ggplot2)
library(MLmetrics)
library(cowplot)
library(gridExtra)
library(gtable)
library(grid)
library(MASS)Data yang kami gunakan pada analisis kali ini adalah data harga gula dunia dalam US cents per bulan sejak Januari 2000 hingga Juni 2022. Data terdiri dari 271 amatan dengan 2 variabel yaitu variabel waktu dan harga gula. Data bersumber dari IMF, yang dapat diakses melalui https://www.imf.org/en/Research/commodity-prices
#Input Data
data<- read_xlsx("C:/Users/Alam/Downloads/bisa mpdw - Copy.xlsx")
head(data)## # A tibble: 6 x 2
## t Gula
## <dttm> <dbl>
## 1 2000-01-01 00:00:00 5.63
## 2 2000-02-01 00:00:00 5.35
## 3 2000-03-01 00:00:00 5.11
## 4 2000-04-01 00:00:00 6.01
## 5 2000-05-01 00:00:00 6.78
## 6 2000-06-01 00:00:00 8.33
str(data)## tibble [271 x 2] (S3: tbl_df/tbl/data.frame)
## $ t : POSIXct[1:271], format: "2000-01-01" "2000-02-01" ...
## $ Gula: num [1:271] 5.63 5.35 5.11 6.01 6.78 ...
dim(data)## [1] 271 2
Yt<-data$GulaPembagian Data Training dan Data Testing
Data training adalah bagian dari data set yang digunakan untuk membuat prediksi atau dalam tahapan modelling. Data yang digunakan sebagai data training sebanyak 70% dari keseluruhan data set, yaitu sebanyak 191 amatan. Sedangkan data testing adalah bagian dari data set yang digunakan untuk melihat keakuratan dari data training. Data yang digunakan sebagai data testing sebanyak 45% dari keseluruhan data set, yaitu sebanyak 81 amatan.
test <- tail(data,81)
train <- head(data,190)
#data time series
train.ts<-ts(train$Gula)
test.ts<-ts(test$Gula, start = 191)
data.ts<-ts(data$Gula)Eksplorasi Data
plot(x = data$t,
y = Yt,
col = "black",
lwd = 1,
type = "o",
xlab = "Tahun",
ylab = "Harga Gula",
main = "Time Series Plot of Harga Gula Dunia")plot(x = train$t,
y = train$Gula,
col = "black",
lwd = 1,
type = "o",
xlab = "Tahun",
ylab = "Harga Gula Dunia",
main = "Time Series Plot of Harga Gula Dunia (Data Training)")plot(x = test$t,
y = test$Gula,
col = "black",
lwd = 1,
type = "o",
xlab = "Tahun",
ylab = "Harga Gula Dunia",
main = "Time Series Plot of Harga Gula Dunia (Data Testing)") Terlihat bahwa pola data harga gula membentuk pola tren menurun. Berdasarkan time series plot, harga gula dunia mengalami peningkatan yang signifikan pada tahun 2016 hingga 2017, dan tahun 2020 hingga sekarang, yakni pada masa pandemi.
Pemulusan
Berdasarkan hasil pengecekan data yang tidak stasioner dan memiliki tren negatif, digunakan Double Moving Average dan Double Exponential Smoothing sebagai metode pemulusan terhadap data. Pemulusan akan dilakukan terhadap data training, dan dilakukan perhitungan akurasi forecasting terhadap data testing.
Double Moving Average
Dilakukan proses pemulusan dengan metode double moving average (DMA) dengan optimisasi nilai m.
akurasi = data.frame()
for(n in 1:95){
dma.step1<-SMA(train.ts, n=n)
dma <- SMA(dma.step1, n=n)
pemulusan.DMA <- c(dma, rep(NA,81))
At <- 2*dma.step1 - dma
Bt <- 2/(n-1)*(dma.step1 - dma)
data.dma<- At+Bt
f = c()
for(i in 1:81){
f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}
data.ramal2<- c(NA, data.dma)
ramalan2 = c(data.ramal2, f[-1])
error.dma = test.ts-ramalan2[191:length(ramalan2)]
SSE.dma = sum(error.dma^2)
MSE.dma = SSE.dma/length(test.ts)
RMSE.dma = sqrt(MSE.dma)
MAPE.dma = mean(abs((error.dma/test.ts)*100))
akurasi.dma <- matrix(c(SSE.dma, MSE.dma, MAPE.dma))
row.names(akurasi.dma)<- c("SSE", "MSE", "MAPE")
colnames(akurasi.dma) <- c(paste("Akurasi m =", n))
akurasi = rbind(akurasi, c(n=n, akurasi=akurasi.dma[3]))
}
akurasi[order(akurasi[,2]),]## X1 Inf.
## 52 52 18.68041
## 51 51 19.21765
## 53 53 19.50629
## 54 54 20.36333
## 55 55 21.82757
## 50 50 23.63784
## 56 56 23.93290
## 4 4 26.86796
## 57 57 27.09642
## 49 49 29.12170
## 58 58 31.03847
## 48 48 35.24623
## 59 59 35.47231
## 5 5 37.22702
## 60 60 40.11844
## 47 47 40.89457
## 61 61 44.92639
## 46 46 45.98237
## 62 62 48.20328
## 63 63 50.03205
## 45 45 51.47619
## 64 64 51.53315
## 65 65 52.55266
## 66 66 53.17128
## 67 67 54.36658
## 68 68 55.96303
## 44 44 56.59479
## 69 69 58.75480
## 21 21 61.28032
## 70 70 61.49829
## 43 43 61.89787
## 25 25 62.36716
## 20 20 62.65885
## 22 22 62.72118
## 24 24 63.40591
## 23 23 63.64989
## 26 26 64.02930
## 71 71 65.12246
## 42 42 66.31795
## 27 27 66.97993
## 19 19 67.49214
## 72 72 68.07570
## 41 41 69.08096
## 28 28 69.90148
## 73 73 71.12152
## 40 40 71.41621
## 29 29 73.16353
## 6 6 73.24203
## 74 74 74.23434
## 18 18 74.59172
## 39 39 75.25395
## 30 30 76.31989
## 75 75 76.81165
## 38 38 77.23697
## 76 76 78.25992
## 37 37 78.75513
## 31 31 79.27086
## 77 77 79.34220
## 95 95 79.36948
## 94 94 79.88060
## 85 85 79.88493
## 92 92 80.02280
## 91 91 80.03161
## 84 84 80.07475
## 90 90 80.09897
## 78 78 80.10154
## 93 93 80.15563
## 83 83 80.23436
## 86 86 80.24110
## 79 79 80.32033
## 80 80 80.40117
## 36 36 80.46399
## 87 87 80.50170
## 89 89 80.50188
## 82 82 80.52112
## 81 81 80.59034
## 88 88 80.63749
## 32 32 81.13528
## 35 35 81.37653
## 34 34 82.19451
## 33 33 82.33926
## 17 17 83.45730
## 16 16 94.09805
## 7 7 101.41075
## 15 15 108.06681
## 14 14 120.03503
## 8 8 127.55118
## 13 13 128.12117
## 3 3 131.04358
## 12 12 136.99141
## 9 9 137.51868
## 10 10 141.63837
## 11 11 143.74276
## 2 2 479.21584
## 1 1 Inf
Didapatkan M = 43 sebagai nilai M optimum.
val = 52
dma.step1<-SMA(train.ts, n=val)
dma <- SMA(dma.step1, n=val)
pemulusan.DMA <- c(dma, rep(NA,81))
At <- 2*dma.step1 - dma
Bt <- 2/(val-1)*(dma.step1 - dma)
data.dma<- At+Bt
f = c()
for(i in 1:81){
f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}
data.ramal2<- c(NA, data.dma)
ramalan2 = c(data.ramal2, f[-1])
error.dma = test.ts-ramalan2[191:length(ramalan2)]
SSE.dma = sum(error.dma^2)
MSE.dma = SSE.dma/length(test.ts)
RMSE.dma = sqrt(MSE.dma)
MAPE.dma = mean(abs((error.dma/test.ts)*100))
accu <- data.frame(SSE.dma, MSE.dma, RMSE.dma, MAPE.dma)
accu## SSE.dma MSE.dma RMSE.dma MAPE.dma
## 1 1268.909 15.66555 3.957973 18.68041
ts.plot(data.ts,xlab="Time Period ", ylab="Harga Gula", main= "DMA M=52 Harga Gula")
lines(pemulusan.DMA,col="green",lwd=2)
lines(ramalan2, col= "red",lwd=2)Double Exponential Smoothing
Dilakukan proses pemulusan dengan metode double exponential smoothing (DES) dengan optimisasi nilai alpha dan beta.
#plot DES
df.master <- data.frame()
for(i in 1:10){
x = i/10
for(j in 1:10){
y = j/10
optimumdes <- HoltWinters(train.ts, alpha = y, beta = x, gamma = FALSE)
ramal_des <- forecast(optimumdes, h = 81)
error.des1 <- (ramal_des$mean-test.ts)
ssetest <- sum(error.des1^2)
msetest <- ssetest/length(error.des1)
rmsetest <- sqrt(msetest)
mapetest <- sum(abs(error.des1/test.ts))/length(error.des1)*100
ak <- data.frame(Alpha=y,Beta=x,SSE=ssetest,MSE=msetest,RMSE=rmsetest, MAPE = mapetest)
df.master <- rbind(df.master,ak)
}
}
df.master[order(df.master[,6]),]## Alpha Beta SSE MSE RMSE MAPE
## 10 1.0 0.1 1228.3520 15.16484 3.894206 16.86720
## 16 0.6 0.2 880.6980 10.87281 3.297395 17.02722
## 24 0.4 0.3 966.7278 11.93491 3.454694 18.06583
## 9 0.9 0.1 1895.8140 23.40511 4.837883 20.72893
## 42 0.2 0.5 1953.2913 24.11471 4.910673 22.68673
## 33 0.3 0.4 1411.3732 17.42436 4.174250 24.35295
## 15 0.5 0.2 2454.0640 30.29709 5.504279 25.89437
## 91 0.1 1.0 1825.0587 22.53159 4.746745 26.30653
## 8 0.8 0.1 3064.5945 37.83450 6.150975 29.06497
## 17 0.7 0.2 1765.7098 21.79889 4.668928 29.66708
## 7 0.7 0.1 4889.9452 60.36969 7.769794 40.19100
## 25 0.5 0.3 4308.1850 53.18747 7.292974 46.76203
## 18 0.8 0.2 4294.1980 53.01479 7.281126 46.87910
## 23 0.3 0.3 6070.0305 74.93865 8.656711 48.18877
## 52 0.2 0.6 4819.7053 59.50253 7.713789 49.05287
## 6 0.6 0.1 7538.3320 93.06583 9.647063 52.63900
## 14 0.4 0.2 7919.8190 97.77554 9.888152 55.33913
## 19 0.9 0.2 7789.3547 96.16487 9.806369 61.98918
## 5 0.5 0.1 11195.1524 138.21176 11.756350 66.25707
## 34 0.4 0.4 9990.8141 123.34338 11.106007 69.24324
## 43 0.3 0.5 11618.6611 143.44026 11.976655 74.22599
## 20 1.0 0.2 11579.7772 142.96021 11.956597 74.58938
## 26 0.6 0.3 12007.7457 148.24377 12.175540 75.49600
## 32 0.2 0.4 14984.1214 184.98915 13.601072 80.18097
## 4 0.4 0.1 16002.5491 197.56234 14.055687 80.84636
## 1 0.1 0.1 18431.9234 227.55461 15.084913 87.34807
## 62 0.2 0.7 18498.3575 228.37478 15.112074 92.03466
## 13 0.3 0.2 20373.9200 251.52988 15.859693 92.72027
## 81 0.1 0.9 19196.3715 236.99224 15.394552 93.20881
## 3 0.3 0.1 21492.3261 265.33736 16.289179 94.81128
## 2 0.2 0.1 23818.2006 294.05186 17.147940 99.95991
## 27 0.7 0.3 22713.2220 280.41015 16.745452 101.70797
## 11 0.1 0.2 25773.4582 318.19084 17.837905 102.48873
## 35 0.5 0.4 24978.4482 308.37590 17.560635 106.12205
## 53 0.3 0.6 29396.7473 362.92281 19.050533 114.39739
## 44 0.4 0.5 31142.5876 384.47639 19.608070 117.61519
## 22 0.2 0.3 35062.4962 432.87032 20.805536 123.59680
## 28 0.8 0.3 35178.9865 434.30848 20.840069 125.42367
## 72 0.2 0.8 37107.1050 458.11241 21.403561 127.55971
## 71 0.1 0.8 38836.1077 479.45812 21.896532 131.92168
## 61 0.1 0.7 40583.2504 501.02778 22.383650 134.45916
## 12 0.2 0.2 42289.7355 522.09550 22.849409 135.09985
## 36 0.6 0.4 45497.4075 561.69639 23.700135 141.43478
## 63 0.3 0.7 48148.6568 594.42786 24.380891 144.68725
## 29 0.9 0.3 47921.1365 591.61897 24.323219 145.89831
## 82 0.2 0.9 54242.2561 669.65748 25.877741 153.03911
## 51 0.1 0.6 53760.7303 663.71272 25.762623 154.77766
## 54 0.4 0.6 58560.1950 722.96537 26.888015 159.26800
## 45 0.5 0.5 59517.4787 734.78369 27.106894 160.83823
## 30 1.0 0.3 59277.8005 731.82470 27.052259 162.04613
## 92 0.2 1.0 65281.9283 805.94973 28.389254 167.53486
## 73 0.3 0.8 65711.8297 811.25716 28.482576 168.25289
## 37 0.7 0.4 69949.2502 863.57099 29.386578 174.74738
## 21 0.1 0.3 82610.6767 1019.88490 31.935637 188.05973
## 83 0.3 0.9 83509.0699 1030.97617 32.108818 189.22546
## 41 0.1 0.5 87699.7854 1082.71340 32.904611 197.24629
## 64 0.4 0.7 91464.6333 1129.19300 33.603467 198.21151
## 46 0.6 0.5 96546.7724 1191.93546 34.524418 204.39097
## 38 0.8 0.4 95839.9198 1183.20889 34.397804 204.55044
## 55 0.5 0.6 105025.0371 1296.60540 36.008407 212.67193
## 93 0.3 1.0 106058.3887 1309.36282 36.185119 212.86275
## 31 0.1 0.4 119023.2943 1469.42339 38.333059 228.34938
## 39 0.9 0.4 120029.9684 1481.85146 38.494824 229.23854
## 74 0.4 0.8 132591.7327 1636.93497 40.459053 238.42450
## 47 0.7 0.5 138254.4694 1706.84530 41.313984 245.06034
## 40 1.0 0.4 139081.8348 1717.05969 41.437419 247.03752
## 65 0.5 0.7 161690.1546 1996.17475 44.678571 263.93480
## 56 0.6 0.6 162505.3440 2006.23882 44.791057 265.14533
## 48 0.8 0.5 180000.0566 2222.22292 47.140459 280.03684
## 84 0.4 0.9 184403.1736 2276.58239 47.713545 281.35048
## 49 0.9 0.5 215933.7291 2665.84851 51.631856 307.05347
## 57 0.7 0.6 224319.5338 2769.37696 52.624870 312.04072
## 75 0.5 0.8 229260.1328 2830.37201 53.201241 314.40184
## 66 0.6 0.7 242114.3013 2989.06545 54.672346 323.65334
## 50 1.0 0.5 240000.8560 2962.97353 54.433202 323.97833
## 94 0.4 1.0 246159.7355 3039.00908 55.127208 325.20942
## 58 0.8 0.6 283080.2733 3494.81819 59.116987 350.93426
## 85 0.5 0.9 305745.7278 3774.63861 61.438088 363.15651
## 67 0.7 0.7 326125.7803 4026.24420 63.452693 376.10675
## 59 0.9 0.6 328731.4549 4058.41302 63.705675 378.51299
## 76 0.6 0.8 334077.5360 4124.41402 64.221601 380.15646
## 60 1.0 0.6 351960.5890 4345.19246 65.918074 391.91760
## 95 0.5 1.0 389049.6375 4803.08194 69.304271 409.69724
## 68 0.8 0.7 401453.0173 4956.21009 70.400356 417.71187
## 86 0.6 0.9 437637.7367 5402.93502 73.504660 435.06136
## 77 0.7 0.8 442118.5726 5458.25398 73.879997 437.81225
## 69 0.9 0.7 451904.0633 5579.06251 74.693122 443.51575
## 70 1.0 0.7 465088.4356 5741.83254 75.774881 450.20299
## 78 0.8 0.8 531305.7148 6559.32981 80.989690 480.36634
## 96 0.6 1.0 553098.9191 6828.38172 82.634023 489.06112
## 87 0.7 0.9 570875.3995 7047.84444 83.951441 497.40467
## 80 1.0 0.8 569179.4729 7026.90707 83.826649 497.80459
## 79 0.9 0.8 578281.1013 7139.27286 84.494218 501.48986
## 90 1.0 0.9 654015.7315 8074.26829 89.856932 533.45088
## 88 0.8 0.9 667907.8322 8245.77571 90.806254 538.44384
## 89 0.9 0.9 699812.2741 8639.65771 92.949759 551.50348
## 97 0.7 1.0 710398.3084 8770.34949 93.650144 554.78741
## 100 1.0 1.0 710068.4278 8766.27689 93.628398 555.74325
## 98 0.8 1.0 805211.7881 9940.88627 99.703993 591.08751
## 99 0.9 1.0 808006.5975 9975.39009 99.876875 592.48072
didapatkan alpha = 1 dan beta = 0.1 sebagai alpha dan beta optimum
optimumdes <- HoltWinters(train.ts, alpha = 1, beta = 0.1, gamma = FALSE)
ramal_des <- forecast(optimumdes, h = 81)
error.des1 <- (ramal_des$mean-test.ts)
sse.des <- sum(error.des1^2)
mse.des <- sse.des/length(test.ts)
rmse.des <- sqrt(mse.des)
mape.des <- sum(abs(error.des1/test.ts))/length(error.des1)*100
aku <- data.frame(SSE=sse.des,MSE=mse.des,RMSE=rmse.des, MAPE = mape.des)
aku## SSE MSE RMSE MAPE
## 1 1228.352 15.16484 3.894206 16.8672
ts.plot(data.ts,xlab="Time Period ", ylab="Harga Gula", main= "DES Harga Gula", sub = "beta, alpha optimum")
lines(optimumdes$fitted[,1], col ="blue", lwd = 2)
lines(ramal_des$mean, col="red", lwd =2)plot(ramal_des, xlab="Bulanan", ylab="US Cents", main="Plot Pemulusan Metode DES Ramalan 1")
lines((length(train.ts)+1):(length(train.ts)+81), test.ts,col="black")Perbandingan Akurasi Smoothing
plot(1:length(train.ts), train.ts, type="b", col="black", xlim=c(1,length(train.ts)+81),
ylab="Data Nilai Tukar",xlab="Bulanan", main="Perbandingan Metode Ramalan vs Aktual\nDilihat setelah data training")
lines((length(train.ts)+1):(length(train.ts)+81), test.ts,col="black")
lines((length(train.ts)+1):(length(train.ts)+81), ramalan2[191:271],col="blue", lwd = 2)
lines((length(train.ts)+1):(length(train.ts)+81), ramal_des$mean,col="red", lwd =2)
legend("topleft",c("data aktual", "Ramalan DMA", "Ramalan DES"), lty=1,
col=c("black", "blue", "red"))metric<- matrix(c(SSE.dma,MSE.dma, RMSE.dma, MAPE.dma,
sse.des,mse.des,rmse.des,mape.des),nrow=4,ncol=2)
colnames(metric) <- c("DMA","DES")
rownames(metric) <- c("SSE", "MSE", "RMSE", "MAPE")
metric## DMA DES
## SSE 1268.909313 1228.351980
## MSE 15.665547 15.164839
## RMSE 3.957973 3.894206
## MAPE 18.680412 16.867202
Berdasarkan perbandingan tersebut, didapatkan bahwa DES memiliki nilai SSE, MSE, RMSE, dan MAPE lebih kecil, sehingga digunakan metode DES sebagai metode pemulusan.
Pengecekan Kestasioneran Data
Plot ACF
acf(train.ts, lag.max = 50)Berdasarkan plot ACF di atas dapat diketahui bahwa plot tersebut membentuk Tails off (slowlu)y yang artinya data tidak stasioner dan perlu proses pembedaan (differencing) terlebih dahulu sampai data menjadi stasioner.
Uji Formal ADF
Kestasioneran data diuji menggunakan ADF-Test dengan hipotesis sebagai berikut: H0 : Data tidak stasioner H1 : Data stasioner
adf.test(train.ts)##
## Augmented Dickey-Fuller Test
##
## data: train.ts
## Dickey-Fuller = -2.0546, Lag order = 5, p-value = 0.5533
## alternative hypothesis: stationary
Terlihat p-value dari uji ADF tersebut lebih besar dari alpha = 0.05. Artinya, keputusan uji hipotesis ini adalah tidak tolak H0 atau dapat dikatakan bahwa data tidak stasioner dan perlu dilakukan penanganan ketidakstasioneran data atau differencing.
Penanganan Ketidakstasioneran Data
Differencing Pertama
Gula.dif1 <- diff(train.ts, differences = 1)Plot Hasil Differencing Pertama
plot(Gula.dif1,
col = "black",
lwd = 1,
type = "o",
xlab = "Time",
ylab = "Data",
main = "Gula") Secara eksploratif dapat dilihat bahwa data setelah mengalami differencing dengan ordo 1 sudah lebih stasioner jika dibandingkan dengan data awal. Untuk mengetahuinya secara lebih pasti, perlu dilakukan uji formal menggunakan ADF Test.
Uji ADF Test Hasil Differencing Pertama
adf.test(Gula.dif1)## Warning in adf.test(Gula.dif1): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: Gula.dif1
## Dickey-Fuller = -5.6449, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
Terlihat p-value dari uji ADF lebih kecil dari alpha = 0.05. Artinya, keputusan uji hipotesis ini adalah tolak H0 atau dapat dikatakan bahwa data sudah stasioner dan tidak diperlukan differencing kedua.
Kandidat Model
Plot ACF
acf(Gula.dif1, lag.max = 20) ## Plot PACF
pacf(Gula.dif1, lag.max = 20) ## EACF
eacf(Gula.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 x o o o x o o
## 1 o o o o o o o o o o o x o o
## 2 o o o o o o o x o o o x o o
## 3 x x o o o o o o o o o x o o
## 4 x o x o o o o o o o o o o o
## 5 x x x x o o o o o o o o o o
## 6 o x x x o o o o o o o o x o
## 7 x x x x x x o o o o o o x o
Berdasarkan plot ACF, PACF, dan EACF, didapati kandidat model dapat dibentuk yaitu : 1. ARIMA (0,1,1) 2. ARIMA (1,1,0) 3. ARIMA(3,1,2)
4. ARIMA(3,1,3) 5. ARIMA (4,1,3)
Pengecekan Auto Arima
auto.arima(train.ts)## Series: train.ts
## ARIMA(1,1,0)
##
## Coefficients:
## ar1
## 0.2785
## s.e. 0.0702
##
## sigma^2 = 1.371: log likelihood = -297.52
## AIC=599.04 AICc=599.1 BIC=605.52
Menggunakan fungsi auto.arima juga diperoleh kandidat model untuk data ini ialah ARIMA(1,1,0) yang sama seperti model 2.
Pendugaan Parameter dan Penentuan Model Terbaik
Model 1
model1 <- Arima(train.ts, order = c(0,1,1), method = "ML")
summary(model1)## Series: train.ts
## ARIMA(0,1,1)
##
## Coefficients:
## ma1
## 0.2556
## s.e. 0.0647
##
## sigma^2 = 1.38: log likelihood = -298.14
## AIC=600.27 AICc=600.34 BIC=606.76
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03740414 1.168457 0.8326766 0.1714894 6.127103 0.9708736
## ACF1
## Training set 0.02234317
lmtest::coeftest(model1)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.255599 0.064748 3.9476 7.893e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model pertama ARIMA (0,1,1) memiliki nilai AIC sebesar 600.27 dan parameter yang signifikan seluruhnya.
Model 2
model2 <- Arima(train.ts, order = c(1,1,0), method = "ML")
summary(model2)## Series: train.ts
## ARIMA(1,1,0)
##
## Coefficients:
## ar1
## 0.2785
## s.e. 0.0702
##
## sigma^2 = 1.371: log likelihood = -297.52
## AIC=599.04 AICc=599.1 BIC=605.52
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03535191 1.164612 0.8300669 0.1842793 6.076027 0.9678308
## ACF1
## Training set 0.000872468
lmtest::coeftest(model2)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.278457 0.070153 3.9693 7.21e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model kedua ARIMA (1,1,0) memiliki nilai AIC sebesar 599.1 dan parameter yang signifikan seluruhnya.
Model 3
model3 <- Arima(train.ts, order = c(3,1,2), method = "ML")
summary(model3)## Series: train.ts
## ARIMA(3,1,2)
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2
## 0.3671 0.6672 -0.2724 -0.0915 -0.6975
## s.e. 0.3005 0.3284 0.0934 0.3021 0.2815
##
## sigma^2 = 1.378: log likelihood = -296.01
## AIC=604.03 AICc=604.49 BIC=623.48
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.05308206 1.155086 0.8280263 0.2157467 6.048277 0.9654514
## ACF1
## Training set -0.008051724
lmtest::coeftest(model3)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.367081 0.300513 1.2215 0.221892
## ar2 0.667226 0.328387 2.0318 0.042171 *
## ar3 -0.272371 0.093432 -2.9152 0.003555 **
## ma1 -0.091529 0.302115 -0.3030 0.761919
## ma2 -0.697550 0.281522 -2.4778 0.013220 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model pertama ARIMA (3,2,1) memiliki nilai AIC sebesar 604.03 dan parameter yang tidak signifikan di AR1, dan MA1
Model 4
model4 <- Arima(train.ts, order = c(3,1,3), method = "ML")
summary(model4)## Series: train.ts
## ARIMA(3,1,3)
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2 ma3
## 0.5275 0.6738 -0.4795 -0.2752 -0.7070 0.2348
## s.e. 0.3811 0.3970 0.3216 0.4162 0.3412 0.3467
##
## sigma^2 = 1.382: log likelihood = -295.77
## AIC=605.54 AICc=606.16 BIC=628.23
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.05066084 1.153526 0.8252545 0.1920238 6.052164 0.9622196
## ACF1
## Training set 0.009429015
lmtest::coeftest(model4)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.52746 0.38112 1.3840 0.16636
## ar2 0.67383 0.39700 1.6973 0.08963 .
## ar3 -0.47952 0.32156 -1.4912 0.13590
## ma1 -0.27518 0.41624 -0.6611 0.50854
## ma2 -0.70705 0.34121 -2.0722 0.03825 *
## ma3 0.23484 0.34667 0.6774 0.49813
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model keempat ARIMA (3,1,3) memiliki nilai AIC sebesar 605.54 dan parameter hanya signifikan di MA2.
Model 5
model5 <- Arima(train.ts, order = c(4,1,3), method = "ML")
summary(model5)## Series: train.ts
## ARIMA(4,1,3)
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1 ma2 ma3
## 0.4324 -0.2876 0.8054 -0.3183 -0.1486 0.2128 -0.7333
## s.e. 0.2712 0.2091 0.1692 0.0705 0.2851 0.2051 0.1904
##
## sigma^2 = 1.371: log likelihood = -294.6
## AIC=605.19 AICc=605.99 BIC=631.13
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.05191168 1.146068 0.8238667 0.2079054 6.140046 0.9606014
## ACF1
## Training set -0.01559986
lmtest::coeftest(model5)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.432389 0.271171 1.5945 0.1108180
## ar2 -0.287554 0.209065 -1.3754 0.1689979
## ar3 0.805387 0.169170 4.7608 1.928e-06 ***
## ar4 -0.318273 0.070536 -4.5122 6.415e-06 ***
## ma1 -0.148583 0.285106 -0.5211 0.6022627
## ma2 0.212805 0.205068 1.0377 0.2993963
## ma3 -0.733346 0.190355 -3.8525 0.0001169 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model kelima ARIMA (4,1,3) memiliki nilai AIC sebesar 605.19 dan parameter tidak signifikan di AR1, AR2, MA1, dan MA2.
Pemilihan Model
Model <- c("ARIMA(0,1,1)", "ARIMA(1,1,0)", "ARIMA(3,1,2)", "ARIMA(3,1,3)", "ARIMA(4,1,3)")
AIC <- c(model1$aic, model2$aic, model3$aic, model4$aic, model5$aic)
Sig.Coef <- c("1 dari 1", "1 dari 1", "3 dari 5", "1 dari 5", "3 dari 7")
tabel <- data.frame(Model, AIC, Sig.Coef)
kableExtra::kable(tabel, align = c(rep('c', times = 4)),
col.names = c("Model", "AIC", "Parameter Signifikan"), digits = 3)| Model | AIC | Parameter Signifikan |
|---|---|---|
| ARIMA(0,1,1) | 600.272 | 1 dari 1 |
| ARIMA(1,1,0) | 599.039 | 1 dari 1 |
| ARIMA(3,1,2) | 604.025 | 3 dari 5 |
| ARIMA(3,1,3) | 605.537 | 1 dari 5 |
| ARIMA(4,1,3) | 605.194 | 3 dari 7 |
Berdasarkan hasil perbandingan di atas, maka dapat disimpulkan model terbaik dengan nilai AIC terkecil dan seluruh parameter signifikan adalah Model 2 ARIMA (1,1,0).
Diagnostik Model
Diagnostik model dilakukan untuk mengetahui apakah sisaan dari model yang dibangun telah memenuhi asumsi pemodelan. Asumsi sisaan yang harus terpenuhi pada model ARIMA(p,d,q) adalah sebagai berikut:
- Sisaan saling bebas (tidak ada autokorelasi) dan identik
- Sisaan mengikuti sebaran Normal (0, σ2)
Eksploratif
sisaan <- model2$residuals
par(mfrow = c(2,2))
qqnorm(sisaan)
qqline(sisaan, col = "red", lwd = 2)
plot(sisaan, type="o",
ylab = "Sisaan", xlab = "Order", main = "Sisaan M1 vs Order")
abline(h = 0, col='red')
acf(sisaan)
pacf(sisaan) Normal Q-Q Plot Berdasarkan hasil eksplorasi di atas, terlihat bahwa masih banyak amatan yang cenderung menjauhi garis qq-plot distribusi normal. Sehingga secara eksploratif, dapat disimpulkan bahwa sisaan belum cukup menyebar normal.
Residual vs Order Berdasarkan hasil eksplorasi di atas, titik pada plot kebebasan sisaan mayoritas bergerak di sekitar titik nol. Namun, terdapat beberapa titik amatan yang terletak cukup jauh dari titik nol. Sehingga, belum dapat disimpulkan apakah terdapat autokorelasi atau tidak.
Plot ACF dan PACF Berdasarkan hasil eksplorasi di atas, baik dari plot ACF maupun plot PACF, pada keduanya terdapat garis vertikal di lag tertentu yang melebihi tinggi garis biru horizontal. Artinya, menurut kedua plot ini, terdapat autokorelasi pada model.
Uji Formal
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 = 39.636, df = 2, p-value = 2.473e-09
shapiro.test(sisaan)##
## Shapiro-Wilk normality test
##
## data: sisaan
## W = 0.95309, p-value = 6.42e-06
Berdasarkan Jarque-Bera test, diperoleh p-value (2.473e-09) < α (0.05). Selain itu, hasil Shapiro-Wilk test, diperoleh p-value (6.42e-06) < α (0.05) maka tolak H0. Artinya, tidak cukup bukti untuk menyatakan bahwa sisaan menyebar normal pada taraf nyata 5%.
Sisaan Saling Bebas atau Tidak ada Autokorelasi
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.00014692, df = 1, p-value = 0.9903
Berdasarkan LJung-Box test, diperoleh p-value (0.9903) > α (0.05), maka tak tolak H0. Artinya, cukup bukti untuk menyatakan bahwa sisaan antara lag saling bebas atau dapat dikatakan tidak ada autokorelasi antara sisaan lag pada taraf nyata 5%.
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.41751, df = 189, p-value = 0.6768
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.1316756 0.2023794
## sample estimates:
## mean of x
## 0.03535191
Berdasarkan t-test, diperoleh p-value (0.6768) > α (0.05), maka tak tolak H0. Artinya, cukup bukti untuk menyatakan bahwa nilai tengah sisaan sama dengan nol pada taraf nyata 5%.
Berdasarkan eksplorasi dan uji formal yang telah dilakukan, hasil dari analisis model ARIMA (1,1,0) yaitu sisaan tidak menyebar normal, tidak ada autokorelasi, dan nilai tengah sisaan bernilai nol.
Overfitting
Overfitting model dilakukan dengan menggunakan:
ARIMA (1,1,1)
ARIMA (2,1,0)
model1a <- Arima(train.ts, order=c(1,1,1), method="ML")
summary(model1a)## Series: train.ts
## ARIMA(1,1,1)
##
## Coefficients:
## ar1 ma1
## 0.2766 0.0020
## s.e. 0.2269 0.2332
##
## sigma^2 = 1.378: log likelihood = -297.52
## AIC=601.04 AICc=601.17 BIC=610.76
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03536171 1.164611 0.8300886 0.184171 6.076408 0.967856
## ACF1
## Training set 0.0007048348
lmtest::coeftest(model1a)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.2765734 0.2268816 1.2190 0.2228
## ma1 0.0020274 0.2332476 0.0087 0.9931
model1b <- Arima(train.ts, order=c(2,1,0), method="ML")
summary(model1b)## Series: train.ts
## ARIMA(2,1,0)
##
## Coefficients:
## ar1 ar2
## 0.2786 -0.0007
## s.e. 0.0729 0.0730
##
## sigma^2 = 1.378: log likelihood = -297.52
## AIC=601.04 AICc=601.17 BIC=610.76
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03536295 1.164611 0.8300921 0.1841541 6.076469 0.9678601
## ACF1
## Training set 0.0006668884
lmtest::coeftest(model1b)##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.27863496 0.07288263 3.8231 0.0001318 ***
## ar2 -0.00065545 0.07301091 -0.0090 0.9928371
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Karena koefisien penduga parameter pada model ARIMA (1,1,1) dan ARIMA (2,1,0) tidak nyata/tidak signifikan dan nilai AICnya lebih besar, maka model yang dipilih tetap model ARIMA (1,1,0).
Forecasting
ramalan <- forecast(model2, h = 81)data.ramalan <- ramalan$mean
plot(ramalan) Perbandingan data aktual dan hasil forecast
accu_mod<-accuracy(data.ramalan, test.ts)
accu_mod## ME RMSE MAE MPE MAPE ACF1 Theil's U
## Test set 0.314603 3.16632 2.661461 -2.085646 17.53248 0.9361954 2.835419
Perbandingan Hasil Smoothing dan Modeling
perbandingan <- matrix(c(RMSE.dma, MAPE.dma, rmse.des,mape.des, accu_mod[,2], accu_mod[,5]),nrow=2,ncol=3)
colnames(perbandingan) <- c("DMA","DES", "Arima (1,1,0)")
rownames(perbandingan) <- c("RMSE", "MAPE")
perbandingan## DMA DES Arima (1,1,0)
## RMSE 3.957973 3.894206 3.16632
## MAPE 18.680412 16.867202 17.53248
plot(1:length(train.ts), train.ts, type="b", col="black", xlim=c(1,length(train.ts)+81),
ylab="Data Nilai Tukar",xlab="Bulanan", main="Perbandingan Metode Ramalan vs Aktual\nDilihat setelah data training")
lines((length(train.ts)+1):(length(train.ts)+81), test.ts,col="black")
lines((length(train.ts)+1):(length(train.ts)+81), ramalan2[191:271],col="blue", lwd = 2)
lines((length(train.ts)+1):(length(train.ts)+81), ramal_des$mean,col="red", lwd =2)
lines((length(train.ts)+1):(length(train.ts)+81), data.ramalan,col="green", lwd =2)
legend("topleft",c("data aktual", "Ramalan DMA", "Ramalan DES", "ramalan ARIMA (1,1,0)"), lty=1,
col=c("black", "blue", "red", "green"))