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).
## Warning: package 'forecast' was built under R version 4.5.3
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## 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
## 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.
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.
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.
## 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
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")## 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")## 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).
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
## 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.
##
## 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-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
## 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.