Pemodelan ARIMAX Harga Minyak Goreng

Nabil Izzany

2022-11-16

library(readxl)
library(forecast)
library(lmtest)
library(padr)
library(tseries)
library(TSA)
library(tidyverse)
library(MASS)
library(scales)

Data

Data yang digunakan data harga minyak goreng (y), data harga CPO Internasional (x1) dan data harga CPO domestik (x2). Semua data berupa data bulanan periode Januari 2013 hingga Oktober 2022. Untuk keperluan analisis, data dibagi menjadi dua yaitu data pemodelan dan validasi. Data pemodelan diambil dari periode Januari 2013 hingga Januari 2022. Data validasi diambil dari periode Februari 2022 hingga Oktober 2022.

setwd("C:/Users/Nabil Izzany/Documents/Kuylah/Semester 5/MPDW/Kerkom/Buat dikumpulin")
data <- readxl::read_xlsx("Data Migor Rapi.xlsx")
data <- data[,c(-1,-6)]
head(data)
## # A tibble: 6 × 5
##       t    Yt    X1    X2 Keterangan
##   <dbl> <dbl> <dbl> <dbl> <chr>     
## 1     1 12664  8.53  7.66 Train     
## 2     2 12607  8.90  7.92 Train     
## 3     3 12554  8.65  7.74 Train     
## 4     4 12531  8.50  7.59 Train     
## 5     5 12441  8.57  7.73 Train     
## 6     6 12461  8.66  7.93 Train
log.data <- data[,2:4]
log.data <- log(log.data)
log.data <- as.ts(log.data)
log.data.ket <- data.frame(t = data$t,Yt = log.data[,1], X1 = log.data[,2], X2 = log.data[,3], Keterangan = data$Keterangan)

Eksplorasi Data

q <- ggplot(data, aes(x=t, y=Yt, color=Keterangan ))+ 
  geom_path(aes(group = 1))+
  geom_point()+
  xlab("Periode")+
  ylab("Harga (Rp)")+
  theme(legend.position = "bottom")
q+theme_classic()
## Warning: Removed 1 row containing missing values (`geom_path()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).

v <- ggplot(log.data.ket, aes(x=t, y=Yt, color=Keterangan ))+ 
  geom_path(aes(group = 1))+
  geom_point()+
  xlab("Periode")+
  ylab("Harga (Rp)")+
  theme(legend.position = "bottom")
v+theme_classic()
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## Warning: Removed 1 row containing missing values (`geom_path()`).
## Removed 1 rows containing missing values (`geom_point()`).

cor(log.data[,1],log.data[,2])
## [1] NA
cor(log.data[,1], log.data[,3])
## [1] NA
train.log <- as.ts(log.data[1:109,])
test.log <- as.ts(log.data[110:118,])

train <- as.ts(data[1:109, 2:4])
test <- as.ts(data[110:118, 2:4])

Transformasi

library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
y <- data$Yt
boxcox(y ~ 1)

ARIMAX

Metode merujuk pada (Umar 2018)

Secara singkat sebagai berikut: 1. Eksplorasi data 2. Pembentukan model regresi 3. Pemodelan sisaan wt menggunakan ARIMA 4. Pembentukan model ARIMAX 5. Evaluasi kebaikan model ARIMAX

Eksplorasi Data

Pembentukan model regresi

reg3 <- lm(train.log[,1]~train[,2]+train[,3], data = NULL)
summary(reg3)
## 
## Call:
## lm(formula = train.log[, 1] ~ train[, 2] + train[, 3], data = NULL)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.12842 -0.02866  0.01068  0.03332  0.20073 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.220391   0.039494 233.461  < 2e-16 ***
## train[, 2]   0.044126   0.011321   3.898 0.000171 ***
## train[, 3]  -0.013959   0.008584  -1.626 0.106857    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04759 on 106 degrees of freedom
## Multiple R-squared:  0.6667, Adjusted R-squared:  0.6604 
## F-statistic:   106 on 2 and 106 DF,  p-value: < 2.2e-16
reg4 <- lm(train.log[,1]~0+train[,2]+train[,3], data = NULL)
summary(reg4)
## 
## Call:
## lm(formula = train.log[, 1] ~ 0 + train[, 2] + train[, 3], data = NULL)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5735 -0.3238  0.2183  0.8119  2.2164 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## train[, 2]  2.52525    0.08816   28.64   <2e-16 ***
## train[, 3] -1.76827    0.09373  -18.87   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.075 on 107 degrees of freedom
## Multiple R-squared:  0.9875, Adjusted R-squared:  0.9873 
## F-statistic:  4242 on 2 and 107 DF,  p-value: < 2.2e-16

Pengujian sisaan white nose

H0 : 𝜌1=𝜌2=⋯=𝜌𝐾=0 (sisaan saling bebas atau sisaan white noise)

H1 : minimal ada satu 𝜌𝑘≠0, untuk k = 1, 2, …, K

sisaan2 <- reg4$residuals
plot(sisaan2, type="o",ylab="Sisaan", xlab="Order")
abline(h=0,col="red")

Box.test(sisaan2)
## 
##  Box-Pierce test
## 
## data:  sisaan2
## X-squared = 54.437, df = 1, p-value = 1.605e-13

Nilai p lebih kecil dari taraf nyata 5%, maka dapat disimpulkan bahwa sisaan belum memenuhi asumsi white noise. Selanjutnya dilakukan pemodelan sisaan menggunakan ARIMA.

Pemodelan sisaan model regresi menggunakan ARIMA

acf(sisaan2)

pacf(sisaan2)

adf.test(sisaan2, k=12)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  sisaan2
## Dickey-Fuller = -2.3857, Lag order = 12, p-value = 0.4166
## alternative hypothesis: stationary

Plot ACF menunjukkan pola yang menurun secara perlahan secara eksponensial yang mengindikasikan bahwa data tidak stasioner, sehingga penentuan ordo untuk model sementara tidak dapat dilakukan.

sisaan.dif2 <- diff(sisaan2, differences = 1)
adf.test(sisaan.dif2, k=12)
## Warning in adf.test(sisaan.dif2, k = 12): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  sisaan.dif2
## Dickey-Fuller = -4.5213, Lag order = 12, p-value = 0.01
## alternative hypothesis: stationary

Uji ADF menghasilkan nilai-p sebesar 0.01 yang membuktikan bahwa data tidak mengandung akar unit atau sudah stasioner. Selanjutnya dilakukan identifikasi orde model ARIMAX dengan melihat plot ACF dan PACF serta EACF.

acf(sisaan.dif2, lag.max = 48)

pacf(sisaan.dif2, lag.max = 48)

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

Dilihat dari plot ACF dan PACF belum terlihat jelas ordo AR dan MAnya oleh karena itu, perlu plot eacf untuk mempermudah. Maka dugaan model sementaara berdasarkan plot EACF adalah ARIMAX(0,1,1) dan ARIMAX(1,1,1).

Pembentukan model ARIMAX

#Yg bener
model1 <- Arima(train.log[,1], order = c(0,1,1), xreg = train[,2:3], method = "ML")
model3 <- Arima(train.log[,1], order = c(1,1,1), xreg = train[,2:3], method = "ML")
#Y doang di LN #Yg bener
round(coeftest(model1), digits = 3)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)
## ma1   -0.019      0.085  -0.219    0.826
## X1    -0.001      0.009  -0.061    0.951
## X2     0.004      0.007   0.521    0.602
round(coeftest(model3), digits = 3)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)    
## ar1   -0.789      0.181  -4.352   <2e-16 ***
## ma1    0.588      0.183   3.215    0.001 ***
## X1    -0.006      0.009  -0.628    0.530    
## X2     0.008      0.007   1.070    0.285    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Genap semua di LN
round(model1$aic, 3)
## [1] -467.438
round(model3$aic, 3)
## [1] -469.603

Hasil uji signifikansi hanya ARIMAX (1,1,1) karena terdapat dua parameternya lebih kecil dari taraf nyata 5%. Selain itu ARIMAX (1,1,1) memiliki AIC yang paling kecil dibanding model lainnya. Selanjutnya model ARIMAX (1,1,1) akan di-overfitting.

#Yg bener
over3 <- Arima(train.log[,1], order = c(1,1,2), xreg = train[,2:3], method = "ML")
over4 <- Arima(train.log[,1], order = c(2,1,1), xreg = train[,2:3], method = "ML")
#Hanya Y di ln
round(coeftest(over3), digits = 3)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)    
## ar1   -0.012      0.145  -0.082    0.935    
## ma1   -0.024      0.097  -0.249    0.804    
## ma2    0.638      0.113   5.650   <2e-16 ***
## X1    -0.016      0.006  -2.654    0.008 ** 
## X2     0.011      0.005   2.008    0.045 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
round(coeftest(over4), digits = 3)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)    
## ar1    0.164      0.184   0.890    0.373    
## ar2    0.647      0.105   6.166   <2e-16 ***
## ma1   -0.212      0.182  -1.166    0.244    
## X1    -0.020      0.007  -2.858    0.004 ** 
## X2     0.013      0.006   2.337    0.019 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#yg bener
round(over3$aic, 3)
## [1] -491.377
round(over4$aic, 3)
## [1] -492.602

Hasil uji signifikansi hanya ARIMAX (2,1,1) lebih banyak parameternya lebih kecil dari taraf nyata 5% serta AIC lebih kecil. Oleh karena itu dipilih ARIMAX (5,1,1).

sisaan.arimax <- over4$residuals

plot(sisaan.arimax, type="o",ylab="Sisaan", xlab="Order")
abline(h=0,col="red")

Box.test(sisaan.arimax)
## 
##  Box-Pierce test
## 
## data:  sisaan.arimax
## X-squared = 0.034136, df = 1, p-value = 0.8534
acf(sisaan.arimax, lag.max = 48)

pacf(sisaan.arimax,lag.max = 48)

Evaluasi kebaikan model ARIMAX

ramalan <- forecast(over4, h = length(test.log[,1]), xreg = test[,2:3])

data.ramalan <- ramalan$mean
data.ramalan <- exp(data.ramalan)
data.ramalan2 <-data.frame("Y" = data.ramalan)

fit <- exp(ramalan$fitted)
fit <- data.frame("Y" =  fit)

banding <- matrix(c(test[,1], data.ramalan),  ncol = 2, byrow = FALSE)
colnames(banding) <- c("aktual", "ramalan")
knitr::kable(banding)
aktual ramalan
17685 21709.09
21433 24397.79
26464 24863.38
26101 26632.78
25808 28508.27
24300 31848.91
22500 31692.45
21700 34167.03
21000 35280.03

Peramalan

peramalan <- Arima(log.data[1:118,1], order = c(2,1,1), xreg = as.matrix(data[1:118, 3:4]), method = "ML")



nov <- forecast(peramalan, h = 1, xreg = as.matrix(data[119, 3:4]))
round(exp(9.980272), digits = 0)
## [1] 21596

Simpulan

Model ARIMAX lebih baik dibandingkan model ARIMA. Harga CPO domestik dan harga CPO internasional cukup mampu menjelaskan harga minyak goreng pada periode Januari 2013 hingga Januari 2022. Akan tetapi, model cukup buruk jika digunakan untuk menjelaskan harga minyak goreng pada periode Februari 2022 hingga Oktober 2022.

Daftar Pustaka

Umar MA, Afendi FM, Rizki A, Waryanto B. 2018. Penerapan Model ARIMAX pada Data Harga Cabai Merah Keriting di Indonesia [skripsi] . Bogor Institut Pertanian Bogor. http://repository.ipb.ac.id/handle/123456789/93668