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="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.
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.
## 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 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")## 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")## 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).
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, 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.
##
## 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 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
## 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.