1 Latar Belakang

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.

2 Library/Packages

## 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

3 Input Data dan Splitting Data (Pembagian Data Insample & Outsample)

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.

4 Pemodelan ARIMA

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.

4.1 Identifikasi Model ARIMA

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 :

4.2 Uji Signifikansi Parameter

# 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.

4.3 Pengujian Diagniostik

# 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)

4.4 Grafik Prediksi dan Peramalan ARIMA (6,1,0)

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

4.5 Evaluasi Model Data In Sample

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%

4.6 Evaluasi Model Data Out Sample

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%

5 Neural Network

5.1 Tahap Standarisasi

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.

5.2 Pembentuka Model NN

#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),]

5.3 NN 1 Hidden

###*Neural network* 1 *hidden layer*
set.seed(1)
mlp_1_1 = neuralnet(nilai_asli~nilai_lag, data=trainy, hidden=1, act.fct="tanh", linear.output = TRUE, learningrate = 0.005, stepmax = 10000, startweights = NULL, threshold = 0.005, algorithm = "rprop+")
plot(mlp_1_1)

set.seed(1)
mlp_1_2 = neuralnet(nilai_asli~nilai_lag, data=trainy, hidden=2, act.fct="tanh", linear.output = T, learningrate = 0.005, stepmax = 10000, startweights = NULL, threshold = 0.005, algorithm = "rprop+")
plot(mlp_1_2)

5.4 NN 2 Hidden

###*Neural network* 2 *hidden layer*
set.seed(1)
mlp_2_1_1 = neuralnet(nilai_asli~nilai_lag, data=trainy, hidden=c(1,1), act.fct="tanh", linear.output = TRUE, learningrate = 0.005, stepmax = 10000, startweights = NULL, threshold = 0.005, algorithm = "rprop+")
plot(mlp_2_1_1)

set.seed(1)
mlp_2_1_2 = neuralnet(nilai_asli~nilai_lag, data=trainy, hidden=c(1,2), act.fct="tanh", linear.output = TRUE, learningrate = 0.005, stepmax = 10000, startweights = NULL, threshold = 0.005, algorithm = "rprop+")
plot(mlp_2_1_2)

set.seed(1)
mlp_2_2_1 = neuralnet(nilai_asli~nilai_lag, data=trainy, hidden=c(2,1), act.fct="tanh", linear.output = TRUE, learningrate = 0.005, stepmax = 10000, startweights = NULL, threshold = 0.005, algorithm = "rprop+")
plot(mlp_2_2_1)

set.seed(1)
mlp_2_2_2 = neuralnet(nilai_asli~nilai_lag, data=trainy, hidden=c(2,2), act.fct="tanh", linear.output = TRUE, learningrate = 0.005, stepmax = 10000, startweights = NULL, threshold = 0.005, algorithm = "rprop+")
plot(mlp_2_2_2)

5.5 Prediksi

##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)

5.6 Pemilihan Model Terbaik

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)

5.7 Permalalan dengan 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

5.8 Grafik Predeksi dan Peramalan dengan NN (1,1)

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.

6 Simple Moving Average (SMA)

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

6.1 Peramalan SMA

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

6.2 Time Series Plot SMA

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)

7 Double Moving Average (DMA)

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

7.1 Peramalan DMA

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

7.2 Time Series Plot DMA

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)

8 Akurasi SMA dan DMA

8.1 Akurasi Insample SMA

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

8.2 Akurasi Outsample SMA

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

8.3 Akurasi Insample DMA

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

8.4 Akurasi Outsample DMA

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

9 Komparasi Metode ARIMA, NN dan Moving Average (MA)

# 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)
)

9.1 Komparasi dengan data Outsample

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.

9.2 Komparasi dengan data Insample

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.

10 Kesimpulan Akhir

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.

11 Ucapan Terima Kasih

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.