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
# DATA
penjualan <- c(
120,135,150,160,170,180,200,210,190,220,240,260,
130,145,160,175,185,200,220,230,210,240,260,280,
140,155,170,180,190,210,230,240,220,250,270,300,
150,165,180,195,205,225,250,260,240,270,290,320,
160,175,190,205,220,240,260,275,255,290,310,340
)
ts_data <- ts(penjualan, start=c(2018,1), frequency=12)
# 1. EKSPLORASI DATA
plot(ts_data, main="Plot Penjualan Bulanan", ylab="Penjualan", xlab="Tahun")
Data menunjukkan tren meningkat dari tahun ke tahun. Selain itu terdapat pola musiman, di mana penjualan cenderung meningkat di akhir tahun.
# 2. UJI STASIONERITAS (ADF)
adf_awal <- adf.test(ts_data)
print(adf_awal)
##
## Augmented Dickey-Fuller Test
##
## data: ts_data
## Dickey-Fuller = -3.3542, Lag order = 3, p-value = 0.07161
## alternative hypothesis: stationary
diff1 <- diff(ts_data)
adf_diff1 <- adf.test(diff1)
## Warning in adf.test(diff1): p-value smaller than printed p-value
print(adf_diff1)
##
## Augmented Dickey-Fuller Test
##
## data: diff1
## Dickey-Fuller = -4.1858, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary
diff2 <- diff(diff1, lag=12)
adf_diff2 <- adf.test(diff2)
print(adf_diff2)
##
## Augmented Dickey-Fuller Test
##
## data: diff2
## Dickey-Fuller = -3.1571, Lag order = 3, p-value = 0.113
## alternative hypothesis: stationary
Data awal belum stasioner karena p-value > 0.05. Setelah differencing pertama, data menjadi stasioner (p-value < 0.05). Namun setelah differencing musiman, data kembali tidak stasioner. Sehingga differencing pertama sudah cukup untuk mencapai stasioneritas.
# 3. IDENTIFIKASI MODEL (ACF & PACF)
acf(diff1, main="ACF")
pacf(diff1, main="PACF")
ACF dan PACF berdasarkan data yang telah stasioner (diff1) menunjukkan pola yang mengindikasikan adanya komponen AR dan MA, sehingga dapat digunakan sebagai dasar dalam menentukan kandidat model ARIMA dan SARIMA.
# 4. ESTIMASI MODEL ARIMA
model_arima1 <- arima(ts_data, order=c(1,1,1))
model_arima2 <- arima(ts_data, order=c(2,1,1))
cat("AIC ARIMA:\n")
## AIC ARIMA:
print(AIC(model_arima1, model_arima2))
## df AIC
## model_arima1 3 607.6804
## model_arima2 4 609.3021
# 5. ESTIMASI MODEL SARIMA
model_sarima1 <- arima(ts_data,
order=c(1,1,1),
seasonal=list(order=c(1,1,1), period=12))
## Warning in arima(ts_data, order = c(1, 1, 1), seasonal = list(order = c(1, :
## possible convergence problem: optim gave code = 1
model_sarima2 <- arima(ts_data,
order=c(2,1,1),
seasonal=list(order=c(1,1,1), period=12))
## Warning in arima(ts_data, order = c(2, 1, 1), seasonal = list(order = c(1, :
## possible convergence problem: optim gave code = 1
cat("\nAIC SARIMA:\n")
##
## AIC SARIMA:
print(AIC(model_sarima1, model_sarima2))
## df AIC
## model_sarima1 5 256.7479
## model_sarima2 6 258.4660
Model SARIMA menunjukkan adanya peringatan konvergensi, yang berarti estimasi parameternya belum optimal. Namun demikian, model ini tetap dipertimbangkan karena memiliki nilai AIC yang lebih kecil dibandingkan ARIMA. Hal ini menunjukkan bahwa model SARIMA lebih mampu menangkap pola dalam data, terutama pola musiman.
# 6. DIAGNOSTIK RESIDUAL
Box.test(residuals(model_sarima1), lag=12, type="Ljung-Box")
##
## Box-Ljung test
##
## data: residuals(model_sarima1)
## X-squared = 12.954, df = 12, p-value = 0.3724
Jika p-value > 0.05 maka residual bersifat white noise. Hal ini menunjukkan bahwa model yang digunakan sudah mampu menangkap pola dalam data dengan baik.
# 7. FORECASTING (MENGGUNAKAN ARIMA TERBAIK)
pred <- predict(model_arima1, n.ahead=12)
plot(ts_data, xlim=c(2018,2024), main="Forecast 12 Bulan ke Depan")
lines(ts(pred$pred, start=c(2023,1), frequency=12))
Forecast dilakukan menggunakan model ARIMA karena model SARIMA mengalami kendala konvergensi. Hasil peramalan menunjukkan tren penjualan yang terus meningkat. Pola musiman tetap ada, dengan kenaikan di akhir tahun.
KESIMPULAN Dari hasil analisis yang dilakukan, terlihat bahwa penjualan bulanan selama periode 2018–2022 cenderung mengalami peningkatan dari tahun ke tahun dan memiliki pola musiman yang cukup jelas, terutama peningkatan di akhir tahun. Uji stasioneritas menunjukkan bahwa data awal belum stasioner, namun setelah dilakukan differencing pertama data sudah menjadi stasioner dan dapat digunakan untuk pemodelan. Berdasarkan perbandingan nilai AIC, model SARIMA memberikan hasil yang lebih baik dibandingkan ARIMA karena mampu menangkap pola musiman. Namun karena terdapat kendala pada proses estimasi model SARIMA, peramalan dilakukan menggunakan model ARIMA. Secara umum, hasil peramalan menunjukkan bahwa penjualan diperkirakan akan terus meningkat dengan pola yang relatif sama.