Perbandingan Metode Intervensi Vs Neural Network (NN)

Latar Belakang

Dengan mengamati data minyak goreng per bulan dari 1 Februari 2018 hingga 1 januari 2025 di Kota Samarinda, kita memiliki peluang untuk menyelami perubahan pasar secara lebih rinci, termasuk mendeteksi pola pergerakan harga minyak, lonjakan harga terhadap efek dari kebijakan pemerintah yang diterapkan pada waktu tertentu.
Topik minyak goreng menarik karena pada Tahun 2022 sempat terjadi kelangkaan minyak goreng yang cukup besar. Dikarenakan hal itu, harga minyak goreng naik drastis dan menjadi perhatian banyak orang termasuk pemerintah. Kami akan melihat bagaimana dampaknya intervensi yang terjadi terhadap harga minyak goreng.

Tujuan analisis ini adalah untuk membandingkan metode Intervensi dan Neural Networks (NN), mana yang lebih akurat dan adaptif dalam memodelkan serta memprediksi harga minyak goreng dari 1 Februari 2018 hingga 1 januari 2025.

Hasil dan Pembahasan

Perbandingan kedua metode menggunakan data Harga Minyak Goreng di Indonesia dari Feb-2018 s/d Jan-2025 yang dibagi menjadi data insampel dan outsample. Perbandingan menggunakan hasil akurasi RMSE, MAPE dan SMAPE dari model yang dibangun menggunakan data insample untuk memprediksi data outsample.
Metode Analisis:
1. Membagi data menjadi Insample dan Outsample.
2. Membangun model Intervensi terbaik (Menggunakan data Insample).
3. Membangun model NN terbaik (Menggunakan data Insample).
4. Membandingkan model Intervensi dan NN terbaik menggunakan metrik RMSE, MAPE, dan SMAPE.

1. Membagi Data menjadi Insample dan Outsample

Kita input data terlebih dahulu. Data harga minyak goreng ada sebanyak 84 periode mulai dari Feb-2018 hingga Jan-2025 (7 Tahun)

data<-read.table("C:/Materi Kuliah/Semester 6/ARW II/Praktikum ARW II/TUGAS R-PUBS/Data Harga Minyak Goreng - Copy.txt",header = T)
datat<-ts(data)

Dan berikut adalah Time Series Plot-nya

plot(datat,xlab="Waktu(t)",ylab="Harga Minyak Goreng")
points(x=1:84,y=datat,cex=1,col="black",bg="purple",pch=21);grid()
abline(v=c(46),col="red")
text(x=46,y=min(datat),labels="t=46",pos=2)
**Gambar 1.** Grafik Runtun Waktu Harga Minyak Goreng

Gambar 1. Grafik Runtun Waktu Harga Minyak Goreng

Pada Gambar 1 terlihat ada kenaikan drastis dari harga minyak goreng yang menandakan adanya kemungkinan intervensi, intervensi ini dimulai ketika periode ke-46 (Jan-2022). Maka kita bisa coba bangun model Intervensi, dan karena efek intervensi masih berlangsung hingga seterusnya maka ini adalah tipe Intervensi Step.

Namun sebelum itu kita akan membagi data menjadi Insample dan Outsample dengan pembagian 6 tahun:1 tahun. Insample 6 tahun berarti 72 periode pertama dan Outsample 1 tahun berarti 12 periode terakhir. Gambar 2 akan menampilkan visualisasinya.

Insample = ts(datat[1:72])
Outsample = ts(datat[73:84])
plot(datat,xlab="Waktu(t)",ylab="Harga Minyak Goreng")
points(x=1:72,y=Insample,cex=1,col="black",bg="yellow",pch=21)
points(x=73:84,y=Outsample,cex=1,col="black",bg="green",pch=21)
abline(v=72.5,col="red")
text(x=72.5,y=max(datat),labels="batas insample",col="red",pos=2,srt=90,cex=0.75);grid()
legend("topleft",legend = c("Insample", "Outsample"),
       pt.bg = c("yellow", "green"),pch = 21,pt.cex = 1)
**Gambar 2.** Grafik Runtun Waktu Insample dan Outsample

Gambar 2. Grafik Runtun Waktu Insample dan Outsample

Setelah membagi data Insample dan Outsample, selanjutnya kita akan membangun model Intervensi dan NN menggunakan data Insample.

2. Metode Intervensi

Intervensi terjadi pada t = 46. Pertama-tama kita akan memodelkan data Sebelum Intervensi menggunakan ARIMA terlebih dahulu.

a. Model ARIMA dari data sebelum intervensi
Kita lihat dulu pola data Sebelum Intervensi apakah sudah stasioner atau belum. Kita lihat pada Gambar 3.

SebelumIntervensi = ts(Insample[1:46])
plot(SebelumIntervensi,xlab="Waktu(t)",ylab="Harga Minyak Goreng")
points(Insample,cex=1,col="black",bg="salmon",pch=21);grid()
**Gambar 3.** Grafik Runtun Waktu Sebelum Intervensi

Gambar 3. Grafik Runtun Waktu Sebelum Intervensi

Pada Gambar 3 terlihat pola horizontal namun dengan lonjakan naik turun di sekitar periode 25-35, yang mengindikasikan data mungkin belum stasioner. Data yang stasioner (khususnya dalam varinsi) adalah data yang nilai lambda dari transformasi Box-Cox mendekati 1.

Untuk mendapatkan nilai lambda kita gunakan function powerTransform() dari package:car.

library(car)
powerTransform(SebelumIntervensi)
## Estimated transformation parameter 
## SebelumIntervensi 
##          5.154376

Setelah mendapatkan nilai lambda kita transformasi data Sebelum Intervensi dengan cara memangkatkannya, kita kasih nama y. Kemudian lihat apakah data setelah transformasi y sudah memiliki nilai lambda mendekati nilai 1.

lambda=powerTransform(SebelumIntervensi)$lambda
y = SebelumIntervensi^lambda
powerTransform(y)
## Estimated transformation parameter 
## y 
## 1

Karena nilai lambda dari data y sudah mendekati nilai 1, maka data y sudah stasioner dalam variansi. Selanjutnya kita lihat apakah data y sudah stasioner dalam rata-rata atau belum dengan menggunakan uji Augmented Dicky-Fuller (ADF Test). Jika nilai p-value <= 0.01, maka data y sudah stasioner dalam rata-rata. Function yang digunakan adalah adfTest yang ada pada package:fUnitRoots.

library(fUnitRoots)
adfTest(y)
## 
## Title:
##  Augmented Dickey-Fuller Test
## 
## Test Results:
##   PARAMETER:
##     Lag Order: 1
##   STATISTIC:
##     Dickey-Fuller: 0.2602
##   P VALUE:
##     0.6931 
## 
## Description:
##  Mon May 12 16:51:56 2025 by user: mrio1

Karena data y belum stasioner dalam rata-rata, maka akan kita lakukan differencing yang akan kita beri nama datadiff. Function yang digunakan adalah diff(). Kemudian kita kembali melakukan ADF Test.

datadiff = diff(y,lag = 1,differences = 1)
adfTest(datadiff)
## 
## Title:
##  Augmented Dickey-Fuller Test
## 
## Test Results:
##   PARAMETER:
##     Lag Order: 1
##   STATISTIC:
##     Dickey-Fuller: -4.3983
##   P VALUE:
##     0.01 
## 
## Description:
##  Mon May 12 16:51:56 2025 by user: mrio1

Setelah dilakukan differencing datadiff sudah stasioner dalam rata-rata dan dalam variansi, maka kita bisa melakukan identifikasi orde ARIMA(p,d,q).
Untuk mengidentifikasi orde p kita perlu melihat lag-lag yang signifikan pada grafik PACF, untuk orde d adalah seberapa banyak differencing dilakukan, untuk orde q kita perlu melihat lag-lag yang signidikan pada grafik ACF. Function yang digunakan adalah acf dan pacf.

acf(datadiff);grid()
**Gambar 4.** Grafik ACF datadiff

Gambar 4. Grafik ACF datadiff

pacf(datadiff);grid()
**Gambar 5.** Grafik PACF datadiff

Gambar 5. Grafik PACF datadiff

Pada Gambar 4 dan Gambar 5 baik di grafik ACF maupun PACF terlihat tidak ada lag yang signifikan, ini artinya perlu dilakukan differencing 2 kali.

datadiff2 = diff(y,lag = 1,differences = 2)
adfTest(datadiff2)
## 
## Title:
##  Augmented Dickey-Fuller Test
## 
## Test Results:
##   PARAMETER:
##     Lag Order: 1
##   STATISTIC:
##     Dickey-Fuller: -6.4076
##   P VALUE:
##     0.01 
## 
## Description:
##  Mon May 12 16:51:56 2025 by user: mrio1

Setelah differencing 2 kali masih stasioner, kita langsung lanjut ke grafik ACF dan PACF datadiff2.

acf(datadiff2);grid()
**Gambar 6.** Grafik ACF datadiff2

Gambar 6. Grafik ACF datadiff2

pacf(datadiff2);grid()
**Gambar 7.** Grafik PACF datadiff2

Gambar 7. Grafik PACF datadiff2

Pada Gambar 6 dan Gambar 7 dapat dilihat plot ACF dan PACF dari datadiff2 cut-off setelah lag 1 yang berarti orde maksimal adalah p=1, d=2, dan q=1

Maka model ARIMA sementara yang dapat dibangun adalah ARIMA(0,2,1), ARIMA(1,2,0), dan ARIMA(1,2,1).

library(forecast)
fit1 = Arima(y,order = c(0,2,1))
fit2 = Arima(y,order = c(1,2,0))
fit3 = Arima(y,order = c(1,2,1))

Kemudian kita lihat model apa saja yang parameternya signfikan semua. Menggunakan function coeftest() dari package:lmtest

library(lmtest)
coeftest(fit1)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.999999   0.088706 -11.273 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Parameter pada model ARIMA(0,2,1) signifikan. Selanjutnya

coeftest(fit2)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)   
## ar1 -0.43189    0.13383 -3.2272  0.00125 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Parameter pada model ARIMA(1,2,0) juga signifikan. Terakhir

coeftest(fit3)
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value Pr(>|z|)    
## ar1  0.102918   0.152421   0.6752   0.4995    
## ma1 -0.999999   0.079755 -12.5383   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Parameter pada model ARIMA(1,2,1) ternyata hanya parameter MA yang signifikan, berarti model tidak signifikan.

Maka selanjutnya kita akan periksa diagnostik dari model ARIMA(0,2,1) dan ARIMA(1,2,0).

Pemeriksaan Diagnostik melewati 2 asumsi, yaitu normalitas residual dan independensi residual(White Noise). Model ARIMA dikatakan lolos diagnostik jika berhasil memenuhi kedua asumsi tersebut.

  • Pemeriksaan normalitas residual dapat menggunakan uji Kolmogorov-Smirnov, jika p-value <= 0.01 maka residual dari model tersebut masih belum berdistribusi normal.
res1 = resid(fit1)
res2 = resid(fit2)
ks.test(res1,"pnorm",mean(res1),sd(res1))
ks.test(res2,"pnorm",mean(res2),sd(res2)) #Normal
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  res1
## D = 0.25071, p-value = 0.004922
## alternative hypothesis: two-sided
## 
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  res2
## D = 0.21076, p-value = 0.03359
## alternative hypothesis: two-sided

Hanya ARIMA(1,2,0) yang memiliki residual berdistribusi normal.

  • Pemeriksaan independensi residual (White Noise) bisa menggunakan uji Ljung-Box, jika nilai p-value dari setiap lag >= 0.01, maka residual bersifat independen (White Noise)
p.value<-rep(0,length(res2))
for(i in 1:length(res2))
  p.value[i]=Box.test(res2,lag=i,type="Ljung")$p.value
plot(p.value,type="p",main="Ljung-Box",xlab="lag",ylab="p value",ylim=c(0,1))
abline(h=0.01,lty=1,col="red")
**Gambar 8.** Grafik Ljung-Box Resid ARIMA(1,2,0)

Gambar 8. Grafik Ljung-Box Resid ARIMA(1,2,0)

Karena pada Gambar 8 semua lag memiliki nilai p-value >= 0.01, maka residual ARIMA(1,2,0) bersifat independen (White Noise).

Maka didapatkan model ARIMA terbaik sebelum intervensi adalah ARIMA(1,2,0). Selanjutnya menentukan orde Intervensi

b. Menentukan orde
Untuk menentukan orde intervensi (b,s,r) perlu melihat plot standarisasi residual dari prediksi ARIMA(1,2,0) terhadap data sebelum+setelah intervensi. Karena data insample ada sebanyak 72 periode dan intervensi terjadi ketika t-46, maka selain memprediksi data sebelum intervensi juga harus prediksi data setelah intervensi sebanyak 26 periode.

set.seed(1)
pred.sebelum.intervensi = fitted.values(fit2)^(1/lambda)
pred.setelah.intervensi = (predict(fit2,n.ahead=26)$pred + rnorm(26,mean=0,sd=sd(res1)))^(1/lambda)
residual.insample = c(pred.sebelum.intervensi-Insample[1:46],pred.setelah.intervensi-Insample[47:72])
MSE.insample = sqrt(mean(residual.insample^2))
stdz.residual.insample = residual.insample/MSE.insample
plot(stdz.residual.insample[42:72],type="h", 
     ylim = c(-5,2),
     xlab="Waktu (T)", ylab = "Standardized Residual", xaxt = "n",lwd = 2)
abline(h=c(-1,1), col="blue", lty=3) 
abline(v = 5, col = "red", lty = 3, lwd = 1.5)
axis(1, at = c(0,5,10,15,20,25,30),
     labels = c("T-5","T=0", "T+5","T+10", "T+15","T+20","T+25"))
text(5, min(stdz.residual.insample), "t=46   T=0",cex = .8) 
**Gambar 9.** Grafik Residual Prediksi Insample

Gambar 9. Grafik Residual Prediksi Insample

Karena pada Gambar 9 residual standar yang signifikan di atas batas 1 Sigma adalah saat lag T=1, maka orde b delay 1 lag (b=1), dan jika kita lihat kembali pada Gambar 2 efek intervensi memiliki respon langsung yang berarti orde r=0 serta efek permanen setelahnya menandakan orde s=0 (dalam hal intervensi step).

c. Membuat model intervensi dan memprediksi data Outsample
Model intervensi yang dibangun adalah model intervensi step dengan ARIMA(1,2,0) dan orde intervensi (b,r,s) = (1,0,0).

# Buat intervensi step
intervensi <- rep(0, length(datat))
intervensi[47:length(datat)] <- 1 #Karena b=1, maka efek terjadi ketika t=46+1

# Model ARIMA Intervensi
library(TSA)
model_intervensi <- Arima(Insample, #masih data Insample
                          order = c(1,2,0), #ARIMA terbaik sebelum intervensi (1,2,0)
                          xreg = intervensi[1:72]) #Karena (b,r,s) = (1,0,0)

# Intervensi pada Outsample 
newxreg <- data.frame(step = intervensi[73:84])

# Prediksi Outsample (12 periode ke depan)
prediksi.outsample <- predict(model_intervensi, n.ahead = 12, newxreg = newxreg) 
hasil.prediksi.outsample.intervensi <- prediksi.outsample$pred + rnorm(12,mean=0,sd=sd(resid(model_intervensi)))

Setelah membuat hasil prediksi outsample pada model intervensi, kita akan lihat visualisasi perbandingan data aktual dengan prediksi Insample maupun Outsample-nya.

plot(datat,ylim=c(min(fitted.values(model_intervensi)),max(fitted.values(model_intervensi))),
     xlab="Waktu(t)",ylab="Harga Minyak Goreng",lwd=2);grid()
#Pred Insample
lines(fitted.values(model_intervensi),col="wheat",type="o",lwd=1)
points(x=1:72,y=fitted.values(model_intervensi),cex=1,col="black",bg="yellow",pch=21)
#Pred Outsample
lines(hasil.prediksi.outsample.intervensi,col="green",type="o",lwd=1)
points(x=73:84,y=hasil.prediksi.outsample.intervensi,cex=1,col="black",bg="green",pch=21)
abline(v=72.5,col="red")
text(x=72.5,y=max(fitted.values(model_intervensi)),
     labels="batas insample",col="red",pos=2,srt=90,cex=0.75)
legend("topleft", 
       legend = c("Aktual", "Pred Insample", "Pred Outsample"),
       lty = c(1, NA, NA),           # hanya yang pertama pakai garis
       pch = c(NA, 21, 21),          # hanya dua terakhir pakai titik (pch 21 = circle with fill)
       pt.bg = c(NA, "yellow", "green"), # warna isi (fill)
       col = c("black", "black", "black"),  # outline (garis atau border warna hitam)
       pt.cex = 1.2,
       lwd = 2)
**Gambar 10.** Grafik Prediksi Model Intervensi

Gambar 10. Grafik Prediksi Model Intervensi

Pada Gambar 10 kita bisa lihat model intervensi dapat mengikuti pola pada data Insample, pada saat Intervensi terdapat error yang cukup besar namun error kembali mengecil ketika data kembali stabil. Sehingga hasil prediksi Outsample cukup baik.

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

3. Metode NN

Batasan NN yang digunakan disini adalah NN dengan mencoba (1 dan 2) Hidden Layer, (1,2, dan 3) Neuron, algoritma Resilient Backpropagation Plus (rprop+), kondisi pemberhentian adalah iterasi maksimal 10000 atau treshold error = 0.05.
a. Standarisasi Data Insample Pertama-tama kita lakukan standarisasi data Insample menggunakan function scale().

Stdz_Insample = scale(Insample);head(Stdz_Insample)
## Time Series:
## Start = 1 
## End = 6 
## Frequency = 1 
##        Series 1
## [1,] -0.6251698
## [2,] -0.6251698
## [3,] -0.6251698
## [4,] -0.6251698
## [5,] -0.6251698
## [6,] -0.6251698
## attr(,"scaled:center")
## [1] 17661.46
## attr(,"scaled:scale")
## [1] 3377.416

b. Menentukan Variabel Input dan Output Untuk menentukan Variabel Input dan Output, kita perlu melihat PACF dari data Insample.

pacf(Insample)
**Gambar 11.** Grafik PACF Data Insample

Gambar 11. Grafik PACF Data Insample

Pada Gambar 11 dapat kita lihat lag yang signifikan hanya ada pada lag 1. Maka Variabel Input hanya ada satu yaitu \(Y_{t-1}\) yang sudah distandarisasi dan akan kita sebut sebagai \(V_{Input}\), kemudian Variabel Output dimulai dari \(t=2\) yang akan kita sebut sebagai \(V_{Output}\).

v_input = Stdz_Insample[1:length(Insample)-1]
v_output = Stdz_Insample[2:length(Insample)]
DataNN <- data.frame(v_input = v_input,v_output = v_output)

c. Membangun Model NN
Dengan kombinasi (1 dan 2) Hidden Layer dan (1,2, dan 3) Neuron, akan dihasilkan 6 model NN. Function yang digunakan adalah neuralnet dari package:neuralnet

set.seed(1)
library(neuralnet)
nn1 <- neuralnet(formula = v_output ~ v_input,
                 data = DataNN,
                 hidden = 1,  # 1 hidden layers: 1 neurons
                 act.fct = "tanh",
                 threshold = 0.05,
                 algorithm = "rprop+",
                 stepmax = 10000,
                 startweights = NULL,
                 linear.output = TRUE)
nn2 <- neuralnet(formula = v_output ~ v_input,
                 data = DataNN,
                 hidden = 2,  # 1 hidden layers: 2 neurons
                 act.fct = "tanh",
                 threshold = 0.05,
                 algorithm = "rprop+",
                 stepmax = 10000,
                 startweights = NULL,
                 linear.output = TRUE)
nn3 <- neuralnet(formula = v_output ~ v_input,
                 data = DataNN,
                 hidden = 3,  # 1 hidden layers: 3 neurons
                 act.fct = "tanh",
                 threshold = 0.05,
                 algorithm = "rprop+",
                 stepmax = 10000,
                 startweights = NULL,
                 linear.output = TRUE)
nn4 <- neuralnet(formula = v_output ~ v_input,
                 data = DataNN,
                 hidden = c(1,1),  # 2 hidden layers: 1 neurons
                 act.fct = "tanh",
                 threshold = 0.05,
                 algorithm = "rprop+",
                 stepmax = 10000,
                 startweights = NULL,
                 linear.output = TRUE)
nn5 <- neuralnet(formula = v_output ~ v_input,
                 data = DataNN,
                 hidden = c(2,2),  # 2 hidden layers: 2 neurons
                 act.fct = "tanh",
                 threshold = 0.05,
                 algorithm = "rprop+",
                 stepmax = 10000,
                 startweights = NULL,
                 linear.output = TRUE)
nn6 <- neuralnet(formula = v_output ~ v_input,
                 data = DataNN,
                 hidden = c(3,3),  # 2 hidden layers: 3 neurons
                 act.fct = "tanh",
                 threshold = 0.05,
                 algorithm = "rprop+",
                 stepmax = 10000,
                 startweights = NULL,
                 linear.output = TRUE)

d. Memilih Model NN Terbaik
Memilih model NN terbaik dengan melihat hasil prediksi Outsample dan membandingankannya menggunakan metrik RMSE, MAPE, dan SMAPE.

Kita lakukan prediksi outsample untuk ke-6 model NN terlebih dahulu

# Mempersiapkan tempat untuk hasil prediksi outsample
pred.outsample.nn1 <- numeric(12)
pred.outsample.nn2 <- numeric(12)
pred.outsample.nn3 <- numeric(12)
pred.outsample.nn4 <- numeric(12)
pred.outsample.nn5 <- numeric(12)
pred.outsample.nn6 <- numeric(12)

#Membuat Prediksi Outsample NN1
last_input <- tail(DataNN$v_input, 1)  # Ambil nilai terakhir dari data input
# Melakukan iterasi untuk ramalan 12 langkah
for (i in 1:12) {
  predicted_value <- predict(nn1, newdata = data.frame(v_input = last_input))
  pred.outsample.nn1[i] <- predicted_value
  last_input <- predicted_value
}
# Destandarisasi
pred.outsample.nn1 = pred.outsample.nn1*sd(Insample)+mean(Insample) 

#Membuat Prediksi Outsample NN2
last_input <- tail(DataNN$v_input, 1)  # Ambil nilai terakhir dari data input
# Melakukan iterasi untuk ramalan 12 langkah
for (i in 1:12) {
  predicted_value <- predict(nn2, newdata = data.frame(v_input = last_input))
  pred.outsample.nn2[i] <- predicted_value
  last_input <- predicted_value
}
pred.outsample.nn2 = pred.outsample.nn2*sd(Insample)+mean(Insample)

#Membuat Prediksi Outsample NN3
last_input <- tail(DataNN$v_input, 1)  # Ambil nilai terakhir dari data input
# Melakukan iterasi untuk ramalan 12 langkah
for (i in 1:12) {
  predicted_value <- predict(nn3, newdata = data.frame(v_input = last_input))
  pred.outsample.nn3[i] <- predicted_value
  last_input <- predicted_value
}
pred.outsample.nn3 = pred.outsample.nn3*sd(Insample)+mean(Insample)

#Membuat Prediksi Outsample NN4
last_input <- tail(DataNN$v_input, 1)  # Ambil nilai terakhir dari data input
# Melakukan iterasi untuk ramalan 12 langkah
for (i in 1:12) {
  predicted_value <- predict(nn4, newdata = data.frame(v_input = last_input))
  pred.outsample.nn4[i] <- predicted_value
  last_input <- predicted_value
}
pred.outsample.nn4 = pred.outsample.nn4*sd(Insample)+mean(Insample)

#Membuat Prediksi Outsample NN5
last_input <- tail(DataNN$v_input, 1)  # Ambil nilai terakhir dari data input
# Melakukan iterasi untuk ramalan 12 langkah
for (i in 1:12) {
  predicted_value <- predict(nn5, newdata = data.frame(v_input = last_input))
  pred.outsample.nn5[i] <- predicted_value
  last_input <- predicted_value
}
pred.outsample.nn5 = pred.outsample.nn5*sd(Insample)+mean(Insample)

#Membuat Prediksi Outsample NN6
last_input <- tail(DataNN$v_input, 1)  # Ambil nilai terakhir dari data input
# Melakukan iterasi untuk ramalan 12 langkah
for (i in 1:12) {
  predicted_value <- predict(nn6, newdata = data.frame(v_input = last_input))
  pred.outsample.nn6[i] <- predicted_value
  last_input <- predicted_value
}
pred.outsample.nn6 = pred.outsample.nn6*sd(Insample)+mean(Insample)

Kemudian akan kita buat tabel metrik untuk ke-6 model NN.

library(Metrics)
Model <- c("NN1", "NN2", "NN3","NN4","NN5","NN6")
RMSE <- rep(0,6)
MAPE <- rep(0,6)
SMAPE <- rep(0,6)
Prediksi.NN = cbind(pred.outsample.nn1,
                pred.outsample.nn2,
                pred.outsample.nn3,
                pred.outsample.nn4,
                pred.outsample.nn5,
                pred.outsample.nn6)

for (i in 1:6){
  RMSE[i] <- rmse(Outsample,Prediksi.NN[,i])
  MAPE[i] <- mape(Outsample,Prediksi.NN[,i])
  SMAPE[i] <- smape(Outsample,Prediksi.NN[,i])
}
data.frame(Model, RMSE, MAPE, SMAPE)
##   Model      RMSE       MAPE      SMAPE
## 1   NN1 1881.4401 0.08433529 0.08025776
## 2   NN2 1468.0886 0.05645953 0.05404760
## 3   NN3 1512.2588 0.05846794 0.05590371
## 4   NN4 1516.6909 0.05741827 0.05484685
## 5   NN5 1881.3044 0.07584271 0.07187974
## 6   NN6  388.7481 0.01778435 0.01770202

Dapat kita lihat hasil metrik NN6 memiliki nilai RMSE, MAPE, dan SMAPE paling kecil. Yang berarti model terbaik dari NN adalah NN dengan 2 hidden layer (3 Neurons). Berikut adalah visualisasi dari hasil prediksi Insample dan Outsample dengan model NN.

plot(datat,xlab="Waktu(t)",ylab="Harga Minyak Goreng",lwd=2);grid()
#Pred Insample
pred.insample.nn6 = ts(nn6$net.result[[1]]*sd(Insample)+mean(Insample),start = 2)
lines(pred.insample.nn6,col="orange",type="o",lwd=1)
points(x=2:72,y=pred.insample.nn6,cex=1,col="black",bg="yellow",pch=21)
#Pred Outsample
pred.outsample.nn6 = ts(pred.outsample.nn6,start = 73)
lines(pred.outsample.nn6,col="green",type="o",lwd=1)
points(x=73:84,y=pred.outsample.nn6,cex=1,col="black",bg="green",pch=21)
abline(v=72.5,col="red")
text(x=72.5,y=max(datat),
     labels="batas insample",col="red",pos=2,srt=90,cex=1)
legend("topleft", 
       legend = c("Aktual", "Pred Insample", "Pred Outsample"),
       lty = c(1, NA, NA),           # hanya yang pertama pakai garis
       pch = c(NA, 21, 21),          # hanya dua terakhir pakai titik (pch 21 = circle with fill)
       pt.bg = c(NA, "yellow", "green"), # warna isi (fill)
       col = c("black", "black", "black"),  # outline (garis atau border warna hitam)
       pt.cex = 1.2,
       lwd = 2)
**Gambar 12.** Grafik Prediksi Model NN

Gambar 12. Grafik Prediksi Model NN

Dari Gambar 12 kita dapat lihat hasil prediksi model NN baik di data Insample maupun Outsample menghasilkan prediksi yang mengikuti data aktul sangat baik. Kita akan bandingkan hasil NN6 dengan Model Intervensi.

4. Perbandingan Model Intervensi dan Model NN

Setelah mendapatkan masing-masing model terbaik, baik dari model Intervensi maupun model NN. Kita akan bandingkan kedua model dengan melihat nilai RMSE, MAPE, dan SMAPE terhadap data Outsample dari kedua metode. Metode paling baik adalah metode dengan nilai RMSE, MAPE, dan SMAPE paling kecil.

library(Metrics)
Outsample = ts(Outsample,start = 73)
Model <- c("Intervensi", "NN")
RMSE <- c(
  rmse(Outsample,hasil.prediksi.outsample.intervensi),
  rmse(Outsample,pred.outsample.nn6)
)
MAPE <- c(
  mape(Outsample,hasil.prediksi.outsample.intervensi),
  mape(Outsample,pred.outsample.nn6)
)
SMAPE <- c(
  smape(Outsample,hasil.prediksi.outsample.intervensi),
  smape(Outsample,pred.outsample.nn6)
)

data.frame(Model, RMSE, MAPE, SMAPE)
##        Model      RMSE       MAPE      SMAPE
## 1 Intervensi 1623.7290 0.06492762 0.06761758
## 2         NN  388.7481 0.01778435 0.01770202

Dapat kita lihat bahwa NN memiliki nilai RMSE Rp 404,12 , nilai MAPE 1,81%, dan nilai SMAPE sebesar 1,79% yang berarti model NN memilikin nilai error paling kecil dibandingkan model Intervensi. Ini juga berarti model NN adalah model yang lebih baik dibandingkan model Intervensi pada peramalan Data Harga Minyak Goreng di Indonesia.

Kesimpulan

Berdasarkan hasil perbandingan model terbaik Intervensi yaitu ARIMA(1,2,0) dengan orde intervensi(1,0,0) ketika t=46 dan model terbaik Neural Network dengan 2 hidden layer (3 Neurons), model NN memiliki nilai error yang lebih kecil yang dilihat dari nilai RMSE NN hanya sebesar 404,12 sedangkan nilai RMSE Intervensi sebesar 1071,28, nilai MAPE NN hanya sebesar 1,81% sedangkan nilai MAPE Intervensi sebesar 4,43%, dan nilai SMAPE NN hanya sebesar 1,79% sedangkan nilai SMAPE Intervensi sebesar 4,46%. Dengan ini disimpulkan bahwa model NN lebih baik dibandingkan model Intervensi pada peramalan Data Harga Minyak Goreng di Indonesia.