Lutfi Syahreza Lubis_G1401211003

Packages

library(rmdformats)
library(ggplot2)
library(tsibble)
## 
## Attaching package: 'tsibble'
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, union
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(MASS)
library(forecast)
library(TSA)
## 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)
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)

Importing data

dataset <- readxl::read_excel("Data UTS Fix.xlsx")

##Angka yang didapat = 822
data <- dataset[,2]+822
data <- data$Data

Eksplorasi Data

Plot Data Penuh

data.ts <- ts(data)
plot.ts(data.ts, col = "navyblue", lty=1, xlab="waktu", ylab="y", main="Data Harga Jual Gas Bumi")

Berdasarkan plot data deret waktu di atas, terlihat data cenderung tidak stasioner dalam rataan dan ragam. Data dikatakan stasioner dalam rataan jka menyebar/bergerak di sekitar nilai tengahnya (0) dan dikatakan stasioner dalam ragam ketika memiliki lebar pita yang cenderung sama.

Berdasarkan pola data, pembagian data latih dan data uji ditetapkan dengan proporsi 80% dan 20%.

Plot Data Latih

data.train <- data[1:121]
train.ts <- ts(data.train)
plot.ts(train.ts, col = "navyblue", lty=1, xlab="waktu", ylab="y", main="Plot Data Latih Harga Jual Gas")

Berdasarkan plot data deret waktu pada lata latih, terlihat bahwa data tidak stasioner dalam rataaan dan ragam.

Plot Data Uji

data.test <- data[122:151]
test.ts <- ts(data.test)
plot.ts(test.ts, col = "navyblue", lty=1, xlab="waktu", ylab="y", main="Plot Data Uji Harga Jual Gas Bumi")

Uji Stasioneritas Data

Plot ACF

acf(train.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data menurun tails off slowly. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan.

Uji ADF

tseries::adf.test(train.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train.ts
## Dickey-Fuller = -2.5693, Lag order = 4, p-value = 0.3401
## 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.3401 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.

Plot Box-Cox

index <- seq(1:121)
bc = MASS::boxcox(train.ts~index, lambda = seq(0,4,by=0.5))

#Nilai Rounded Lambda
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] 2.707071
#SK
bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
##  [1] 1.656566 1.696970 1.737374 1.777778 1.818182 1.858586 1.898990 1.939394
##  [9] 1.979798 2.020202 2.060606 2.101010 2.141414 2.181818 2.222222 2.262626
## [17] 2.303030 2.343434 2.383838 2.424242 2.464646 2.505051 2.545455 2.585859
## [25] 2.626263 2.666667 2.707071 2.747475 2.787879 2.828283 2.868687 2.909091
## [33] 2.949495 2.989899 3.030303 3.070707 3.111111 3.151515 3.191919 3.232323
## [41] 3.272727 3.313131 3.353535 3.393939 3.434343 3.474747 3.515152 3.555556
## [49] 3.595960 3.636364 3.676768 3.717172

Plot Boxcox menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 2.707071 dan pada selang kepercayaan 95% nilai memiliki batas bawah 1.656566 dan batas atas 3.717172. 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 Harga Jual Gas Bumi", main="Plot Difference Harga Jual Gas Bumi")

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 = -4.5474, 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 1, sehingga jika plot PACF dianggap tails off, 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 off, maka model tentatifnya adalah ARIMA(1,1,0).

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 x o o o o o  o  o  x 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x o o o o o o x o o o  o  o  o 
## 3 x x o o o o o o o o o  o  o  o 
## 4 x o o o o o o o o o o  o  o  o 
## 5 x o x x x o o o o o o  o  o  o 
## 6 x x x x x o o o o o o  o  o  o 
## 7 x x x x o 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(2,1,1).

Pendugaan Parameter Model Tentatif

ARIMA(0,1,1)

model1.da=Arima(train.diff, order=c(0,1,1),method="ML")
summary(model1.da) #AIC=1429.04
## Series: train.diff 
## ARIMA(0,1,1) 
## 
## Coefficients:
##           ma1
##       -1.0000
## s.e.   0.0226
## 
## sigma^2 = 9005:  log likelihood = -712.52
## AIC=1429.04   AICc=1429.15   BIC=1434.6
## 
## Training set error measures:
##                     ME     RMSE      MAE MPE MAPE      MASE       ACF1
## Training set 0.6409772 94.09819 71.82653 Inf  Inf 0.6201827 -0.1863446
lmtest::coeftest(model1.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -1.000000   0.022606 -44.236 < 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=1482.06
## Series: train.diff 
## ARIMA(1,1,0) 
## 
## Coefficients:
##           ar1
##       -0.5690
## s.e.   0.0759
## 
## sigma^2 = 14588:  log likelihood = -739.03
## AIC=1482.06   AICc=1482.17   BIC=1487.62
## 
## Training set error measures:
##                     ME     RMSE      MAE MPE MAPE      MASE       ACF1
## Training set -1.048552 119.7705 88.72935 Inf  Inf 0.7661292 -0.2486422
lmtest::coeftest(model2.da) #seluruh parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.568970   0.075943 -7.4921 6.779e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA(2,1,1)

model3.da=Arima(train.diff, order=c(2,1,1),method="ML")
summary(model3.da) #AIC=1428.16
## Series: train.diff 
## ARIMA(2,1,1) 
## 
## Coefficients:
##           ar1      ar2      ma1
##       -0.2020  -0.0728  -1.0000
## s.e.   0.0915   0.0926   0.0244
## 
## sigma^2 = 8753:  log likelihood = -710.08
## AIC=1428.16   AICc=1428.51   BIC=1439.28
## 
## Training set error measures:
##                    ME     RMSE     MAE MPE MAPE     MASE        ACF1
## Training set 1.567611 91.98314 70.4669 Inf  Inf 0.608443 0.004616911
lmtest::coeftest(model3.da) # hanya 2 dari 3 parameter signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value Pr(>|z|)    
## ar1 -0.202006   0.091476  -2.2083  0.02722 *  
## ar2 -0.072834   0.092575  -0.7868  0.43142    
## ma1 -1.000000   0.024429 -40.9349  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil dimiliki oleh model ARIMA(2,1,1), namun hanya 2 dari 3 parameter yang sifnifikan.

Selain itu, nilai AIC terkecil kedua dimiliki oleh model ARIMA(0,1,1) dan semua parameter signifikan, namun hanya 2 dari 3 parameter yang sifnifikan. Sehingga model yang dipilih adalah model ARIMA(0,1,1).

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 <- model1.da$residuals 
par(mfrow=c(2,2))
par(mar = c(1, 1, 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 tidak menyebar normal ditandai dengan titik-titik di bagian atas yang cenderung tidak mengikuti garis \(45^{\circ}\).

Kemudian dapat dilihat, lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen.

Plot ACF dan PACF sisaan ARIMA(0,1,1) signifikan pada lag-lag tertentu yang menandakan sisaan tidak saling bebas atau terdapat autokorelasi. Kondisi ini akan diuji lebih lanjut dengan uji formal.

Uji Formal

#1) Sisaan Menyebar Normal 

## Kolmogorov-Smirnov Test
ks.test(sisaan.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan.da
## D = 0.49996, p-value < 2.2e-16
## alternative hypothesis: two-sided
##Jarque Bera Test
library(moments)
## 
## Attaching package: 'moments'
## The following objects are masked from 'package:TSA':
## 
##     kurtosis, skewness
jarque.bera.test(sisaan.da)
## 
##  Jarque Bera Test
## 
## data:  sisaan.da
## X-squared = 36.545, df = 2, p-value = 1.16e-08

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

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan kedua uji 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")
## 
##  Box-Ljung test
## 
## data:  sisaan.da
## X-squared = 4.272, df = 1, p-value = 0.03875

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

#3) Sisaan homogen 
Box.test((sisaan.da)^2, type = "Ljung")
## 
##  Box-Ljung test
## 
## data:  (sisaan.da)^2
## X-squared = 0.18528, df = 1, p-value = 0.6669

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.6669 yang lebih besar 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.07431, df = 119, p-value = 0.9409
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -16.43890  17.72086
## sample estimates:
## mean of x 
## 0.6409772

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.9409 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(0,1,1) untuk melihat apakah terdapat model lain yang lebih baik dari model saat ini. Kandidat model overfitting adalah ARIMA(1,1,1) dan ARIMA(0,1,2).

#---OVERFITTING---#

#ARIMA(1,1,1)
model1a.arma2=Arima(train.ts, order=c(1,1,1),method="ML")
summary(model1a.arma2) #AIC=1435.99
## Series: train.ts 
## ARIMA(1,1,1) 
## 
## Coefficients:
##           ar1      ma1
##       -0.0383  -0.1367
## s.e.   0.3658   0.3566
## 
## sigma^2 = 8913:  log likelihood = -715
## AIC=1435.99   AICc=1436.2   BIC=1444.35
## 
## Training set error measures:
##                     ME    RMSE      MAE        MPE     MAPE      MASE
## Training set -16.08289 93.2322 72.07355 -0.4423285 1.843457 0.9866331
##                     ACF1
## Training set -0.03225292
lmtest::coeftest(model1a.arma2) #tidak ada parameter yang signifikan
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)
## ar1 -0.038279   0.365840 -0.1046   0.9167
## ma1 -0.136668   0.356643 -0.3832   0.7016
#ARIMA(0,1,2)
model1b.arma2=Arima(train.ts, order=c(0,1,2),method="ML")
summary(model1b.arma2) #AIC=1435.98
## Series: train.ts 
## ARIMA(0,1,2) 
## 
## Coefficients:
##           ma1     ma2
##       -0.1781  0.0156
## s.e.   0.0946  0.0981
## 
## sigma^2 = 8912:  log likelihood = -714.99
## AIC=1435.98   AICc=1436.18   BIC=1444.34
## 
## Training set error measures:
##                     ME     RMSE      MAE        MPE    MAPE     MASE
## Training set -15.97931 93.22622 72.04907 -0.4395739 1.84251 0.986298
##                     ACF1
## Training set -0.02952284
lmtest::coeftest(model1b.arma2) #tidak ada parameter yang signifikan dalam taraf nyata 5%
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)  
## ma1 -0.178053   0.094590 -1.8824  0.05979 .
## ma2  0.015571   0.098057  0.1588  0.87383  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#model yang dipilih adalah model awal, yaitu ARIMA(0,1,1)

AIC model awal lebih kecil daripada model overfitting dan semua parameter signifikan, sehingga model yang dipilih adalah model awal, yaitu ARIMA(0,1,1).

Peramalan

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

#---FORECAST---#
ramalan.da <- forecast::forecast(model1.da, h = 31) 
ramalan.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 122      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 123      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 124      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 125      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 126      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 127      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 128      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 129      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 130      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 131      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 132      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 133      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 134      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 135      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 136      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 137      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 138      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 139      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 140      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 141      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 142      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 143      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 144      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 145      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 146      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 147      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 148      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 149      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 150      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 151      -13.53333 -135.6483 108.5816 -200.2921 173.2254
## 152      -13.53333 -135.6483 108.5816 -200.2921 173.2254
data.ramalan.da <- ramalan.da$mean
plot(ramalan.da)

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

pt_1 <- train.ts[121] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1

# Plot data aktual dan hasil forecast
ts.plot(train.ts,hasil, main="Plot Data Aktual dan Data Forecast")

Perbandingan Data Aktual dan Hasil Forecast

perbandingan.da<-matrix(data=c(head(test.ts, n=31), hasil[-1]),
                     nrow = 31, ncol = 2)
## Warning in matrix(data = c(head(test.ts, n = 31), hasil[-1]), nrow = 31, : data
## length [61] is not a sub-multiple or multiple of the number of rows [31]
colnames(perbandingan.da)<-c("Aktual","Hasil Forecast")
perbandingan.da
##         Aktual Hasil Forecast
##  [1,] 3124.000       3150.933
##  [2,] 3094.000       3137.400
##  [3,] 3146.000       3123.867
##  [4,] 3091.000       3110.333
##  [5,] 3121.000       3096.800
##  [6,] 3106.000       3083.267
##  [7,] 3101.000       3069.733
##  [8,] 3148.000       3056.200
##  [9,] 3173.000       3042.667
## [10,] 3157.000       3029.133
## [11,] 3182.000       3015.600
## [12,] 3091.000       3002.067
## [13,] 3097.000       2988.533
## [14,] 3048.000       2975.000
## [15,] 3030.000       2961.467
## [16,] 3013.000       2947.933
## [17,] 2971.000       2934.400
## [18,] 2948.000       2920.867
## [19,] 2974.000       2907.333
## [20,] 3009.000       2893.800
## [21,] 2963.000       2880.267
## [22,] 2911.000       2866.733
## [23,] 2929.000       2853.200
## [24,] 2853.000       2839.667
## [25,] 2806.000       2826.133
## [26,] 2805.000       2812.600
## [27,] 2803.000       2799.067
## [28,] 2838.000       2785.533
## [29,] 2773.000       2772.000
## [30,] 2773.000       2758.467
## [31,] 3164.467       3124.000
accuracy(ts(hasil[-1]), head(test.ts, n=31))
##                ME     RMSE      MAE      MPE     MAPE      ACF1 Theil's U
## Test set 34.36666 61.50921 48.19333 1.114401 1.577966 0.6917659   1.53262

Dari hasil tersebut didapatkan nilai mape 1.58% atau kurang dari 10% sehingga hasil peramalan menggunakan model ARIMA(0,1,1) sudah baik.