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.
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.
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
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
Setelah membagi data Insample dan Outsample, selanjutnya kita akan membangun model Intervensi dan NN menggunakan data Insample.
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
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
pacf(datadiff);grid()
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
pacf(datadiff2);grid()
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.
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.
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)
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
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
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.
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
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
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.
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.
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.