HANDS ON SARIMA

LOAD PACKAGE

Kode ini digunakan untuk memanggil package yang dibutuhkan dalam analisis time series.

forecast → digunakan untuk pemodelan ARIMA/SARIMA, forecasting, ACF, PACF, dan evaluasi model.

tseries → digunakan untuk uji stasioneritas menggunakan ADF (Augmented Dickey-Fuller Test).

library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(TSA)
## Warning: package 'TSA' was built under R version 4.5.3
## Registered S3 methods overwritten by 'TSA':
##   method       from    
##   fitted.Arima forecast
##   plot.Arima   forecast
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar

IMPORT DATA

setwd("C:/Users/USER/Downloads")

data <- read.csv("Walmart.csv", header=TRUE)
head(data)
##   Store       Date Weekly_Sales Holiday_Flag Temperature Fuel_Price      CPI
## 1     1 05-02-2010      1643691            0       42.31      2.572 211.0964
## 2     1 12-02-2010      1641957            1       38.51      2.548 211.2422
## 3     1 19-02-2010      1611968            0       39.93      2.514 211.2891
## 4     1 26-02-2010      1409728            0       46.63      2.561 211.3196
## 5     1 05-03-2010      1554807            0       46.50      2.625 211.3501
## 6     1 12-03-2010      1439542            0       57.79      2.667 211.3806
##   Unemployment
## 1        8.106
## 2        8.106
## 3        8.106
## 4        8.106
## 5        8.106
## 6        8.106

DATA TIME SERIES

Data penjualan mingguan (Weekly Sales) terlebih dahulu diubah menjadi bentuk runtun waktu (time series) menggunakan fungsi ts(). Penentuan frequency = 52 dilakukan karena data yang digunakan merupakan data mingguan, sehingga dalam satu tahun terdapat 52 periode pengamatan. Pembentukan objek time series bertujuan agar data dapat diproses menggunakan metode SARIMA.

data.ts <- ts(data, start=1903)

VISUALISASI DATA TIME SERIES

# Ubah Date menjadi format tanggal
data$Date <- as.Date(data$Date, format="%d-%m-%Y")

# Buat objek time series dari Weekly_Sales
data.ts <- ts(data$Weekly_Sales)

# Plot time series
ts.plot(data.ts,
        type="l",
        ylab="Weekly Sales",
        xlab="Time",
        col="pink")

title(main="Time Series Plot of Weekly Sales",
      cex.main=1)

points(data.ts,
       pch=20,
       col="pink")

# SEASONALITY DATA TIME SERIES

library(forecast)

# Membuat time series mingguan
data.ts <- ts(data$Weekly_Sales, frequency = 52)

# Seasonal plot
seasonplot(data.ts,
           main = "Seasonal Plot Weekly Sales",
           ylab = "Weekly Sales",
           year.labels = TRUE,
           col = rainbow(18))

# SPLITTING DATA Data dibagi menjadi dua bagian, yaitu data training dan testing. Data training digunakan untuk membangun model SARIMA, sedangkan data testing digunakan untuk mengevaluasi kemampuan model dalam melakukan prediksi. Pada penelitian ini digunakan 91 data pertama sebagai data training dan 23 data berikutnya sebagai data testing.

# Training set
train.sales.ts <- subset(data.ts, start=1, end=91)

# Testing set
test.sales.ts <- subset(data.ts, start=92, end=114)

VISUALISASI SPLITITNG DATA

ts.plot(train.sales.ts,
        col="pink",
        ylab="Weekly Sales",
        xlab="Time")

title(main="Train Time Series Plot of Weekly Sales",
      cex.main=1)

points(train.sales.ts,
       pch=20,
       col="pink")

ts.plot(test.sales.ts,
        col="pink",
        ylab="Weekly Sales",
        xlab="Time")

title(main="Test Time Series Plot of Weekly Sales")

points(test.sales.ts,
       pch=20,
       col="pink")

Visualisasi data dilakukan menggunakan grafik runtun waktu (time series plot) untuk melihat pola pergerakan data dari waktu ke waktu. Melalui grafik tersebut dapat diamati apakah data memiliki kecenderungan (trend), pola musiman (seasonality), atau fluktuasi tertentu.

Berdasarkan grafik time series, dapat diamati pola perubahan nilai Weekly Sales dari setiap periode pengamatan. Apabila data menunjukkan perubahan rata-rata atau varians dari waktu ke waktu, maka data diduga belum stasioner.

MODEL SARIMA

UJI STASIONER (ADF)

Uji stasioneritas dilakukan menggunakan metode Augmented Dickey-Fuller (ADF). Tujuan uji ini adalah untuk mengetahui apakah data telah memenuhi asumsi stasioner sebelum dilakukan pemodelan SARIMA.

Hipotesis yang digunakan adalah:

H0:Data tidak stasioner

H1:Data stasioner

Kriteria pengambilan keputusan:

Jika nilai p-value < 0,05 maka H₀ ditolak sehingga data bersifat stasioner.

Jika nilai p-value > 0,05 maka H₀ gagal ditolak sehingga data belum stasioner.

Apabila data belum stasioner, maka dilakukan proses differencing.

adf.test(train.sales.ts)
## Warning in adf.test(train.sales.ts): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train.sales.ts
## Dickey-Fuller = -4.5634, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
# H0 : Data tidak stasioner
# H1 : Data stasioner

# Jika p-value > 0.05
# lakukan differencing

DIFFERENCING ORDE 1

Differencing orde pertama dilakukan untuk menghilangkan kecenderungan (trend) pada data. Proses ini dilakukan dengan menghitung selisih antara nilai pengamatan saat ini dengan nilai pengamatan sebelumnya.

diff1 <- diff(train.sales.ts)

ts.plot(diff1,
        col="pink",
        ylab="Differenced Data")

title(main="Differencing Order 1")

adf.test(diff1)
## Warning in adf.test(diff1): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1
## Dickey-Fuller = -5.8174, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

SEASONAL DIFFERENCING

Karena metode SARIMA mempertimbangkan komponen musiman, dilakukan seasonal differencing untuk menghilangkan pola musiman pada data. Pada penelitian ini digunakan lag sebesar 52 karena data bersifat mingguan.

season.diff <- diff(diff1,
                    lag=52)

ts.plot(season.diff,
        col="pink",
        ylab="Seasonal Difference")

title(main="Seasonal Differencing")

adf.test(season.diff)
## Warning in adf.test(season.diff): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  season.diff
## Dickey-Fuller = -5.2705, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary

Maka H₀ ditolak dan H₁ diterima. Dengan demikian dapat disimpulkan bahwa data hasil seasonal differencing telah bersifat stasioner, sehingga proses identifikasi model menggunakan ACF dan PACF dapat dilakukan.

IDENTIFIKASI MODEL (ACF & PACF)

Setelah data stasioner, identifikasi model dilakukan menggunakan plot Autocorrelation Function (ACF) dan Partial Autocorrelation Function (PACF).

ACF digunakan untuk mengidentifikasi parameter Moving Average (MA), sedangkan PACF digunakan untuk mengidentifikasi parameter Autoregressive (AR).

Acf(season.diff,
    main="ACF Plot")

Pacf(season.diff,
     main="PACF Plot")

Interpretasi dilakukan sebagai berikut:

  • ACF yang terpotong pada lag tertentu menunjukkan kandidat nilai MA(q).

  • PACF yang terpotong pada lag tertentu menunjukkan kandidat nilai AR(p).

  • Lonjakan pada lag musiman menunjukkan komponen musiman.

PEMBENTUKAN MODEL SARIMA

Model SARIMA dibentuk menggunakan fungsi auto.arima() yang secara otomatis menentukan kombinasi parameter terbaik berdasarkan nilai informasi model.

Bentuk umum model SARIMA:

ϕ_p(B)Φ_P(Bs)(1-B)d(1-B^s )^DX_t = θ_q(B)Θ_Q(B^s)e_t

dengan: p = orde AR non-musiman d = differencing non-musiman q = orde MA non-musiman P = orde AR musiman D = differencing musiman Q = orde MA musiman

sarima.model <- auto.arima(
                    train.sales.ts,
                    seasonal=TRUE)

summary(sarima.model)
## Series: train.sales.ts 
## ARIMA(1,0,0) with non-zero mean 
## 
## Coefficients:
##          ar1        mean
##       0.2528  1519996.98
## s.e.  0.1013    19074.94
## 
## sigma^2 = 1.904e+10:  log likelihood = -1205.12
## AIC=2416.25   AICc=2416.53   BIC=2423.78
## 
## Training set error measures:
##                     ME     RMSE      MAE        MPE     MAPE     MASE
## Training set -387.5955 136465.5 90338.07 -0.6973038 5.750635 1.686399
##                     ACF1
## Training set 0.005978942

Berdasarkan hasil estimasi menggunakan fungsi auto.arima(), diperoleh model terbaik yaitu ARIMA(1,0,0). Model tersebut menunjukkan bahwa data tidak memerlukan proses differencing maupun komponen musiman tambahan. Nilai koefisien autoregressive (AR) orde satu yang diperoleh sebesar 0,2528 dengan nilai rata-rata sebesar 1519996,98. Oleh karena itu, persamaan model yang diperoleh adalah: Xt = 1519996.98+0.2528X_t−1+e_t

Koefisien AR(1) sebesar 0,2528 menunjukkan bahwa nilai penjualan pada periode sebelumnya mempengaruhi nilai penjualan pada periode saat ini sebesar 25,28%, sedangkan sisanya dipengaruhi oleh faktor lain yang tercakup dalam error(et)

AIC, BIC, AICc

Pemilihan model terbaik dilakukan menggunakan nilai AIC (Akaike Information Criterion), BIC (Bayesian Information Criterion), dan AICc (Corrected Akaike Information Criterion).

Model terbaik dipilih berdasarkan nilai AIC, BIC, dan AICc terkecil karena menunjukkan keseimbangan yang lebih baik antara ketepatan model dan kompleksitas model.

criteria <- data.frame(
  AIC=AIC(sarima.model),
  BIC=BIC(sarima.model),
  AICc=sarima.model$aicc
)

criteria
##        AIC      BIC     AICc
## 1 2416.249 2423.782 2416.525

Berdasarkan hasil yang diperoleh, model ARIMA(1,0,0) menghasilkan nilai AIC sebesar 2416,249, nilai BIC sebesar 2423,782, dan nilai AICc sebesar 2416,525. Nilai-nilai tersebut digunakan sebagai dasar pemilihan model terbaik. Karena model yang dipilih oleh auto.arima() memiliki nilai kriteria informasi paling kecil dibandingkan kandidat model lainnya, maka model ARIMA(1,0,0) dipilih sebagai model yang paling sesuai untuk menggambarkan data Weekly Sales.

DIAGNOSTIK RESIDUAL

Setelah model terbentuk, dilakukan uji diagnostik residual menggunakan uji Ljung-Box untuk mengetahui apakah residual bersifat white noise.

Hipotesis:

H0:Residual bersifat white noise

H1:Residual tidak bersifat white noise

Kriteria:

Jika p-value > 0,05 maka residual memenuhi asumsi white noise.

Jika p-value < 0,05 maka model perlu diperbaiki.

checkresiduals(sarima.model)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 14.398, df = 17, p-value = 0.6388
## 
## Model df: 1.   Total lags used: 18
Box.test(
  residuals(sarima.model),
  lag=20,
  type="Ljung"
)
## 
##  Box-Ljung test
## 
## data:  residuals(sarima.model)
## X-squared = 14.59, df = 20, p-value = 0.7993

FORECASTING

Tahap terakhir adalah melakukan peramalan (forecasting) menggunakan model SARIMA yang telah diperoleh. Hasil peramalan kemudian dibandingkan dengan data aktual menggunakan ukuran akurasi seperti RMSE, MAE, dan MAPE.

Semakin kecil nilai kesalahan prediksi yang diperoleh, maka model yang dibangun semakin baik dalam menggambarkan pola data dan menghasilkan prediksi.

forecast.sarima <- forecast(
                       sarima.model,
                       h=length(test.sales.ts)
                       )

plot(forecast.sarima)

lines(test.sales.ts,
      col="pink")

legend("topleft",
       legend=c(
         "Forecast",
         "Actual"
       ),
       col=c(
         "blue",
         "pink"
       ),
       lty=1)

## EVALUASI MODEL

accuracy(
  forecast.sarima,
  test.sales.ts
)
##                       ME     RMSE       MAE        MPE      MAPE     MASE
## Training set   -387.5955 136465.5  90338.07 -0.6973038  5.750635 1.686399
## Test set     155928.7500 261082.4 192288.16  7.9785556 10.626504 3.589567
##                     ACF1 Theil's U
## Training set 0.005978942        NA
## Test set     0.169579456    1.0426

Berdasarkan hasil evaluasi pada data training diperoleh nilai RMSE sebesar 136465,5 dan MAE sebesar 90338,07. Nilai MAPE pada data training sebesar 5,75%, yang menunjukkan bahwa rata-rata persentase kesalahan model relatif kecil.

Pada data testing diperoleh nilai RMSE sebesar 261082,4 dan MAE sebesar 192288,16. Nilai MAPE sebesar 10,63% menunjukkan bahwa rata-rata kesalahan prediksi model terhadap data aktual sebesar 10,63%.

KESIMPULAN AKHIR

Berdasarkan hasil analisis data Weekly Sales Walmart, diperoleh model terbaik yaitu SARIMA(1,0,0)(0,0,052 atau setara dengan ARIMA(1,0,0). Hasil analisis menunjukkan bahwa pola penjualan mingguan Walmart lebih dipengaruhi oleh penjualan pada periode sebelumnya dibandingkan oleh faktor musiman yang kuat. Nilai MAPE sebesar 10,63% menunjukkan bahwa model memiliki tingkat prediksi yang baik dalam menggambarkan data penjualan. Secara nyata, hasil ini mengindikasikan bahwa penjualan Walmart cenderung mengikuti pola historis minggu sebelumnya, sehingga informasi penjualan periode sebelumnya dapat digunakan sebagai dasar untuk memperkirakan kebutuhan stok, perencanaan persediaan, serta pengambilan keputusan operasional agar distribusi produk menjadi lebih efektif.