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:/Topik Statistik 1")

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="purple")

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

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

# 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="purple",
        ylab="Weekly Sales",
        xlab="Time")

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

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

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

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

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

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 mengurangi pengaruh trend pada data. Proses ini dilakukan dengan menghitung selisih antara data pada periode sekarang dengan periode sebelumnya sehingga pola data menjadi lebih stabil.

diff1 <- diff(train.sales.ts)

ts.plot(diff1,
        col="purple",
        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 model SARIMA mempertimbangkan unsur musiman, dilakukan seasonal differencing menggunakan lag 52 sesuai karakteristik data mingguan..

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

ts.plot(season.diff,
        col="purple",
        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

Hasil pengujian menunjukkan bahwa data setelah seasonal differencing telah memenuhi asumsi stasioner sehingga dapat digunakan untuk tahap identifikasi model.

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, diperoleh model terbaik yaitu ARIMA(1,0,0). Model ini menunjukkan bahwa data tidak memerlukan differencing tambahan maupun komponen musiman.

Nilai koefisien AR(1) sebesar 0,2528 menunjukkan bahwa penjualan pada periode sebelumnya memberikan pengaruh terhadap penjualan pada periode saat ini sebesar 25,28%, sedangkan sisanya dipengaruhi oleh faktor lain di luar model.

AIC, BIC, AICc

Pemilihan model terbaik dilakukan dengan membandingkan nilai AIC, BIC, dan AICc.

Model dengan nilai AIC, BIC, dan AICc paling kecil dianggap paling baik karena mampu memberikan keseimbangan antara ketepatan model dan kompleksitas parameter.

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

Hasil yang diperoleh menunjukkan bahwa model ARIMA(1,0,0) memiliki nilai kriteria informasi paling rendah sehingga dipilih sebagai model terbaik.

DIAGNOSTIK RESIDUAL

Pengujian residual dilakukan menggunakan uji Ljung-Box untuk memastikan bahwa residual model bersifat white noise.

Hipotesis yang digunakan:

H 0 ​

: residual bersifat white noise H 1 ​

: residual tidak white noise

Jika nilai p-value > 0,05 maka residual dianggap acak dan model dinyatakan sudah memenuhi asumsi diagnostik.

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 forecasting dilakukan menggunakan model SARIMA terbaik yang telah diperoleh sebelumnya. Hasil prediksi kemudian dibandingkan dengan data aktual untuk melihat kemampuan model dalam memprediksi data di masa mendatang.

Kualitas model dievaluasi menggunakan ukuran error seperti RMSE, MAE, dan MAPE. Semakin kecil nilai error yang dihasilkan maka performa model semakin baik.

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

plot(forecast.sarima)

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

legend("topleft",
       legend=c(
         "Forecast",
         "Actual"
       ),
       col=c(
         "red",
         "purple"
       ),
       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

Hasil evaluasi menunjukkan bahwa model memiliki tingkat kesalahan prediksi yang relatif kecil pada data training maupun testing.

Nilai MAPE sebesar 10,63% pada data testing menunjukkan bahwa model mampu melakukan prediksi dengan tingkat akurasi yang cukup baik dalam menggambarkan pola penjualan mingguan Walmart.

##KESIMPULAN AKHIR

Berdasarkan hasil analisis menggunakan metode SARIMA, diperoleh model terbaik yaitu ARIMA(1,0,0). Model tersebut menunjukkan bahwa pola penjualan mingguan Walmart lebih dipengaruhi oleh nilai penjualan pada periode sebelumnya dibandingkan oleh faktor musiman.

Hasil evaluasi memperlihatkan bahwa model memiliki kemampuan prediksi yang cukup baik dengan nilai MAPE sebesar 10,63%. Oleh karena itu, model ini dapat digunakan sebagai dasar dalam membantu perencanaan stok, pengendalian persediaan, dan pengambilan keputusan operasional berdasarkan prediksi penjualan pada periode berikutnya.