Package dan Library
knitr::opts_chunk$set(dev = "png",
dpi = 300,
echo = TRUE,
cache = TRUE)
#Import Library
library(readxl)
library(TTR)
library(forecast)
library(tseries)
library(TSA)
library(dynlm)
library(lmtest)
library(imputeTS)
library(stats)
library(MASS)
library(kableExtra)
library(padr)
library(astsa)
library(tfarima)
library(FinTS)
Model ARIMA
Import Data
dataset <- read_excel("C:/Users/denan/OneDrive/Documents/Kuliah/Kampus/Semester 5/MPDW/Data Inflasi Global.xlsx")
data <- dataset$`Data Inflasi`
Eksplorasi Data
Time Series Plot
#Mengubah data ke dalam bentuk time series
data.ts<-ts(data,frequency=12, start=2012)
#Plot semua data
plot(data.ts,xlab ="Periode", ylab = "Data Inflasi (Persen)", col="black", main = "Plot Deret Waktu Data Inflasi Indonesia")
points(data.ts)
Splitting Data (Data Training dan Testing)
#Splitting Data
data.train <- ts(data[1:96])
data.test <- ts(data[97:130])
#Time Series Data
training.ts<-ts(data.train,frequency=12, start=2012)
testing.ts<-ts(data.test,frequency=12, start=2020)
#Plot Data
par(mfrow=c(2,2))
plot(training.ts, xlab ="Periode", ylab = "Data Inflasi (Persen)", col="red", main = "Plot Data Training")
points(training.ts)
plot(testing.ts, xlab ="Periode", ylab = "Data Inflasi (Persen)", col="red", main = "Plot Data Testing")
points(testing.ts)
## Plot Data Training dan testing Inflasi
ts.plot(data.ts, xlab = "Periode", ylab ="Data Inflasi (Persen)",
main = "Plot Deret Waktu Data Inflasi Indonesia")
lines(training.ts, col = "blue")
lines(testing.ts, col="Red")
legend(2020,9,c("Data Training","Data Testing"),
lty=8, col=c("blue","red"), cex=0.8)
abline(v=2020, col=c("black"), lty=1, lwd=1)
Cek Kestasioneran Data
1. ACF & PACF Plot data inflasi
acf(data.train, lag.max = 24, main = "Plot ACF Data Inflasi")
pacf(data.train, lag.max = 24, main = "Plot PACF Data Inflasi")
tidak stasioner.
2. Uji Formal (ADF-Test)
\(H_{0}\): Data tidak stasioner
\(H_{1}\): Data stasioner
\(\alpha\) = 5% = 0.05
adf.test(data.train)
##
## Augmented Dickey-Fuller Test
##
## data: data.train
## Dickey-Fuller = -2.6984, Lag order = 4, p-value = 0.2879
## alternative hypothesis: stationary
tak tolak \(H_{0}\). Artinya, cukup bukti untuk
mengatakan bahwa data tidak stasioner pada taraf nyata 5%. Untuk
mengatasi ketidakstasioneran tersebut, perlu dilakukan
differencing.
Pemodelan ARIMA
Karena data tidak stasioner, maka akan dilakukan differencing untuk menstasionerkan data.
Differencing 1
stasioner dalam nilai tengah.
data.dif1<-diff(data.train,differences = 1)
plot.ts(ts(data.dif1,start = 2012, frequency = 12),lty=1,xlab = "Periode", ylab= "Data Inflasi Pembedaan 1", main="Plot Differencing Data Inflasi")
Cek Kestasioneran Data Setelah Differencing
Pengujian menggunakan Augmented Dickey-Fuller Test
\(H_{0}\): Data tidak stasioner
\(H_{1}\): Data stasioner
\(\alpha\) = 5% = 0.05
adf.test(data.dif1)
## Warning in adf.test(data.dif1): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data.dif1
## Dickey-Fuller = -4.54, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
tolak H_0.
Artinya, cukup bukti untuk mengatakan bahwa data stasioner
pada taraf nyata 5% setelah dilakukan differencing sebanyak 1
kali.
ACF & PACF Plot, EACF Matrix
acf(data.dif1, lag.max = 24, main = "Plot ACF Data Inflasi Setelah Differencing satu kali")
pacf(data.dif1, lag.max = 24, main = "Plot PACF Data Inflasi Setelah Differencing satu kali")
eacf(data.dif1)
## 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 x o o
## 1 x x o o o o o o o o o x o o
## 2 o o o o o o o o o o o x o o
## 3 x o o o o o o o o o o x o o
## 4 x o o o o o o o o o o x o o
## 5 x x x o o o o o o o o x o o
## 6 x x x o o o o o o o o x o o
## 7 x o x o o o o o o o o x o o
Dari Matriks EACF Data Inflasi dapat diduga model yang cocok adalah model :
ARIMA(0,1,2)
ARIMA (0,1,3)
ARIMA (1,1,2)
ARIMA (3,1,1)
ARIMA (3,1,2)
Pemodelan ARIMA Data Inflasi
Identifikasi Model Tentatif
ARIMA(0,1,1), dengan orde p = 0, d = 1, dan q = 1
ARIMA(2,1,0), dengan orde p = 2, d = 1, dan q = 0
ARIMA(0,1,2), dengan orde p = 0, d = 1, dan q = 2
ARIMA(0,1,3), dengan orde p = 0, d = 1, dan q = 3
ARIMA(1,1,2), dengan orde p = 1, d = 1, dan q = 2
ARIMA(3,1,1), dengan orde p = 3, d = 1, dan q = 1
ARIMA(3,1,2), dengan orde p = 3, d = 1, dan q = 2
model1 <- Arima(data.dif1, order=c(0,0,1), method="ML")
model2 <- Arima(data.dif1, order=c(2,0,0), method="ML")
model3 <- Arima(data.dif1, order=c(0,0,2), method="ML")
model4 <- Arima(data.dif1, order=c(0,0,3), method="ML")
model5 <- Arima(data.dif1, order=c(1,0,2), method="ML")
model6 <- Arima(data.dif1, order=c(3,0,1), method="ML")
model7 <- Arima(data.dif1, order=c(3,0,2), method="ML")
Pendugaan Parameter Model
ARIMA(0,1,1)
summary(model1)
## Series: data.dif1
## ARIMA(0,0,1) with non-zero mean
##
## Coefficients:
## ma1 mean
## 0.3490 -0.0113
## s.e. 0.1007 0.0790
##
## sigma^2 = 0.3345: log likelihood = -81.83
## AIC=169.66 AICc=169.93 BIC=177.32
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.0004262922 0.5722137 0.3513354 -Inf Inf 0.7426473 -0.03000317
lmtest::coeftest((model1))
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.348971 0.100691 3.4658 0.0005287 ***
## intercept -0.011280 0.078982 -0.1428 0.8864335
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diperoleh persamaan pada model:
ARIMA(2,1,0)
summary(model2)
## Series: data.dif1
## ARIMA(2,0,0) with non-zero mean
##
## Coefficients:
## ar1 ar2 mean
## 0.3020 -0.2419 -0.0108
## s.e. 0.0992 0.0987 0.0617
##
## sigma^2 = 0.3288: log likelihood = -80.53
## AIC=169.05 AICc=169.5 BIC=179.27
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.0009839349 0.5642494 0.3459638 Inf Inf 0.731293 -0.0004607976
lmtest::coeftest((model2))
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.302001 0.099202 3.0443 0.002332 **
## ar2 -0.241863 0.098727 -2.4498 0.014293 *
## intercept -0.010841 0.061723 -0.1756 0.860574
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diperoleh persamaan pada model:
ARIMA(0,1,2)
summary(model3)
## Series: data.dif1
## ARIMA(0,0,2) with non-zero mean
##
## Coefficients:
## ma1 ma2 mean
## 0.2843 -0.1095 -0.0106
## s.e. 0.1103 0.1086 0.0686
##
## sigma^2 = 0.3346: log likelihood = -81.33
## AIC=170.66 AICc=171.11 BIC=180.88
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.0003472967 0.5692085 0.3471446 Inf Inf 0.7337888 0.01808154
lmtest::coeftest((model3))
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.284312 0.110346 2.5765 0.00998 **
## ma2 -0.109462 0.108619 -1.0078 0.31357
## intercept -0.010646 0.068573 -0.1552 0.87663
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diperoleh persamaan pada model:
ARIMA(0,1,3)
summary(model4)
## Series: data.dif1
## ARIMA(0,0,3) with non-zero mean
##
## Coefficients:
## ma1 ma2 ma3 mean
## 0.3030 -0.1566 -0.1372 -0.0110
## s.e. 0.1023 0.1045 0.0994 0.0586
##
## sigma^2 = 0.3315: log likelihood = -80.41
## AIC=170.81 AICc=171.49 BIC=183.58
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.001378825 0.5634979 0.3481822 Inf Inf 0.7359821 0.0006102943
lmtest::coeftest((model4))
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.302963 0.102343 2.9603 0.003074 **
## ma2 -0.156631 0.104480 -1.4991 0.133836
## ma3 -0.137235 0.099393 -1.3807 0.167362
## intercept -0.010982 0.058600 -0.1874 0.851346
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diperoleh persamaan pada model:
ARIMA(1,1,2)
summary(model5)
## Series: data.dif1
## ARIMA(1,0,2) with non-zero mean
##
## Coefficients:
## ar1 ma1 ma2 mean
## 0.8800 -0.6099 -0.3901 -0.0282
## s.e. 0.0599 0.1043 0.0995 0.0194
##
## sigma^2 = 0.3221: log likelihood = -79.98
## AIC=169.95 AICc=170.63 BIC=182.72
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.04241606 0.5554849 0.3527581 Inf Inf 0.7456547 -0.01252043
lmtest::coeftest((model5))
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.879966 0.059945 14.6796 < 2.2e-16 ***
## ma1 -0.609942 0.104278 -5.8492 4.939e-09 ***
## ma2 -0.390054 0.099526 -3.9191 8.887e-05 ***
## intercept -0.028221 0.019389 -1.4555 0.1455
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diperoleh persamaan pada model:
ARIMA(3,1,1)
summary(model6)
## Series: data.dif1
## ARIMA(3,0,1) with non-zero mean
##
## Coefficients:
## Warning in sqrt(diag(x$var.coef)): NaNs produced
## ar1 ar2 ar3 ma1 mean
## 0.1284 -0.1871 -0.0517 0.171 -0.0109
## s.e. NaN NaN NaN NaN 0.0612
##
## sigma^2 = 0.336: log likelihood = -80.52
## AIC=173.04 AICc=173.99 BIC=188.36
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.001047293 0.5642167 0.3458751 Inf Inf 0.7311055 0.001935606
lmtest::coeftest((model6))
## Warning in sqrt(diag(se)): NaNs produced
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.128449 NaN NaN NaN
## ar2 -0.187099 NaN NaN NaN
## ar3 -0.051727 NaN NaN NaN
## ma1 0.170953 NaN NaN NaN
## intercept -0.010853 0.061186 -0.1774 0.8592
Diperoleh persamaan pada model:
ARIMA(3,1,2)
summary(model7)
## Series: data.dif1
## ARIMA(3,0,2) with non-zero mean
##
## Coefficients:
## Warning in sqrt(diag(x$var.coef)): NaNs produced
## ar1 ar2 ar3 ma1 ma2 mean
## 0.1672 -0.1532 -0.0571 0.1311 -0.0464 -0.0108
## s.e. NaN NaN NaN NaN 0.1879 0.0604
##
## sigma^2 = 0.3397: log likelihood = -80.51
## AIC=175.02 AICc=176.31 BIC=192.9
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.001129378 0.5641619 0.3463942 Inf Inf 0.7322027 0.002545374
lmtest::coeftest((model7))
## Warning in sqrt(diag(se)): NaNs produced
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.167204 NaN NaN NaN
## ar2 -0.153203 NaN NaN NaN
## ar3 -0.057106 NaN NaN NaN
## ma1 0.131094 NaN NaN NaN
## ma2 -0.046401 0.187872 -0.2470 0.8049
## intercept -0.010843 0.060359 -0.1796 0.8574
Diperoleh persamaan pada model:
Perbandingan Kebaikan Model Tentatif
#AIC ARIMA dan Signifikansi Parameter
modelaccuracy<-data.frame(
"Model"=c("ARIMA(0,1,1)", "ARIMA(2,1,0)", "ARIMA(0,1,2)", "ARIMA(0,1,3)","ARIMA(1,1,2)", "ARIMA(3,1,1)", "ARIMA(3,1,2)"),
"AIC"=c(model1$aic, model2$aic, model3$aic,model4$aic,model5$aic,model6$aic,model7$aic),
"BIC"=c(model1$bic, model2$bic, model3$bic,model4$bic,model5$bic,model6$bic,model7$bic),
"Signifikansi"=c("Signifikan","Signifikan","Tidak Signifikan","Tidak Signifikan","Signifikan","Tidak Signifikan","Tidak Signifikan"))
modelaccuracy
## Model AIC BIC Signifikansi
## 1 ARIMA(0,1,1) 169.6621 177.3237 Signifikan
## 2 ARIMA(2,1,0) 169.0506 179.2661 Signifikan
## 3 ARIMA(0,1,2) 170.6633 180.8788 Tidak Signifikan
## 4 ARIMA(0,1,3) 170.8122 183.5816 Tidak Signifikan
## 5 ARIMA(1,1,2) 169.9512 182.7206 Signifikan
## 6 ARIMA(3,1,1) 173.0399 188.3632 Tidak Signifikan
## 7 ARIMA(3,1,2) 175.0214 192.8985 Tidak Signifikan
kable(modelaccuracy)
| Model | AIC | BIC | Signifikansi |
|---|---|---|---|
| ARIMA(0,1,1) | 169.6621 | 177.3237 | Signifikan |
| ARIMA(2,1,0) | 169.0506 | 179.2661 | Signifikan |
| ARIMA(0,1,2) | 170.6633 | 180.8788 | Tidak Signifikan |
| ARIMA(0,1,3) | 170.8122 | 183.5816 | Tidak Signifikan |
| ARIMA(1,1,2) | 169.9512 | 182.7206 | Signifikan |
| ARIMA(3,1,1) | 173.0399 | 188.3632 | Tidak Signifikan |
| ARIMA(3,1,2) | 175.0214 | 192.8985 | Tidak Signifikan |
Diagnostik Model
Overfitting
model2b <- Arima(data.dif1, order=c(3,0,0), method="ML")
model2c <- Arima(data.dif1, order=c(2,0,1), method = "ML")
ARIMA(3,1,0)
coeftest(model2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.302001 0.099202 3.0443 0.002332 **
## ar2 -0.241863 0.098727 -2.4498 0.014293 *
## intercept -0.010841 0.061723 -0.1756 0.860574
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(model2b)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.298835 0.102398 2.9184 0.003519 **
## ar2 -0.238035 0.103396 -2.3022 0.021326 *
## ar3 -0.012674 0.101811 -0.1245 0.900928
## intercept -0.010852 0.060960 -0.1780 0.858708
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(model2c)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.360282 0.440854 0.8172 0.41379
## ar2 -0.256001 0.139298 -1.8378 0.06609 .
## ma1 -0.062070 0.459190 -0.1352 0.89248
## intercept -0.010854 0.060766 -0.1786 0.85824
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Karena parameter \(\phi _3\) atau ar3 tidak berbeda secara signifikan dari angka nol, dan
karena parameter \(\phi _1\) atau ar1 dan parameter \(\phi _2\) atau ar2 pada model ARIMA(3,1,0) tidak berubah secara signifikan dari parameter \(\phi _1\) atau ar1 dan parameter \(\phi _2\) atau ar2 pada model ARIMA(2,1,0), selain itu diperoleh bahwa model ARIMAX(2,1,1) tidak signifikan pada semua parameter dan nilai AIC lebih besar daripada ARIMAX(2,1,0).
Maka model ARIMA(2,1,0) tidak terjadi overfitting atau merupakan model yang baik untuk digunakan. (Cryer dan Chan. 2008)Uji Diagnostik
Diagnostik Model: Eksploratif
sisaan2 <- model2$residuals
par(mfrow=c(2,2))
qqnorm(sisaan2)
box(col="black",lwd=2)
qqline(sisaan2, col = "red", lwd =1, col.lab="black",
col.axis="black",col.sub = "black")
box(col="black",lwd=2)
plot(c(1:length(sisaan2)),sisaan2,col="black",col.lab="black",col.axis="black")
box(col="black",lwd=2)
acf(sisaan2,col="black",col.sub = "black",col.axis="black", col.lab="black")
box(col="black",lwd=2)
pacf(sisaan2,col="black",col.sub = "black",col.axis="black", col.lab="black",col.main="black")
box(col="black",lwd=2)
Diagnostik Model: Uji Formal
1. Sisaan Menyebar Normal
Uji formal ini dilakukan dengan Shapiro-Wilk test.
Hipotesis yang diuji:
\(H_{0}\): Sisaan menyebar normal
\(H_{1}\): Sisaan tidak menyebar normal
\(\alpha\) = 5% = 0.05
shapiro.test(sisaan2)
##
## Shapiro-Wilk normality test
##
## data: sisaan2
## W = 0.85335, p-value = 2.943e-08
tolak \(H_{0}\). Artinya, tidak cukup bukti untuk
menyatakan bahwa sisaan menyebar normal pada taraf nyata 5%.
2. Sisaan Saling Bebas
Uji formal ini dilakukan dengan LJung-Box test.
Hipotesis yang diuji:
\(H_0\): Sisaan antara lag saling bebas
\(H_1\): Sisaan antara lag tidak saling bebas
\(\alpha\) = 5% = 0.05
Box.test(sisaan2, type = "Ljung")
##
## Box-Ljung test
##
## data: sisaan2
## X-squared = 2.0816e-05, df = 1, p-value = 0.9964
tak tolak \(H_0\).
Artinya, cukup bukti untuk menyatakan bahwa sisaan antara lag saling
bebas atau dapat dikatakan tidak ada autokorelasi antara sisaan lag pada
taraf nyata 5%.
3. Nilai Tengah Sisaan Sama dengan Nol
Uji formal ini dilakukan dengan t test.
Hipotesis yang diuji:
\(H_0\): Nilai tengah sisaan sama dengan nol
\(H_1\): Nilai tengah sisaan tidak sama dengan nol
\(\alpha\) = 5% = 0.05
t.test(sisaan2, mu = 0, conf.level = 0.95)
##
## One Sample t-test
##
## data: sisaan2
## t = 0.016907, df = 94, p-value = 0.9865
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.1145691 0.1165370
## sample estimates:
## mean of x
## 0.0009839349
tak tolak \(H_0\).
Artinya, cukup bukti untuk menyatakan bahwa nilai tengah sisaan sama
dengan nol pada taraf nyata 5%.
4. Uji Kehomogenan Ragam Sisaan
Breusch-Pagan Test
\(H_0\): ragam sisaan homogen
\(H_1\): ragam sisaan tidak homogen
ArchTest(sisaan2)
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: sisaan2
## Chi-squared = 16.343, df = 12, p-value = 0.176
tak tolak \(H_0\).
Artinya, cukup bukti untuk menyatakan bahwa ragam sisaan homogen pada
taraf nyata 5%.
Forecasting
ramalan <- forecast(Arima(data.train, order=c(2,1,0),method="ML",include.drift = TRUE),h = length(data.test))
data.ramalan <- ramalan$mean
data.ramalan.ts <- ts(data.ramalan, start = 2020, frequency = 12)
plot(ramalan,col="black",col.sub ="black",col.axis="black",
col.lab="black",col.main="black",lwd=2)
box(col="black",lwd=2)
ts.plot(data.ts,xlab = "Periode", ylab = "Data Inflasi(Persen)", col="black",lwd=2,main="Forecasting ARIMA(2,1,0)",gpars = list(col.main="black",col.axis="black",col.sub="black"))
lines(data.ramalan.ts, col = "blue",lwd=2)
lines(testing.ts, col = "red", lwd =2)
legend(2018,9,c("Data Training", "Data Testing","Data Forecast ARIMA"),
lwd=2, col=c("black","red","blue"), cex=0.8)
box(col="black",lwd=2)
perbandingan.temp<-matrix(data=c(data.test[1:10], data.ramalan[1:10]), nrow = 10, ncol = 2)
colnames(perbandingan.temp)<-c("Aktual","Hasil Forecast")
head(perbandingan.temp)
## Aktual Hasil Forecast
## [1,] 2.68 2.656693
## [2,] 2.98 2.695106
## [3,] 2.96 2.711829
## [4,] 2.67 2.697400
## [5,] 2.19 2.678808
## [6,] 1.96 2.666494
error <- data.frame(data.test)-data.frame(data.ramalan[1:34])
## SSE (Sum Square Error)
SSE <- sum(error^2, na.rm = T)
## MSE (Mean Squared Error)
MSE<- sapply(error^2, mean, na.rm = T)
## RMSE (Root Mean Square Error)
RMSE <- sqrt(MSE)
## MAD (Mean Absolute Deviation)
MAD <- sapply(abs(error), mean, na.rm = T)
## MAPE (Mean Absolute Percentage Error)
r.error <- (error/data.frame(data.test))*100 # Relative Error
MAPE <- sapply(abs(r.error), mean, na.rm = T)
akurasifarima <- data.frame(
"Ukuran Keakuratan" = c("SSE", "MSE", "MAPE", "RMSE", "MAD"),
"Forecasting" = c(SSE, MSE, MAPE, RMSE, MAD))
akurasifarima
## Ukuran.Keakuratan Forecasting
## 1 SSE 62.598323
## 2 MSE 1.841127
## 3 MAPE 49.245009
## 4 RMSE 1.356881
## 5 MAD 1.088177
kable(akurasifarima)
| Ukuran.Keakuratan | Forecasting |
|---|---|
| SSE | 62.598323 |
| MSE | 1.841127 |
| MAPE | 49.245009 |
| RMSE | 1.356881 |
| MAD | 1.088177 |
Model ARIMAX
Karena model yang dihasilkan oleh metode peramalan ARIMA kurang menghasilkan model yang tepat, maka digunakan suatu metode ARIMA dengan variabel X atau biasa disebut dengan ARIMAX. Metode ini mengambil peubah-peubah yang memiliki pengaruh signifikan terhadap data inflasi di Indonesia dan ditambahkan ke dalam pemodelan deret waktu ARIMAX untuk meningkatkan nilai akurasi.(Newton et al 2020) Peubah-peubah tersebut adalah data inflasi global (X1), data nilai impor minyak gas (X2), dan data nilai kurs jual USD (X3). Ketiga peubah tersebut diduga memiliki pengaruh terhadap inflasi di Indonesia. (Kuntiarti 2018)
Import Data Variabel X
dataGlobal <- dataset$`Global Inflation`
dataImpor <- dataset$Import
dataKurs1 <- dataset$Price
# Ubah urutan dari bawah ke atas
dataKurs1 <- as.data.frame(t(rev(as.data.frame(t(dataKurs1)))))
dataKurs <- as.numeric(dataKurs1$V1)
Format Time Series
dataGlobal.ts <- ts(dataGlobal,frequency=12,start=2012)
dataImpor.ts <- ts(dataImpor, frequency = 12, start = 2012)
dataKurs.ts <- ts(dataKurs, frequency = 12, start = 2012)
Tahapan Pemodelan ARIMAX
Tahapan pemodelan ARIMAX adalah sebagai berikut:
Eksplorasi data
Pembentukan model regresi
Pemodelan sisaan wt menggunakan ARIMA
Pembentukan model ARIMAX
Evaluasi kebaikan model ARIMAX
Eksplorasi Data
Time Series Plot
plot(dataGlobal.ts,xlab ="Periode", ylab = "Data Inflasi Global(Persen)", col="black", main = "Plot Data Inflasi Global (Persen)")
points(dataGlobal.ts)
plot(dataImpor.ts,xlab ="Periode", ylab = "Nilai Impor Migas", col="black", main = "Plot Data Deret Waktu Data Nilai Impor Migas")
points(dataImpor.ts)
plot(dataKurs.ts,xlab ="Periode", ylab = "Nilai Jual Kurs USD", col="black", main = "Plot Data Deret Waktu Data Nilai Jual Kurs USD")
points(dataKurs.ts)
Splitting Data
#Splitting Data
dataGlobal.train <- ts(dataGlobal[1:96])
dataGlobal.test <- ts(dataGlobal[97:130])
dataImpor.train <- ts(dataImpor[1:96])
dataImpor.test <- ts(dataImpor[97:130])
dataKurs.train <- ts(dataKurs[1:96])
dataKurs.test <- ts(dataKurs[97:130])
#Time Series Data
Globaltraining.ts<-ts(dataGlobal.train,frequency=12, start=2012)
Globaltesting.ts<-ts(dataGlobal.test,frequency=12, start=2020)
Importraining.ts <- ts(dataImpor.train,frequency=12, start=2012)
Importesting.ts <-ts(dataImpor.test,frequency=12, start=2020)
Kurstraining.ts <- ts(dataKurs.train,frequency=12, start=2012)
Kurstesting.ts <-ts(dataKurs.test,frequency=12, start=2020)
Plot Time Series Variabel X
#Plot Data
par(mfrow = c(3,2))
plot(Globaltraining.ts,xlab = "Periode", ylab = "Data Inflasi Global(Persen)", col="black", main = "Data Training Inflasi Global")
points(Globaltraining.ts)
plot(Globaltesting.ts,xlab ="Periode", ylab = "Data Inflasi Global(Persen)", col="black", main = "Data Testing Inflasi Global")
points(Globaltesting.ts)
plot(Importraining.ts,xlab ="Periode", ylab = "Nilai Impor Migas", col="black", main = "Data Training Nilai impor migas")
points(Importraining.ts)
plot(Importesting.ts,xlab ="Periode", ylab = "Nilai Impor Migas", col="black", main = "Testing Data Nilai Impor Migas")
points(Importesting.ts)
plot(Kurstraining.ts,xlab ="Periode", ylab = "Nilai Jual Kurs USD", col="black", main = "Training Kurs USD")
points(Kurstraining.ts)
plot(Kurstesting.ts,xlab ="Periode", ylab = "Nilai Jual Kurs USD", col="black", main = "Testing Kurs USD")
points(Kurstesting.ts)
## Plot Data Training dan testing Inflasi Global
ts.plot(dataGlobal.ts, xlab = "Periode", ylab ="Data Inflasi Global (Persen)",
main = "Plot Data Training dan Data Testing")
lines(Globaltraining.ts, col = "blue")
lines(Globaltesting.ts, col="Red")
legend("bottomright",c("Data Training","Data Testing"),
lty=8, col=c("blue","red"), cex=0.8)
abline(v=2020, col=c("green"), lty=1, lwd=1)
## Plot Data Training dan testing Nilai Impor Migas
ts.plot(dataImpor.ts, xlab = "Periode", ylab ="Data Nilai Impor Migas",
main = "Plot Data Training dan Data Testing")
lines(Importraining.ts, col = "blue")
lines(Importesting.ts, col="Red")
legend("bottomright",c("Data Training","Data Testing"),
lty=8, col=c("blue","red"), cex=0.8)
abline(v=2020, col=c("green"), lty=1, lwd=1)
## Plot Data Training dan testing Nilai Jual Kurs USD
ts.plot(dataKurs.ts, xlab = "Periode", ylab ="Data Nilai Jual Kurs USD",
main = "Plot Data Training dan Data Testing")
lines(Kurstraining.ts, col = "blue")
lines(Kurstesting.ts, col="Red")
legend("topright",c("Data Training","Data Testing"),
lty=8, col=c("blue","red"), cex=0.8)
abline(v=2020, col=c("green"), lty=1, lwd=1)
Korelasi Data
Korelasi Antar Variabel Bebas
korelasix <- c("Inflasi Global vs Nilai Impor" = cor(dataGlobal, dataImpor),"Nilai Impor vs Kurs Jual USD" =cor(dataImpor, dataKurs),"Inflasi Global vs Kurs Jual USD" =cor(dataGlobal, dataKurs))
korx <- data.frame("Nilai Korelasi" = korelasix)
kable(korx)
| Nilai.Korelasi | |
|---|---|
| Inflasi Global vs Nilai Impor | 0.3116337 |
| Nilai Impor vs Kurs Jual USD | -0.5993230 |
| Inflasi Global vs Kurs Jual USD | 0.2981848 |
Karena tidak ada variabel x yang memiliki korelasi yang kuat antara variabel x yang lain, maka dapat disimpulkan bahwa tidak ada variabel x yang bersifat multikolinearitas.
Korelasi Antar Data Testing
korelasitest <- c("Inflasi vs Inflasi Global" = cor(data.test, dataGlobal.test), "Inflasi vs Nilai Impor" =cor(data.test, dataImpor.test),"Inflasi vs Nilai Kurs Jual USD" =cor(data.test, dataKurs.test))
kort <- data.frame("Nilai Korelasi" = korelasitest)
kable(kort)
| Nilai.Korelasi | |
|---|---|
| Inflasi vs Inflasi Global | 0.5655008 |
| Inflasi vs Nilai Impor | 0.6749067 |
| Inflasi vs Nilai Kurs Jual USD | 0.5561514 |
Karena nilai korelasi antara data testing data inflasi global(Persen), nilai impor migas, dan nilai kurs jual USD dengan data testing inflasi secara berturut-turut sebesar 0.5655008, 0.6749067, dan 0.5561514 maka data testingdata inflasi global (Persen), nilai impor migas, dan nilai kurs jual USD dengan data testing inflasi memiliki korelasi positif kuat. Hal ini mengindikasikan bahwa ketiga variabel tersebut memiliki hubungan yang dapat meningkatkan keakuratan peramalan dengan metode ARIMAX
Korelasi Antar Data Testing Variabel Bebas
korelasitest <- c("Global vs Impor" = cor(dataGlobal.test, dataImpor.test),"Impor vs Kurs" =cor(dataImpor.test, dataKurs.test),"Global vs Kurs" =cor(dataGlobal.test, dataKurs.test))
kort <- data.frame("Nilai Korelasi" = korelasitest)
kable(kort)
| Nilai.Korelasi | |
|---|---|
| Global vs Impor | 0.9229091 |
| Impor vs Kurs | 0.2115825 |
| Global vs Kurs | 0.1439594 |
Pola pada data testing data inflasi global dengan data nilai impor migas memiliki hubungan positif yang kuat. Hal ini mengindikasikan bahwa data inflasi global dengan nilai impor migas pada Januari tahun 2020 hingga Oktober tahun 2022 memiliki faktor-faktor pengaruh yang sama.
Pembentukan Model Regresi
Mendefinisikan Variabel Bebas
X1 = dataGlobal
X2 = dataImpor
X3 = dataKurs
y <- data
reg2 <- lm(y~X1+X2+X3)
Metode Best Subset Regression
library(olsrr)
bs.hc <- ols_step_best_subset(reg2)
bs.hc
## Best Subsets Regression
## -----------------------
## Model Index Predictors
## -----------------------
## 1 X2
## 2 X1 X2
## 3 X1 X2 X3
## -----------------------
##
## Subsets Regression Summary
## ----------------------------------------------------------------------------------------------------------------------------------
## Adj. Pred
## Model R-Square R-Square R-Square C(p) AIC SBIC SBC MSEP FPE HSP APC
## ----------------------------------------------------------------------------------------------------------------------------------
## 1 0.3071 0.3017 0.2862 83.1716 497.9554 127.2309 506.5580 340.1667 2.6569 0.0206 0.7145
## 2 0.5482 0.5411 0.5223 12.3919 444.3645 75.1549 455.8346 223.5687 1.7593 0.0136 0.4731
## 3 0.5826 0.5727 0.5526 4.0000 436.0619 67.3899 450.3996 208.1869 1.6505 0.0128 0.4439
## ----------------------------------------------------------------------------------------------------------------------------------
## AIC: Akaike Information Criteria
## SBIC: Sawa's Bayesian Information Criteria
## SBC: Schwarz Bayesian Criteria
## MSEP: Estimated error of prediction, assuming multivariate normality
## FPE: Final Prediction Error
## HSP: Hocking's Sp
## APC: Amemiya Prediction Criteria
Model terbaik yang dipilih adalah model dengan tiga variabel, yaitu Data Inflasi Global(Persen), Nilai impor migas, dan Nilai Kurs Jual (USD). Hal tersebut dapat dilihat dari:
CP Mallows dan AIC terendah
R-Square terbesar
reg1 <- lm(data~0+X1+X2+X3)
summary(reg1)
##
## Call:
## lm(formula = data ~ 0 + X1 + X2 + X3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.4436 -1.0058 -0.2693 1.0162 3.1791
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## X1 -5.229e-01 5.772e-02 -9.059 2.00e-15 ***
## X2 1.566e-03 1.006e-04 15.566 < 2e-16 ***
## X3 1.111e-04 2.021e-05 5.497 2.03e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.284 on 127 degrees of freedom
## Multiple R-squared: 0.9218, Adjusted R-squared: 0.9199
## F-statistic: 498.7 on 3 and 127 DF, p-value: < 2.2e-16
Diperoleh persamaan regresinya sebagai berikut
summary(reg2)
##
## Call:
## lm(formula = y ~ X1 + X2 + X3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.6514 -0.9502 -0.1336 1.0686 2.9386
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.6030779 1.6419370 -2.194 0.03004 *
## X1 -0.6187629 0.0717186 -8.628 2.29e-14 ***
## X2 0.0019239 0.0001907 10.090 < 2e-16 ***
## X3 0.0003348 0.0001038 3.224 0.00161 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.265 on 126 degrees of freedom
## Multiple R-squared: 0.5826, Adjusted R-squared: 0.5727
## F-statistic: 58.63 on 3 and 126 DF, p-value: < 2.2e-16
Diperoleh persamaan regresinya sebagai berikut
Data Inflasi = -3.6030779 - 0.6187629 x (Data Inflasi Global(Persen)) + 0.0019239 x (Nilai impor migas) + 0.0003348 x (Nilai Jual Kurs USD)
\(\beta_0\) dimasukkan karena berpengaruh signifikansisaanx <- reg2$residuals
par(mfrow=c(2,2))
qqnorm(sisaanx)
box(col="black",lwd=2)
qqline(sisaanx, col = "red", lwd =1, col.lab="black",
col.axis="black",col.sub = "black")
box(col="black",lwd=2)
plot(c(1:length(sisaanx)),sisaanx,col="black",col.lab="black",col.axis="black")
box(col="black",lwd=2)
acf(sisaanx,col="black",col.sub = "black",col.axis="black", col.lab="black")
box(col="black",lwd=2)
pacf(sisaanx,col="black",col.sub = "black",col.axis="black", col.lab="black",col.main="black")
box(col="black",lwd=2)
## Pengujian White Noise Regressi
\(H_0\) : \(\rho_1\) = \(\rho_2\) = …. = \(\rho_k\) = 0 untuk k = 1, 2, …, n (Sisaan saling bebas atau sisaan white noise)
\(H_1\) : minimal ada satu \(\rho_k\) ≠ 0 , untuk k = 1, 2, …, n (Sisaan tidak saling bebas atau sisaan tidak terjadi white noise)
Box.test(sisaanx, lag = 12)
##
## Box-Pierce test
##
## data: sisaanx
## X-squared = 183.34, df = 12, p-value < 2.2e-16
Box.test(sisaanx, lag = 24)
##
## Box-Pierce test
##
## data: sisaanx
## X-squared = 206.12, df = 24, p-value < 2.2e-16
Box.test(sisaanx, lag = 36)
##
## Box-Pierce test
##
## data: sisaanx
## X-squared = 239.63, df = 36, p-value < 2.2e-16
Box.test(sisaanx, lag = 48)
##
## Box-Pierce test
##
## data: sisaanx
## X-squared = 289.73, df = 48, p-value < 2.2e-16
tolak \(H_0\). Artinya, cukup bukti untuk
menyatakan bahwa sisaan antara lag tidak saling bebas atau sisaan tidak
terjadi white noise pada taraf nyata 5%.
Pemodelan sisaan model regresi menggunakan ARIMA
Cek Kestasioneran Data
1. Plot ACF dan PACF
acf(sisaanx, lag.max = 24, main = "Plot ACF Sisaan Regresi")
pacf(sisaanx, lag.max = 24, main = "Plot PACF Sisaan Regresi")
tidak stasioner.
Perlu dilakukan uji formal untuk mengambil kesimpulan kestasioneran data
2. Uji Formal (ADF-Test)
\(H_{0}\): Nilai tengah sisaan tidak stasioner
\(H_{1}\): Nilai tengah sisaan stasioner
\(\alpha\) = 5% = 0.05
adf.test(sisaanx)
##
## Augmented Dickey-Fuller Test
##
## data: sisaanx
## Dickey-Fuller = -2.5635, Lag order = 5, p-value = 0.3422
## alternative hypothesis: stationary
tak tolak \(H_{0}\). Artinya, tidak cukup bukti untuk
mengatakan bahwa sisaan stasioner pada taraf nyata 5%. Sehingga, perlu
dilakukan differencing sebelum melakukan penentuan model tentatif
Differencing 1
sisaan.dif <- diff(sisaanx, difference = 1)
Uji Formal (ADF-Test)
Pengujian menggunakan Augmented Dickey-Fuller Test
\(H_{0}\): Nilai tengah sisaan tidak stasioner
\(H_{1}\): Nilai tengah sisaan stasioner
\(\alpha\) = 5% = 0.05
adf.test(sisaan.dif)
## Warning in adf.test(sisaan.dif): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: sisaan.dif
## Dickey-Fuller = -5.7088, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
tolak H_0.
Artinya, cukup bukti untuk mengatakan bahwa sisaan
stasioner pada taraf nyata 5% setelah dilakukan
differencing sebanyak 1 kali.
ACF & PACF Plot, EACF Matrix Setelah Differencing
acf(sisaan.dif, lag.max = 24, main = "Plot ACF Sisaan Setelah Differencing satu kali")
pacf(sisaan.dif, lag.max = 24, main = "Plot PACF Sisaan Setelah Differencing satu kali")
eacf(sisaan.dif)
## AR/MA
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o x o o o o o o
## 1 x x o o o o o x o o o o o o
## 2 x x o o o o o o o x o o o o
## 3 x x x 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 o o o x o o o o o o o o o
## 6 x o x x x o o o o o o o o o
## 7 x x o o x o o o o o o o o o
Dari Matriks EACF dapat diduga model yang cocok adalah model :
ARIMAX(0,1,1)
ARIMAX(1,1,2)
ARIMAX(2,1,1)
ARIMAX(3,1,1)
Identifikasi Model Tentatif
ARIMAX(0,1,2), dengan orde p = 0, d = 1, dan q = 2
ARIMAX(2,1,0), dengan orde p = 2, d = 1, dan q = 0
ARIMAX(0,1,3), dengan orde p = 0, d = 1, dan q = 3
ARIMAX(1,1,2), dengan orde p = 1, d = 1, dan q = 2
ARIMAX(2,1,1), dengan orde p = 2, d = 1, dan q = 1
ARIMAX(3,1,1), dengan orde p = 3, d = 1, dan q = 1
modelx1 <- Arima(data.train, order = c(0,1,2), xreg = cbind(dataGlobal.train,dataImpor.train,dataKurs.train), method = "ML")
modelx2 <- Arima(data.train, order = c(2,1,0), xreg = cbind(dataGlobal.train,dataImpor.train,dataKurs.train), method = "ML")
modelx3 <- Arima(data.train, order = c(0,1,1), xreg = cbind(dataGlobal.train,dataImpor.train,dataKurs.train), method = "ML")
modelx4 <- Arima(data.train, order = c(1,1,2), xreg = cbind(dataGlobal.train,dataImpor.train,dataKurs.train), method = "ML")
modelx5 <- Arima(data.train, order = c(2,1,1), xreg = cbind(dataGlobal.train,dataImpor.train,dataKurs.train), method = "ML")
modelx6 <- Arima(data.train, order = c(3,1,1), xreg = cbind(dataGlobal.train,dataImpor.train,dataKurs.train), method = "ML")
ARIMAX(0,1,2)
coeftest(modelx1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.30369431 0.12471198 2.4352 0.01488 *
## ma2 -0.14535815 0.12160700 -1.1953 0.23197
## dataGlobal.train 0.08518822 0.24438948 0.3486 0.72741
## dataImpor.train 0.00019605 0.00016956 1.1562 0.24760
## dataKurs.train 0.00033330 0.00022281 1.4959 0.13468
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ARIMAX(2,1,0)
coeftest(modelx2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.31513976 0.10911519 2.8881 0.003875 **
## ar2 -0.26537823 0.09926247 -2.6735 0.007506 **
## dataGlobal.train 0.08855213 0.23546296 0.3761 0.706860
## dataImpor.train 0.00018159 0.00016629 1.0920 0.274815
## dataKurs.train 0.00030598 0.00022032 1.3888 0.164899
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ARIMAX(0,1,1)
coeftest(modelx3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.40531227 0.10445739 3.8802 0.0001044 ***
## dataGlobal.train 0.18495411 0.23005851 0.8039 0.4214294
## dataImpor.train 0.00018893 0.00016495 1.1454 0.2520596
## dataKurs.train 0.00025912 0.00021377 1.2122 0.2254541
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ARIMAX(1,1,2)
coeftest(modelx4)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.72048476 0.24494142 2.9415 0.003267 **
## ma1 -0.39956373 0.22896412 -1.7451 0.080969 .
## ma2 -0.39538677 0.09891344 -3.9973 6.407e-05 ***
## dataGlobal.train 0.09288089 0.24053289 0.3861 0.699388
## dataImpor.train 0.00020993 0.00016912 1.2413 0.214496
## dataKurs.train 0.00030638 0.00021990 1.3933 0.163535
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ARIMAX(2,1,1)
coeftest(modelx5)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.15317779 0.38598379 0.3969 0.6915
## ar2 -0.22298341 0.15023530 -1.4842 0.1377
## ma1 0.18044916 0.40465184 0.4459 0.6556
## dataGlobal.train 0.12197799 0.24145086 0.5052 0.6134
## dataImpor.train 0.00017780 0.00016537 1.0752 0.2823
## dataKurs.train 0.00031464 0.00021945 1.4338 0.1516
ARIMAX(3,1,1)
coeftest(modelx6)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.01032177 0.99586334 0.0104 0.9917
## ar2 -0.17773953 0.32939516 -0.5396 0.5895
## ar3 -0.04309874 0.29720279 -0.1450 0.8847
## ma1 0.32049764 0.97511813 0.3287 0.7424
## dataGlobal.train 0.11312053 0.24682332 0.4583 0.6467
## dataImpor.train 0.00017954 0.00016591 1.0822 0.2792
## dataKurs.train 0.00031653 0.00021996 1.4390 0.1501
#AIC ARIMA dan Signifikansi Parameter
modelxaccuracy<-data.frame(
"Model"=c("ARIMAX(0,1,2)", "ARIMAX(2,1,0)", "ARIMAX(0,1,1)", "ARIMAX(1,1,2)","ARIMAX(2,1,1)", "ARIMAX(3,1,1)"),
"AIC"=c(modelx1$aic, modelx2$aic, modelx3$aic,modelx4$aic,modelx5$aic,modelx6$aic),
"BIC"=c(modelx1$bic, modelx2$bic, modelx3$bic,modelx4$bic,modelx5$bic,modelx6$bic),
"Signifikansi"=c("Tidak Signifikan","Signifikan","Signifikan","Tidak Signifikan","Tidak Signifikan","Tidak Signifikan"))
modelxaccuracy
## Model AIC BIC Signifikansi
## 1 ARIMAX(0,1,2) 169.0097 184.3330 Tidak Signifikan
## 2 ARIMAX(2,1,0) 168.0144 183.3377 Signifikan
## 3 ARIMAX(0,1,1) 168.4533 181.2227 Signifikan
## 4 ARIMAX(1,1,2) 169.4186 187.2958 Tidak Signifikan
## 5 ARIMAX(2,1,1) 169.8616 187.7388 Tidak Signifikan
## 6 ARIMAX(3,1,1) 171.8390 192.2700 Tidak Signifikan
kable(modelxaccuracy)
| Model | AIC | BIC | Signifikansi |
|---|---|---|---|
| ARIMAX(0,1,2) | 169.0097 | 184.3330 | Tidak Signifikan |
| ARIMAX(2,1,0) | 168.0144 | 183.3377 | Signifikan |
| ARIMAX(0,1,1) | 168.4533 | 181.2227 | Signifikan |
| ARIMAX(1,1,2) | 169.4186 | 187.2958 | Tidak Signifikan |
| ARIMAX(2,1,1) | 169.8616 | 187.7388 | Tidak Signifikan |
| ARIMAX(3,1,1) | 171.8390 | 192.2700 | Tidak Signifikan |
Overfitting
ARIMAX(3,1,0)
model2x <- Arima(data.train, order = c(3,1,0), xreg = cbind(dataGlobal.train,dataKurs.train,dataImpor.train), method = "ML")
coeftest(model2b)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.298835 0.102398 2.9184 0.003519 **
## ar2 -0.238035 0.103396 -2.3022 0.021326 *
## ar3 -0.012674 0.101811 -0.1245 0.900928
## intercept -0.010852 0.060960 -0.1780 0.858708
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(model2x)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.32853331 0.11741531 2.7980 0.005141 **
## ar2 -0.27649036 0.10576971 -2.6141 0.008947 **
## ar3 0.03302335 0.10876297 0.3036 0.761412
## dataGlobal.train 0.11475884 0.24927356 0.4604 0.645248
## dataKurs.train 0.00030987 0.00021913 1.4141 0.157340
## dataImpor.train 0.00017781 0.00016572 1.0729 0.283310
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ARIMAX(2,1,1)
coeftest(modelx5)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.15317779 0.38598379 0.3969 0.6915
## ar2 -0.22298341 0.15023530 -1.4842 0.1377
## ma1 0.18044916 0.40465184 0.4459 0.6556
## dataGlobal.train 0.12197799 0.24145086 0.5052 0.6134
## dataImpor.train 0.00017780 0.00016537 1.0752 0.2823
## dataKurs.train 0.00031464 0.00021945 1.4338 0.1516
Karena parameter \(\phi _3\) atau ar3 tidak berbeda secara signifikan dari angka nol, dan
karena parameter \(\phi _1\) atau ar1 dan parameter \(\phi _2\) atau ar2 pada model ARIMAX(3,1,0) tidak berubah secara signifikan dari parameter \(\phi _1\) atau ar1 dan parameter \(\phi _2\) atau ar2 pada model ARIMAX(2,1,0), selain itu diperoleh bahwa model ARIMAX(2,1,1) tidak signifikan pada semua parameter dan nilai AIC lebih besar daripada ARIMAX(2,1,0).
Maka model ARIMAX(2,1,0) tidak terjadi overfitting atau merupakan model yang baik untuk digunakan. (Cryer dan Chan. 2008)Diagnostik Model ARIMAX(2,1,0)
sisaan.arimax <- modelx2$residuals
Pengujian White Noise
\(H_0\) : \(\rho_1\) = \(\rho_2\) = …. = \(\rho_k\) = 0 untuk k = 1, 2, …, n (Sisaan saling bebas atau sisaan white noise)
\(H_1\) : minimal ada satu \(\rho_k\) ≠ 0 , untuk k = 1, 2, …, n (Sisaan tidak saling bebas atau sisaan tidak terjadi white noise)
Box.test(sisaan.arimax, lag = 12)
##
## Box-Pierce test
##
## data: sisaan.arimax
## X-squared = 18.16, df = 12, p-value = 0.1109
Box.test(sisaan.arimax, lag = 24)
##
## Box-Pierce test
##
## data: sisaan.arimax
## X-squared = 29.638, df = 24, p-value = 0.197
Box.test(sisaan.arimax, lag = 36)
##
## Box-Pierce test
##
## data: sisaan.arimax
## X-squared = 36.092, df = 36, p-value = 0.4643
Box.test(sisaan.arimax, lag = 48)
##
## Box-Pierce test
##
## data: sisaan.arimax
## X-squared = 41.322, df = 48, p-value = 0.7412
terima \(H_0\).
Artinya, tidak cukup bukti untuk menyatakan bahwa sisaan antara lag
tidak saling bebas atau sisaan tidak terjadi white noise pada taraf
nyata 5%.
plot(sisaan.arimax, type="o",ylab="Sisaan", xlab="Order",main="Plot Sisaan vs Order")
abline(h=0,col="red")
acf(sisaan.arimax, lag.max = 24, main = "Plot ACF Sisaan Model ARIMAX")
pacf(sisaan.arimax, lag.max = 24, main = "Plot ACF Sisaan Model ARIMAX")
Forecast Model ARIMAX(2,1,0)
ramalanx <- forecast((modelx2), xreg = cbind(dataGlobal.test,dataImpor.test,dataKurs.test))
## Warning in forecast.forecast_ARIMA((modelx2), xreg = cbind(dataGlobal.test, :
## xreg contains different column names from the xreg used in training. Please
## check that the regressors are in the same order.
data.ramalanx <- ramalanx$mean
data.ramalan.tsx <- ts(data.ramalanx, start = 2020, frequency = 12)
plot(ramalanx,col="black",col.sub ="black",col.axis="black",
col.lab="black",col.main="black",lwd=2)
box(col="black",lwd=2)
perbandinganx <- matrix(c(data.test[1:10], data.ramalanx[1:10]), nrow = 10, ncol = 2, byrow = FALSE)
colnames(perbandinganx) <- c("Aktual", "Ramalan")
perbandinganx
## Aktual Ramalan
## [1,] 2.68 2.632256
## [2,] 2.98 2.845049
## [3,] 2.96 3.370148
## [4,] 2.67 2.665953
## [5,] 2.19 2.526681
## [6,] 1.96 2.456059
## [7,] 1.54 2.646489
## [8,] 1.32 2.683225
## [9,] 1.42 2.814403
## [10,] 1.44 2.712852
kable(perbandinganx)
| Aktual | Ramalan |
|---|---|
| 2.68 | 2.632255 |
| 2.98 | 2.845049 |
| 2.96 | 3.370148 |
| 2.67 | 2.665953 |
| 2.19 | 2.526681 |
| 1.96 | 2.456059 |
| 1.54 | 2.646489 |
| 1.32 | 2.683225 |
| 1.42 | 2.814403 |
| 1.44 | 2.712852 |
ts.plot(data.ts,xlab = "Periode", ylab = "Data Inflasi(Persen)", col="black",lwd=2,main="Forecasting ARIMAX(2,1,0)",gpars = list(col.main="black",col.axis="black",col.sub="black"))
lines(data.ramalan.tsx, col = "blue",lwd=2)
lines(testing.ts, col = "red", lwd =2)
legend(2018,9,c("Data Training", "Data Testing", "Data Forecast ARIMAX(2,1,0)"),
lwd=2, col=c("black","red","blue"), cex=0.8)
box(col="black",lwd=2)
error <- data.frame(data.test)-data.frame(data.ramalanx[1:34])
## SSE (Sum Square Error)
SSE <- sum(error^2, na.rm = T)
## MSE (Mean Squared Error)
MSE<- sapply(error^2, mean, na.rm = T)
## RMSE (Root Mean Square Error)
RMSE <- sqrt(MSE)
## MAD (Mean Absolute Deviation)
MAD <- sapply(abs(error), mean, na.rm = T)
## MAPE (Mean Absolute Percentage Error)
r.error <- (error/data.frame(data.test))*100 # Relative Error
MAPE <- sapply(abs(r.error), mean, na.rm = T)
akurasiarimax <- data.frame(
"Ukuran Keakuratan" = c("SSE", "MSE", "MAPE", "RMSE", "MAD"),
"Forecasting" = c(SSE, MSE, MAPE, RMSE, MAD))
kable(akurasiarimax)
| Ukuran.Keakuratan | Forecasting |
|---|---|
| SSE | 52.362820 |
| MSE | 1.540083 |
| MAPE | 60.229263 |
| RMSE | 1.241001 |
| MAD | 1.098647 |
Perbandingan Forecast ARIMA dengan Forecast ARIMAX
forecasterror <- data.frame("Ukuran Keakuratan" = akurasifarima$Ukuran.Keakuratan, "Akurasi ARIMA" = akurasifarima$Forecasting , "Akurasi ARIMAX" = akurasiarimax$Forecasting)
kable(forecasterror)
| Ukuran.Keakuratan | Akurasi.ARIMA | Akurasi.ARIMAX |
|---|---|---|
| SSE | 62.598323 | 52.362820 |
| MSE | 1.841127 | 1.540083 |
| MAPE | 49.245009 | 60.229263 |
| RMSE | 1.356881 | 1.241001 |
| MAD | 1.088177 | 1.098647 |
ts.plot(data.ts,xlab = "Periode", ylab = "Data Inflasi(Persen)", col="black",lwd=2,main="Forecasting ARIMAX(2,1,0) vs Forecasting ARIMA(2,1,0)",gpars = list(col.main="black",col.axis="black",col.sub="black"))
lines(data.ramalan.tsx, col = "blue",lwd=2)
lines(data.ramalan.ts, col = "purple", lwd=1)
lines(testing.ts, col = "red", lwd =2)
abline(v=2020, col=c("green"), lty=1, lwd=1)
legend(2019,9,c("Data Testing","Data Forecast ARIMAX", "Data Forecast ARIMA", "Split Data"),
lwd=2, col=c("red","blue","purple","green"), cex=0.8)
box(col="black",lwd=2)
korarimax <- cor(data.test,data.ramalan.tsx)
korarima <- cor(data.test,data.ramalan.ts)
framekorelasi <- data.frame(
"Variabel Korelasi" = c("ARIMAX(2,1,0) vs Data Aktual", "ARIMA(2,1,0) vs Data Aktual"),
"Nilai Korelasi" = c(korarimax, korarima))
kable(framekorelasi)
| Variabel.Korelasi | Nilai.Korelasi |
|---|---|
| ARIMAX(2,1,0) vs Data Aktual | 0.7224937 |
| ARIMA(2,1,0) vs Data Aktual | -0.5882779 |
Kesimpulan
Daftar Pustaka
Habsari HDP, Purnamasari I, Yuniarti D. 2020. Peramalan menggunakan metode Double Exponential Smoothing dan verifikasi hasil peramalan menggunakan grafik pengendali tracking signal. Jurnal Ilmu Matematika dan Terapan. 14(1): 13-22. doi:10.30598/barekengvol14iss1pp013-022.
Kuntiarti DD. 2018. Pengaruh inflasi, jumlah penduduk dan kenaikan upah minimum terhadap pengangguran terbuka di Provinsi Banten tahun 2010-2015. Jurnal Pendidikan dan Ekonomi. 7(1).
Newton, Kurnia A, Sumertajaya IM. 2020. Analisis inflasi menggunakan data google trends dengan model arimax di DKI Jakarta. Indonesian Journal of Statistics and Its Applications.4(3): 545 - 556.
Cryer JD, Chan KS. 2008. Time Series Analysis With Applications in R. New York (NY): Springer New York.
Febrian D, Idrus SIA, Nainggolan DAJ. 2020. The comparison of Double Moving Average and Double Exponential Smoothing methods in forecasting the number of foreign tourists coming to North Sumatera, Journal of Physics: Conference Series. 1462(1): 012046. DOI:10.1088/1742-6596/1462/1/012046
Kristanti N, Darsyah MY. 2017. Perbandingan peramalan metode Single Exponential Smoothing dan Double Exsponential Smoothing pada karakteristik penduduk bekerja di Indonesia tahun 2017.Di dalam: Prosiding Seminar Nasional Mahasiswa Unimus(Vol.1)
Hartati H. 2017. Penggunaan Metode Arima Dalam Meramal Pergerakan Inflasi. Jurnal Matematika Sains Dan Teknologi. 18(1): 1–10.
Elvani SP, Utary AR, Yudaruddin R. 2016. Peramalan jumlah produksi tanaman kelapa sawit dengan menggunakan metode Arima (Autoregressive Integrated Moving Average). Jurnal Manajemen. 8(1): 95-112. doi
Hikmah A, Agoestanto A, Arifudin R. 2018. Peramalan deret waktu dengan menggunakan Autoregressive (AR), jaringan syaraf tiruan Radial basis function (Rbf) dan Hibrid Ar-Rbf pada Inflasi Indonesia. Unnes Journal of Mathematics. 7(2): 228-241. doi:10.15294/ujm.v7i2.1398
Hakimah M, Rahmawati WM, Afandi AY. 2020. PENGUKURAN KINERJA METODE PERAMALAN TIPE EXPONENTIAL SMOOTHING DALAM PARAMETER TERBAIKNYA. Jurnal Ilmiah NERO. 5(1): 44-50. - Tinjauan pustaka (SES & DES) - https://nero.trunojoyo.ac.id/index.php/nero/article/view/150/139