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)
library(readxl)
library(rio)
## Warning: package 'rio' was built under R version 4.3.1
library(imputeTS)
## Warning: package 'imputeTS' was built under R version 4.3.1
## 
## Attaching package: 'imputeTS'
## The following object is masked from 'package:tseries':
## 
##     na.remove

Data

data <- import("https://raw.githubusercontent.com/divanm/mpdw/main/Data/DATA%20IDX%20COMPOSITE%20JKSE.csv")
head(data)
##         Date     Open     High      Low    Close Adj Close    Volume
## 1 2020-04-06 4623.429 4975.536 4562.902 4649.079  4649.079 255758500
## 2 2020-04-13 4649.079 4747.725 4480.607 4634.821  4634.821 218419900
## 3 2020-04-20 4634.821 4669.542 4441.090 4496.064  4496.064 238397200
## 4 2020-04-27 4496.064 4726.774 4474.893 4716.403  4716.403 183906700
## 5 2020-05-04 4716.403 4716.403 4576.228 4597.430  4597.430 179791700
## 6 2020-05-11 4597.430 4659.862 4460.273 4507.607  4507.607 231060000
dim(data)
## [1] 143   7

Mengambil data close

data <- as.numeric(data$Close)
data <- as.data.frame(data)

Mengecek keberadaan missing value

data[which(is.na(data$data)),]
## [1] NA

Menduga missing value

data <- na_interpolation(data, option = "spline")
data[109,]
## [1] 6840.217

Mengubah data menjadi data time series

data.ts <- ts(data)

Eksplorasi Data

Plot Data Penuh

plot.ts(data.ts, lty=1, xlab="waktu", ylab="IHSG yahoo finance", main="Plot Data IHSG YAHOO FINANCE")

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 80%:20%.

Pembagian Data

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

data.train <- data$data[1:115]
train.ts <- ts(data.train)
data.test <- data$data[116:143]
test.ts <- ts(data.test)

Plot Data Latih

train.ts<-ts(data.train)
plot.ts(train.ts, lty=1, xlab="waktu", ylab="IHSG", main="Plot IHSG 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

test.ts<-ts(data.test)
plot.ts(test.ts, lty=1, xlab="waktu", ylab="IHSG", main="Plot IHSG")

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.4499, Lag order = 4, p-value = 0.3898
## 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.3898 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:115)
bc = boxcox(train.ts~index, lambda = seq(-5,10,by=1))

#Nilai Rounded Lambda
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] 2.575758
#SK
bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
##  [1] 1.818182 1.969697 2.121212 2.272727 2.424242 2.575758 2.727273 2.878788
##  [9] 3.030303 3.181818 3.333333

Plot Boxcox menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 2.575758 dan pada selang kepercayaan 95% nilai memiliki batas bawah 1.818182 dan batas atas 3.333333. Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data tidak 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 IHSG", main="Plot Difference IHSG")

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 2. 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 = -4.708, Lag order = 4, 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 2, sehingga jika plot PACF dianggap tails of, maka model tentatifnya adalah ARIMA(0,1,2).

Plot PACF

pacf(train.diff)

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

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

Plot EACF

eacf(train.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o x 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 o o o o o o o o o o  o  o  o 
## 3 x o o o o o o o o o o  o  o  o 
## 4 x x o 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 o x o o o o o o o o o  o  o  o 
## 7 x o o o o o o 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(1,1,2), ARIMA(2,1,1), ARIMA(3,1,1).

Pendugaan Parameter Model Tentatif

ARIMA(0,1,2)

model1.da=Arima(train.diff, order=c(0,1,2),method="ML")
summary(model1.da) #AIC=1412.54
## Series: train.diff 
## ARIMA(0,1,2) 
## 
## Coefficients:
##           ma1      ma2
##       -0.8527  -0.1473
## s.e.   0.1176   0.1147
## 
## sigma^2 = 14582:  log likelihood = -703.27
## AIC=1412.54   AICc=1412.76   BIC=1420.73
## 
## Training set error measures:
##                     ME    RMSE      MAE      MPE     MAPE      MASE        ACF1
## Training set -2.391877 119.158 84.56665 62.67515 177.2135 0.7197247 -0.03252704
lmtest::coeftest(model1.da) #ma2 tidak signifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.85267    0.11756 -7.2533 4.068e-13 ***
## ma2 -0.14733    0.11468 -1.2847    0.1989    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(2,1,0)

model2.da=Arima(train.diff, order=c(2,1,0),method="ML")
summary(model2.da) #AIC=1445.9
## Series: train.diff 
## ARIMA(2,1,0) 
## 
## Coefficients:
##           ar1      ar2
##       -0.4662  -0.3915
## s.e.   0.0869   0.0890
## 
## sigma^2 = 20301:  log likelihood = -719.95
## AIC=1445.9   AICc=1446.12   BIC=1454.08
## 
## Training set error measures:
##                      ME     RMSE      MAE      MPE     MAPE      MASE
## Training set -0.8701929 140.5959 99.80282 87.25399 270.3644 0.8493958
##                    ACF1
## Training set -0.1349956
lmtest::coeftest(model2.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.46621    0.08693 -5.3630 8.184e-08 ***
## ar2 -0.39153    0.08904 -4.3972 1.097e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(2,1,2)

model3.da=Arima(train.diff, order=c(2,1,2),method="ML")
summary(model3.da) #AIC=1411.04
## Series: train.diff 
## ARIMA(2,1,2) 
## 
## Coefficients:
##          ar1      ar2      ma1     ma2
##       0.2490  -0.2427  -1.1553  0.1554
## s.e.  0.3136   0.0931   0.3197  0.3180
## 
## sigma^2 = 14060:  log likelihood = -700.52
## AIC=1411.04   AICc=1411.61   BIC=1424.68
## 
## Training set error measures:
##                     ME     RMSE      MAE      MPE     MAPE      MASE
## Training set -4.060905 115.9471 81.82385 28.79724 205.3341 0.6963814
##                     ACF1
## Training set -0.01000473
lmtest::coeftest(model3.da) #ar1 dan ma2 tidak signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1  0.248952   0.313602  0.7938 0.4272834    
## ar2 -0.242722   0.093066 -2.6081 0.0091054 ** 
## ma1 -1.155277   0.319698 -3.6136 0.0003019 ***
## ma2  0.155377   0.318035  0.4886 0.6251583    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(1,1,2)

model4.da=Arima(train.diff, order=c(1,1,2),method="ML")
summary(model4.da) #AIC=11412.85 
## Series: train.diff 
## ARIMA(1,1,2) 
## 
## Coefficients:
##           ar1      ma1      ma2
##       -0.5139  -0.3399  -0.6601
## s.e.   0.3805   0.3367   0.3361
## 
## sigma^2 = 14481:  log likelihood = -702.42
## AIC=1412.85   AICc=1413.22   BIC=1423.76
## 
## Training set error measures:
##                     ME     RMSE      MAE      MPE     MAPE      MASE
## Training set -2.857175 118.2081 84.26853 50.49274 189.9772 0.7171875
##                     ACF1
## Training set -0.03986361
lmtest::coeftest(model4.da) #ar1 dan ma1 tidak signifikan
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)  
## ar1 -0.51389    0.38051 -1.3505  0.17684  
## ma1 -0.33986    0.33672 -1.0093  0.31282  
## ma2 -0.66008    0.33610 -1.9639  0.04954 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

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

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 <- model2.da$residuals 
par(mfrow=c(1,1)) 
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 menyebar normal ditandai dengan titik titik yang cenderung mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(2,1,0) juga signifikan pada 3 lag awal yang menandakan tidak 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.49995, 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 2.2e-16 yang kurang dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini tidak 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 = 2.1327, df = 1, p-value = 0.1442

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.1442 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas.

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

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.01034 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan heterogen.

#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.065795, df = 113, p-value = 0.9477
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -27.07307  25.33269
## sample estimates:
##  mean of x 
## -0.8701929

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 sebesar0.9477 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

Overfitting

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

Model ARIMA(3,1,0)

model.overfit1=Arima(train.diff, order=c(3,1,0),method="ML")
summary(model.overfit1) #1433.78
## Series: train.diff 
## ARIMA(3,1,0) 
## 
## Coefficients:
##           ar1      ar2      ar3
##       -0.6019  -0.5479  -0.3553
## s.e.   0.0886   0.0925   0.0912
## 
## sigma^2 = 18018:  log likelihood = -712.89
## AIC=1433.78   AICc=1434.15   BIC=1444.69
## 
## Training set error measures:
##                      ME     RMSE      MAE       MPE     MAPE      MASE
## Training set -0.4254738 131.8556 95.83321 -5.821828 339.1933 0.8156115
##                     ACF1
## Training set -0.09548837
lmtest::coeftest(model.overfit1) #semua parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.601923   0.088641 -6.7906 1.117e-11 ***
## ar2 -0.547886   0.092543 -5.9203 3.213e-09 ***
## ar3 -0.355276   0.091209 -3.8952 9.813e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Model ARIMA(2,1,1)

model.overfit2=Arima(train.diff, order=c(2,1,1),method="ML")
summary(model.overfit2) #1409.25
## Series: train.diff 
## ARIMA(2,1,1) 
## 
## Coefficients:
##          ar1      ar2     ma1
##       0.1018  -0.2293  -1.000
## s.e.  0.0922   0.0927   0.031
## 
## sigma^2 = 13968:  log likelihood = -700.63
## AIC=1409.25   AICc=1409.62   BIC=1420.16
## 
## Training set error measures:
##                    ME     RMSE      MAE      MPE     MAPE      MASE        ACF1
## Training set -3.94285 116.0933 81.96369 27.03611 210.6193 0.6975716 -0.01975933
lmtest::coeftest(model.overfit2) #ar1 tidak signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value Pr(>|z|)    
## ar1  0.101834   0.092195   1.1045  0.26936    
## ar2 -0.229287   0.092734  -2.4725  0.01342 *  
## ma1 -0.999994   0.030988 -32.2699  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

model yang dipilih adalah model awal, yaitu ARIMA(3,1,0) karena memiliki AIC lebih kecil dari ARIMA(2,1,0) dan semua parameter signifikan.

Oleh karena itu, dilakukan lagi Analisis sisaan untuk ARIMA(3,1,0)

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.da1 <- model.overfit1$residuals 
par(mfrow=c(1,1)) 
qqnorm(sisaan.da1) 
qqline(sisaan.da1, col = "blue", lwd = 2) 

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

acf(sisaan.da1) 

pacf(sisaan.da1) 

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(3,1,0) signifikan pada lag ke-4 sehingga sisaan tidak saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

Uji Formal

#1) Sisaan Menyebar Normal 
ks.test(sisaan.da1,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan.da1
## D = 0.54386, 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 2.2e-16 yang lebih kecil 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.da1, type = "Ljung") 
## 
##  Box-Ljung test
## 
## data:  sisaan.da1
## X-squared = 1.0671, df = 1, p-value = 0.3016
#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.3016 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas.

#3) Sisaan homogen
Box.test((sisaan.da1)^2, type = "Ljung") 
## 
##  Box-Ljung test
## 
## data:  (sisaan.da1)^2
## X-squared = 1.3964, df = 1, p-value = 0.2373
#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.2373yang 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.da1, mu = 0, conf.level = 0.95) 
## 
##  One Sample t-test
## 
## data:  sisaan.da1
## t = -0.034302, df = 113, p-value = 0.9727
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -24.99976  24.14881
## sample estimates:
##  mean of x 
## -0.4254738
#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.9727yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

Peramalan

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

#---FORECAST---#
ramalan.da <- forecast::forecast(model.overfit1, h = 31) 
ramalan.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 116       3.803331 -168.2213 175.8279 -259.2856 266.8923
## 117      30.548263 -154.6053 215.7018 -252.6197 313.7162
## 118     -50.681654 -239.4094 138.0461 -339.3158 237.9525
## 119     -70.969946 -266.5682 124.6283 -370.1117 228.1718
## 120     -23.755076 -241.9676 194.4575 -357.4823 309.9722
## 121     -12.200128 -242.1904 217.7901 -363.9399 339.5396
## 122     -37.815728 -274.7724 199.1410 -400.2097 324.5782
## 123     -45.502187 -290.8247 199.8203 -420.6906 329.6862
## 124     -30.946303 -287.9883 226.0957 -424.0582 362.1656
## 125     -26.395928 -293.0037 240.2118 -434.1373 381.3454
## 126     -34.379052 -308.7529 239.9948 -453.9977 385.2396
## 127     -37.238260 -319.6676 245.1911 -469.1767 394.7002
## 128     -32.760036 -323.9905 258.4704 -478.1585 412.6384
## 129     -31.052854 -330.4691 268.3634 -488.9704 426.8647
## 130     -33.518194 -340.4370 273.4006 -502.9100 435.8736
## 131     -34.560593 -348.9408 279.8196 -515.3636 446.2424
## 132     -33.188945 -355.1349 288.7570 -525.5628 459.1849
## 133     -32.567581 -361.8234 296.6883 -536.1209 470.9858
## 134     -33.322762 -369.5861 302.9406 -547.5932 480.9477
## 135     -33.695950 -376.8588 309.4669 -558.5183 491.1264
## 136     -33.278322 -383.2868 316.7302 -568.5701 502.0134
## 137     -33.056940 -389.7607 323.6468 -578.5883 512.4744
## 138     -33.286423 -396.5181 329.9453 -588.8014 522.2285
## 139     -33.417957 -403.0707 336.2348 -598.7531 531.9172
## 140     -33.291705 -409.2806 342.6972 -608.3170 541.7336
## 141     -33.214104 -415.4298 349.0016 -617.7626 551.3344
## 142     -33.283254 -421.6126 355.0460 -627.1817 560.6152
## 143     -33.329002 -427.6790 361.0210 -636.4352 569.7772
## 144     -33.291149 -433.5787 366.9964 -645.4781 578.8958
## 145     -33.264301 -439.4018 372.8732 -654.3980 587.8694
## 146     -33.284948 -445.1852 378.6153 -663.2321 596.6622
data.ramalan.da <- ramalan.da$mean
plot(ramalan.da)

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

pt_1 <- train.ts[115] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
hasil
## Time Series:
## Start = 115 
## End = 146 
## Frequency = 1 
##  [1] 6936.967 6940.770 6971.318 6920.637 6849.667 6825.912 6813.712 6775.896
##  [9] 6730.394 6699.447 6673.051 6638.672 6601.434 6568.674 6537.621 6504.103
## [17] 6469.542 6436.354 6403.786 6370.463 6336.767 6303.489 6270.432 6237.146
## [25] 6203.728 6170.436 6137.222 6103.939 6070.610 6037.318 6004.054 5970.769
#has.1 sama hasilnya dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train.ts,hasil)

perbandingan.da<-matrix(data=c(head(test.ts, n=28), hasil[-1]),
                     nrow = 28, ncol = 2)
## Warning in matrix(data = c(head(test.ts, n = 28), hasil[-1]), nrow = 28, : data
## length [59] is not a sub-multiple or multiple of the number of rows [28]
colnames(perbandingan.da)<-c("Aktual","Hasil Forecast")
perbandingan.da
##         Aktual Hasil Forecast
##  [1,] 7042.937       6940.770
##  [2,] 6794.328       6971.318
##  [3,] 6740.219       6920.637
##  [4,] 6651.905       6849.667
##  [5,] 6886.962       6825.912
##  [6,] 6951.123       6813.712
##  [7,] 7084.655       6775.896
##  [8,] 7129.277       6730.394
##  [9,] 7172.434       6699.447
## [10,] 7135.248       6673.051
## [11,] 7177.179       6638.672
## [12,] 7242.656       6601.434
## [13,] 7168.870       6568.674
## [14,] 7178.583       6537.621
## [15,] 7040.798       6504.103
## [16,] 7026.783       6469.542
## [17,] 6814.530       6436.354
## [18,] 7017.771       6403.786
## [19,] 7056.040       6370.463
## [20,] 7045.527       6336.767
## [21,] 7089.206       6303.489
## [22,] 7082.181       6270.432
## [23,] 7053.150       6237.146
## [24,] 7019.639       6203.728
## [25,] 6715.118       6170.436
## [26,] 6812.193       6137.222
## [27,] 6800.673       6103.939
## [28,] 6835.808       6070.610
accuracy(ts(hasil[-1]), head(test.ts, n=28))
##               ME     RMSE     MAE      MPE     MAPE      ACF1 Theil's U
## Test set 471.449 561.3136 511.104 6.698776 7.288398 0.8761914  4.752978

Dari hasil diperoleh nilai MAPE 7.288398 sangat baik untuk menggambarkan model deret waktu