Pendahuluan
Analisis regresi merupakan salah satu teknik analisis data dalam statistika yang seringkali digunakan untuk mengkaji hubungan antara beberapa variabel dan meramal suatu variabel (Kutner et. al, 2004). Ada tiga jenis data yang seringkali digunakan dalam analisis regresi, yaitu:
- Data cross section adalah data yang dikumpulkan dalam kurun waktu tertentu dari sampel
- Data time series adalah sekumpulan observasi dalam rentang waktu tertentu yang dikumpulkan dalam interval waktu secara kontinu
- Data panel adalah data gabungan antara data cross section dengan data time series (Widarjono, 2007).
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 (Nurahman et al. 2016).
Tujuan
Tugas ini bertujuan mengkaji pemodelan regresi linier, khususnya regresi linier sederhana untuk data time series yaitu memodelkan salah satu faktor yang memengaruhi penjualan mingguan salah satu ritel di US.
Package yang digunakan
library(dLagM) #bisa otomatis timeseries datanya
library(dynlm) #data harus timeseries
library(MLmetrics) #MAPE
library(lmtest)
library(car)
library(readxl)
library(knitr)
library(dplyr)
Data untuk Analisis
Data yang digunakan adalah data dari kaggle.com, diupload oleh Yasser (2021) yang
berisi data penjualan mingguan salah satu ritel terkemuka di AS,
Walmart, dari Februari 2010 hingga Oktober 2012. Data ini terdiri atas
penjualan 45 toko Walmart (Store) yang masing-masing
tokonya terdiri dari 99 departemen. Detil dari datanya bisa didapatkan
pada link
ini. Akan dilakukan analisis salah satu faktor yang paling
berpengaruh terhadap data penjualan walmart. Faktor tersebut dipilih
berdasarkan nilai korelasi yang paling besar, tahapannya akan dijelaskan
pada bagian selanjutnya.
Import Data
data <- read.csv("walmart_cleaned.csv")
str(data)
## 'data.frame': 421570 obs. of 17 variables:
## $ X : int 0 1 2 3 4 5 6 7 8 9 ...
## $ Store : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Date : chr "2010-02-05" "2010-02-05" "2010-02-05" "2010-02-05" ...
## $ IsHoliday : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Dept : num 1 26 17 45 28 79 55 5 58 7 ...
## $ Weekly_Sales: num 24924.5 11737.1 13223.8 37.4 1085.3 ...
## $ Temperature : num 42.3 42.3 42.3 42.3 42.3 ...
## $ Fuel_Price : num 2.57 2.57 2.57 2.57 2.57 ...
## $ MarkDown1 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown2 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown3 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown4 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown5 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ CPI : num 211 211 211 211 211 ...
## $ Unemployment: num 8.11 8.11 8.11 8.11 8.11 ...
## $ Type : int 3 3 3 3 3 3 3 3 3 3 ...
## $ Size : int 151315 151315 151315 151315 151315 151315 151315 151315 151315 151315 ...
Dari output di atas, dapat terlihat bahwa data memiliki \(421570\) observasi (baris) dan \(17\) variabel (kolom).
Filtering Data
Untuk kemudahan pengolahan data, akan dilakukan filtering baris. Data yang digunakan hanyalah data yang didapat oleh departemen 2 di Store 3. Syntaxnya adalah sebagai berikut:
data <- data[which(data$Store==3&data$Dept==2),]
str(data)
## 'data.frame': 143 obs. of 17 variables:
## $ X : int 20582 20636 20694 20800 20854 20894 20957 21025 21092 21175 ...
## $ Store : int 3 3 3 3 3 3 3 3 3 3 ...
## $ Date : chr "2010-02-05" "2010-02-12" "2010-02-19" "2010-02-26" ...
## $ IsHoliday : int 0 1 0 0 0 0 0 0 0 0 ...
## $ Dept : num 2 2 2 2 2 2 2 2 2 2 ...
## $ Weekly_Sales: num 17567 15177 15676 15112 16477 ...
## $ Temperature : num 45.7 47.9 47.1 52 53 ...
## $ Fuel_Price : num 2.57 2.55 2.51 2.56 2.62 ...
## $ MarkDown1 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown2 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown3 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown4 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ MarkDown5 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ CPI : num 214 215 215 215 215 ...
## $ Unemployment: num 7.37 7.37 7.37 7.37 7.37 ...
## $ Type : int 2 2 2 2 2 2 2 2 2 2 ...
## $ Size : int 37392 37392 37392 37392 37392 37392 37392 37392 37392 37392 ...
Setelah filtering, dapat terlihat bahwa data yang tersisa memiliki 143 baris dan 17 kolom yang merupakan data deret waktu mingguan dari tahun 2010 hingga 2012. Selanjutnya, akan dilakukan filtering kolom yang sekiranya relevan dengan analisis regresi deret waktu.
data <- data[c(3,6:8,14:15)]
str(data)
## 'data.frame': 143 obs. of 6 variables:
## $ Date : chr "2010-02-05" "2010-02-12" "2010-02-19" "2010-02-26" ...
## $ Weekly_Sales: num 17567 15177 15676 15112 16477 ...
## $ Temperature : num 45.7 47.9 47.1 52 53 ...
## $ Fuel_Price : num 2.57 2.55 2.51 2.56 2.62 ...
## $ CPI : num 214 215 215 215 215 ...
## $ Unemployment: num 7.37 7.37 7.37 7.37 7.37 ...
Sehingga didapat data:
knitr::kable(head(data,10), align = "l")
| Date | Weekly_Sales | Temperature | Fuel_Price | CPI | Unemployment | |
|---|---|---|---|---|---|---|
| 20505 | 2010-02-05 | 17566.72 | 45.71 | 2.572 | 214.4249 | 7.368 |
| 20559 | 2010-02-12 | 15177.30 | 47.93 | 2.548 | 214.5748 | 7.368 |
| 20617 | 2010-02-19 | 15676.11 | 47.07 | 2.514 | 214.6199 | 7.368 |
| 20723 | 2010-02-26 | 15112.23 | 52.05 | 2.561 | 214.6475 | 7.368 |
| 20777 | 2010-03-05 | 16477.28 | 53.04 | 2.625 | 214.6751 | 7.368 |
| 20817 | 2010-03-12 | 15022.47 | 63.08 | 2.667 | 214.7028 | 7.368 |
| 20880 | 2010-03-19 | 14631.70 | 60.42 | 2.720 | 214.5301 | 7.368 |
| 20948 | 2010-03-26 | 14044.59 | 57.06 | 2.732 | 214.3241 | 7.368 |
| 21015 | 2010-04-02 | 15830.95 | 65.56 | 2.719 | 214.1181 | 7.343 |
| 21098 | 2010-04-09 | 14848.71 | 68.00 | 2.770 | 213.9121 | 7.343 |
Korelasi Antar Peubah
Untuk memilih nilai X terbaik (terhadap nilai Y
Weekly_Sales), akan dilakukan eksplorasi terhadap seluruh
data numerik yang ada.
GGally::ggpairs(data[sapply(data,is.numeric)])
Dari matriks korelasi di atas, dapat terlihat bahwa Weekly_Sales
memiliki korelasi tertinggi dengan CPI. Maka, akan dilakukan pemodelan
regresi dengan peubah lag dengan peubah respons
Weekly_Sales dan peubah bebas CPI. Consumer
Price Index (CPI) atau yang bisa juga disebut dengan Indeks Harga
Konsumen adalah ukuran yang memeriksa rata-rata tertimbang harga
sekeranjang barang dan jasa konsumen, seperti transportasi, makanan, dan
perawatan medis. Ini dihitung dengan mengambil perubahan harga untuk
setiap item dalam keranjang barang yang telah ditentukan dan
dirata-ratakan. Perubahan CPI digunakan untuk menilai perubahan harga
yang terkait dengan biaya hidup. CPI adalah salah satu statistik yang
paling sering digunakan untuk mengidentifikasi periode inflasi
atau deflasi.
data <- data[c(1,2,5)]
str(data)
## 'data.frame': 143 obs. of 3 variables:
## $ Date : chr "2010-02-05" "2010-02-12" "2010-02-19" "2010-02-26" ...
## $ Weekly_Sales: num 17567 15177 15676 15112 16477 ...
## $ CPI : num 214 215 215 215 215 ...
Split Data dan Membuat data menjadi time series.
#Split data
train<-data[1:100,]
test<-data[101:143,]
#data time series
train.ts<-ts(train)
test.ts<-ts(test)
data.ts<-ts(data)
Proporsi data Training: 70% Proporsi data Testing: 30%
Didapat Plot data testing dan training adalah sebagai berikut:
plot(train$CPI,train$Weekly_Sales,pch = 19, main = "Scatter Plot Data Training", ylab = "Weekly_Sales", xlab = "CPI")
plot(test$CPI,test$Weekly_Sales,pch = 19, main = "Scatter Plot Data Testing", ylab = "Weekly_Sales", xlab = "CPI")
Terlihat bahwa kedua data memiliki pola yang mirip, ini mengindikasikan hal yang baik untuk menghindari terjadinya over/underfitting.
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$CPI, y = train$Weekly_Sales , q = 2)
summary(model.dlm)
##
## Call:
## lm(formula = model.formula, data = design)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2842.1 -900.2 -53.3 760.8 3197.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -54713.6 11226.2 -4.874 4.43e-06 ***
## x.t 742.5 1434.4 0.518 0.606
## x.1 -958.3 2768.8 -0.346 0.730
## x.2 541.3 1464.5 0.370 0.713
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1226 on 94 degrees of freedom
## Multiple R-squared: 0.3361, Adjusted R-squared: 0.3149
## F-statistic: 15.86 on 3 and 94 DF, p-value: 2.012e-08
##
## AIC and BIC values for the model:
## AIC BIC
## 1 1677.903 1690.828
Dari hasil di atas, didapat bahwa masing-masing \(P-Value\) dari setiap uji t pada peubah \(\ge0.05\). Hal ini menunjukkan bahwa peubah \(x_t,\ x_{t-1},\ dan\ x_{t-2}\) (CPI dalam periode yang sama, 1, dan 2 periode lalu) tidak berpengaruh signifikan terhadap penjualan mingguan walmart dengan nilai \(R^2\) sebesar \(33.61%\). Dengan model keseluruhannya adalah sebagai berikut:
\[ \hat{Y_t} = -54713.6 + 742.5X_{t} - 958.3X_{t-1} + 541.3X_{t-2} \]
Ramalan Lag
#ramalan
(fore.dlm <- forecast(model = model.dlm, x=test$CPI, h=43)) #meramalkan 43 periode ke depan
## $forecasts
## [1] 17898.65 17958.28 17952.06 18030.83 18061.59 18092.35 18174.23 18228.47
## [9] 18270.49 18340.46 18365.64 18388.90 18456.60 18480.75 18504.90 18515.08
## [17] 18543.30 18561.32 18579.35 18568.17 18583.01 18591.63 18591.73 18600.76
## [25] 18620.57 18618.10 18631.89 18645.69 18635.34 18656.15 18659.37 18662.58
## [33] 18719.61 18747.54 18762.61 18807.10 18858.62 18943.22 18978.54 19044.58
## [41] 19110.63 19059.31 19139.91
##
## $call
## forecast.dlm(model = model.dlm, x = test$CPI, h = 43)
##
## attr(,"class")
## [1] "forecast.dlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan mingguan untuk 43 periode ke depan menggunakan Model Regresi dengan Distribusi Lag = 2.
MAPE testing dan akurasi Data Training
#mape data testing
mape.dlm <- MAPE(fore.dlm$forecasts, test$Weekly_Sales)
#akurasi data training
mape_train <- GoF(model.dlm)["MAPE"]
c("MAPE_testing" = mape.dlm, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.05660674
##
## $MAPE_training.MAPE
## [1] 0.05959153
Dari hasil di atas, terlihat bahwa nilai MAPE keduanya tidak jauh
berbeda. Artinya, model regresi dengan distribusi lag ini tidak
overfitted atau underfitted.
Regression with Distributed Lag Optimum
#penentuan lag optimum
finiteDLMauto(formula = Weekly_Sales ~ CPI,
data = data.frame(train), q.min = 1, q.max = 40,
model.type = "dlm", error.type = "AIC", trace = TRUE) ##q max lag maksimum
Dari tabel di atas, terlihat bahwa semakin besar q, semakin baik ukuran kebaikan model yang didapat. Namun, penentuan n optimum tidak hanya dapat dinilai dari nilai error-nya saja, melainkan juga dinilai dari kebaikan plot. Maka dari itu, akan dilihat kebaikan plot dari 10 hingga 40.
par(mfrow=c(2,2))
for(q in seq(10,40,10)){
model.dlm2 = dLagM::dlm(x = train$CPI,y = train$Weekly_Sales , q = q)
(fore.dlm2 <- forecast(model = model.dlm2, x=test$CPI, h=43))
plot(1:nrow(train), train$Weekly_Sales, type="b", col="black", xlim=c(1,nrow(train)+43),
ylab="Weekly_Sales",xlab="Index waktu", main=paste("Model DLM q =",q))
points((nrow(train)+1):(nrow(train)+43), fore.dlm2$forecasts,col="blue")
lines((nrow(train)+1):(nrow(train)+43), fore.dlm2$forecasts,col="blue")
}
Dari grafik di atas, dapat terlihat bahwa nilai plot terlihat optimum
didapat ketika q bernilai 40. Berdasarkan nilai keakuratan dan plot,
nilai q = 40 dipilih menjadi nilai q optimum.
#model dlm dengan lag optimum
model.dlm2 = dLagM::dlm(x = train$CPI, y = train$Weekly_Sales , q = 40)
summary(model.dlm2)
##
## Call:
## lm(formula = model.formula, data = design)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1764.62 -592.74 55.31 517.99 2199.72
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -63966.1 73140.5 -0.875 0.3933
## x.t -3348.7 4431.2 -0.756 0.4596
## x.1 6512.2 8990.8 0.724 0.4782
## x.2 1905.5 9570.7 0.199 0.8444
## x.3 -8859.5 9509.1 -0.932 0.3638
## x.4 5533.9 9500.9 0.582 0.5675
## x.5 -1697.8 8852.5 -0.192 0.8501
## x.6 5063.7 8064.8 0.628 0.5380
## x.7 -11900.5 8189.0 -1.453 0.1634
## x.8 8333.5 7969.7 1.046 0.3096
## x.9 -5377.8 7848.0 -0.685 0.5019
## x.10 12041.2 7939.1 1.517 0.1467
## x.11 -12615.1 8008.5 -1.575 0.1326
## x.12 4748.4 8089.9 0.587 0.5645
## x.13 -2591.4 7936.2 -0.327 0.7478
## x.14 7575.2 7983.3 0.949 0.3552
## x.15 -5997.4 7920.2 -0.757 0.4587
## x.16 -3705.0 8116.0 -0.457 0.6535
## x.17 3661.8 8933.0 0.410 0.6867
## x.18 3851.9 10567.7 0.364 0.7197
## x.19 9041.5 10347.9 0.874 0.3938
## x.20 -23463.3 10343.7 -2.268 0.0358 *
## x.21 15124.0 10708.0 1.412 0.1749
## x.22 -5670.5 9705.7 -0.584 0.5663
## x.23 12430.4 8145.6 1.526 0.1444
## x.24 -19230.3 7983.6 -2.409 0.0269 *
## x.25 9488.2 7858.5 1.207 0.2429
## x.26 -2928.7 7862.0 -0.373 0.7139
## x.27 8625.1 7406.7 1.165 0.2594
## x.28 -8445.1 7368.8 -1.146 0.2668
## x.29 -764.2 7455.5 -0.103 0.9195
## x.30 696.8 7337.0 0.095 0.9254
## x.31 5356.7 7232.7 0.741 0.4685
## x.32 2252.4 7247.9 0.311 0.7595
## x.33 -10934.1 8057.5 -1.357 0.1916
## x.34 3495.2 9713.2 0.360 0.7232
## x.35 4836.8 10273.6 0.471 0.6434
## x.36 1582.8 10217.5 0.155 0.8786
## x.37 -9531.6 10235.3 -0.931 0.3641
## x.38 6825.6 10437.4 0.654 0.5214
## x.39 -2665.0 8956.2 -0.298 0.7694
## x.40 1111.5 4071.2 0.273 0.7880
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1509 on 18 degrees of freedom
## Multiple R-squared: 0.6854, Adjusted R-squared: -0.03118
## F-statistic: 0.9565 on 41 and 18 DF, p-value: 0.5647
##
## AIC and BIC values for the model:
## AIC BIC
## 1 1062.372 1152.429
Dari hasil di atas, didapat bahwa hanya terdapat 2 peubah yang memiliki nilai \(P-Value<0.05\). Hal ini menunjukkan bahwa hanya peubah \(x_{t-20}\ dan\ x_{t-24}\) (CPI pada 20 dan 24 periode lalu) berpengaruh signifikan terhadap penjualan mingguan walmart dengan nilai \(R^2\) sebesar \(68.54\%\). Dengan model keseluruhannya adalah sebagai berikut: \[ \hat{Y_t} = -63966.1 - 3348.7X_{t} + 6512.2X_{t-1} + ... +1111.5X_{t-40} \]
Ramalan Lag Optimum
#ramalan
(fore.dlm2 <- forecast(model = model.dlm2, x=test$CPI, h=43))
## $forecasts
## [1] 17995.41 17234.72 16926.66 17708.13 19931.57 18003.11 18666.36 20208.03
## [9] 18777.97 19319.28 18601.90 19449.87 18607.41 19164.17 18494.03 18647.50
## [17] 18611.22 18877.94 19193.44 19419.10 19652.57 17380.59 19015.07 18699.44
## [25] 18296.63 17555.13 19662.01 19381.18 20195.70 18980.13 18555.24 19498.04
## [33] 19214.80 18349.92 18060.39 19622.63 19449.08 19179.37 18745.47 20011.14
## [41] 19247.51 20025.80 19504.14
##
## $call
## forecast.dlm(model = model.dlm2, x = test$CPI, h = 43)
##
## attr(,"class")
## [1] "forecast.dlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan mingguan untuk 43 periode ke depan menggunakan Model Regresi dengan Distribusi Lag = 40.
MAPE testing dan akurasi Data Training
#mape data testing
mape.dlm2 <- MAPE(fore.dlm2$forecasts, test$Weekly_Sales)
#akurasi data training
mape_train <- GoF(model.dlm2)["MAPE"]
c("MAPE_testing" = mape.dlm2, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.05406452
##
## $MAPE_training.MAPE
## [1] 0.03974911
Dari hasil di atas, terlihat bahwa nilai MAPE keduanya tidak jauh
berbeda. Artinya, model regresi dengan distribusi lag = 40 ini tidak
overfitted atau underfitted.
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}\)
model.koyck = dLagM::koyckDlm(x = train$CPI, y = train$Weekly_Sales)
summary(model.koyck)
##
## Call:
## "Y ~ (Intercept) + Y.1 + X.t"
##
## Residuals:
## Min 1Q Median 3Q Max
## -2789.63 -876.03 -56.18 738.12 3108.36
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -5.097e+04 1.128e+04 -4.520 1.77e-05 ***
## Y.1 5.372e-02 1.003e-01 0.536 0.593
## X.t 3.042e+02 5.578e+01 5.453 3.84e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1212 on 96 degrees of freedom
## Multiple R-Squared: 0.3386, Adjusted R-squared: 0.3248
## Wald test: 24.51 on 2 and 96 DF, p-value: 2.507e-09
##
## Diagnostic tests:
## NULL
##
## alpha beta phi
## Geometric coefficients: -53862.93 304.1983 0.0537243
Dari hasil di atas, didapat bahwa peubah \(x_t\) memiliki nilai \(P-Value<0.05\). Hal ini menunjukkan bahwa hanya peubah \(x_t\) (CPI pada periode yang sama) berpengaruh signifikan terhadap penjualan mingguan walmart dengan nilai \(R^2\) sebesar \(68.54\%\). Dengan model keseluruhannya adalah sebagai berikut: \[ \hat{Y_t} = - 50970 - 304.2X_{t}+0.053Y_{t-1} \]
Ramalan KOYCK
(fore.koyck <- forecast(model = model.koyck, x=test$CPI, h=43))
## $forecasts
## [1] 17838.64 17939.63 17973.81 18004.41 18034.80 18065.19 18116.52 18184.69
## [9] 18253.75 18322.87 18373.63 18398.93 18422.87 18446.73 18470.59 18488.72
## [17] 18506.55 18524.36 18542.17 18548.01 18548.42 18548.53 18548.64 18552.39
## [25] 18565.49 18579.08 18592.71 18606.33 18610.07 18613.27 18616.45 18619.62
## [33] 18644.85 18687.79 18731.69 18775.64 18822.47 18886.72 18951.90 19017.14
## [41] 19082.38 19099.53 19106.09
##
## $call
## forecast.koyckDlm(model = model.koyck, x = test$CPI, h = 43)
##
## attr(,"class")
## [1] "forecast.koyckDlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan mingguan untuk 43 periode ke depan dengan menggunakan Model KOYCK.
MAPE testing dan akurasi Data Training
#mape data testing
mape.koyck <- MAPE(fore.koyck$forecasts, test$Weekly_Sales)
#akurasi data training
mape_train <- dLagM::GoF(model.koyck)["MAPE"]
c("MAPE_testing" = mape.koyck, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.05714497
##
## $MAPE_training.MAPE
## [1] 0.05910573
Dari hasil di atas, terlihat bahwa nilai MAPE keduanya tidak jauh
berbeda. Artinya, model regresi dengan distribusi lag ini tidak
overfitted atau underfitted.
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)
Model Autoregressive (p = 1 & q = 1)
#MODEL AUTOREGRESSIVE
model.ardl = ardlDlm(x = train$CPI, y = train$Weekly_Sales, p = 1 , q = 1)
summary(model.ardl)
##
## Time series regression with "ts" data:
## Start = 2, End = 100
##
## Call:
## dynlm(formula = as.formula(model.text), data = data, start = 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2787.46 -874.65 -56.63 736.01 3107.14
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -5.109e+04 1.201e+04 -4.252 4.95e-05 ***
## X.t 2.750e+02 7.944e+02 0.346 0.730
## X.1 2.975e+01 8.112e+02 0.037 0.971
## Y.1 5.399e-02 1.008e-01 0.536 0.593
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1219 on 95 degrees of freedom
## Multiple R-squared: 0.3386, Adjusted R-squared: 0.3177
## F-statistic: 16.21 on 3 and 95 DF, p-value: 1.377e-08
Dari hasil di atas, didapat bahwa masing-masing \(P-Value\) dari setiap uji t pada peubah \(\ge0.05\). Hal ini menunjukkan bahwa peubah \(x_t,\ x_{t-1},\ dan\ y_{t-1}\) (CPI dalam periode yang sama, 1 periode lalu, dan penjualan mingguan 1 periode lalu) tidak berpengaruh signifikan terhadap penjualan mingguan periode ini dengan nilai \(R^2\) sebesar \(33.86\%\). Dengan model keseluruhannya adalah sebagai berikut:
\[ \hat{Y_t} = -51090 + 275X_{t} - 29.75X_{t-1} + 0.054Y_{t-1} \]
Ramalan Autoregressive
#ramalan
(fore.ardl <- forecast(model = model.ardl, x=test$CPI, h=43))
## $forecasts
## [1] 17839.47 17940.83 17977.75 18008.55 18039.02 18069.47 18118.85 18185.50
## [9] 18254.62 18323.88 18376.54 18404.40 18428.52 18452.44 18476.34 18495.08
## [17] 18512.97 18530.82 18548.66 18555.69 18556.63 18556.78 18556.88 18560.29
## [25] 18572.50 18586.07 18599.72 18613.37 18618.09 18621.35 18624.54 18627.72
## [33] 18650.83 18692.13 18736.02 18780.05 18826.70 18889.37 18954.60 19019.97
## [41] 19085.34 19107.25 19114.86
##
## $call
## forecast.ardlDlm(model = model.ardl, x = test$CPI, h = 43)
##
## attr(,"class")
## [1] "forecast.ardlDlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan mingguan untuk 43 periode ke depan menggunakan Model Autoregressive dengan p = 1 dan q = 1.
MAPE testing dan akurasi Data Training
#akurasi testing
mape.ardl <- MAPE(fore.ardl$forecasts, test$Weekly_Sales) #data testing
#akurasi data training
mape_train <- GoF(model.ardl)["MAPE"]
c("MAPE_testing" = mape.ardl, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.05705837
##
## $MAPE_training.MAPE
## [1] 0.05913632
Dari hasil di atas, terlihat bahwa nilai MAPE keduanya tidak jauh
berbeda. Artinya, model regresi dengan distribusi lag ini tidak
overfitted atau underfitted.
Model Autoregressive / Dynamic Regression Optimum
Penentuan lag optimum
#penentuan lag optimum
dff <- ardlBoundOrders(data = data.frame(train), ic="AIC", formula = Weekly_Sales ~ CPI)
min_p=c()
for(i in 1:15){
min_p[i]=min(dff$Stat.table[[i]])
}
q_opt=which(min_p==min(min_p))
p_opt=which(dff$Stat.table[[q_opt]]==min(dff$Stat.table[[q_opt]]))
data.frame("q_optimum" = q_opt, "p_optimum" = p_opt, "AIC"=dff$min.Stat)
Dari tabel di atas, dapat terlihat bahwa nilai AIC terendah didapat ketika p = 1 dan q = 15, yaitu sebesar 1432.262. Artinya, model autoregressive optimum didapat ketika p = 1 dan q =15
#MODEL AUTOREGRESSIVE
model.ardl2 = ardlDlm(x = train$CPI, y = train$Weekly_Sales, p = 1, q = 15)
summary(model.ardl2)
##
## Time series regression with "ts" data:
## Start = 16, End = 100
##
## Call:
## dynlm(formula = as.formula(model.text), data = data, start = 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2117.3 -558.5 -142.2 472.3 2872.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.751e+04 2.201e+04 -2.159 0.03445 *
## X.t 4.981e+02 7.832e+02 0.636 0.52697
## X.1 -2.195e+02 7.871e+02 -0.279 0.78125
## Y.1 1.994e-01 1.254e-01 1.590 0.11661
## Y.2 2.037e-01 1.373e-01 1.483 0.14276
## Y.3 -1.245e-01 1.295e-01 -0.961 0.33984
## Y.4 2.741e-01 1.323e-01 2.072 0.04213 *
## Y.5 -1.260e-01 1.361e-01 -0.926 0.35793
## Y.6 -1.817e-01 1.428e-01 -1.273 0.20749
## Y.7 -1.589e-02 1.423e-01 -0.112 0.91143
## Y.8 -1.998e-01 1.401e-01 -1.426 0.15841
## Y.9 1.265e-01 1.428e-01 0.886 0.37903
## Y.10 -1.010e-01 1.416e-01 -0.713 0.47815
## Y.11 -6.443e-02 1.413e-01 -0.456 0.64984
## Y.12 -6.642e-02 1.342e-01 -0.495 0.62218
## Y.13 3.613e-01 1.333e-01 2.709 0.00855 **
## Y.14 -6.615e-02 1.386e-01 -0.477 0.63461
## Y.15 -3.760e-02 1.339e-01 -0.281 0.77967
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1067 on 67 degrees of freedom
## Multiple R-squared: 0.6115, Adjusted R-squared: 0.513
## F-statistic: 6.204 on 17 and 67 DF, p-value: 2.392e-08
Dari hasil di atas, didapat bahwa hanya terdapat 2 peubah yang memiliki nilai \(P-Value<0.05\). Hal ini menunjukkan bahwa hanya peubah \(y_{t-4}\ dan\ y_{t-13}\) (penjualan mingguan pada 4 dan 13 periode lalu) berpengaruh signifikan terhadap penjualan mingguan walmart dengan nilai \(R^2\) sebesar \(61.15\%\). Dengan model keseluruhannya adalah sebagai berikut: \[ \hat{Y_t} = -4751 + 498.1X_{t} - 219.5X_{t-1} + 0.199Y_{t-1}+... -0.037Y_{t-15} \]
Ramalan Autoregressive
#ramalan
(fore.ardl2 <- forecast(model = model.ardl2, x=test$CPI, h=43))
## $forecasts
## [1] 19798.70 18300.99 20128.59 16608.88 18806.45 17236.40 18197.16 16799.78
## [9] 17350.55 17838.39 18217.48 19747.64 17494.22 19770.11 18474.80 20551.64
## [17] 17782.17 19567.12 18235.47 19147.32 18038.96 17955.03 18322.41 17978.72
## [25] 19268.18 17479.40 19375.79 18108.97 20082.92 18051.52 19532.93 18529.41
## [33] 19398.42 18753.97 18559.92 18989.37 18424.24 19619.83 18116.92 19738.19
## [41] 18533.21 20217.19 18657.28
##
## $call
## forecast.ardlDlm(model = model.ardl2, x = test$CPI, h = 43)
##
## attr(,"class")
## [1] "forecast.ardlDlm" "dLagM"
Data di atas merupakan hasil peramalan penjualan mingguan untuk 43 periode ke depan menggunakan Model Autoregressive dengan p = 1 dan q = 15.
MAPE testing dan akurasi Data Training
#akurasi testing
mape.ardl2 <- MAPE(fore.ardl2$forecasts, test$Weekly_Sales) #data testing
#akurasi data training
mape_train <- GoF(model.ardl2)["MAPE"]
c("MAPE_testing" = mape.ardl, "MAPE_training" = mape_train)
## $MAPE_testing
## [1] 0.05705837
##
## $MAPE_training.MAPE
## [1] 0.0454105
Dari hasil di atas, terlihat bahwa nilai MAPE keduanya tidak jauh
berbeda. Artinya, model autoregressive dengan parameter optimum ini
tidak overfitted atau underfitted.
Perbandingan Keakuratan Ramalan
Tabel
#PERBANDINGAN
akurasi <- matrix(c(mape.koyck, mape.dlm, mape.dlm2, mape.ardl, mape.ardl2))
row.names(akurasi)<- c("Koyck","DLM 1","DLM Optimum","Autoregressive", "Autoregressive Optimum")
colnames(akurasi) <- c("MAPE")
akurasi
## MAPE
## Koyck 0.05714497
## DLM 1 0.05660674
## DLM Optimum 0.05406452
## Autoregressive 0.05705837
## Autoregressive Optimum 0.06670530
Jika dilihat berdasarkan nilai MAPE, model paling optimum didapat pada Model distribution lag ketika lag optimum (40).
Plot
#PLOT
par(mfrow=c(1,1))
plot(1:nrow(test), test$Weekly_Sales, type="b", col="black",xlab="Index waktu",
main="Perbandingan Metode Ramalan vs Aktual")
points(1:nrow(test), test$Weekly_Sales,col="black",pch=19)
lines(1:nrow(test), test$Weekly_Sales,col="black")
points(1:nrow(test), fore.koyck$forecasts,col="blue",pch=19)
lines(1:nrow(test), fore.koyck$forecasts,col="blue")
points(1:nrow(test), fore.dlm$forecasts,col="red",pch=19)
lines(1:nrow(test), fore.dlm$forecasts,col="red")
points(1:nrow(test), fore.dlm2$forecasts,col="orange",pch=19)
lines(1:nrow(test), fore.dlm2$forecasts,col="orange")
points(1:nrow(test), fore.ardl$forecasts,col="green",pch=19)
lines(1:nrow(test), fore.ardl$forecasts,col="green")
points(1:nrow(test), fore.ardl2$forecasts,col="grey",pch=19)
lines(1:nrow(test), fore.ardl2$forecasts,col="grey")
legend("bottomright",c("data aktual", "Koyck", "DLM", "DLM Optimum", "Autoregressive", "Autoregressive Optimum"), lty=1, cex=.75,
col=c("black", "blue", "red", "orange", "green", "grey"))
plot(1:nrow(test), fore.dlm2$forecasts, type="b", col="blue", xlab="Index waktu",
pch=19, main="Perbandingan Metode Ramalan")
points(1:nrow(test), fore.dlm$forecasts,col="red",pch=19)
lines(1:nrow(test), fore.dlm$forecasts,col="red")
points(1:nrow(test), fore.koyck$forecasts,col="orange",pch=19)
lines(1:nrow(test), fore.koyck$forecasts,col="orange")
points(1:nrow(test), fore.ardl$forecasts,col="green",pch=19)
lines(1:nrow(test), fore.ardl$forecasts,col="green")
points(1:nrow(test), fore.ardl2$forecasts,col="grey",pch=19)
lines(1:nrow(test), fore.ardl2$forecasts,col="grey")
legend("topleft",c("DLM Optimum", "DLM", "DLM Koyck", "Autoregressive", "Autoregressive Optimum"), lty=1, cex=.75,
col=c("blue", "red", "orange", "green", "grey"))
par(mfrow=c(1,1))
plot(1:nrow(train), train$Weekly_Sales, type="b", col="black", xlim=c(1,nrow(train)+43),
ylab="Weekly_Sales",xlab="Index waktu", main="Perbandingan Metode Ramalan vs Aktual\nDilihat setelah data training")
points((nrow(train)+1):(nrow(train)+43), test$Weekly_Sales,col="black")
lines((nrow(train)+1):(nrow(train)+43), test$Weekly_Sales,col="black")
points((nrow(train)+1):(nrow(train)+43), fore.koyck$forecasts,col="blue")
lines((nrow(train)+1):(nrow(train)+43), fore.koyck$forecasts,col="blue")
points((nrow(train)+1):(nrow(train)+43), fore.dlm$forecasts,col="red")
lines((nrow(train)+1):(nrow(train)+43), fore.dlm$forecasts,col="red")
points((nrow(train)+1):(nrow(train)+43), fore.dlm2$forecasts,col="orange")
lines((nrow(train)+1):(nrow(train)+43), fore.dlm2$forecasts,col="orange")
points((nrow(train)+1):(nrow(train)+43), fore.ardl$forecasts,col="green")
lines((nrow(train)+1):(nrow(train)+43), fore.ardl$forecasts,col="green")
points((nrow(train)+1):(nrow(train)+43), fore.ardl2$forecasts,col="grey")
lines((nrow(train)+1):(nrow(train)+43), fore.ardl2$forecasts,col="grey")
legend("topleft",c("data aktual", "Koyck", "DLM", "DLM Optimum", "Autoregressive", "Autoregressive Optimum"), lty=1, cex=.9,
col=c("black", "blue", "red", "orange", "green", "grey"))
Berdasarkan plot di atas, dapat terlihat pula bahwa plot yang paling
mendekati data test atau data aktualnya adalah model DLM Optimum, yaitu
model regresi lag distribution dengan lag optimum (40). Maka, dari hasil
ini dan juga nilai akurasi, dapat disimpulkan bahwa pemodelan terbaik
adalah pemodelan regresi dengan distribution lag optimum (40).
Daftar Pustaka
- Kutner MH, Nachtsheim CJ, Neter J. 2004. Applied Linear Regression Models. 4th ed. New York: McGraw-Hill Companies.
- Widarjono, A. 2007. Ekonometrika: Teori dan Aplikasi untuk Ekonomi dan Bisnis. Edisi Kedua. Yogyakarta: Ekonisia Fakultas Ekonomi Universitas Islam Indonesia.
- Nurahman MC, Wahyuningsih S, Yuniarti D. 2016. Model dinamis: Autoregressive dan distribusi lag (Studi Kasus : Pengaruh Kurs Dollar Amerika Terhadap Produk Domestik Regional Bruto (PDRB)). Jurnal EKSPONENSIAL. 7(2): 139-146.