Package
library("dLagM") #bisa otomatis timeseries datanya
library("dynlm") #data harus timeseries
library("MLmetrics") #MAPE
library("lmtest")
library("car")
library("knitr")
library("bsts")
library("caret")
library("forecast")
library("keras")
library("smooth")
library("tensorflow")
library("tseries")
library("TTR")
Pendahuluan
Menurut (Wibowo et al. 2012), analisis runtun waktu merupakan analisis sekumpulan data dalam suatu periode waktu yang lampau yang berguna untuk mengetahui atau meramalkan kondisi masa mendatang. Model regresi dengan menggunakan data runtun waktu tidak hanya menggunakan pengaruh perubahan variabel bebas terhadap variabel tak bebas dalam kurun waktu yang sama dan selama periode pengamatan yang sama, tetapi juga menggunakan periode waktu sebelumnya. Waktu yang diperlukan bagi variabel X dalam mempengaruhi variabel tak bebas Y disebut beda kala atau lag.
Model regresi yang memuat variabel tak bebas dan dipengaruhi oleh variabel bebas pada waktu t, serta dipengaruhi juga oleh variabel bebas pada waktu t-1, t-2 dan seterusnya disebut model dinamis distribusi lag, sebab pengaruh dari suatu atau beberapa variabel X terhadap variabel Y menyebar ke beberapa periode waktu. Model regresi yang memuat variabel tak bebas yang dipengaruhi oleh variabel bebas pada waktu t, serta dipengaruhi juga oleh variabel tak bebas itu sendiri pada waktu t-1disebut model dinamis autoregressive
1. Regresi Runtun Waktu
Model regresi linier yang sering ditemui biasanya tidak memperhatikan pengaruh waktu karena pada umumnya model regresi linier cenderung mengasumsikan bahwa pengaruh variabel bebas terhadap variabel tak bebas terjadi dalam kurun waktu yang sama (Jamila et al. 2021). Namun, dalam model regresi linier juga terdapat model regresi yang memperhatikan pengaruh waktu. Waktu yang diperlukan bagi variabel bebas X dalam mempengaruhi variabel tak bebas Y disebut beda kala atau a lag atau a time lag.
2. Model Autoregressive
Menurut (Islamiyahm D 2013), apabila variabel tak bebas dipengaruhi oleh variabel bebas pada waktu t, serta dipengaruhi juga oleh variabel tak bebas itu sendiri pada waktu t-1 maka model tersebut disebut autoregressive dengan:
\[ y_t=α+β_0X_{t}+β_1Y_{t-1}+\varepsilon_t \] Dimana :
\(Y_t=\) variabel tak bebas pada saat ke t pengamatan
\(X_t=\) variabel bebas
\(Y_{t-1}=\) variabel tak bebas pada saat ke t-1 pengamatan
\(α=\) intersep
\(β_0,β_1=\) slope (kemiringan garis regresi)
\(\varepsilon_t=\) residual
3. Model Distribusi Lag
Dalam analisis regresi yang melibatkan data runtun waktu, jika model regresi memasukan tidak hanya nilai variabel bebas saat ini atau GeneralMerchandise tapi juga nilai variabel bebas masa lalu pada waktu t - 1, t - 2 dan seterusnya. Model regresi seperti ini disebut model distributed lag (Nachrowi dan Usman 2005). Suatu Variabel tak bebas apabila dipengaruhi oleh variabel bebas pada waktu t, serta dipengaruhi juga oleh variabel bebas pada waktu t - 1, t - 2 dan seterusnya disebut model dinamis distribusi lag. Model dinamis distribusi lag ada 2 jenis yaitu:
Model Infinite Lag:
\[ y_t=α+β_0X_{t}+β_1Y_{t-1}+β_2Y_{t-2}+...+\varepsilon_t \]
Model disebut model infinite lag sebab panjang beda kalanya tidak diketahui.
Model Finite Lag:
\[ y_t=α+β_0X_{t}+β_1Y_{t-1}+β_2Y_{t-2}+...+β_kY_{t-k}+\varepsilon_t \]
Model disebut model finite lag sebab panjang beda kalanya diketahui sebesar k.
4. Cara Pengestimasian Model Koyck
Model Koyck digunakan untuk mencari nilai estimasi dari masing-masing parameter yang ada dalam model distribusi lag untuk jenis infinite lag (Gujarati 2006). Model Koyck didasarkan asumsi bahwa semakin jauh jarak lag variabel bebas dari periode sekarang maka semakin kecil pengaruh variabel lag terhadap variabel tak bebas (Aqibah et al. 2020). Kyock mengusulkan suatu metode untuk memperkirakan model dinamis distribusi lag dengan mengasumsikan bahwa semua koefisien β mempunyai tanda sama. Koyck menganggap bahwa koefisien menurun secara geometris sebagai berikut:
\[ β_k=β_0C^k \]
dengan \(k = 0,1,2,3,..\)
Data
Data time series yang akan dianalisis lebih lanjut saat ini merupakan data penjualan barang di toko eceran per hari dari tahun 2010 sampai 2019. Peubah yang selanjutnya akan dianalisis regresi sebagai peubah X adalah peubah GeneralMerchandise dan peubah yang menjadi Y adalah Clothing. Detail dari datanya dapat dilihat pada link di sini.
Import Data
data <- read.csv("D:/2020 STATISTIKA DAN SAINS DATA/Semester 5/Metode Peramalan Deret Waktu/DATA TUGAS INDIVIDU.csv")
data <- data[217:336,c(1,2,6)]
head(data)
Eksplorasi Data
corrplot::corrplot(corr=cor(data[sapply(data,is.numeric)]), method = "number", type = "upper")
plot(data$GeneralMerchandise,data$Clothing,pch = 20, col = "blue", main = "Scatter Plot General Merchandise VS Clothing", ylab = "GeneralMerchandise", xlab = "Clothing")
Dapat dilihat dengan jelas dari scatterplot di atas bahwa terdapat hubungan positif antara peubah Clothing dan GeneralMerchandise. Nilai korelasi antara kedua variabel ini juga hampir sempurna, yaitu sebesar \(0.98\).
Split Data dan Membuat Data Menjadi Time Series.
#SPLIT DATA
train<-data[1:96,]
test<-data[97:120,]
#data time series
train.ts<-ts(train)
test.ts<-ts(test)
#Converting data for analysis
train$Clothing <- as.numeric(train$Clothing)
train$GeneralMerchandise <- as.numeric(train$GeneralMerchandise)
Data yang digunakan dibagi menjadi 2 bagian, yaitu data training dan data testing. Sekitar 80% data atau 96 baris digunakan sebagai data training dan 20% data sisanya atau 24 baris terakhir digunakan sebanyak data testing.
plot(train$GeneralMerchandise,train$Clothing,pch = 20, col = "blue", main = "Scatter Plot General Merchandise VS Clothing (Train)", ylab = "Clothing", xlab = "General Merchandise")
plot(test$GeneralMerchandise,test$Clothing,pch = 20, col = "blue", main = "Scatter Plot General Merchandise VS Clothing (Test)", ylab = "Clothing", xlab = "General Merchandise")
Berdasarkan kedua plot di atas, terlihat bahwa pola data training dan data testing masih serupa. Hal ini menunjukkan bahwa pembagian data training dan data testing telah baik dan benar.
Regression with Distributed Lag
Regression with Distributed Lag (lag=2)
#REGRESSION WITH DISTRIBUTED LAG -> estimasi parameter menggunakan least square
model.dlm = dLagM::dlm(x = train$GeneralMerchandise, y = train$Clothing , q = 2)
summary(model.dlm)
##
## Call:
## lm(formula = model.formula, data = design)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1533.25 -465.05 17.78 435.14 2209.38
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.299e+03 8.885e+02 -9.340 6.75e-15 ***
## x.t 5.714e-01 9.836e-03 58.087 < 2e-16 ***
## x.1 -5.120e-02 1.039e-02 -4.930 3.73e-06 ***
## x.2 4.455e-03 1.028e-02 0.433 0.666
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 679.7 on 90 degrees of freedom
## Multiple R-squared: 0.9747, Adjusted R-squared: 0.9739
## F-statistic: 1157 on 3 and 90 DF, p-value: < 2.2e-16
##
## AIC and BIC values for the model:
## AIC BIC
## 1 1498.733 1511.449
AIC(model.dlm)
## [1] 1498.733
BIC(model.dlm)
## [1] 1511.449
Hasil di atas menunjukkan bahwa peubah x.t (penjualan merchandise pada waktu sekarang) dan x.1 (penjualan merchandise pada 1 periode lalu) berpengaruh signifikan terhadap penjualan pakaian dengan nilai AIC sebesar 1498 dan BIC sebesar 1511. Didapat bahwa model regresi dengan distribusi lag adalah sebagai berikut:
\[ Y_t = -0.0083 + 0.571X_{t} - 0.052X_{t-1} + 0.0046X_{t-2} \]
Ramalan Lag
#ramalan
(fore.dlm <- dLagM::forecast(model = model.dlm, x=test$GeneralMerchandise, h=24)) #meramalkan 24 periode ke depan
## $forecasts
## [1] 16862.50 18469.40 23076.20 19645.10 23651.61 22045.34 21781.80 23360.09
## [9] 20273.12 22163.74 26880.03 33110.67 17548.59 18326.76 22928.55 21479.13
## [17] 23846.06 22534.74 22525.31 24252.32 20101.92 22808.47 26844.08 33089.68
##
## $call
## forecast.dlm(model = model.dlm, x = test$GeneralMerchandise,
## h = 24)
##
## attr(,"class")
## [1] "forecast.dlm" "dLagM"
fore.dlm$forecasts
## [1] 16862.50 18469.40 23076.20 19645.10 23651.61 22045.34 21781.80 23360.09
## [9] 20273.12 22163.74 26880.03 33110.67 17548.59 18326.76 22928.55 21479.13
## [17] 23846.06 22534.74 22525.31 24252.32 20101.92 22808.47 26844.08 33089.68
Data di atas merupakan hasil peramalan penjualan pakaian untuk 24 periode ke depan dengan menggunakan Model Regresi dengan Distribusi Lag 2.
MAPE testing dan akurasi Data Training
#mape data testing
mape.dlm <- MAPE(fore.dlm$forecasts, test$Clothing)
#akurasi data training
mape_train <- GoF(model.dlm)["MAPE"]
c("MAPE_testing" = mape.dlm, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.03518874
##
## $MAPE_training.MAPE
## [1] 0.02496442
Hasil di atas merupakan nilai MAPE untuk data training dan data testing. Terlihat bahwa nilai MAPE keduanya tidak jauh berbeda. Artinya, model regresi dengan distribusi lag ini tidak overfitted (terlalu mempelajari data train) atau underfited (performa data test kurang baik).
Regression with Distributed Lag Optimum
#penentuan lag optimum
finiteDLMauto(formula = Clothing ~ GeneralMerchandise,
data = data.frame(train), q.min = 1, q.max = 4,
model.type = "dlm", error.type = "AIC", trace = TRUE) ##q max lag maksimum
Berdasarkan output di atas, dapat diketahui bahwa semakin besar lag maka nilai AIC akan semakin kecil. Namun, hal ini tidak berarti nilai lag yang sangat besar memberikan model regresi terbaik. Oleh karena itu, kami menggunakan nilai lag maksimum 4 sebagai model regresi lag optimum.
#model dlm dengan lag optimum
model.dlm2 = dLagM::dlm(x = train$GeneralMerchandise,y = train$Clothing , q = 4) #terdapat lag yang tidak signifikan sehingga dapat dikurangi jumlah lagnya
summary(model.dlm2)
##
## Call:
## lm(formula = model.formula, data = design)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1424.24 -401.27 2.76 416.31 2144.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.934e+03 1.112e+03 -8.932 6.78e-14 ***
## x.t 5.689e-01 9.269e-03 61.376 < 2e-16 ***
## x.1 -5.283e-02 9.871e-03 -5.352 7.11e-07 ***
## x.2 1.264e-02 1.000e-02 1.264 0.210
## x.3 -1.408e-02 9.832e-03 -1.432 0.156
## x.4 4.008e-02 9.609e-03 4.171 7.21e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 631.5 on 86 degrees of freedom
## Multiple R-squared: 0.9789, Adjusted R-squared: 0.9776
## F-statistic: 796.5 on 5 and 86 DF, p-value: < 2.2e-16
##
## AIC and BIC values for the model:
## AIC BIC
## 1 1455.343 1472.996
AIC(model.dlm2)
## [1] 1455.343
BIC(model.dlm2)
## [1] 1472.996
Hasil di atas menunjukkan bahwa peubah x.t (penjualan merchandise pada waktu sekarang), x.1 (penjualan merchandise pada 1 periode lalu), dan x.4 (penjualan merchandise pada 4 periode lalu) berpengaruh signifikan terhadap penjualan pakaian dengan nilai AIC sebesar 1455 dan BIC sebesar 1472. Didapat bahwa model regresi dengan distribusi lag adalah sebagai berikut:
\[ Y_t = -0.009 + 0.569X_{t} - 0.053X_{t-1} + 0.013X_{t-2} + 0.014X_{t-3} + 0.040X_{t-4} \]
Ramalan Lag Optimum
#ramalan
(fore.dlm2 <- dLagM::forecast(model = model.dlm2, x=test$GeneralMerchandise, h=24))
## $forecasts
## [1] 16884.99 18633.53 23074.20 20638.60 23576.02 21811.69 22013.20 23265.87
## [9] 20471.79 22308.29 26890.03 33282.52 17589.85 18501.87 23048.86 22418.37
## [17] 23808.10 22322.13 22700.92 24277.84 20322.18 22980.52 26882.41 33340.10
##
## $call
## forecast.dlm(model = model.dlm2, x = test$GeneralMerchandise,
## h = 24)
##
## attr(,"class")
## [1] "forecast.dlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan pakaian untuk 24 periode ke depan dengan menggunakan Model Regresi dengan Distribusi Lag 4.
MAPE testing dan akurasi Data Training
#mape data testing
mape.dlm2 <- MAPE(fore.dlm2$forecasts, test$Clothing)
#akurasi data training
mape_train <- GoF(model.dlm2)["MAPE"]
c("MAPE_testing" = mape.dlm2, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.03710123
##
## $MAPE_training.MAPE
## [1] 0.02287714
Hasil di atas merupakan nilai MAPE untuk data training dan data testing. Terlihat bahwa nilai MAPE keduanya tidak jauh berbeda. Artinya, model regresi dengan distribusi lag ini tidak overfitted (terlalu mempelajari data train) atau underfitted (performa data train kurang baik).
Plot Hasil Peramalan
Berikut adalah perbandingan plot data testing aktual dan hasil forecasting:
ts.plot(fore.dlm$forecasts, xlab="periode waktu", ylab="Clothing", main="Plot Hasil Peramalan Clothing", col="blue", lty=3)
points(fore.dlm$forecasts)
lines (fore.dlm$forecasts, col="blue",lwd=2)
points(fore.dlm2$forecasts)
lines (fore.dlm2$forecasts, col="green",lwd=2)
points(test$Clothing,col="red")
lines (test$Clothing, col="red",lwd=2)
legend("topleft",c("aktual", "DLM", "DLM2"), lty=1, col=c("red","blue", "green"), cex=0.8)
Berdasarkan plot di atas, terlihat bahwa titik hasil peramalan DLM sangat mendekati titik data aktual.
Model KOYCK
Metode Koyck didasarkan asumsi bahwa semakin jauh jarak lag peubah independen dari periode sekarang maka semakin kecil pengaruh peubah lag terhadap peubah dependen.
Koyck mengusulkan suatu metode untuk menduga model dinamis distributed lag dengan mengasumsikan bahwa semua koefisien \(/beta\) mempunyai tanda sama.
Model Koyck merupakan jenis paling umum dari model infinite distributed lag dan juga dikenal sebagai geometric lag.
\[ y_t=α(1-λ)+β_0X_{t}+β_1Z_{t}+λY_{t-1}+V_{t} \] dengan \(V_t =u_t - λu_{t-1}\)
Analisis dengan Model Koyck
model.koyck = dLagM::koyckDlm(x = train$GeneralMerchandise, y = train$Clothing)
summary(model.koyck)
##
## Call:
## "Y ~ (Intercept) + Y.1 + X.t"
##
## Residuals:
## Min 1Q Median 3Q Max
## -1378.01 -455.97 -20.64 426.14 2559.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.156e+03 1.462e+03 -5.578 2.43e-07 ***
## Y.1 -8.087e-02 1.868e-02 -4.329 3.80e-05 ***
## X.t 5.521e-01 2.830e-02 19.506 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 686.5 on 92 degrees of freedom
## Multiple R-Squared: 0.9742, Adjusted R-squared: 0.9736
## Wald test: 194 on 2 and 92 DF, p-value: < 2.2e-16
##
## Diagnostic tests:
## NULL
##
## alpha beta phi
## Geometric coefficients: -7546.009 0.552103 -0.08086517
AIC(model.koyck)
## [1] 1515.544
BIC(model.koyck)
## [1] 1525.76
Berdasarkan hasil di atas, didapat nilai intersep model sebesar -0.00815, nilai \(X_t\) sebesar \(0.552\), dan nilai \(Y_{t-1}\) sebesar \(-0.0898\). Sehingga, dapat disimpulkan bahwa permodelan Koyck yang dibentuk dari data Clothing adalah sebagai berikut:
\[ Y_t=-0.00815+0.552X_t-0.0898Y_{t-1} \]
Interpretasi dari model di atas adalah nilai -0.00815 berarti nilai penjualan pakaian (Clothing) pada periode waktu t memiliki nilai -0.00815 saat tidak ada pengaruh peubah bebas ataupun pengaruh waktu sebelumnya. Setiap penurunan penjualan merchandise akan menyebabkan penjualan pakaian naik sebesar 0.552 satuan. Nilai -0.0898 berarti nilai penjualan pakaian periode ke-t dipengaruhi oleh penjualan pakaian pada periode sebelumnya sebesar 0.0898 kali lipat dari sebelumnya. Model ini memiliki nilai AIC sebesar 1515 dan BIC sebesar 1525.
Hipotesis:
\[ H_0: β_i =0 \]
\[ H_1: β_i≠0 \]
Berdasarkan hasil analisis regresi sebelumnya, didapat nilai P-value dari seluruh koefisien kurang dari \(alpha=0.05\). Artinya, pada taraf nyata 5% penjualan pakaian dipengaruhi oleh penjualan merchandise dan penjualan pakaian pada periode sebelumnya.
Ramalan KOYCK
fore.koyck <- dLagM::forecast(model = model.koyck, x=test$GeneralMerchandise, h=24)
fore.koyck$forecasts
## [1] 17033.69 18496.62 22959.67 19693.04 23532.62 22013.03 21745.02 23266.20
## [9] 20297.65 22097.95 26671.74 32733.33 17744.94 18359.60 22816.16 21463.65
## [17] 23736.16 22486.83 22466.40 24134.30 20139.12 22718.63 26641.98 32712.55
Data di atas merupakan hasil peramalan penjualan pakaian untuk 24 periode ke depan dengan menggunakan Model Koyck.
MAPE testing dan akurasi Data Training
#mape data testing
mape.koyck <- MAPE(fore.koyck$forecasts, test$Clothing)
#akurasi data training
mape_train <- dLagM::GoF(model.koyck)["MAPE"]
c("MAPE_testing" = mape.koyck, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.03492866
##
## $MAPE_training.MAPE
## [1] 0.02561592
Hasil di atas merupakan nilai MAPE untuk data training dan data testing. Terlihat bahwa nilai MAPE keduanya tidak jauh berbeda. Artinya, model Koyck ini tidak overfitted atau underfited.
Plot Hasil Peramalan
Berikut adalah perbandingan plot data testing aktual dan hasil forecasting:
ts.plot(fore.koyck$forecasts, xlab="periode waktu", ylab="Clothing", main="Plot Hasil Peramalan Clothing", col="blue", lty=3)
points(fore.koyck$forecasts)
lines (fore.koyck$forecasts, col="blue",lwd=2)
points(test$Clothing,col="red")
lines (test$Clothing, col="red",lwd=2)
legend("topleft",c("aktual", "Koyck"), lty=1, col=c("red","blue"), cex=0.8)
Berdasarkan plot di atas, titik data hasil peramalan model Koyck telah mendekati titik data aktual.
Model Autoregressive / Dynamic Regression
Apabila peubah dependen dipengaruhi oleh peubah independen pada waktu sekarang, serta dipengaruhii juga oleh peubah dependen itu sendiri pada satu waktu yang lalu maka model tersebut disebut autoregressive (Gujarati 2004)
Selanjutnya akan dibuat model autoregressive dengan parameter p=3 dan q=3. Parameter tersebut terpilih karena menghasilkan model dengan hampir seluruh peubahnya signifikan dan menghasilkan AIC model yang cukup kecil.
#MODEL AUTOREGRESSIVE
model.ardl = ardlDlm(x = train$GeneralMerchandise, y = train$Clothing, p = 3 , q = 3)
summary(model.ardl)
##
## Time series regression with "ts" data:
## Start = 4, End = 96
##
## Call:
## dynlm(formula = as.formula(model.text), data = data, start = 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1656.97 -405.02 32.87 391.81 2095.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.460e+04 1.764e+03 -8.275 1.58e-12 ***
## X.t 5.853e-01 1.053e-02 55.572 < 2e-16 ***
## X.1 -4.699e-02 6.348e-02 -0.740 0.461124
## X.2 2.287e-01 6.326e-02 3.615 0.000508 ***
## X.3 1.631e-01 5.535e-02 2.947 0.004141 **
## Y.1 -3.781e-02 1.078e-01 -0.351 0.726678
## Y.2 -4.030e-01 1.068e-01 -3.772 0.000299 ***
## Y.3 -3.379e-01 9.485e-02 -3.563 0.000604 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 609.1 on 85 degrees of freedom
## Multiple R-squared: 0.9807, Adjusted R-squared: 0.9791
## F-statistic: 617.6 on 7 and 85 DF, p-value: < 2.2e-16
AIC(model.ardl)
## [1] 1466.175
BIC(model.ardl)
## [1] 1488.968
Berdasarkan hasil di atas, didapat hampir seluruh peubah signifikan pada taraf nyata 5%. Interpretasinya adalag peubah General Merchandise periode ini, General Merchandise 2 periode lalu, General Merchandise 3 periode lalu, Clothing 2 periode lalu, dan Clothing 3 periode lalu berpengaruh signifikan.
Dengan bantuan software R juga didapat nilai AIC sebesar 1466 dan BIC sebesar 1488. Model regresi yang dihasilkan adalah sebagai berikut:
\[ Y_t=-1.460e^{4}+5.853e^{-1}X_t-4.699e^{-2}X_{t-2}+1.631e^{-1}X_{t-3}-3.781e^{-2}Y_{t-1}-4.030e^{-1}Y_{t-2}-3.379e^{-1}Y_{t-3} \]
Ramalan Autoregressive
#ramalan
(fore.ardl <- dLagM::forecast(model = model.ardl, x=test$Clothing, h=24))
## $forecasts
## [1] -3371.1530 2004.7215 3801.8688 3310.5196 3979.1922 2290.9688
## [7] 3038.5322 4243.4928 2178.2827 2895.7915 5125.4288 10060.3004
## [13] -903.5044 1304.1902 3616.7205 3335.1678 3849.9691 2479.8991
## [19] 3147.9331 4501.7128 1874.4874 3055.0232 5098.0910 10825.4173
##
## $call
## forecast.ardlDlm(model = model.ardl, x = test$Clothing, h = 24)
##
## attr(,"class")
## [1] "forecast.ardlDlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan pakaian untuk 24 periode ke depan dengan menggunakan Model Autoregressive.
MAPE testing dan akurasi Data Training
#akurasi testing
mape.ardl <- MAPE(fore.ardl$forecasts, test$Clothing) #data testing
#akurasi data training
mape_train <- GoF(model.ardl)["MAPE"]
c("MAPE_testing" = mape.ardl, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 6.457182
##
## $MAPE_training.MAPE
## [1] 0.0219887
Hasil di atas merupakan nilai MAPE untuk data training dan data testing. Terlihat bahwa nilai MAPE keduanya tidak jauh berbeda. Artinya, model autoregressive ini tidak overfitted atau underfited.
Plot Hasil Peramalan
Berikut adalah perbandingan plot data testing aktual dan hasil forecasting:
ts.plot(fore.ardl$forecasts, xlab="periode waktu", ylab="Clothing", main="Plot Hasil Peramalan Clothing", col="blue", lty=3, ylim=c(-2000,40000))
points(fore.ardl$forecasts)
lines (fore.ardl$forecasts, col="blue",lwd=2)
points(test$Clothing,col="red")
lines (test$Clothing, col="red",lwd=2)
legend("topleft",c("aktual", "autoregressive"), lty=1, col=c("red", "blue"), cex=0.8)
Berdasarkan plot di atas, terlihat bahwa pola titik hasil peramalan telah serupa dengan pola data aktual. Namun, nilai peramalan tersebut jauh lebih kecil dari data aktual.
Uji Diagnostik Model
PEMODELAN DLM dan ARDL dengan library dynlm
library(dynlm)
#sama dengan model dlm q=1
cons_lm1 <- dynlm(Clothing ~ GeneralMerchandise+L(GeneralMerchandise),data = train.ts)
#sama dengan model dlm q=4
cons_lm2 <- dynlm(Clothing ~ GeneralMerchandise+L(GeneralMerchandise)+L(GeneralMerchandise,2)+L(GeneralMerchandise,3)+L(GeneralMerchandise,4),data = train.ts)
#sama dengan ardl p=3 q=3
cons_lm3 <- dynlm(Clothing ~ GeneralMerchandise+L(GeneralMerchandise)+L(GeneralMerchandise,2)+L(GeneralMerchandise,3)+L(Clothing)+L(Clothing,2)+L(Clothing,3),data = train.ts)
#Ringkasan Model
summary(cons_lm1)
##
## Time series regression with "ts" data:
## Start = 2, End = 96
##
## Call:
## dynlm(formula = Clothing ~ GeneralMerchandise + L(GeneralMerchandise),
## data = train.ts)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1555.44 -458.46 36.14 421.74 2206.78
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.157e+03 6.866e+02 -11.881 < 2e-16 ***
## GeneralMerchandise 5.714e-01 9.587e-03 59.608 < 2e-16 ***
## L(GeneralMerchandise) -4.952e-02 1.005e-02 -4.926 3.69e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 674.5 on 92 degrees of freedom
## Multiple R-squared: 0.975, Adjusted R-squared: 0.9745
## F-statistic: 1797 on 2 and 92 DF, p-value: < 2.2e-16
summary(cons_lm2)
##
## Time series regression with "ts" data:
## Start = 5, End = 96
##
## Call:
## dynlm(formula = Clothing ~ GeneralMerchandise + L(GeneralMerchandise) +
## L(GeneralMerchandise, 2) + L(GeneralMerchandise, 3) + L(GeneralMerchandise,
## 4), data = train.ts)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1424.24 -401.27 2.76 416.31 2144.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.934e+03 1.112e+03 -8.932 6.78e-14 ***
## GeneralMerchandise 5.689e-01 9.269e-03 61.376 < 2e-16 ***
## L(GeneralMerchandise) -5.283e-02 9.871e-03 -5.352 7.11e-07 ***
## L(GeneralMerchandise, 2) 1.264e-02 1.000e-02 1.264 0.210
## L(GeneralMerchandise, 3) -1.408e-02 9.832e-03 -1.432 0.156
## L(GeneralMerchandise, 4) 4.008e-02 9.609e-03 4.171 7.21e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 631.5 on 86 degrees of freedom
## Multiple R-squared: 0.9789, Adjusted R-squared: 0.9776
## F-statistic: 796.5 on 5 and 86 DF, p-value: < 2.2e-16
summary(cons_lm3)
##
## Time series regression with "ts" data:
## Start = 4, End = 96
##
## Call:
## dynlm(formula = Clothing ~ GeneralMerchandise + L(GeneralMerchandise) +
## L(GeneralMerchandise, 2) + L(GeneralMerchandise, 3) + L(Clothing) +
## L(Clothing, 2) + L(Clothing, 3), data = train.ts)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1656.97 -405.02 32.87 391.81 2095.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.460e+04 1.764e+03 -8.275 1.58e-12 ***
## GeneralMerchandise 5.853e-01 1.053e-02 55.572 < 2e-16 ***
## L(GeneralMerchandise) -4.699e-02 6.348e-02 -0.740 0.461124
## L(GeneralMerchandise, 2) 2.287e-01 6.326e-02 3.615 0.000508 ***
## L(GeneralMerchandise, 3) 1.631e-01 5.535e-02 2.947 0.004141 **
## L(Clothing) -3.781e-02 1.078e-01 -0.351 0.726678
## L(Clothing, 2) -4.030e-01 1.068e-01 -3.772 0.000299 ***
## L(Clothing, 3) -3.379e-01 9.485e-02 -3.563 0.000604 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 609.1 on 85 degrees of freedom
## Multiple R-squared: 0.9807, Adjusted R-squared: 0.9791
## F-statistic: 617.6 on 7 and 85 DF, p-value: < 2.2e-16
#SSE
deviance(cons_lm1)
## [1] 41855791
deviance(cons_lm2)
## [1] 34301123
deviance(cons_lm3)
## [1] 31531436
Uji Model
Hipotesis:
Uji Autokorelasi (Durbin-Watson Test)
H0: Sisaan saling bebas (Tidak ada autokorelasi)
H1: Sisaan tidak saling bebas (Ada autokorelasi)
Uji Heterogenitas (Breusch-Pagan Test)
H0: Tidak ada heterogenitas
H1: Ada heterogenitas
Uji Normalitas (Shapiro-Wilk)
H0: Sebaran sisaan mengikuti sebaran normal
H1: Sebaran sisaan tidak mengikuti sebaran normal
#Uji Autokorelasi Durbin Watson
dwtest(cons_lm1)
##
## Durbin-Watson test
##
## data: cons_lm1
## DW = 2.0275, p-value = 0.5429
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(cons_lm2)
##
## Durbin-Watson test
##
## data: cons_lm2
## DW = 2.0865, p-value = 0.6492
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(cons_lm3)
##
## Durbin-Watson test
##
## data: cons_lm3
## DW = 1.7664, p-value = 0.1317
## alternative hypothesis: true autocorrelation is greater than 0
#Uji Heterogenitas Bp-Test
bptest(cons_lm1)
##
## studentized Breusch-Pagan test
##
## data: cons_lm1
## BP = 13.836, df = 2, p-value = 0.0009898
bptest(cons_lm2)
##
## studentized Breusch-Pagan test
##
## data: cons_lm2
## BP = 15.372, df = 5, p-value = 0.008884
bptest(cons_lm3)
##
## studentized Breusch-Pagan test
##
## data: cons_lm3
## BP = 12.633, df = 7, p-value = 0.08158
#Uji Normalitas Shapiro Wilk
shapiro.test(residuals(cons_lm1))
##
## Shapiro-Wilk normality test
##
## data: residuals(cons_lm1)
## W = 0.99105, p-value = 0.7776
shapiro.test(residuals(cons_lm2))
##
## Shapiro-Wilk normality test
##
## data: residuals(cons_lm2)
## W = 0.98901, p-value = 0.6438
shapiro.test(residuals(cons_lm3))
##
## Shapiro-Wilk normality test
##
## data: residuals(cons_lm3)
## W = 0.9852, p-value = 0.3788
Hasil Uji Model:
Model DLM dengan q=1
Tidak ada autokorelasi, ada heterogenitas, mengikuti sebaran normal
Model DLM dengan q=4
Tidak ada autokorelasi, ada heterogenitas, mengikuti sebaran normal
Model ARDL dengan p=3, q=3 (SELURUH UJI TERPENUHI)
Tidak ada autokorelasi, tidak ada heterogenitas, mengikuti sebaran normal
Perbandingan Keakuratan Ramalan
Tabel
#PERBANDINGAN
akurasi <- matrix(c(mape.koyck, mape.dlm, mape.dlm2, mape.ardl))
row.names(akurasi)<- c("Koyck","DLM 1","DLM 2","Autoregressive")
colnames(akurasi) <- c("MAPE")
akurasi
## MAPE
## Koyck 0.03492866
## DLM 1 0.03518874
## DLM 2 0.03710123
## Autoregressive 6.45718218
Berdasarkan nilai keakuratan MAPE, model Koyck adalah model paling ideal karena menghasilkan nilai MAPE terkecil dibandingkan model lainnya.
Plot
#PLOT
par(mfrow=c(1,1))
plot(test$GeneralMerchandise, test$Clothing, type="b", col="black")
points(test$GeneralMerchandise,fore.koyck$forecasts,col="red")
points(test$GeneralMerchandise,fore.dlm$forecasts,col="blue")
points(test$GeneralMerchandise,fore.dlm2$forecasts,col="orange")
points(test$GeneralMerchandise,fore.ardl$forecasts,col="green")
legend("topleft",c("aktual", "koyck","DLM 1","DLM 2", "autoregressive"), lty=1, col=c("black","red","blue","orange","green"), cex=0.8)
Berdasarkan plot di atas, terlihat bahwa titik hasil peramalan DLM, DLM 2, dan Koyck telah mendekati titik data aktual. Hanya model autoregressive yang hasil peramalannya jauh berbeda. Model Koyck dinilai paling optimum untuk meramalkan data Clothing dan General Merchandie.
Daftar Pustaka
- Aqibah M, Suciptawati NLP, Sumarjaya IW. 2020. Model dinamis Autoregressive Distributed Lag. (Studi kasus: pengaruh kurs Dolar Amerika dan inflasi terhadap harga saham tahun 2014-2018. E-Jurnal Matematika. 9(4): 240-250.
- Gujarati DN. 2006. Essentials of Econometrics. Third Edition. New York: The McGraw-Hill.
- Islamiyahm S. Penerapan Autoregressive Distributed Lag (ARDL) dalam Memodelkan Pengaruh Harga Minyak Dunia dan Jumlah Uang Beredar Terhadap Inflasi Di Indonesia. Jurnal Mahasiswa Statistik. 2013; 18(6): 45-48.
- Jamila AU, Siregar BM, Yunis R. 2021. Analisis Runtun Waktu untuk Memprediksi Jumlah Mahasiswa Baru dengan Model Arima. Paradigma. 23(1): 85-92.
- Nachrowi DN, Usman H. 2005. Penggunaan Teknik Ekonometri. Jakarta: PT. Raja Grafindo.
- Wibowo YA, Suparti, Tarno. 2012. Analisis data runtun waktu menggunakan metode wavelet tresholding. Jurnal Gaussian. 1(1): 249-258.