Analisis data Kaggle - Faktor yang mempengaruhi Weekly Sales Walmart

Alfidhia Rahman NJ

2022-09-11

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:

  1. Data cross section adalah data yang dikumpulkan dalam kurun waktu tertentu dari sampel
  2. Data time series adalah sekumpulan observasi dalam rentang waktu tertentu yang dikumpulkan dalam interval waktu secara kontinu
  3. 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

  1. Kutner MH, Nachtsheim CJ, Neter J. 2004. Applied Linear Regression Models. 4th ed. New York: McGraw-Hill Companies.
  2. Widarjono, A. 2007. Ekonometrika: Teori dan Aplikasi untuk Ekonomi dan Bisnis. Edisi Kedua. Yogyakarta: Ekonisia Fakultas Ekonomi Universitas Islam Indonesia.
  3. 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.