Kota Samarinda, sebagai ibu kota Provinsi Kalimantan Timur, memiliki iklim tropis dengan curah hujan yang tinggi dan fluktuatif sepanjang tahun. Variabilitas curah hujan di wilayah ini berdampak signifikan terhadap berbagai sektor, seperti pertanian, pengelolaan sumber daya air, tata kelola perkotaan, dan mitigasi bencana, khususnya banjir yang kerap melanda kawasan ini. Oleh karena itu, kemampuan untuk memprediksi curah hujan secara akurat menjadi sangat penting guna mendukung perencanaan pembangunan daerah yang berkelanjutan dan pengambilan keputusan yang tepat oleh pemerintah maupun masyarakat.
Curah hujan merupakan komponen utama dalam sistem hidrologi yang berperan penting dalam berbagai aspek kehidupan. Namun, ketidakpastian pola curah hujan akibat perubahan iklim dan fenomena cuaca ekstrem dapat memicu bencana seperti banjir, kekeringan, hingga kerusakan lingkungan. Dengan demikian, analisis pola dan peramalan curah hujan menjadi langkah krusial dalam mendukung kebijakan mitigasi dan adaptasi perubahan iklim di wilayah Samarinda.Data curah hujan historis Kota Samarinda periode “2017” hingga “2024” memberikan landasan yang cukup untuk membangun model prediksi yang andal.
Dalam studi ini, dilakukan perbandingan tiga metode peramalan untuk menentukan pendekatan terbaik, yaitu Autoregressive Integrated Moving Average (ARIMA) sebagai metode statistik klasik,Neural Network (NN) sebagai metode pembelajaran mesin yang mampu menangkap hubungan nonlinear, serta Moving Average (MA) sebagai metode peramalan sederhana namun banyak digunakan.Masing-masing metode memiliki karakteristik dan keunggulan tersendiri dalam menganalisis data runtun waktu (time series), sehingga perbandingan kinerja ketiganya menjadi penting untuk mendapatkan hasil peramalan yang optimal.
## Loading required package: carData
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Warning: package 'Rssa' was built under R version 4.4.3
## Loading required package: svd
## Warning: package 'svd' was built under R version 4.4.3
##
## Attaching package: 'Rssa'
## The following object is masked from 'package:stats':
##
## decompose
##
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:base':
##
## Recall
## Warning: package 'Metrics' was built under R version 4.4.3
##
## Attaching package: 'Metrics'
## The following object is masked from 'package:forecast':
##
## accuracy
##
## Attaching package: 'urca'
## The following objects are masked from 'package:fUnitRoots':
##
## punitroot, qunitroot, unitrootTable
## Registered S3 methods overwritten by 'TSA':
## method from
## fitted.Arima forecast
## plot.Arima forecast
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
## Warning: package 'rio' was built under R version 4.4.3
## Warning: package 'tsoutliers' was built under R version 4.4.3
## Warning: package 'xfun' was built under R version 4.4.3
##
## Attaching package: 'xfun'
## The following object is masked from 'package:base':
##
## attr
## Warning: package 'neuralnet' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:neuralnet':
##
## compute
## The following object is masked from 'package:car':
##
## recode
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data = read.csv(file.choose(),header = T,sep = ",")
curah_hujan = ts(data = data$Curah)
head(curah_hujan)
## Time Series:
## Start = 1
## End = 6
## Frequency = 1
## [1] 160.8 138.6 88.1 343.3 309.3 421.8
Data curah hujan dipanggil melalui sintkas pemilihan file menggunakan file.choose(), lalu dikonversi menjadi time series dan disimpan dalam variabel curah_hujan. Fungsi head() digunakan untuk melihat beberapa data awal.
jumlah_train = round(NROW(curah_hujan)*0.90, 0)
jumlah_test = NROW(curah_hujan) - jumlah_train
data_train = curah_hujan[1:jumlah_train]
data_test = curah_hujan[(jumlah_train+1):(jumlah_test+jumlah_train)]
Data dibagi menjadi 90% untuk data Insample (data_train) yaitu sebanyak 86 data dan 10% untuk data Oustsample (data_test) sebanyak 9 data.
ts.plot(data_train,type="o",ylab="Curah Hujan di Kota Samarinda", xlab="Periode",main="Time Series Plot curah hujan kota samarinda periode 2017 sampai 2024")
Berdasarkan plot time series curah hujan Kota Samarinda periode 2017–2023, data menunjukkan pola fluktuatif yang cukup signifikan, ditandai dengan naik turunnya curah hujan dari waktu ke waktu tanpa pola yang konsisten. Rata-rata data terlihat relatif stabil sepanjang periode, sehingga secara visual dapat dikatakan stasioner dalam rata-rata. Namun, variansi data tampak berubah-ubah, dengan beberapa periode menunjukkan lonjakan curah hujan yang sangat tinggi dan periode lainnya memiliki fluktuasi yang lebih kecil. Hal ini menunjukkan bahwa data tidak stasioner dalam variansi. Oleh karena itu, meskipun data tampak stabil dalam rata-rata, ketidakstabilan variansi perlu diperhatikan sebelum dilakukan analisis lanjutan.
acf(data_train,86, main="Plot ACF Data Aktual")
pacf(data_train,86, main="Plot PACF Data Aktual")
boxcox(data_train~1) #cek stasioner dalam variansi
Berdasarkan gambar terlihat bahwa𝜆 memiliki nilai yang belum mendekati angka satu untuk memastikannya kita akan melihat nilai𝜆nya sebagai berikut :
p<-powerTransform(data_train);p
## Estimated transformation parameter
## data_train
## 0.3820104
diketahui bahwa nilai 𝜆=0.3820104 dimana nilai tersebut masih jauh dari angka 1 maka dapat disimpulkan bahwa data curah hujan di Kota Samarinda belum stasioner dalam varians, sehingga akan dilakukan transformasi dengan memangkatkan data aktual dengan nilai 𝜆=0.3820104
y<-(data_train^(p$lambda))
y1<-as.data.frame(y)
boxcox(y~1)
p1<-powerTransform(y)
p1
## Estimated transformation parameter
## y
## 0.9999998
Plot Box-Cox Data curah hujan di Kota Samarinda Setelah di Transformasi Berdasarkan Gambar diatas dengan menggunakan data yang telah di transformasi diperoleh nilai λ yang sudah hampir mendekati angka 1, dengan nilai λ = 0.9999998 menunjukkan bahwa data sudah stasioner dalam varians.
plot.ts(y, type="o", main="Time Series Plot Data Aktual Setelah Transformasi", xlab="Periode", ylab="Curah Hujan")
q<-powerTransform(y)
#menampilkan plot ACF data transformasi
acf(y,86, main="Plot ACF Data Training Setelah Transformasi")
pacf(y,86, main="Plot PACF Data Aktual Setelah Transformasi")
adfTest(y)
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 1
## STATISTIC:
## Dickey-Fuller: -0.7567
## P VALUE:
## 0.3716
##
## Description:
## Tue May 13 10:33:54 2025 by user: ASUS
Berdasarkan hasil uji Augmented Dickey-Fuller (ADF), diperoleh nilai p-value 0.3716. Karena p-value lebih besar dari tingkat signifikansi alpha =0.05, maka diputuskan bahwa H0 ditolak yang berarti dapat disimpulkan bahwa data bersifat non-stasioner. sehingga perlu dilakukan differenicing.
datadiff=diff(y,differences=1)
datadiff
## [1] -0.38420439 -1.04572699 3.77014300 -0.36338030 1.12481954 -3.09999688
## [7] 1.27322252 -2.43039979 1.00740813 1.01756572 0.05845222 -0.09827540
## [13] -2.03654769 1.09462249 0.42198899 1.52168696 -1.26976450 -0.97676303
## [19] -2.16394148 1.98648382 0.44277868 -0.45617357 0.74758737 0.68804195
## [25] -2.03654769 1.09462249 0.42198899 1.52168696 -1.26976450 -0.97676303
## [31] -2.16394148 1.98648382 0.44277868 -0.45617357 0.74758737 1.09914691
## [37] -2.58301312 0.90146848 0.69308902 0.69719787 -0.75852682 -0.40814196
## [43] 1.22018632 0.66959907 -1.52300658 0.23806352 -1.16609230 3.37880333
## [49] -2.81755336 1.78958363 -0.21872090 -2.15019156 0.45560889 1.11646147
## [55] 1.63361361 -1.20663818 0.26165411 0.20257208 -0.63324583 -2.05829645
## [61] 0.06575634 2.52070495 0.02142120 -1.26108009 -0.34855966 2.00117304
## [67] -2.30120778 3.81793393 -1.80359746 0.03019167 -2.26496681 0.26666522
## [73] 0.14592413 1.18246364 0.86214922 -1.65634003 0.76376970 -2.86354163
## [79] -0.83651982 2.21951375 -0.46260961 2.60164288 -1.71097489 -0.45589028
## [85] -1.64910013
adfTest(datadiff)
## Warning in adfTest(datadiff): p-value smaller than printed p-value
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 1
## STATISTIC:
## Dickey-Fuller: -8.0972
## P VALUE:
## 0.01
##
## Description:
## Tue May 13 10:33:54 2025 by user: ASUS
Setelah dilakukan differencing satu kali di peroleh hasil uji Augmented Dickey-Fuller (ADF),dengan nilai p-value 0.01. Karena p-value lebih kecil dari tingkat signifikansi alpha =0.05, maka diputuskan bahwa H0 ditolak yang berarti dapat disimpulkan bahwa data telah stasioner.Selanjutnya dilakukan pengecekkan Plot ACF dan PACF pada data differencing
acf(datadiff,85, main="Plot ACF Data Training Setelah differenicng")
Berdasarkan plot diatas, secara visual dapat dilihat bahwa plot ACF mengalami cutoff setelah lag 3, maka model yang disarankan adalah MA(3)
pacf(datadiff,85, main="Plot PACF Data Aktual Setelah differencing")
Berdasarkan plot diatas, secara visual dapat dilihat bahwa plot PACF mengalami cutoff setelah lag 6, maka model yang disarankan adalah AR(6). berdasarkan plot ACF dan PACf dan dengan differencing satu kali model ARIMA sementara yang Terbentuk adalah sebagai berikut :
# ARIMA(0,1,1)
fit1 = arima(x = y, order = c(0,1,1))
fit1
##
## Call:
## arima(x = y, order = c(0, 1, 1))
##
## Coefficients:
## ma1
## -0.8799
## s.e. 0.0667
##
## sigma^2 estimated as 1.615: log likelihood = -141.74, aic = 285.47
coeftest(fit1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.879924 0.066654 -13.201 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(0,1,2)
fit2 = arima(x = y, order = c(0,1,2))
fit2
##
## Call:
## arima(x = y, order = c(0, 1, 2))
##
## Coefficients:
## ma1 ma2
## -0.8008 -0.1992
## s.e. 0.1081 0.0910
##
## sigma^2 estimated as 1.512: log likelihood = -140.26, aic = 284.52
coeftest(fit2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.800826 0.108074 -7.4100 1.263e-13 ***
## ma2 -0.199174 0.091049 -2.1876 0.0287 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(0,1,3)
fit3 = arima(x = y, order = c(0,1,3))
fit3
##
## Call:
## arima(x = y, order = c(0, 1, 3))
##
## Coefficients:
## ma1 ma2 ma3
## -0.6734 -0.0975 -0.2291
## s.e. 0.1260 0.1099 0.1153
##
## sigma^2 estimated as 1.459: log likelihood = -138.55, aic = 283.11
coeftest(fit3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.67339 0.12598 -5.3454 9.022e-08 ***
## ma2 -0.09753 0.10987 -0.8877 0.37470
## ma3 -0.22908 0.11525 -1.9876 0.04686 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(1,1,0)
fit4 = arima(x = y, order = c(1,1,0))
fit4
##
## Call:
## arima(x = y, order = c(1, 1, 0))
##
## Coefficients:
## ar1
## -0.3839
## s.e. 0.1000
##
## sigma^2 estimated as 2.03: log likelihood = -150.78, aic = 303.57
coeftest(fit4)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.38388 0.10003 -3.8375 0.0001243 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(1,1,1)
fit5 = arima(x = y, order = c(1,1,1))
fit5
##
## Call:
## arima(x = y, order = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1
## 0.2478 -1.0000
## s.e. 0.1084 0.0475
##
## sigma^2 estimated as 1.5: log likelihood = -139.83, aic = 283.66
coeftest(fit5)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.247824 0.108352 2.2872 0.02218 *
## ma1 -0.999996 0.047528 -21.0402 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(1,1,2)
fit6 = arima(x = y, order = c(1,1,2))
fit6
##
## Call:
## arima(x = y, order = c(1, 1, 2))
##
## Coefficients:
## ar1 ma1 ma2
## 0.2723 -1.0256 0.0256
## s.e. 0.2659 0.2620 0.2578
##
## sigma^2 estimated as 1.5: log likelihood = -139.83, aic = 285.65
coeftest(fit6)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.272299 0.265853 1.0242 0.3057
## ma1 -1.025618 0.262023 -3.9142 9.069e-05 ***
## ma2 0.025619 0.257776 0.0994 0.9208
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(1,1,3)
fit7 = arima(x = y, order = c(1,1,3))
fit7
##
## Call:
## arima(x = y, order = c(1, 1, 3))
##
## Coefficients:
## ar1 ma1 ma2 ma3
## -0.5901 -0.1003 -0.4998 -0.4000
## s.e. 0.2081 0.2083 0.1714 0.1129
##
## sigma^2 estimated as 1.403: log likelihood = -137.01, aic = 282.02
coeftest(fit7)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.59011 0.20807 -2.8361 0.0045662 **
## ma1 -0.10028 0.20829 -0.4814 0.6302030
## ma2 -0.49975 0.17137 -2.9162 0.0035433 **
## ma3 -0.39996 0.11288 -3.5432 0.0003953 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(2,1,0)
fit8 = arima(x = y, order = c(2,1,0))
fit8
##
## Call:
## arima(x = y, order = c(2, 1, 0))
##
## Coefficients:
## ar1 ar2
## -0.4161 -0.0809
## s.e. 0.1087 0.1084
##
## sigma^2 estimated as 2.017: log likelihood = -150.51, aic = 305.01
coeftest(fit8)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.416122 0.108741 -3.8267 0.0001299 ***
## ar2 -0.080901 0.108420 -0.7462 0.4555609
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(2,1,1)
fit9 = arima(x = y, order = c(2,1,1))
fit9
##
## Call:
## arima(x = y, order = c(2, 1, 1))
##
## Coefficients:
## ar1 ar2 ma1
## 0.2439 0.0191 -1.0000
## s.e. 0.1107 0.1106 0.0461
##
## sigma^2 estimated as 1.501: log likelihood = -139.82, aic = 285.63
coeftest(fit9)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.243883 0.110727 2.2026 0.02763 *
## ar2 0.019143 0.110623 0.1730 0.86262
## ma1 -0.999999 0.046091 -21.6964 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(2,1,2)
fit10 = arima(x = y, order = c(2,1,2))
fit10
##
## Call:
## arima(x = y, order = c(2, 1, 2))
##
## Coefficients:
## ar1 ar2 ma1 ma2
## -0.4450 0.2835 -0.3186 -0.6814
## s.e. 0.2755 0.1113 0.2700 0.2682
##
## sigma^2 estimated as 1.466: log likelihood = -138.79, aic = 285.57
coeftest(fit10)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.44501 0.27553 -1.6151 0.10628
## ar2 0.28353 0.11126 2.5483 0.01082 *
## ma1 -0.31856 0.26999 -1.1799 0.23803
## ma2 -0.68143 0.26817 -2.5411 0.01105 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(2,1,3)
fit11 = arima(x = y, order = c(2,1,3))
fit11
##
## Call:
## arima(x = y, order = c(2, 1, 3))
##
## Coefficients:
## ar1 ar2 ma1 ma2 ma3
## -1.1115 -0.6424 0.4468 -0.2734 -0.9269
## s.e. 0.1041 0.0961 0.1387 0.1536 0.1539
##
## sigma^2 estimated as 1.318: log likelihood = -135.47, aic = 280.95
coeftest(fit11)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -1.111463 0.104062 -10.6808 < 2.2e-16 ***
## ar2 -0.642353 0.096075 -6.6859 2.294e-11 ***
## ma1 0.446808 0.138652 3.2225 0.001271 **
## ma2 -0.273418 0.153631 -1.7797 0.075123 .
## ma3 -0.926948 0.153880 -6.0238 1.703e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(3,1,0)
fit12 = arima(x = y, order = c(3,1,0))
fit12
##
## Call:
## arima(x = y, order = c(3, 1, 0))
##
## Coefficients:
## ar1 ar2 ar3
## -0.4516 -0.2490 -0.3999
## s.e. 0.1004 0.1088 0.1035
##
## sigma^2 estimated as 1.709: log likelihood = -143.73, aic = 293.46
coeftest(fit12)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.45163 0.10043 -4.4971 6.889e-06 ***
## ar2 -0.24904 0.10882 -2.2885 0.0221056 *
## ar3 -0.39989 0.10349 -3.8640 0.0001116 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(3,1,1)
fit13 = arima(x = y, order = c(3,1,1))
fit13
##
## Call:
## arima(x = y, order = c(3, 1, 1))
##
## Coefficients:
## ar1 ar2 ar3 ma1
## 0.0818 -0.0418 -0.3999 -0.7888
## s.e. 0.1145 0.1060 0.1090 0.0827
##
## sigma^2 estimated as 1.365: log likelihood = -134.74, aic = 277.48
coeftest(fit13)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.081767 0.114531 0.7139 0.4752692
## ar2 -0.041783 0.105996 -0.3942 0.6934372
## ar3 -0.399898 0.108964 -3.6700 0.0002426 ***
## ma1 -0.788798 0.082733 -9.5342 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(3,1,2)
fit14 = arima(x = y, order = c(3,1,2))
fit14
##
## Call:
## arima(x = y, order = c(3, 1, 2))
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2
## 0.3859 -0.1242 -0.4132 -1.1315 0.3461
## s.e. 0.2234 0.1201 0.1146 0.2320 0.2140
##
## sigma^2 estimated as 1.341: log likelihood = -134.03, aic = 278.06
coeftest(fit14)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.38588 0.22342 1.7271 0.0841468 .
## ar2 -0.12422 0.12008 -1.0345 0.3008988
## ar3 -0.41324 0.11455 -3.6074 0.0003093 ***
## ma1 -1.13155 0.23199 -4.8776 1.074e-06 ***
## ma2 0.34608 0.21399 1.6172 0.1058294
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(3,1,3)
fit15 = arima(x = y, order = c(3,1,3))
fit15
##
## Call:
## arima(x = y, order = c(3, 1, 3))
##
## Coefficients:
## ar1 ar2 ar3 ma1 ma2 ma3
## 0.3295 -0.0543 -0.4327 -1.0690 0.2222 0.0640
## s.e. 0.3733 0.4116 0.1522 0.4069 0.7195 0.3703
##
## sigma^2 estimated as 1.34: log likelihood = -134.02, aic = 280.04
coeftest(fit15)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.329484 0.373272 0.8827 0.377402
## ar2 -0.054303 0.411564 -0.1319 0.895029
## ar3 -0.432705 0.152240 -2.8423 0.004480 **
## ma1 -1.069049 0.406892 -2.6274 0.008605 **
## ma2 0.222190 0.719493 0.3088 0.757463
## ma3 0.064007 0.370326 0.1728 0.862778
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(4,1,0)
fit16 = arima(x = y, order = c(4,1,0))
fit16
##
## Call:
## arima(x = y, order = c(4, 1, 0))
##
## Coefficients:
## ar1 ar2 ar3 ar4
## -0.5581 -0.3175 -0.5323 -0.2904
## s.e. 0.1040 0.1079 0.1102 0.1081
##
## sigma^2 estimated as 1.57: log likelihood = -140.3, aic = 288.61
coeftest(fit16)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.55806 0.10401 -5.3656 8.069e-08 ***
## ar2 -0.31749 0.10787 -2.9434 0.003247 **
## ar3 -0.53231 0.11023 -4.8291 1.371e-06 ***
## ar4 -0.29045 0.10814 -2.6859 0.007234 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(4,1,1)
fit17 = arima(x = y, order = c(4,1,1))
fit17
##
## Call:
## arima(x = y, order = c(4, 1, 1))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1
## 0.0017 -0.0695 -0.4168 -0.1167 -0.7343
## s.e. 0.1481 0.1095 0.1087 0.1367 0.1125
##
## sigma^2 estimated as 1.353: log likelihood = -134.39, aic = 278.79
coeftest(fit17)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.0016785 0.1481224 0.0113 0.9909585
## ar2 -0.0694629 0.1095063 -0.6343 0.5258669
## ar3 -0.4168340 0.1086950 -3.8349 0.0001256 ***
## ar4 -0.1167106 0.1366672 -0.8540 0.3931180
## ma1 -0.7343138 0.1124759 -6.5286 6.637e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(4,1,2)
fit18 = arima(x = y, order = c(4,1,2))
fit18
##
## Call:
## arima(x = y, order = c(4, 1, 2))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1 ma2
## 0.4041 -0.1243 -0.4129 0.011 -1.1489 0.3581
## s.e. 0.4698 0.1202 0.1156 0.249 0.4568 0.3458
##
## sigma^2 estimated as 1.341: log likelihood = -134.03, aic = 280.06
coeftest(fit18)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.404093 0.469797 0.8601 0.3897093
## ar2 -0.124321 0.120171 -1.0345 0.3008894
## ar3 -0.412876 0.115578 -3.5723 0.0003539 ***
## ar4 0.011011 0.248989 0.0442 0.9647254
## ma1 -1.148872 0.456787 -2.5151 0.0118993 *
## ma2 0.358080 0.345795 1.0355 0.3004227
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(4,1,3)
fit19 = arima(x = y, order = c(4,1,3))
fit19
##
## Call:
## arima(x = y, order = c(4, 1, 3))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ma1 ma2 ma3
## 0.0381 0.0557 -0.4699 -0.1213 -0.7772 -0.1044 0.1629
## s.e. 0.9697 0.3657 0.1573 0.4273 0.9654 1.0310 0.3287
##
## sigma^2 estimated as 1.339: log likelihood = -133.98, aic = 281.97
coeftest(fit19)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.038063 0.969747 0.0393 0.968690
## ar2 0.055741 0.365749 0.1524 0.878870
## ar3 -0.469906 0.157329 -2.9868 0.002819 **
## ar4 -0.121295 0.427329 -0.2838 0.776529
## ma1 -0.777236 0.965398 -0.8051 0.420766
## ma2 -0.104355 1.030962 -0.1012 0.919375
## ma3 0.162899 0.328747 0.4955 0.620237
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(5,1,0)
fit20 = arima(x = y, order = c(5,1,0))
fit20
##
## Call:
## arima(x = y, order = c(5, 1, 0))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5
## -0.6447 -0.4713 -0.6371 -0.4674 -0.3074
## s.e. 0.1035 0.1162 0.1109 0.1195 0.1075
##
## sigma^2 estimated as 1.425: log likelihood = -136.46, aic = 282.92
coeftest(fit20)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.64467 0.10351 -6.2278 4.730e-10 ***
## ar2 -0.47130 0.11621 -4.0555 5.002e-05 ***
## ar3 -0.63713 0.11088 -5.7461 9.132e-09 ***
## ar4 -0.46742 0.11945 -3.9130 9.117e-05 ***
## ar5 -0.30742 0.10749 -2.8599 0.004238 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(5,1,1)
fit21 = arima(x = y, order = c(5,1,1))
fit21
##
## Call:
## arima(x = y, order = c(5, 1, 1))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ma1
## -0.1682 -0.2140 -0.4881 -0.2280 -0.1970 -0.5723
## s.e. 0.2073 0.1557 0.1197 0.1599 0.1451 0.1965
##
## sigma^2 estimated as 1.325: log likelihood = -133.58, aic = 279.16
coeftest(fit21)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.16816 0.20725 -0.8114 0.417154
## ar2 -0.21399 0.15571 -1.3743 0.169363
## ar3 -0.48814 0.11965 -4.0796 4.511e-05 ***
## ar4 -0.22797 0.15987 -1.4260 0.153864
## ar5 -0.19705 0.14511 -1.3579 0.174488
## ma1 -0.57229 0.19647 -2.9129 0.003581 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(5,1,2)
fit22 = arima(x = y, order = c(5,1,2))
fit22
##
## Call:
## arima(x = y, order = c(5, 1, 2))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ma1 ma2
## 0.0152 -0.6011 -0.6402 -0.2269 -0.4117 -0.6973 0.6017
## s.e. 0.1639 0.1781 0.1097 0.1113 0.1347 0.1521 0.2179
##
## sigma^2 estimated as 1.298: log likelihood = -132.94, aic = 279.88
coeftest(fit22)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.015194 0.163935 0.0927 0.9261559
## ar2 -0.601127 0.178146 -3.3743 0.0007399 ***
## ar3 -0.640164 0.109716 -5.8347 5.387e-09 ***
## ar4 -0.226869 0.111325 -2.0379 0.0415594 *
## ar5 -0.411692 0.134662 -3.0572 0.0022340 **
## ma1 -0.697326 0.152120 -4.5841 4.560e-06 ***
## ma2 0.601704 0.217866 2.7618 0.0057483 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(5,1,3)
fit23 = arima(x = y, order = c(5,1,3))
fit23
##
## Call:
## arima(x = y, order = c(5, 1, 3))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ma1 ma2 ma3
## 0.6340 -0.9086 -0.3582 0.0713 -0.3237 -1.4253 1.4343 -0.6575
## s.e. 0.1842 0.1506 0.1772 0.1469 0.1313 0.1718 0.2070 0.1685
##
## sigma^2 estimated as 1.207: log likelihood = -130.3, aic = 276.6
coeftest(fit23)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.633952 0.184215 3.4414 0.0005788 ***
## ar2 -0.908617 0.150633 -6.0320 1.620e-09 ***
## ar3 -0.358152 0.177228 -2.0209 0.0432951 *
## ar4 0.071251 0.146923 0.4850 0.6277099
## ar5 -0.323705 0.131284 -2.4657 0.0136755 *
## ma1 -1.425273 0.171758 -8.2981 < 2.2e-16 ***
## ma2 1.434338 0.207049 6.9275 4.283e-12 ***
## ma3 -0.657525 0.168496 -3.9023 9.528e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(6,1,0)
fit24 = arima(x = y, order = c(6,1,0))
fit24
##
## Call:
## arima(x = y, order = c(6, 1, 0))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ar6
## -0.7385 -0.6117 -0.8209 -0.6320 -0.5219 -0.3316
## s.e. 0.1023 0.1189 0.1212 0.1239 0.1218 0.1073
##
## sigma^2 estimated as 1.273: log likelihood = -132.03, aic = 276.05
coeftest(fit24)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.73848 0.10230 -7.2186 5.254e-13 ***
## ar2 -0.61172 0.11892 -5.1441 2.688e-07 ***
## ar3 -0.82086 0.12121 -6.7725 1.266e-11 ***
## ar4 -0.63197 0.12386 -5.1021 3.358e-07 ***
## ar5 -0.52190 0.12183 -4.2837 1.838e-05 ***
## ar6 -0.33156 0.10725 -3.0914 0.001992 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(6,1,1)
fit25 = arima(x = y, order = c(6,1,1))
fit25
##
## Call:
## arima(x = y, order = c(6, 1, 1))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ar6 ma1
## -0.7565 -0.6233 -0.8292 -0.6433 -0.5302 -0.3371 0.0201
## s.e. 0.2842 0.2082 0.1725 0.2076 0.1727 0.1333 0.2969
##
## sigma^2 estimated as 1.273: log likelihood = -132.03, aic = 278.05
coeftest(fit25)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.756496 0.284240 -2.6615 0.007780 **
## ar2 -0.623323 0.208172 -2.9943 0.002751 **
## ar3 -0.829204 0.172468 -4.8079 1.525e-06 ***
## ar4 -0.643298 0.207567 -3.0992 0.001940 **
## ar5 -0.530241 0.172705 -3.0702 0.002139 **
## ar6 -0.337106 0.133344 -2.5281 0.011468 *
## ma1 0.020139 0.296933 0.0678 0.945927
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ARIMA(6,1,2)
fit26 = arima(x = y, order = c(6,1,2))
fit26
##
## Call:
## arima(x = y, order = c(6, 1, 2))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ar6 ma1 ma2
## -0.4409 -0.8563 -0.9266 -0.5739 -0.5963 -0.3647 -0.2827 0.5614
## s.e. 0.2228 0.1697 0.1540 0.1665 0.1175 0.1417 0.2276 0.1695
##
## sigma^2 estimated as 1.23: log likelihood = -130.75, aic = 277.5
coeftest(fit26)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.44088 0.22284 -1.9785 0.0478764 *
## ar2 -0.85627 0.16966 -5.0470 4.488e-07 ***
## ar3 -0.92658 0.15398 -6.0175 1.771e-09 ***
## ar4 -0.57387 0.16652 -3.4462 0.0005686 ***
## ar5 -0.59634 0.11747 -5.0763 3.848e-07 ***
## ar6 -0.36468 0.14169 -2.5738 0.0100591 *
## ma1 -0.28270 0.22757 -1.2422 0.2141513
## ma2 0.56141 0.16954 3.3114 0.0009284 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#ARIMA (6,1,3)
fit27 = arima(x = y, order = c(6,1,3))
fit27
##
## Call:
## arima(x = y, order = c(6, 1, 3))
##
## Coefficients:
## ar1 ar2 ar3 ar4 ar5 ar6 ma1 ma2
## -0.1691 -0.9153 -0.6585 -0.3597 -0.5516 -0.2370 -0.5826 0.7907
## s.e. 0.3688 0.1351 0.3007 0.2915 0.1214 0.2267 0.3791 0.2307
## ma3
## -0.3723
## s.e. 0.2775
##
## sigma^2 estimated as 1.212: log likelihood = -130.16, aic = 278.32
coeftest(fit27)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.16914 0.36880 -0.4586 0.6464998
## ar2 -0.91526 0.13514 -6.7727 1.264e-11 ***
## ar3 -0.65852 0.30071 -2.1899 0.0285317 *
## ar4 -0.35974 0.29152 -1.2340 0.2171977
## ar5 -0.55163 0.12145 -4.5422 5.566e-06 ***
## ar6 -0.23699 0.22669 -1.0454 0.2958291
## ma1 -0.58264 0.37909 -1.5369 0.1243080
## ma2 0.79069 0.23071 3.4272 0.0006099 ***
## ma3 -0.37234 0.27752 -1.3416 0.1797113
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Berdasarkan uji signifikansi parameter didapatkan model ARIMA yang signifikan yakni model ARIMA (0,1,1), ARIMA (0,1,2), ARIMA (1,1,0), ARIMA (1,1,1), ARIMA (0,1,1), ARIMA (3,1,0), ARIMA (4,1,0), ARIMA (5,1,0), dan ARIMA (6,1,0) sehingga model tersebut dilanjutkan ke pengujian independensi residual dan asumsi normalitas residual.
# ARIMA(0,1,1) #TIDAK MEMENUHI#
tsdiag(fit1,85)
res1 = resid(fit1)
shapiro.test(res1)
##
## Shapiro-Wilk normality test
##
## data: res1
## W = 0.99194, p-value = 0.8792
# ARIMA(0,1,2) #TIDAK MEMENUHI#
tsdiag(fit2,85)
res2 = resid(fit2)
shapiro.test(res2)
##
## Shapiro-Wilk normality test
##
## data: res2
## W = 0.98946, p-value = 0.7197
# ARIMA(1,1,0) #TIDAK MEMENUHI#
tsdiag(fit4,85)
res4 = resid(fit4)
shapiro.test(res4)
##
## Shapiro-Wilk normality test
##
## data: res4
## W = 0.9822, p-value = 0.2837
# ARIMA(1,1,1) #TIDAK MEMENUHI#
tsdiag(fit5,85)
res5 = resid(fit5)
shapiro.test(res5)
##
## Shapiro-Wilk normality test
##
## data: res5
## W = 0.99109, p-value = 0.8293
#ARIMA(3,1,0) #TIDAK MEMENUHI#
tsdiag(fit12,85)
res12 = resid(fit12)
shapiro.test(res12)
##
## Shapiro-Wilk normality test
##
## data: res12
## W = 0.98555, p-value = 0.455
# ARIMA(4,1,0) #TIDAK MEMENUHI#
tsdiag(fit16,85)
res16 = resid(fit16)
shapiro.test(res16)
##
## Shapiro-Wilk normality test
##
## data: res16
## W = 0.98993, p-value = 0.7522
# ARIMA(5,1,0) #TIDAK MEMENUHI#
tsdiag(fit20,85)
res20 = resid(fit20)
shapiro.test(res20)
##
## Shapiro-Wilk normality test
##
## data: res20
## W = 0.98939, p-value = 0.7145
# ARIMA(6,1,0) #MEMENUHI#
tsdiag(fit24,85)
res24 = resid(fit24)
shapiro.test(res24)
##
## Shapiro-Wilk normality test
##
## data: res24
## W = 0.99273, p-value = 0.919
Diperoleh bahwa Model ARIMA yang memenuhi Asumsi Normalitas Residual dan Indepedensi yaitu model ARIMA (6,1,0)
Prediksi=fitted(fit24)
Prediksi
## Time Series:
## Start = 1
## End = 86
## Frequency = 1
## [1] 6.956481 6.858300 6.456970 6.694247 8.251664 8.861069 7.766322 7.155115
## [9] 6.879829 7.597265 8.005519 8.900497 8.298078 7.204225 6.909601 6.467232
## [17] 7.657833 7.833373 7.589197 6.634544 6.077339 6.897744 7.823187 7.091167
## [25] 6.666360 6.603031 5.624474 6.342616 7.289885 7.194504 7.328482 6.634544
## [33] 6.077339 6.897744 7.823187 7.091167 6.666360 6.710545 5.641185 6.153565
## [41] 7.339189 7.044977 7.133059 6.887307 6.836443 7.615866 7.249171 7.250680
## [49] 7.226021 7.795004 8.139655 7.281969 8.091062 6.823449 7.000142 8.539252
## [57] 7.988916 8.048042 7.401130 7.544880 7.665691 7.602476 7.870251 8.520689
## [65] 8.498883 7.377114 7.003266 7.357745 7.348222 8.271683 8.871931 7.153867
## [73] 7.675726 7.757148 8.073660 8.843737 8.397372 7.462015 6.810682 6.914215
## [81] 6.228219 7.819618 7.668715 6.949260 6.963699 5.131753
Hasil prediksi yang telah ditransformasi sebelumnya dengan metode Box-Cox dikembalikan ke skala aslinya.
kembalikan.predict=(Prediksi^(1/(p$lambda)))
kembalikan.predict1=as.data.frame(kembalikan.predict)
Lakukan prediksi pada data outsample menggunakan model ARIMA Terpilih
#Prediksi outsample
Pred_Out=predict(fit24,n.ahead=22)$pred
Pred_Out
## Time Series:
## Start = 87
## End = 108
## Frequency = 1
## [1] 5.586098 6.282877 6.973997 7.258872 6.583696 6.049203 5.569849 6.033270
## [9] 6.471882 6.853677 6.728773 6.361947 6.035735 5.979710 6.255995 6.524430
## [17] 6.642192 6.491512 6.273197 6.134666 6.188078 6.357344
Hasil prediksi yang telah ditransformasi sebelumnya dengan metode Box-Cox dikembalikan ke skala aslinya.
kembalikan.Pred_Out <- Pred_Out^(1 / (p$lambda)) # simpan sebagai numerik
kembalikan.Pred_Out1 <- as.data.frame(kembalikan.Pred_Out)
plot(1:96, curah_hujan, type = "l", main = "Grafik Prediksi dan Peramalan ARIMA", ylab = "Curah Hujan", xlab = "Waktu")
points(curah_hujan, cex = 0.9, pch = 21)
lines(1:86, kembalikan.predict1[,1], col = "blue")
lines(87:96, kembalikan.Pred_Out[1:10], col = "red")
lines(97:108, kembalikan.Pred_Out[11:22], col = "green")
abline(v = 86, col = "gray", lty = 2)
abline(v = 97, col = "pink", lty = 2)
legend("topleft",
legend = c("Prediksi", "In-sample", "Out-sample","peramalan"),
col = c("blue", "red", "cyan","green"),
lty = 1, lwd = 2, pch=c(3,16,16))
Berdasarkan Gambar dapat dilihat bahwa pola data hasil prediksi dan peramalan curah hujan menggunakan model ARIMA mendekati pola data aktual, meskipun masih terdapat penyimpangan pada beberapa titik lonjakan. Prediksi jangka pendek (out-sample) masih mengikuti data dengan baik, sedangkan hasil peramalan jangka panjang menunjukkan pola yang lebih datar karena model cenderung konstan
MAPE_data_train=MAPE(kembalikan.predict,data_train)*100
cat("MAPE ARIMA (6,1,0) data_train(in sample)=",MAPE_data_train)
## MAPE ARIMA (6,1,0) data_train(in sample)= 37.59947
SMAPE_data_train=smape(data_train,kembalikan.predict)*100
cat("\nSMAPE ARIMA (6,1,0) data_train(in sample)=",SMAPE_data_train)
##
## SMAPE ARIMA (6,1,0) data_train(in sample)= 31.89662
RMSE_data_train = RMSE(kembalikan.predict,data_train)
cat("\nRMSE ARIMA (6,1,0) In sample = ",RMSE_data_train)
##
## RMSE ARIMA (6,1,0) In sample = 75.26691
Berdasarkan evaluasi model data insampel di peroleh bahwa tingkat kesalahan pada model ARIMA (6,1,0) memiliki tingkat kesalahan yang cukup tinggi diatas 30%
MAPE_data_test=MAPE(kembalikan.Pred_Out[1:10],data_test)*100
cat("MAPE ARIMA (6,1,0) data_test(out sample)=",MAPE_data_test)
## MAPE ARIMA (6,1,0) data_test(out sample)= 33.7048
SMAPE_data_test=smape(data_test,kembalikan.Pred_Out[1:10])*100
cat("\nSMAPE ARIMA (6,1,0) data_test(out sample)=",SMAPE_data_test)
##
## SMAPE ARIMA (6,1,0) data_test(out sample)= 40.71542
RMSE_data_test = RMSE(kembalikan.Pred_Out[1:10],data_test)
cat("\nRMSE ARIMA (6,1,0) out sample = ",RMSE_data_test)
##
## RMSE ARIMA (6,1,0) out sample = 104.7211
Berdasarkan evaluasi model data Outsample di peroleh bahwa tingkat kesalahan pada model ARIMA (6,1,0) memiliki tingkat kesalahan yang cukup tinggi diatas 30%
max_asli = max(curah_hujan)
min_asli = min(curah_hujan)
data_standarisasi = 2 * ((as.numeric(curah_hujan) - min_asli)/(max_asli - min_asli)) - 1
head(data_standarisasi)
## [1] -0.4497505 -0.5552388 -0.7952008 0.4174388 0.2558803 0.7904490
pacf(data_standarisasi, main = "PACF Data Standarisasi", lag.max = 96)
grid()
Berdasarkan grafik PACF data standarisasi terlihat bahwa terdapat 1 lag dengan nilai PACF yang signifikan,yaitu lag ke-1. Kemudian keluaran yang digunakan adalah data curah hujan yang telah distandarisasi yang kemudian dinotasikan dengan Y, selanjutnya data masukan dan keluaran dimulai saat t=2.
#Input Data
y = data.frame(
nilai_asli = data_standarisasi
) %>%
mutate(
nilai_lag = dplyr::lag(nilai_asli, n = 1, default = NA) +
dplyr::lag(nilai_asli, n = 2, default = NA) +
dplyr::lag(nilai_asli, n = 3, default = NA)
) %>%
na.omit()
head(y)
## nilai_asli nilai_lag
## 4 0.4174388 -1.8001901
## 5 0.2558803 -0.9330007
## 6 0.7904490 -0.1218817
## 7 -0.4492754 1.4637681
## 8 -0.0273224 0.5970539
## 9 -0.7386553 0.3138513
trainy = y[1:jumlah_train,]
testy = y[(jumlah_train+1):(jumlah_train+jumlah_test),]
##Tahap Prediksi
###1 *hidden layer*
####NN(1)
predict_NN1 = ts(mlp_1_1$net.result[[1]])
kembali_NN1 = ((predict_NN1 + 1) / 2) * (max(curah_hujan) - min(curah_hujan)) + min(curah_hujan)
####NN(2)
predict_NN2 = ts(mlp_1_2$net.result[[1]])
kembali_NN2 = ((predict_NN2 + 1) / 2) * (max(curah_hujan) - min(curah_hujan)) + min(curah_hujan)
###2 *hidden layer*
#### NN(1,1)
predict_NN_1_1 = ts(mlp_2_1_1$net.result[[1]])
kembali_NN_1_1 = ((predict_NN_1_1 + 1) / 2) * (max(curah_hujan) - min(curah_hujan)) + min(curah_hujan)
####NN(1,2)
predict_NN_1_2 = ts(mlp_2_1_2$net.result[[1]])
kembali_NN_1_2 = ((predict_NN_1_2 + 1) / 2) * (max(curah_hujan) - min(curah_hujan)) + min(curah_hujan)
####NN(2,1)
predict_NN_2_1 = ts(mlp_2_2_1$net.result[[1]])
kembali_NN_2_1 = ((predict_NN_2_1 + 1) / 2) * (max(curah_hujan) - min(curah_hujan)) + min(curah_hujan)
####NN(2,2)
predict_NN_2_2 = ts(mlp_2_2_2$net.result[[1]])
kembali_NN_2_2 = ((predict_NN_2_2 + 1) / 2) * (max(curah_hujan) - min(curah_hujan)) + min(curah_hujan)
cat("\nMAPE Neural Network (1) = ", MAPE(ts(kembali_NN1), ts(data_train[4:jumlah_train])) * 100)
##
## MAPE Neural Network (1) = 47.22628
cat("\nMAPE Neural Network (2) = ", MAPE(ts(kembali_NN2), ts(data_train[4:jumlah_train])) * 100)
##
## MAPE Neural Network (2) = 47.22003
cat("\nMAPE Neural Network (1,1) = ", MAPE(ts(kembali_NN_1_1), ts(data_train[4:jumlah_train])) * 100)
##
## MAPE Neural Network (1,1) = 45.35879
cat("\nMAPE Neural Network (1,2) = ", MAPE(ts(kembali_NN_1_2), ts(data_train[4:jumlah_train])) * 100)
##
## MAPE Neural Network (1,2) = 47.24108
cat("\nMAPE Neural Network (2,1) = ", MAPE(ts(kembali_NN_2_1), ts(data_train[4:jumlah_train])) * 100)
##
## MAPE Neural Network (2,1) = 47.21125
cat("\nMAPE Neural Network (2,2) = ", MAPE(ts(kembali_NN_2_2), ts(data_train[4:jumlah_train])) * 100)
##
## MAPE Neural Network (2,2) = 47.20147
cat("\nRMSE Neural Network (1) = ", RMSE(ts(kembali_NN1), ts(data_train[4:jumlah_train])))
##
## RMSE Neural Network (1) = 83.99079
cat("\nRMSE Neural Network (2) = ", RMSE(ts(kembali_NN2), ts(data_train[4:jumlah_train])))
##
## RMSE Neural Network (2) = 83.99095
cat("\nRMSE Neural Network (1,1) = ", RMSE(ts(kembali_NN_1_1), ts(data_train[4:jumlah_train])))
##
## RMSE Neural Network (1,1) = 82.53503
cat("\nRMSE Neural Network (1,2) = ", RMSE(ts(kembali_NN_1_2), ts(data_train[4:jumlah_train])))
##
## RMSE Neural Network (1,2) = 83.99045
cat("\nRMSE Neural Network (2,1) = ", RMSE(ts(kembali_NN_2_1), ts(data_train[4:jumlah_train])))
##
## RMSE Neural Network (2,1) = 83.99089
cat("\nRMSE Neural Network (2,2) = ", RMSE(ts(kembali_NN_2_2), ts(data_train[4:jumlah_train])))
##
## RMSE Neural Network (2,2) = 83.99064
cat("\nSMAPE Neural Network (1) = ", smape(ts(data_train[4:jumlah_train]), ts(kembali_NN1)) * 100)
##
## SMAPE Neural Network (1) = 36.33137
cat("\nSMAPE Neural Network (2) = ", smape(ts(data_train[4:jumlah_train]), ts(kembali_NN2)) * 100)
##
## SMAPE Neural Network (2) = 36.32884
cat("\nSMAPE Neural Network (1,1) = ", smape(ts(data_train[4:jumlah_train]), ts(kembali_NN_1_1)) * 100)
##
## SMAPE Neural Network (1,1) = 34.86978
cat("\nSMAPE Neural Network (1,2) = ", smape(ts(data_train[4:jumlah_train]), ts(kembali_NN_1_2)) * 100)
##
## SMAPE Neural Network (1,2) = 36.33079
cat("\nSMAPE Neural Network (2,1) = ", smape(ts(data_train[4:jumlah_train]), ts(kembali_NN_2_1)) * 100)
##
## SMAPE Neural Network (2,1) = 36.3394
cat("\nSMAPE Neural Network (2,2) = ", smape(ts(data_train[4:jumlah_train]), ts(kembali_NN_2_2)) * 100)
##
## SMAPE Neural Network (2,2) = 36.33451
Berdasarkan evaluasi model, diperoleh model Neural Network terbaik adalah NN (1,1)
last_lag = tail(data_train, 1)
forecast_normalized <- numeric(12)
current_lag = last_lag
#Peramalan untuk 12 periode ke depan
for (i in 1:12) {
new_data = data.frame(nilai_lag = current_lag)
pred = neuralnet::compute(mlp_1_1, covariate = new_data)
forecast_normalized[i] = pred$net.result[1, 1]
current_lag = forecast_normalized[i]
}
#Denormalisasi hasil peramalan
forecast_denormalized = ((forecast_normalized + 1) / 2) * (max_asli - min_asli) + min_asli
Hasil_NN = ts(c(curah_hujan, forecast_denormalized))
plot(1:108, Hasil_NN, type = "l", main = "Grafik Prediksi dan Peramalan NN",
ylab = "Intensitas Curah Hujan", xlab = "Time", col = "purple", lwd = 3)
lines(1:96, curah_hujan, col = "black", lwd = 2)
lines(1:jumlah_train, Hasil_NN[1:jumlah_train], col = "cyan4", lwd = 3)
lines((jumlah_train + 1):(jumlah_train + 12), Hasil_NN[(jumlah_train + 1):(jumlah_train + 12)], col = "darkorange", lwd = 3)
points(1:96, curah_hujan, cex = 0.9, pch = 21, col = "black", bg = "black")
legend("topright", legend = c("Data Aktual", "Prediksi In Sample", "Prediksi Out Sample", "Peramalan"),
col = c("black", "cyan4", "darkorange", "purple"),
lty = c(1, 1, 1, 1),
pch = c(21, NA, NA, NA),
pt.bg = c("black", NA, NA, NA),
lwd = c(2, 3, 3, 3), bty = "o", cex = 0.8)
grid()
Berdasarkan grafik prediksi dan peramalan, terlihat bahwa hasil prediksi cenderung mengikuti data aktual dengan cukup baik. Selain itu pada hasil peramalan, terlihat bahwa nilai curah hujan mengalami penurunan tajam di awal periode dan kemudian cenderung stabil mendekati nilai konstan.
Ide dasar dari Single Moving Average (SMA) adalah data suatu periode dipengaruhi oleh data periode sebelumnya. Metode pemulusan ini cocok digunakan untuk pola data stasioner atau konstan. Prinsip dasar metode pemulusan ini adalah data pemulusan pada periode ke-t merupakan rata rata dari m buah data pada periode ke-t hingga periode ke (t-m+1). Data pemulusan pada periode ke-t selanjutnya digunakan sebagai nilai peramalan pada periode ke t+1
Pemulusan menggunakan metode SMA dilakukan dengan fungsi SMA(). Dalam hal ini akan dilakukan pemulusan dengan parameter m=4.
data.sma<-SMA(data_train, n=4)
data.sma
## [1] NA NA NA 182.700 219.825 290.625 308.825 285.425 233.100
## [10] 165.650 180.125 173.475 202.450 188.875 172.700 161.975 182.075 206.900
## [19] 202.600 169.525 127.300 116.025 113.475 143.875 166.000 152.450 159.300
## [28] 161.975 182.075 206.900 202.600 169.525 127.300 116.025 113.475 143.875
## [37] 173.775 158.750 160.950 162.700 157.125 177.325 180.450 193.500 207.950
## [46] 207.300 216.625 188.925 210.550 205.050 227.225 261.750 198.750 197.000
## [55] 181.500 205.000 236.750 267.750 285.250 255.500 221.000 182.025 179.800
## [64] 190.775 209.525 222.050 231.050 197.775 269.000 300.150 294.475 291.475
## [73] 211.100 178.350 164.775 208.150 216.200 235.450 195.375 130.800 120.225
## [82] 90.450 143.200 171.625 171.250 158.950
Data pemulusan pada periode ke-t selanjutnya digunakan sebagai nilai peramalan pada periode ke t+1 sehingga hasil peramalan 1 periode kedepan adalah sebagai berikut.
data.ramal<-c(NA,data.sma)
data.ramal
## [1] NA NA NA NA 182.700 219.825 290.625 308.825 285.425
## [10] 233.100 165.650 180.125 173.475 202.450 188.875 172.700 161.975 182.075
## [19] 206.900 202.600 169.525 127.300 116.025 113.475 143.875 166.000 152.450
## [28] 159.300 161.975 182.075 206.900 202.600 169.525 127.300 116.025 113.475
## [37] 143.875 173.775 158.750 160.950 162.700 157.125 177.325 180.450 193.500
## [46] 207.950 207.300 216.625 188.925 210.550 205.050 227.225 261.750 198.750
## [55] 197.000 181.500 205.000 236.750 267.750 285.250 255.500 221.000 182.025
## [64] 179.800 190.775 209.525 222.050 231.050 197.775 269.000 300.150 294.475
## [73] 291.475 211.100 178.350 164.775 208.150 216.200 235.450 195.375 130.800
## [82] 120.225 90.450 143.200 171.625 171.250 158.950
Selanjutnya akan dilakukan peramalan sejumlah data uji yaitu 86 periode. Pada metode SMA, hasil peramalan 86 periode ke depan akan bernilai sama dengan hasil peramalan 1 periode kedepan. Dalam hal ini akan dilakukan pengguabungan data aktual train, data hasil pemulusan dan data hasil ramalan 86 periode kedepan.
data.gab<-cbind(aktual=c(data_train,rep(NA,26)),pemulusan=c(data.sma,rep(NA,26)),ramalan=c(data.ramal,rep(data.ramal[length(data.ramal)],25)))
data.gab
## aktual pemulusan ramalan
## [1,] 160.8 NA NA
## [2,] 138.6 NA NA
## [3,] 88.1 NA NA
## [4,] 343.3 182.700 NA
## [5,] 309.3 219.825 182.700
## [6,] 421.8 290.625 219.825
## [7,] 160.9 308.825 290.625
## [8,] 249.7 285.425 308.825
## [9,] 100.0 233.100 285.425
## [10,] 152.0 165.650 233.100
## [11,] 218.8 180.125 165.650
## [12,] 223.1 173.475 180.125
## [13,] 215.9 202.450 173.475
## [14,] 97.7 188.875 202.450
## [15,] 154.1 172.700 188.875
## [16,] 180.2 161.975 172.700
## [17,] 296.3 182.075 161.975
## [18,] 197.0 206.900 182.075
## [19,] 136.9 202.600 206.900
## [20,] 47.9 169.525 202.600
## [21,] 127.4 127.300 169.525
## [22,] 151.9 116.025 127.300
## [23,] 126.7 113.475 116.025
## [24,] 169.5 143.875 113.475
## [25,] 215.9 166.000 143.875
## [26,] 97.7 152.450 166.000
## [27,] 154.1 159.300 152.450
## [28,] 180.2 161.975 159.300
## [29,] 296.3 182.075 161.975
## [30,] 197.0 206.900 182.075
## [31,] 136.9 202.600 206.900
## [32,] 47.9 169.525 202.600
## [33,] 127.4 127.300 169.525
## [34,] 151.9 116.025 127.300
## [35,] 126.7 113.475 116.025
## [36,] 169.5 143.875 113.475
## [37,] 247.0 173.775 143.875
## [38,] 91.8 158.750 173.775
## [39,] 135.5 160.950 158.750
## [40,] 176.5 162.700 160.950
## [41,] 224.7 157.125 162.700
## [42,] 172.6 177.325 157.125
## [43,] 148.0 180.450 177.325
## [44,] 228.7 193.500 180.450
## [45,] 282.5 207.950 193.500
## [46,] 170.0 207.300 207.950
## [47,] 185.3 216.625 207.300
## [48,] 117.9 188.925 216.625
## [49,] 369.0 210.550 188.925
## [50,] 148.0 205.050 210.550
## [51,] 274.0 227.225 205.050
## [52,] 256.0 261.750 227.225
## [53,] 117.0 198.750 261.750
## [54,] 141.0 197.000 198.750
## [55,] 212.0 181.500 197.000
## [56,] 350.0 205.000 181.500
## [57,] 244.0 236.750 205.000
## [58,] 265.0 267.750 236.750
## [59,] 282.0 285.250 267.750
## [60,] 231.0 255.500 285.250
## [61,] 106.0 221.000 255.500
## [62,] 109.1 182.025 221.000
## [63,] 273.1 179.800 182.025
## [64,] 274.9 190.775 179.800
## [65,] 181.0 209.525 190.775
## [66,] 159.2 222.050 209.525
## [67,] 309.1 231.050 222.050
## [68,] 141.8 197.775 231.050
## [69,] 465.9 269.000 197.775
## [70,] 283.8 300.150 269.000
## [71,] 286.4 294.475 300.150
## [72,] 129.8 291.475 294.475
## [73,] 144.4 211.100 291.475
## [74,] 152.8 178.350 211.100
## [75,] 232.1 164.775 178.350
## [76,] 303.3 208.150 164.775
## [77,] 176.6 216.200 208.150
## [78,] 229.8 235.450 216.200
## [79,] 71.8 195.375 235.450
## [80,] 45.0 130.800 195.375
## [81,] 134.3 120.225 130.800
## [82,] 110.7 90.450 120.225
## [83,] 282.8 143.200 90.450
## [84,] 158.7 171.625 143.200
## [85,] 132.8 171.250 171.625
## [86,] 61.5 158.950 171.250
## [87,] NA NA 158.950
## [88,] NA NA 158.950
## [89,] NA NA 158.950
## [90,] NA NA 158.950
## [91,] NA NA 158.950
## [92,] NA NA 158.950
## [93,] NA NA 158.950
## [94,] NA NA 158.950
## [95,] NA NA 158.950
## [96,] NA NA 158.950
## [97,] NA NA 158.950
## [98,] NA NA 158.950
## [99,] NA NA 158.950
## [100,] NA NA 158.950
## [101,] NA NA 158.950
## [102,] NA NA 158.950
## [103,] NA NA 158.950
## [104,] NA NA 158.950
## [105,] NA NA 158.950
## [106,] NA NA 158.950
## [107,] NA NA 158.950
## [108,] NA NA 158.950
## [109,] NA NA 158.950
## [110,] NA NA 158.950
## [111,] NA NA 158.950
## [112,] NA NA 158.950
Adapun time series plot dari hasil peramalan yang dilakukan adalah sebagai berikut.
ts.plot(curah_hujan, xlab="Time Period ", ylab="Curah Hujan", main= "Grafik Prediksi dan Peramalan ARIMA")
points(curah_hujan)
lines(data.gab[,2],col="green",lwd=2)
lines(data.gab[,3],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.5)
Metode pemulusan Double Moving Average (DMA) pada dasarnya mirip dengan SMA. Namun demikian, metode ini lebih cocok digunakan untuk pola data trend. Proses pemulusan dengan rata rata dalam metode ini dilakukan sebanyak 2 kali.
dma <- SMA(data.sma, n = 4)
At <- 2*data.sma - dma
Bt <- 2/(4-1)*(data.sma - dma)
data.dma<- At+Bt
data.ramal2<- c(NA, data.dma)
data.ramal2
## [1] NA NA NA NA NA NA NA
## [8] 406.04375 300.84167 155.77708 27.98333 120.20833 149.12083 239.15833
## [15] 193.28125 153.24167 129.43333 191.52292 250.21250 226.28750 134.94167
## [22] 45.16458 52.96250 83.29792 175.05208 217.92708 166.61667 165.78958
## [29] 165.38125 212.28333 255.79583 226.28750 134.94167 45.16458 52.96250
## [36] 83.29792 175.05208 235.42083 177.55208 163.63750 160.46042 152.53125
## [43] 198.65833 198.86667 220.83333 238.18958 223.96667 233.76042 161.80000
## [50] 218.38333 204.65417 259.37083 321.09375 158.01042 156.69792 134.41667
## [57] 220.72917 289.56250 342.75000 346.18750 245.81250 160.37500 92.16042
## [64] 130.16458 186.40000 241.18125 257.90417 260.55000 168.90000 334.05208
## [71] 384.57708 343.01667 295.97500 105.76667 69.18333 87.02500 237.41042
## [78] 256.75208 284.29375 164.67708 24.70625 36.49583 17.51250 179.91875
## [85] 238.70833 216.44792 155.10625
t = 1:26
f = c()
for (i in t) {
f[i] = At[length(At)] + Bt[length(Bt)]*(i)
}
data.gab2 <- cbind(aktual = c(data_train,rep(NA,26)), pemulusan1 = c(data.sma,rep(NA,26)),pemulusan2 = c(data.dma, rep(NA,26)),At = c(At, rep(NA,26)), Bt = c(Bt,rep(NA,26)),ramalan = c(data.ramal2, f[-1]))
data.gab2
## aktual pemulusan1 pemulusan2 At Bt ramalan
## [1,] 160.8 NA NA NA NA NA
## [2,] 138.6 NA NA NA NA NA
## [3,] 88.1 NA NA NA NA NA
## [4,] 343.3 182.700 NA NA NA NA
## [5,] 309.3 219.825 NA NA NA NA
## [6,] 421.8 290.625 NA NA NA NA
## [7,] 160.9 308.825 406.04375 367.15625 38.8875000 NA
## [8,] 249.7 285.425 300.84167 294.67500 6.1666667 406.04375
## [9,] 100.0 233.100 155.77708 186.70625 -30.9291667 300.84167
## [10,] 152.0 165.650 27.98333 83.05000 -55.0666667 155.77708
## [11,] 218.8 180.125 120.20833 144.17500 -23.9666667 27.98333
## [12,] 223.1 173.475 149.12083 158.86250 -9.7416667 120.20833
## [13,] 215.9 202.450 239.15833 224.47500 14.6833333 149.12083
## [14,] 97.7 188.875 193.28125 191.51875 1.7625000 239.15833
## [15,] 154.1 172.700 153.24167 161.02500 -7.7833333 193.28125
## [16,] 180.2 161.975 129.43333 142.45000 -13.0166667 153.24167
## [17,] 296.3 182.075 191.52292 187.74375 3.7791667 129.43333
## [18,] 197.0 206.900 250.21250 232.88750 17.3250000 191.52292
## [19,] 136.9 202.600 226.28750 216.81250 9.4750000 250.21250
## [20,] 47.9 169.525 134.94167 148.77500 -13.8333333 226.28750
## [21,] 127.4 127.300 45.16458 78.01875 -32.8541667 134.94167
## [22,] 151.9 116.025 52.96250 78.18750 -25.2250000 45.16458
## [23,] 126.7 113.475 83.29792 95.36875 -12.0708333 52.96250
## [24,] 169.5 143.875 175.05208 162.58125 12.4708333 83.29792
## [25,] 215.9 166.000 217.92708 197.15625 20.7708333 175.05208
## [26,] 97.7 152.450 166.61667 160.95000 5.6666667 217.92708
## [27,] 154.1 159.300 165.78958 163.19375 2.5958333 166.61667
## [28,] 180.2 161.975 165.38125 164.01875 1.3625000 165.78958
## [29,] 296.3 182.075 212.28333 200.20000 12.0833333 165.38125
## [30,] 197.0 206.900 255.79583 236.23750 19.5583333 212.28333
## [31,] 136.9 202.600 226.28750 216.81250 9.4750000 255.79583
## [32,] 47.9 169.525 134.94167 148.77500 -13.8333333 226.28750
## [33,] 127.4 127.300 45.16458 78.01875 -32.8541667 134.94167
## [34,] 151.9 116.025 52.96250 78.18750 -25.2250000 45.16458
## [35,] 126.7 113.475 83.29792 95.36875 -12.0708333 52.96250
## [36,] 169.5 143.875 175.05208 162.58125 12.4708333 83.29792
## [37,] 247.0 173.775 235.42083 210.76250 24.6583333 175.05208
## [38,] 91.8 158.750 177.55208 170.03125 7.5208333 235.42083
## [39,] 135.5 160.950 163.63750 162.56250 1.0750000 177.55208
## [40,] 176.5 162.700 160.46042 161.35625 -0.8958333 163.63750
## [41,] 224.7 157.125 152.53125 154.36875 -1.8375000 160.46042
## [42,] 172.6 177.325 198.65833 190.12500 8.5333333 152.53125
## [43,] 148.0 180.450 198.86667 191.50000 7.3666667 198.65833
## [44,] 228.7 193.500 220.83333 209.90000 10.9333333 198.86667
## [45,] 282.5 207.950 238.18958 226.09375 12.0958333 220.83333
## [46,] 170.0 207.300 223.96667 217.30000 6.6666667 238.18958
## [47,] 185.3 216.625 233.76042 226.90625 6.8541667 223.96667
## [48,] 117.9 188.925 161.80000 172.65000 -10.8500000 233.76042
## [49,] 369.0 210.550 218.38333 215.25000 3.1333333 161.80000
## [50,] 148.0 205.050 204.65417 204.81250 -0.1583333 218.38333
## [51,] 274.0 227.225 259.37083 246.51250 12.8583333 204.65417
## [52,] 256.0 261.750 321.09375 297.35625 23.7375000 259.37083
## [53,] 117.0 198.750 158.01042 174.30625 -16.2958333 321.09375
## [54,] 141.0 197.000 156.69792 172.81875 -16.1208333 158.01042
## [55,] 212.0 181.500 134.41667 153.25000 -18.8333333 156.69792
## [56,] 350.0 205.000 220.72917 214.43750 6.2916667 134.41667
## [57,] 244.0 236.750 289.56250 268.43750 21.1250000 220.72917
## [58,] 265.0 267.750 342.75000 312.75000 30.0000000 289.56250
## [59,] 282.0 285.250 346.18750 321.81250 24.3750000 342.75000
## [60,] 231.0 255.500 245.81250 249.68750 -3.8750000 346.18750
## [61,] 106.0 221.000 160.37500 184.62500 -24.2500000 245.81250
## [62,] 109.1 182.025 92.16042 128.10625 -35.9458333 160.37500
## [63,] 273.1 179.800 130.16458 150.01875 -19.8541667 92.16042
## [64,] 274.9 190.775 186.40000 188.15000 -1.7500000 130.16458
## [65,] 181.0 209.525 241.18125 228.51875 12.6625000 186.40000
## [66,] 159.2 222.050 257.90417 243.56250 14.3416667 241.18125
## [67,] 309.1 231.050 260.55000 248.75000 11.8000000 257.90417
## [68,] 141.8 197.775 168.90000 180.45000 -11.5500000 260.55000
## [69,] 465.9 269.000 334.05208 308.03125 26.0208333 168.90000
## [70,] 283.8 300.150 384.57708 350.80625 33.7708333 334.05208
## [71,] 286.4 294.475 343.01667 323.60000 19.4166667 384.57708
## [72,] 129.8 291.475 295.97500 294.17500 1.8000000 343.01667
## [73,] 144.4 211.100 105.76667 147.90000 -42.1333333 295.97500
## [74,] 152.8 178.350 69.18333 112.85000 -43.6666667 105.76667
## [75,] 232.1 164.775 87.02500 118.12500 -31.1000000 69.18333
## [76,] 303.3 208.150 237.41042 225.70625 11.7041667 87.02500
## [77,] 176.6 216.200 256.75208 240.53125 16.2208333 237.41042
## [78,] 229.8 235.450 284.29375 264.75625 19.5375000 256.75208
## [79,] 71.8 195.375 164.67708 176.95625 -12.2791667 284.29375
## [80,] 45.0 130.800 24.70625 67.14375 -42.4375000 164.67708
## [81,] 134.3 120.225 36.49583 69.98750 -33.4916667 24.70625
## [82,] 110.7 90.450 17.51250 46.68750 -29.1750000 36.49583
## [83,] 282.8 143.200 179.91875 165.23125 14.6875000 17.51250
## [84,] 158.7 171.625 238.70833 211.87500 26.8333333 179.91875
## [85,] 132.8 171.250 216.44792 198.36875 18.0791667 238.70833
## [86,] 61.5 158.950 155.10625 156.64375 -1.5375000 216.44792
## [87,] NA NA NA NA NA 155.10625
## [88,] NA NA NA NA NA 153.56875
## [89,] NA NA NA NA NA 152.03125
## [90,] NA NA NA NA NA 150.49375
## [91,] NA NA NA NA NA 148.95625
## [92,] NA NA NA NA NA 147.41875
## [93,] NA NA NA NA NA 145.88125
## [94,] NA NA NA NA NA 144.34375
## [95,] NA NA NA NA NA 142.80625
## [96,] NA NA NA NA NA 141.26875
## [97,] NA NA NA NA NA 139.73125
## [98,] NA NA NA NA NA 138.19375
## [99,] NA NA NA NA NA 136.65625
## [100,] NA NA NA NA NA 135.11875
## [101,] NA NA NA NA NA 133.58125
## [102,] NA NA NA NA NA 132.04375
## [103,] NA NA NA NA NA 130.50625
## [104,] NA NA NA NA NA 128.96875
## [105,] NA NA NA NA NA 127.43125
## [106,] NA NA NA NA NA 125.89375
## [107,] NA NA NA NA NA 124.35625
## [108,] NA NA NA NA NA 122.81875
## [109,] NA NA NA NA NA 121.28125
## [110,] NA NA NA NA NA 119.74375
## [111,] NA NA NA NA NA 118.20625
## [112,] NA NA NA NA NA 116.66875
Hasil pemulusan menggunakan metode DMA divisualisasikan sebagai berikut
ts.plot(curah_hujan, xlab="Time Period ", ylab="Curah Hujan", main= "Grafik Prediksi dan Peramalan ARIMA")
points(curah_hujan)
lines(data.gab2[,3],col="green",lwd=2)
lines(data.gab2[,6],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan","data peramalan"), lty=8, col=c("black","green","red"), cex=0.5)
error_insample.sma = data_train - data.ramal[1:length(data_train)]
RMSE_insample.sma = sqrt(mean(error_insample.sma[5:length(data_train)]^2))
MAPE_insample.sma = mean(abs((error_insample.sma[5:length(data_train)]/data_train[5:length(data_train)])*100))
SMAPE_insample.sma = mean(2 * abs(error_insample.sma[5:length(data_train)]) /(abs(data_train[5:length(data_train)]) + abs(data.ramal[5:length(data_train)])) * 100)
akurasi_insample.sma <- matrix(c(RMSE_insample.sma, MAPE_insample.sma, SMAPE_insample.sma))
row.names(akurasi_insample.sma) <- c("RMSE", "MAPE", "SMAPE")
colnames(akurasi_insample.sma) <- c("Akurasi m = 4")
akurasi_insample.sma
## Akurasi m = 4
## RMSE 93.45899
## MAPE 52.34680
## SMAPE 38.72499
error_outsample.sma = data_test - data.gab[87:96, 3]
RMSE_outsample.sma = sqrt(mean(error_outsample.sma^2))
MAPE_outsample.sma = mean(abs(error_outsample.sma/data_test)*100)
SMAPE_outsample.sma = mean(2 * abs(error_outsample.sma) /
(abs(data_test) + abs(data.gab[87:96, 3])) * 100)
akurasi_outsample.sma <- matrix(c(RMSE_outsample.sma, MAPE_outsample.sma, SMAPE_outsample.sma))
row.names(akurasi_outsample.sma) <- c("RMSE", "MAPE", "SMAPE")
colnames(akurasi_outsample.sma) <- c("Akurasi m = 4")
akurasi_outsample.sma
## Akurasi m = 4
## RMSE 101.97837
## MAPE 44.48605
## SMAPE 44.15748
error_insample.dma = data_train - data.ramal2[1:length(data_train)]
RMSE_insample.dma = sqrt(mean(error_insample.dma[8:length(data_train)]^2))
MAPE_insample.dma = mean(abs((error_insample.dma[8:length(data_train)]/data_train[8:length(data_train)])*100))
SMAPE_insample.dma = mean(2 * abs(error_insample.dma[8:length(data_train)]) /
(abs(data_train[8:length(data_train)]) + abs(data.ramal2[8:length(data_train)])) * 100)
akurasi_insample.dma <- matrix(c(RMSE_insample.dma, MAPE_insample.dma, SMAPE_insample.dma))
row.names(akurasi_insample.dma) <- c("RMSE", "MAPE", "SMAPE")
colnames(akurasi_insample.dma) <- c("Akurasi m = 4")
akurasi_insample.dma
## Akurasi m = 4
## RMSE 117.57261
## MAPE 67.87414
## SMAPE 55.19280
error_outsample.dma = data_test - data.gab2[87:96, 6]
RMSE_outsample.dma = sqrt(mean(error_outsample.dma^2))
MAPE_outsample.dma = mean(abs(error_outsample.dma / data_test) * 100)
SMAPE_outsample.dma = mean(2 * abs(error_outsample.dma) /
(abs(data_test) + abs(data.gab2[87:96, 6])) * 100)
akurasi_outsample.dma <- matrix(c(RMSE_outsample.dma, MAPE_outsample.dma, SMAPE_outsample.dma))
row.names(akurasi_outsample.dma) <- c("RMSE", "MAPE", "SMAPE")
colnames(akurasi_outsample.dma) <- c("Akurasi m = 4")
akurasi_outsample.dma
## Akurasi m = 4
## RMSE 107.89033
## MAPE 42.60474
## SMAPE 44.57904
# TABEL PERBANDINGAN INSAMPLE
evaluasi_insample <- data.frame(
Model = c("ARIMA (6,1,0)", "Neural Network (1,1)", "SMA", "DMA"),
MAPE = c(MAPE_data_train,
MAPE(ts(kembali_NN_1_1), ts(data_train[4:jumlah_train])) * 100,
MAPE_insample.sma,
MAPE_insample.dma),
SMAPE = c(SMAPE_data_train,
smape(ts(data_train[4:jumlah_train]), ts(kembali_NN_1_1)) * 100,
SMAPE_insample.sma,
SMAPE_insample.dma),
RMSE = c(RMSE_data_train,
RMSE(ts(kembali_NN_1_1), ts(data_train[4:jumlah_train])),
RMSE_insample.sma,
RMSE_insample.dma)
)
# TABEL PERBANDINGAN OUTSAMPLE
evaluasi_outsample <- data.frame(
Model = c("ARIMA (6,1,0)", "SMA", "DMA"),
MAPE = c(MAPE_data_test,
MAPE_outsample.sma,
MAPE_outsample.dma),
SMAPE = c(SMAPE_data_test,
SMAPE_outsample.sma,
SMAPE_outsample.dma),
RMSE = c(RMSE_data_test,
RMSE_outsample.sma,
RMSE_outsample.dma)
)
print(evaluasi_outsample)
## Model MAPE SMAPE RMSE
## 1 ARIMA (6,1,0) 33.70480 40.71542 104.7211
## 2 SMA 44.48605 44.15748 101.9784
## 3 DMA 42.60474 44.57904 107.8903
Pada data outsample (data uji), ARIMA mencatat nilai MAPE sebesar 33.70%, SMAPE sebesar 40.72%, dan RMSE sebesar 104.72. Meskipun nilai RMSE-nya sedikit lebih tinggi dibanding model SMA (101.98), nilai MAPE dan SMAPE yang lebih rendah menunjukkan bahwa ARIMA lebih akurat dalam memprediksi data di luar data pelatihan. Hal ini menandakan bahwa ARIMA mampu mempertahankan kestabilan dan keakuratannya pada data yang belum pernah dilihat sebelumnya.
print(evaluasi_insample)
## Model MAPE SMAPE RMSE
## 1 ARIMA (6,1,0) 37.59947 31.89662 75.26691
## 2 Neural Network (1,1) 45.35879 34.86978 82.53503
## 3 SMA 52.34680 38.72499 93.45899
## 4 DMA 67.87414 55.19280 117.57261
Hasil evaluasi pada data insample (data latih) juga menempatkan ARIMA sebagai model terbaik, dengan MAPE sebesar 37.60%, SMAPE 31.90%, dan RMSE 75.67. Model Neural Network (1,1) berada di posisi kedua dengan MAPE 45.36%, SMAPE 34.87%, dan RMSE 82.54, menunjukkan bahwa meskipun cukup mampu menangkap pola nonlinear, akurasinya masih di bawah ARIMA. Model SMA dan DMA pada data insamle menunjukkan performa yang kurang baik dengan error yang relatif tinggi.
Secara keseluruhan, hasil evaluasi ini mengindikasikan bahwa model ARIMA (6,1,0) adalah pendekatan paling optimal untuk meramalkan curah hujan di Kota Samarinda dalam studi ini, karena mampu memberikan tingkat kesalahan yang paling rendah secara konsisten pada kedua jenis data evaluasi.
Kami Tim 10 mengucapkan terima kasih yang sebesar-besarnya kepada para asisten praktikum Analisis Runtun Waktu 2 FMIPA Universitas Mulawarman atas bimbingan, bantuan, dan ilmu yang telah diberikan selama proses praktikum berlangsung. Terima kasih khusus saya sampaikan kepada Bang Chiko Zet Oroh, Bang Bagus Dwi Ramadhani, Bang Muhammad Irsadul Ibaad, dan Kak Febiani Putri Ardhana yang telah dengan sabar mendampingi dan memberikan arahan dalam memahami materi serta menyelesaikan tugas-tugas praktikum. Semoga kebaikan dan ilmu yang telah dibagikan menjadi amal jariyah dan memberikan manfaat yang luas.