Packages

library(ggplot2)
library(tsibble)
## Warning: package 'tsibble' was built under R version 4.3.1
## 
## Attaching package: 'tsibble'
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, union
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.1
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(MASS)
## Warning: package 'MASS' was built under R version 4.3.1
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.1
library(TSA)
## Warning: package 'TSA' was built under R version 4.3.1
## 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
library(TTR)
## Warning: package 'TTR' was built under R version 4.3.1
library(aTSA)
## 
## Attaching package: 'aTSA'
## The following object is masked from 'package:forecast':
## 
##     forecast
## The following objects are masked from 'package:tseries':
## 
##     adf.test, kpss.test, pp.test
## The following object is masked from 'package:graphics':
## 
##     identify
library(graphics)

Pembangkitan Data

White Noise

Pembangkitan data berpola AR, MA, ARMA, dan banyak proses deret waktu lainnya diawali pembangkitan white noise. White noise merupakan sederet nilai dari peubah bebas stokastik identik. Oleh karena itu, white noise memiliki dua karakteristik penting:

  1. White noise tidak memiliki autokorelasi (karena saling bebas)
  2. Nilai harapan dan ragam white noise sama (karena berasal dari peubah acak bebas stokastik identik)

White noise dibangkitkan dari suatu peubah acak, umumnya peubah acak normal.

MA

Data yang akan dibangkitkan adalah data dengan model MA(2) dengan \[\theta_{1}=\] sebagai berikut.

set.seed(1401211002)
ma <- arima.sim(list(order = c(0,0,2), ma = c(0.55,0.65)), n = 300)

AR

Data yang akan dibangkitkan adalah data dengan model AR(2) dengan \(\phi_1 = 0.5\) dan \(\phi_2 = 0.2\) sebanyak 300 observasi.

set.seed(1401211002)
ar <- arima.sim(list(order=c(2,0,0), ar=c(0.5,0.2)), n=300)

Pembagian Data

Data kemudian dibagi menjadi data latih dan data uji. Pembagian kali ini dilakukan dengan proporsi / perbandingan, yaitu 80:20.

ma <- ma[-c(1:25)]
ma.train <- ma[1:239]
ma.test <- ma[240:300]
ar <- ar[-c(1:25)]
ar.train <- ar[1:239]
ar.test <- ar[240:300]

Eksplorasi Data

Sebelum masuk dalam tahap pemodelan, dilakukan eksplorasi data dengan plot deret waktu untuk melihat pola data.

#--PLOT TIME SERIES--#
plot(ma.train,
     col = "navyblue",
     lwd = 1,
     type = "o",
     xlab = "Time",
     ylab = "Data")

#--PLOT TIME SERIES--#
plot(ar.train,
     col = "navyblue",
     lwd = 1,
     type = "o",
     xlab = "Time",
     ylab = "Data")

Berdasarkan plot data deret waktu di atas, terlihat data cenderung tidak stasioner dalam rataan dan ragam. Data stasioner dalam rataan karena tidak menyebar/bergerak di sekitar nilai tengahnya (0) dan dikatakan tidak stasioner dalam ragam karena memiliki lebar pita yang cenderung berbeda. Selain dengan plot data deret waktu, akan dilakukan pengecekan stasioneritas data dengan plot ACF dan uji ADF.

Plot ACF

#--CEK KESTASIONERAN---#
acf(ma.train, main="ACF", lag.max=20)

Berdasarkan plot ACF di atas, dapat dilihat bahwa plot tails off dan membentuk gelombang sinus pada lag ke-2.

#--CEK KESTASIONERAN---#
acf(ar.train, main="ACF", lag.max=20)

Berdasarkan plot ACF di atas, dapat dilihat bahwa plot tails off slowly sehingga diindikasikan tidak stasioner dalam rataan.

Uji ADF

adf.test(ma.train) 
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -8.00    0.01
## [2,]   1 -6.96    0.01
## [3,]   2 -8.53    0.01
## [4,]   3 -6.14    0.01
## [5,]   4 -4.98    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -8.02    0.01
## [2,]   1 -6.99    0.01
## [3,]   2 -8.57    0.01
## [4,]   3 -6.18    0.01
## [5,]   4 -5.01    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -8.11    0.01
## [2,]   1 -7.12    0.01
## [3,]   2 -8.75    0.01
## [4,]   3 -6.34    0.01
## [5,]   4 -5.16    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
#stasioner
adf.test(ar.train) 
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag   ADF p.value
## [1,]   0 -7.42    0.01
## [2,]   1 -5.87    0.01
## [3,]   2 -5.21    0.01
## [4,]   3 -5.27    0.01
## [5,]   4 -5.14    0.01
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -7.44    0.01
## [2,]   1 -5.88    0.01
## [3,]   2 -5.21    0.01
## [4,]   3 -5.25    0.01
## [5,]   4 -5.13    0.01
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -7.53    0.01
## [2,]   1 -5.95    0.01
## [3,]   2 -5.26    0.01
## [4,]   3 -5.24    0.01
## [5,]   4 -5.14    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
#stasioner

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa data stasioner dalam rataan. Hal ini tidak sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF sehingga diperlukan adanya diferensing.

Diferensing data

train.diff.ar<-diff(ar.train,differences = 1) 
par(mfrow=c(1,1))
plot(train.diff.ar,lwd = 2, main = 'Plot Data Train 1 Kali  Diferensiasi')
abline(h=mean(train.diff.ar),lwd=2,lty = 2, col ='red')

Acf(train.diff.ar, main ='Grafik ACF Data Train  1 Kali 
    Diferensiasi ', lag.max = 36)

Uji ADF model diferensing

adf.test(train.diff.ar) 
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag    ADF p.value
## [1,]   0 -20.80    0.01
## [2,]   1 -14.83    0.01
## [3,]   2 -11.93    0.01
## [4,]   3  -9.65    0.01
## [5,]   4  -9.66    0.01
## Type 2: with drift no trend 
##      lag    ADF p.value
## [1,]   0 -20.75    0.01
## [2,]   1 -14.80    0.01
## [3,]   2 -11.91    0.01
## [4,]   3  -9.63    0.01
## [5,]   4  -9.64    0.01
## Type 3: with drift and trend 
##      lag    ADF p.value
## [1,]   0 -20.72    0.01
## [2,]   1 -14.77    0.01
## [3,]   2 -11.90    0.01
## [4,]   3  -9.62    0.01
## [5,]   4  -9.62    0.01
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01
#stasioner

Spesifikasi Model

#---SPESIFIKASI MODEL---#
par(mfrow = c(1,2))
acf(ma.train, main="ACF", lag.max=20) #ARIMA(0,0,2)
pacf(ma.train, main="PACF", lag.max=20) #ARIMA(1,0,0)

par(mfrow = c(1,1))

Berdasarkan Plot ACF, terlihat cuts off pada lag ke-2 sehingga dapat kita asumsikan model yang terbentuk adalah ARIMA(0,0,2). Selanjutnya, berdasarkan plot PACF, terlihat cuts off pada lag ketiga sehingga model yang terbentuk adalah ARIMA(3,0,0). Selain dengan plot ACF dan PACF, penentuan spesifikasi model dilakukan dengan extended ACF (EACF) berikut ini.

#---SPESIFIKASI MODEL---#
par(mfrow = c(1,2))
acf(train.diff.ar, main="ACF", lag.max=20) #ARIMA(0,0,2)
pacf(train.diff.ar, main="PACF", lag.max=20) #ARIMA(1,0,0)

par(mfrow = c(1,1))

Berdasarkan Plot ACF, terlihat cutt off pada lag pertama sehingga model yang tebentuk adalah ARIMA(0,1,1). Selanjutnya, berdasarkan plot PACF, terlihat cuts off pada lag kedua sehingga model yang terbentuk adalah ARIMA(2,1,0). Selain dengan plot ACF dan PACF, penentuan spesifikasi model dilakukan dengan extended ACF (EACF) berikut ini.

eacf(ma.train) 
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x x o o o o o o o o o  o  o  o 
## 1 o x x o o o o o o o o  o  o  o 
## 2 o x x o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 x x o x o o o o o o o  o  o  o 
## 6 x x o x x o o o o o o  o  o  o 
## 7 x x o x o o o o o o o  o  o  o

Menggunakan plot EACF, dapat diambil beberapa model dengan melihat ujung segitiga yang terbentuk, antara lain ARIMA(2,0,0), dan ARIMA(1,0,2).

Pendugaan Parameter

Selanjutnya akan dilakukan pendugaan parameter kelima model ARIMA yang terbentuk sebelumnya. Pendugaan dilakukan dengan fungsi Arima() yang dilanjutkan dengan melihat nilai AIC pada ringkasan data dan melihat signifikansi parameter.

#---PENDUGAAN PARAMETER MODEL---#
model1.ma=Arima(ma.train, order=c(0,0,2),method="ML")
summary(model1.ma) #AIC=326.87
## Series: ma.train 
## ARIMA(0,0,2) with non-zero mean 
## 
## Coefficients:
##          ma1     ma2    mean
##       0.5986  0.5478  0.0794
## s.e.  0.0556  0.0499  0.1421
## 
## sigma^2 = 1.068:  log likelihood = -345.91
## AIC=699.83   AICc=700   BIC=713.73
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.003483711 1.026922 0.8181525 43.95846 320.5153 0.8415997
##                    ACF1
## Training set 0.01859592
lmtest::coeftest(model1.ma) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value Pr(>|z|)    
## ma1       0.598611   0.055629 10.7608   <2e-16 ***
## ma2       0.547783   0.049906 10.9764   <2e-16 ***
## intercept 0.079379   0.142108  0.5586   0.5764    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model2.ma=Arima(ma.train, order=c(0,1,1),method="ML") 
summary(model2.ma) #AIC=340.47
## Series: ma.train 
## ARIMA(0,1,1) 
## 
## Coefficients:
##           ma1
##       -0.2651
## s.e.   0.0800
## 
## sigma^2 = 1.447:  log likelihood = -381.24
## AIC=766.47   AICc=766.52   BIC=773.42
## 
## Training set error measures:
##                      ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.01089839 1.197985 0.9484332 129.1403 442.3047 0.9756142
##                    ACF1
## Training set 0.01973697
lmtest::coeftest(model2.ma) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.265132   0.080005 -3.3139 0.0009199 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model3.ma=Arima(ma.train, order=c(2,1,0),method="ML") 
summary(model3.ma) #AIC=329.22
## Series: ma.train 
## ARIMA(2,1,0) 
## 
## Coefficients:
##           ar1     ar2
##       -0.2186  0.0891
## s.e.   0.0644  0.0644
## 
## sigma^2 = 1.439:  log likelihood = -380.08
## AIC=766.15   AICc=766.25   BIC=776.57
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE     MASE
## Training set 0.008784832 1.192153 0.9452095 99.76444 454.3473 0.972298
##                   ACF1
## Training set 0.0317383
lmtest::coeftest(model3.ma) #tidak ada yang signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.218584   0.064411 -3.3936 0.0006899 ***
## ar2  0.089115   0.064403  1.3837 0.1664491    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model4.ma=Arima(ma.train, order=c(1,0,2),method="ML") 
summary(model4.ma) #AIC=330.6
## Series: ma.train 
## ARIMA(1,0,2) with non-zero mean 
## 
## Coefficients:
##          ar1     ma1     ma2    mean
##       0.0817  0.5375  0.5274  0.0787
## s.e.  0.1236  0.1082  0.0617  0.1487
## 
## sigma^2 = 1.071:  log likelihood = -345.7
## AIC=701.41   AICc=701.66   BIC=718.79
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.003729607 1.026005 0.8188312 34.30382 328.1569 0.8422979
##                     ACF1
## Training set -0.00366993
lmtest::coeftest(model4.ma) #hanya ma2 yang signifikan
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1       0.081676   0.123574  0.6609    0.5086    
## ma1       0.537460   0.108211  4.9668 6.807e-07 ***
## ma2       0.527361   0.061749  8.5404 < 2.2e-16 ***
## intercept 0.078693   0.148694  0.5292    0.5966    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan pendugaan parameter di atas, parameter model ARIMA(0,0,2) seluruhnya signifikan sehingga model yang dipilih adalah model ARIMA(1,0,2) dengan nilai AIC = 88.71 dan BIC = 706,1.

Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

Eksplorasi Sisaan

#Eksplorasi
sisaan.ma2 <- model1.ma$residuals
par(mfrow=c(1,1))
qqnorm(sisaan.ma2)
qqline(sisaan.ma2, col = "blue", lwd = 2)

plot(c(1:length(sisaan.ma2)),sisaan.ma2)

acf(sisaan.ma2)

pacf(sisaan.ma2)

par(mfrow = c(1,1))

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan menyebar normal mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Akan tetapi, plot ACF dan PACF sisaan ARIMA(0,0,2) signifikan pada lag ke-5 sehingga sisaan tidak saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

Uji Formal

#1) Sisaan Menyebar Normal
ks.test(sisaan.ma2,"pnorm") 
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan.ma2
## D = 0.042434, p-value = 0.7826
## alternative hypothesis: two-sided
#tak tolak H0 > sisaan menyebar normal

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar 0.9507 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

#2) Sisaan saling bebas/tidak ada autokorelasi
Box.test(sisaan.ma2, type = "Ljung") 
## 
##  Box-Ljung test
## 
## data:  sisaan.ma2
## X-squared = 0.08369, df = 1, p-value = 0.7724
#tak tolak H0 > sisaan saling bebas

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar 0.548 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini berbeda dengan eksplorasi.

#3) Sisaan homogen
Box.test((sisaan.ma2)^2, type = "Ljung") 
## 
##  Box-Ljung test
## 
## data:  (sisaan.ma2)^2
## X-squared = 0.74386, df = 1, p-value = 0.3884
#tak tolak H0 > sisaan homogen

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar 0.7276 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa ragam sisaan homogen.

#4) Nilai tengah sisaan sama dengan nol
t.test(sisaan.ma2, mu = 0, conf.level = 0.95) 
## 
##  One Sample t-test
## 
## data:  sisaan.ma2
## t = 0.052335, df = 238, p-value = 0.9583
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.1276483  0.1346157
## sample estimates:
##   mean of x 
## 0.003483711
#tak tolak h0 > nilai tengah sisaan sama dengan 0

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar 0.9842 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol. Hal ini berbeda dengan eksplorasi.

Overfitting

Tahapan selanjutnya adalah overfitting dilakukan dengan menaikkan orde AR(p) dan MA(q) dari model ARIMA(1,0,2) untuk melihat apakah terdapat model lain yang lebih baik dari model saat ini. Kandidat model overfitting adalah ARIMA(2,0,2) dan ARIMA(1,0,3).

#---OVERFITTING---#
model1a.ma2=Arima(ma.train, order=c(2,0,2),method="ML")
summary(model1a.ma2) #327.31
## Series: ma.train 
## ARIMA(2,0,2) with non-zero mean 
## 
## Coefficients:
##          ar1     ar2     ma1     ma2    mean
##       0.0319  0.0641  0.5865  0.5076  0.0774
## s.e.  0.1527  0.1300  0.1406  0.0754  0.1531
## 
## sigma^2 = 1.074:  log likelihood = -345.59
## AIC=703.18   AICc=703.54   BIC=724.04
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.004159703 1.025497 0.8179611 41.27564 331.6899 0.8414029
##                      ACF1
## Training set -0.001271912
lmtest::coeftest(model1a.ma2) #ar1 tidak signifikan
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1       0.031853   0.152680  0.2086    0.8347    
## ar2       0.064070   0.129996  0.4929    0.6221    
## ma1       0.586504   0.140597  4.1715 3.026e-05 ***
## ma2       0.507637   0.075447  6.7284 1.715e-11 ***
## intercept 0.077435   0.153081  0.5058    0.6130    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model1b.ma2=Arima(ma.train, order=c(1,0,3),method="ML")
summary(model1b.ma2) #327.24
## Series: ma.train 
## ARIMA(1,0,3) with non-zero mean 
## 
## Coefficients:
##          ar1     ma1     ma2      ma3    mean
##       0.3345  0.2852  0.3762  -0.1405  0.0780
## s.e.  1.1905  1.1977  0.7266   0.6790  0.1511
## 
## sigma^2 = 1.075:  log likelihood = -345.67
## AIC=703.34   AICc=703.7   BIC=724.2
## 
## Training set error measures:
##                       ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.003979135 1.025854 0.8185532 37.17363 329.7685 0.8420119
##                      ACF1
## Training set -0.003865898
lmtest::coeftest(model1b.ma2) #ma3 tidak signifikan
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value Pr(>|z|)
## ar1        0.33452    1.19051  0.2810   0.7787
## ma1        0.28524    1.19766  0.2382   0.8118
## ma2        0.37617    0.72661  0.5177   0.6047
## ma3       -0.14047    0.67899 -0.2069   0.8361
## intercept  0.07801    0.15114  0.5161   0.6058
#model yang dipilih adalah model awal, yaitu ARIMA(0,0,2)

Berdasarkan kedua model hasil overfitting di atas, model ARIMA(1,0,3) dan ARIMA(2,0,2) memiliki AIC yang lebih besar dibandingkan dengan model AIC model (1,0,2) lebih kecil dibanding model (1,0,2). Oleh karena itu, model ARIMA(1,0,2) akan tetap digunakan untuk melakukan peramalan.

Peramalan

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 61 hari ke depan.

#---FORECAST---#
ramalan <- forecast :: forecast(model1.ma, h = 61) 
ramalan
##     Point Forecast     Lo 80     Hi 80     Lo 95    Hi 95
## 240    -0.37461363 -1.699006 0.9497784 -2.400097 1.650869
## 241    -0.20926072 -1.752809 1.3342872 -2.569914 2.151392
## 242     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 243     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 244     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 245     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 246     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 247     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 248     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 249     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 250     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 251     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 252     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 253     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 254     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 255     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 256     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 257     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 258     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 259     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 260     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 261     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 262     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 263     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 264     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 265     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 266     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 267     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 268     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 269     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 270     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 271     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 272     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 273     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 274     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 275     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 276     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 277     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 278     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 279     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 280     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 281     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 282     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 283     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 284     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 285     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 286     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 287     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 288     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 289     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 290     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 291     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 292     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 293     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 294     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 295     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 296     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 297     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 298     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 299     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
## 300     0.07937917 -1.626159 1.7849173 -2.529016 2.687775
data.ramalan <- ramalan$mean
plot(ramalan)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(0,0,2) cenderung meningkat di awal periode dan stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

perbandingan<-matrix(data=c(ma.test, data.ramalan),
                     nrow = 30, ncol = 2)
## Warning in matrix(data = c(ma.test, data.ramalan), nrow = 30, ncol = 2): data
## length [122] is not a sub-multiple or multiple of the number of rows [30]
colnames(perbandingan)<-c("Aktual","Hasil Forecast")
perbandingan
##            Aktual Hasil Forecast
##  [1,] -0.63672251      1.5445163
##  [2,]  0.60009378      0.4021689
##  [3,]  1.43166977      1.6765452
##  [4,]  2.16988149      1.3932572
##  [5,] -0.08196533      0.9154793
##  [6,] -1.10964123      0.7148921
##  [7,]  0.25899015             NA
##  [8,]  0.54735569             NA
##  [9,]  2.35798621             NA
## [10,]  1.72802199             NA
## [11,]  1.94346211             NA
## [12,] -0.02303735             NA
## [13,]  0.53047443             NA
## [14,] -0.56615656             NA
## [15,] -0.43634899             NA
## [16,] -1.80721245             NA
## [17,] -1.38212667             NA
## [18,] -1.87111344             NA
## [19,]  0.20242710             NA
## [20,] -1.94315100             NA
## [21,] -0.79344884             NA
## [22,] -0.67993693             NA
## [23,]  0.90605873             NA
## [24,]  2.50541768             NA
## [25,]  1.18060711             NA
## [26,]  0.95565331             NA
## [27,] -0.28661561             NA
## [28,]  0.14482174             NA
## [29,]  1.46622015             NA
## [30,]  0.62219745             NA
accuracy(data.ramalan, ma.test)
##                 ME  RMSE      MAE     MPE    MAPE
## Test set 0.3462695 1.229 1.023793 106.918 106.918

Data Asli

Digunakan data kurs yang dalam hal ini hanya digunakan data 500 periode awal

library(rio)
## Warning: package 'rio' was built under R version 4.3.1
datakurs<-import("https://raw.githubusercontent.com/rizkynurhambali/Praktikum-MPDW-2324/main/Pertemuan%2067/kurs.csv")
datakurs <- datakurs[1:500,]
datakurs.ts<-ts(datakurs)

Eksplorasi Data

Plot Data Penuh

plot.ts(datakurs.ts, lty=1, xlab="waktu", ylab="Kurs", main="Plot Data Kurs")

Berdasarkan plot data deret waktu, terlihat bahwa data cenderung memiliki trend yang naik. Berdasarkan pola data, pembagian data latih dan data uji ditetapkan dengan proporsi 86%:14%.

Plot Data Latih

kurstrain<-datakurs[1:430]
train.ts<-ts(kurstrain)
plot.ts(train.ts, lty=1, xlab="waktu", ylab="Kurs", main="Plot Kurs Train")

Berdasarkan plot data deret waktu pada data latih, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan.

Plot Data Uji

kurstest<-datakurs[431:500]
test.ts<-ts(kurstest)
plot.ts(test.ts, lty=1, xlab="waktu", ylab="Kurs", main="Plot Kurs Test")

Uji Stasioneritas Data

Plot ACF

acf(train.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan

Uji ADF

tseries::adf.test(train.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train.ts
## Dickey-Fuller = -2.0526, Lag order = 7, p-value = 0.5553
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.5553 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani

Plot Box-Cox

index <- seq(1:430)
bc = boxcox(train.ts~index, lambda = seq(5,10,by=1))

#Nilai Rounded Lambda
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] 6.616162
#SK
bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
##  [1] 5.656566 5.707071 5.757576 5.808081 5.858586 5.909091 5.959596 6.010101
##  [9] 6.060606 6.111111 6.161616 6.212121 6.262626 6.313131 6.363636 6.414141
## [17] 6.464646 6.515152 6.565657 6.616162 6.666667 6.717172 6.767677 6.818182
## [25] 6.868687 6.919192 6.969697 7.020202 7.070707 7.121212 7.171717 7.222222
## [33] 7.272727 7.323232 7.373737 7.424242 7.474747 7.525253 7.575758 7.626263
## [41] 7.676768

Plot Boxcox menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 6,64 dan pada selang kepercayaan 95% nilai memiliki batas bawah 0,48 dan batas atas 5,27. Selang tersebut memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan stasioner dalam ragam.

Penanganan Ketidakstasioneran Data

train.diff<-diff(train.ts,differences = 1) 
plot.ts(train.diff, lty=1, xlab="waktu", ylab="Data Difference 1 Kurs", main="Plot Difference Kurs")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data)

Plot ACF

acf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 1. Hal ini menandakan data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

Uji ADF

tseries::adf.test(train.diff)
## Warning in tseries::adf.test(train.diff): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train.diff
## Dickey-Fuller = -6.3673, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan

Identifikasi Model

Plot ACF

acf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 1, sehingga jika plot PACF dianggap tails of, maka model tentatifnya adalah ARIMA(0,1,1).

Plot PACF

pacf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 1, sehingga jika plot ACF dianggap tails of, maka model tentatifnya adalah ARIMA(1,1,0).

Jika baik plot ACF maupun plot PACF keduanya dianggap tails of, maka model yang terbentuk adalah ARIMA(1,1,1)

Plot EACF

eacf(train.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x o o o o o o o o o o  o  o  o 
## 1 x x o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x o o o o o o o o o  o  o  o 
## 4 x x x o o o o o o o o  o  o  o 
## 5 x x o o o o o o o o o  o  o  o 
## 6 x x o o x x o o o o o  o  o  o 
## 7 x x o x x x x o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat ujung segitiga pada pola segitiga nol. Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,2), ARIMA(1,1,2), ARIMA(2,1,2), dan ARIMA(3,1,2).

Pendugaan Parameter Model Tentatif

ARIMA(0,1,1)

model1.da=Arima(train.diff, order=c(0,1,1),method="ML")
summary(model1.da) #AIC=4753.18
## Series: train.diff 
## ARIMA(0,1,1) 
## 
## Coefficients:
##           ma1
##       -0.9879
## s.e.   0.0148
## 
## sigma^2 = 3835:  log likelihood = -2374.59
## AIC=4753.18   AICc=4753.21   BIC=4761.3
## 
## Training set error measures:
##                      ME     RMSE      MAE MPE MAPE      MASE     ACF1
## Training set -0.6762224 61.78387 43.22489 NaN  Inf 0.7363284 0.112352
lmtest::coeftest(model1.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.987941   0.014806 -66.727 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(1,1,0)

model2.da=Arima(train.diff, order=c(1,1,0),method="ML")
summary(model2.da) #AIC=4917.41
## Series: train.diff 
## ARIMA(1,1,0) 
## 
## Coefficients:
##           ar1
##       -0.3940
## s.e.   0.0444
## 
## sigma^2 = 5676:  log likelihood = -2456.7
## AIC=4917.41   AICc=4917.43   BIC=4925.52
## 
## Training set error measures:
##                       ME     RMSE      MAE MPE MAPE      MASE      ACF1
## Training set -0.05787648 75.16292 54.08917 NaN  Inf 0.9213996 -0.121856
lmtest::coeftest(model2.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.394037   0.044414 -8.8719 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(1,1,1)

model3.da=Arima(train.diff, order=c(1,1,1),method="ML")
summary(model3.da) #AIC=4761.39
## Series: train.diff 
## ARIMA(1,1,1) 
## 
## Coefficients:
##          ar1      ma1
##       0.1207  -0.9966
## s.e.  0.0491   0.0210
## 
## sigma^2 = 3782:  log likelihood = -2371.6
## AIC=4749.21   AICc=4749.27   BIC=4761.39
## 
## Training set error measures:
##                     ME     RMSE     MAE  MPE MAPE      MASE        ACF1
## Training set -2.082868 61.28528 43.2876 -Inf  Inf 0.7373967 0.006544589
lmtest::coeftest(model3.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value Pr(>|z|)    
## ar1  0.120655   0.049064   2.4591  0.01393 *  
## ma1 -0.996606   0.020970 -47.5253  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(0,1,2)

model4.da=Arima(train.diff, order=c(0,1,2),method="ML")
summary(model4.da) #AIC=4748.3
## Series: train.diff 
## ARIMA(0,1,2) 
## 
## Coefficients:
##           ma1      ma2
##       -0.8600  -0.1359
## s.e.   0.0512   0.0507
## 
## sigma^2 = 3775:  log likelihood = -2371.15
## AIC=4748.3   AICc=4748.35   BIC=4760.47
## 
## Training set error measures:
##                     ME     RMSE      MAE  MPE MAPE      MASE         ACF1
## Training set -2.059629 61.22216 43.24997 -Inf  Inf 0.7367557 -0.009277841
lmtest::coeftest(model4.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.860021   0.051204 -16.796 < 2.2e-16 ***
## ma2 -0.135945   0.050725  -2.680  0.007361 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(1,1,2)

model5.da=Arima(train.diff, order=c(1,1,2),method="ML")
summary(model5.da) #AIC=4749.85 
## Series: train.diff 
## ARIMA(1,1,2) 
## 
## Coefficients:
##           ar1      ma1      ma2
##       -0.1723  -0.6912  -0.3021
## s.e.   0.2443   0.2348   0.2305
## 
## sigma^2 = 3782:  log likelihood = -2370.92
## AIC=4749.85   AICc=4749.94   BIC=4766.08
## 
## Training set error measures:
##                     ME     RMSE      MAE  MPE MAPE      MASE         ACF1
## Training set -1.798497 61.21036 43.15664 -Inf  Inf 0.7351659 -0.006549048
lmtest::coeftest(model5.da) #terdapat parameter tidak signifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)   
## ar1 -0.17233    0.24425 -0.7056 0.480467   
## ma1 -0.69120    0.23481 -2.9436 0.003244 **
## ma2 -0.30214    0.23054 -1.3106 0.189995   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(2,1,2)

model6.da=Arima(train.diff, order=c(2,1,2),method="ML")
summary(model6.da) #AIC=4749.52
## Series: train.diff 
## ARIMA(2,1,2) 
## 
## Coefficients:
##          ar1      ar2      ma1     ma2
##       0.4635  -0.1308  -1.3295  0.3386
## s.e.  0.3091   0.0565   0.3089  0.3073
## 
## sigma^2 = 3777:  log likelihood = -2369.76
## AIC=4749.52   AICc=4749.66   BIC=4769.81
## 
## Training set error measures:
##                      ME     RMSE     MAE MPE MAPE      MASE         ACF1
## Training set -0.4957896 61.09641 43.1911 NaN  Inf 0.7357528 -0.004047784
lmtest::coeftest(model6.da) #terdapat parameter tidak signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1  0.463451   0.309061  1.4995   0.13373    
## ar2 -0.130837   0.056523 -2.3148   0.02063 *  
## ma1 -1.329455   0.308856 -4.3045 1.674e-05 ***
## ma2  0.338625   0.307281  1.1020   0.27046    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil dimiliki oleh model ARIMA(0,1,2) dan parameter model ARIMA(0,1,2) juga seluruhnya signifikan sehingga model yang dipilih adalah model ARIMA(0,1,2).

Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

Eksplorasi Sisaan

#Eksplorasi 
sisaan.da <- model4.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan.da) 
qqline(sisaan.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan.da)),sisaan.da) 
acf(sisaan.da) 
pacf(sisaan.da) 

par(mfrow = c(1,1))

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung tidak sama menandakan bahwa sisaan memiliki ragam yang heterogen. Plot ACF dan PACF sisaan ARIMA(0,0,2) juga tidak signifikan pada 20 lag awal yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

Uji Formal

#1) Sisaan Menyebar Normal 
ks.test(sisaan.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan.da
## D = 0.46816, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar 0.00 yang kurang dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

#2) Sisaan saling bebas/tidak ada autokorelasi 
Box.test(sisaan.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan.da
## X-squared = 0.037186, df = 1, p-value = 0.8471

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar 0.8471 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini berbeda dengan eksplorasi.

#3) Sisaan homogen 
Box.test((sisaan.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan.da)^2
## X-squared = 29.906, df = 1, p-value = 4.536e-08

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar 0.000 yang kurang dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan.da
## t = -0.69638, df = 428, p-value = 0.4866
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -7.872876  3.753619
## sample estimates:
## mean of x 
## -2.059629

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar 0.4866 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol. Hal ini berbeda dengan eksplorasi.

Peramalan

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 30 hari ke depan.

#---FORECAST---#
ramalan.da <- forecast::forecast(model4.da, h = 30) 
ramalan.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 431      0.3239709 -78.42499 79.07294 -120.1122 120.7601
## 432      6.7730086 -72.74745 86.29346 -114.8430 128.3891
## 433      6.7730086 -72.74808 86.29410 -114.8440 128.3900
## 434      6.7730086 -72.74872 86.29473 -114.8450 128.3910
## 435      6.7730086 -72.74935 86.29537 -114.8459 128.3920
## 436      6.7730086 -72.74998 86.29600 -114.8469 128.3929
## 437      6.7730086 -72.75062 86.29664 -114.8479 128.3939
## 438      6.7730086 -72.75125 86.29727 -114.8489 128.3949
## 439      6.7730086 -72.75189 86.29790 -114.8498 128.3958
## 440      6.7730086 -72.75252 86.29854 -114.8508 128.3968
## 441      6.7730086 -72.75316 86.29917 -114.8518 128.3978
## 442      6.7730086 -72.75379 86.29981 -114.8527 128.3988
## 443      6.7730086 -72.75442 86.30044 -114.8537 128.3997
## 444      6.7730086 -72.75506 86.30108 -114.8547 128.4007
## 445      6.7730086 -72.75569 86.30171 -114.8556 128.4017
## 446      6.7730086 -72.75633 86.30234 -114.8566 128.4026
## 447      6.7730086 -72.75696 86.30298 -114.8576 128.4036
## 448      6.7730086 -72.75760 86.30361 -114.8586 128.4046
## 449      6.7730086 -72.75823 86.30425 -114.8595 128.4055
## 450      6.7730086 -72.75886 86.30488 -114.8605 128.4065
## 451      6.7730086 -72.75950 86.30552 -114.8615 128.4075
## 452      6.7730086 -72.76013 86.30615 -114.8624 128.4085
## 453      6.7730086 -72.76077 86.30678 -114.8634 128.4094
## 454      6.7730086 -72.76140 86.30742 -114.8644 128.4104
## 455      6.7730086 -72.76204 86.30805 -114.8653 128.4114
## 456      6.7730086 -72.76267 86.30869 -114.8663 128.4123
## 457      6.7730086 -72.76330 86.30932 -114.8673 128.4133
## 458      6.7730086 -72.76394 86.30996 -114.8683 128.4143
## 459      6.7730086 -72.76457 86.31059 -114.8692 128.4152
## 460      6.7730086 -72.76521 86.31122 -114.8702 128.4162
data.ramalan.da <- ramalan.da$mean
plot(ramalan.da)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(0,012) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train.ts[430] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train.ts,hasil)

perbandingan.da<-matrix(data=c(head(test.ts, n=30), hasil[-1]),
                     nrow = 30, ncol = 2)
colnames(perbandingan.da)<-c("Aktual","Hasil Forecast")
perbandingan.da
##       Aktual Hasil Forecast
##  [1,]  12866       12813.32
##  [2,]  12887       12820.10
##  [3,]  12862       12826.87
##  [4,]  12863       12833.64
##  [5,]  12993       12840.42
##  [6,]  12962       12847.19
##  [7,]  12963       12853.96
##  [8,]  13022       12860.74
##  [9,]  12983       12867.51
## [10,]  13047       12874.28
## [11,]  13059       12881.05
## [12,]  13164       12887.83
## [13,]  13176       12894.60
## [14,]  13191       12901.37
## [15,]  13237       12908.15
## [16,]  13209       12914.92
## [17,]  13164       12921.69
## [18,]  13008       12928.47
## [19,]  13075       12935.24
## [20,]  13076       12942.01
## [21,]  12972       12948.78
## [22,]  12932       12955.56
## [23,]  13003       12962.33
## [24,]  13064       12969.10
## [25,]  13086       12975.88
## [26,]  13084       12982.65
## [27,]  13043       12989.42
## [28,]  13000       12996.20
## [29,]  12942       13002.97
## [30,]  12982       13009.74
accuracy(ts(hasil[-1]), head(test.ts, n=30))
##                ME     RMSE      MAE       MPE      MAPE      ACF1 Theil's U
## Test set 118.9674 156.6908 126.4518 0.9079581 0.9657541 0.7929994  2.646555