Tiga chapter terakhir kita menyiapkan semua bahan: differencing untuk menstasionerkan, autoregressive untuk memanfaatkan nilai lampau, dan moving average — dalam artian model — untuk memanfaatkan error lampau. ARIMA (AutoRegressive Integrated Moving Average) merangkai ketiganya menjadi satu model yang selama puluhan tahun menjadi standar peramalan deret waktu. Pada chapter ini kita pahami arti ketiga hurufnya, memilih orde lewat pembandingan sederhana berbasis AIC, lalu meramal tujuh hari penjualan Toko Kopi Kita lengkap dengan interval kepercayaannya — sekaligus mencatat dengan jujur apa yang tidak mampu ditangkap ARIMA dasar.
Tiga Huruf: p, d, q #
ARIMA(p, d, q) adalah tiga keputusan yang kita ambil bergantung pada sifat data:
| Huruf | Nama | Mengatur | Rujukan bab | Pada data kita |
|---|---|---|---|---|
| p | AutoRegressive | Berapa nilai lampau yang masuk model | Model Autoregressive | Kandidat: 1-2 |
| d | Integrated | Berapa kali differencing sebelum dipaskan | Stasioneritas | 1 (tren linear) |
| q | Moving Average | Berapa error lampau yang ikut menjelaskan | Bab ini | Kandidat: 1-2 |
I Integrated merujuk pada fakta bahwa model dipasang pada deret yang sudah didifferencing, lalu hasilnya “diintegralkan” kembali — dijumlah mundur — supaya ramalan keluar dalam satuan gelas, bukan selisih harian. Komponen MA perlu diluruskan dari namanya yang menyesatkan: MA(q) di sini bukan moving average pemulusan chapter sebelumnya, melainkan regresi nilai sekarang atas q error periode lalu — model berkata “besok naik sedikit karena hari ini saya meleset ke bawah”. Kombinasi ketiganya memberi fleksibilitas: AR menangkap korelasi nilai, MA menyerap guncangan sesaat, dan d membersihkan tren.
Memilih Orde dengan AIC #
Orde (p, d, q) idealnya dipilih lewat ACF/PACF dan uji stasioneritas; dalam praktik, cara cepat yang jujur adalah mencoba sedikit kandidat yang masuk akal lalu membandingkan AIC mereka. Akaike Information Criterion (AIC) menilai model dari dua sisi: seberapa baik model menempel pada data, dikurangi penalti karena banyaknya parameter — makin kecil AIC, makin baik keseimbangannya. Karena d untuk deret bertren linear kita jelas 1, kita cukup membandingkan tiga kombinasi kecil p dan q.
import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
rng = np.random.default_rng(42)
n = 42
tanggal = pd.date_range("2025-01-06", periods=n, freq="D")
bobot_hari = np.array([0, 1, 2, 3, 8, 14, 11], dtype=float)
gelas = 40 + 0.6 * np.arange(n) + bobot_hari[tanggal.dayofweek] + rng.normal(0, 4.0, n)
deret = pd.Series(gelas.round().astype(int), index=tanggal, name="gelas")
for p, d, q in [(1, 1, 1), (2, 1, 1), (1, 1, 2)]:
model = ARIMA(deret, order=(p, d, q)).fit()
print(f"ARIMA({p},{d},{q}) : AIC = {model.aic:.1f}")Output yang Dihasilkan:
ARIMA(1,1,1) : AIC = 275.4
ARIMA(2,1,1) : AIC = 274.4
ARIMA(1,1,2) : AIC = 275.2Mari kita baca hasilnya:
ARIMA(deret, order=(p, d, q)).fit()memasang ketiga kandidat pada deret yang sama;.aicmengambil skor AIC-nya.- ARIMA(2,1,1) menang dengan 274,4, mengungguli ARIMA(1,1,2) selisih 0,8 dan ARIMA(1,1,1) selisih 1,0. Selisih sekecil itu tergolong tipis — aturan praktis praktisi menyebut perbedaan AIC di bawah 2 belum layak dijadikan alasan memilih model yang lebih rumit.
- Prinsip kehematan (parsimony) lalu berbicara: tambahan satu parameter AR(2) atau MA(2) hanya membeli perbaikan AIC sekecil itu, jadi ARIMA(1,1,1) — paling sederhana di antara ketiganya — adalah pilihan yang sah dan akan kita pakai untuk meramal. Model sederhana juga lebih tahan terhadap overfitting pada data yang hanya 42 titik.
Meramal dengan Interval Kepercayaan #
get_forecast() mengembalikan ramalan beserta sebarannya, dan conf_int(alpha=0.05) memberi batas bawah-atas interval kepercayaan 95% — rentang nilai yang (menurut asumsi model) akan memuat nilai sesungguhnya pada 95% percobaan.
import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
rng = np.random.default_rng(42)
n = 42
tanggal = pd.date_range("2025-01-06", periods=n, freq="D")
bobot_hari = np.array([0, 1, 2, 3, 8, 14, 11], dtype=float)
gelas = 40 + 0.6 * np.arange(n) + bobot_hari[tanggal.dayofweek] + rng.normal(0, 4.0, n)
deret = pd.Series(gelas.round().astype(int), index=tanggal, name="gelas")
model = ARIMA(deret, order=(1, 1, 1)).fit()
ramalan = model.get_forecast(steps=7)
tengah = ramalan.predicted_mean
interval = ramalan.conf_int(alpha=0.05)
hasil = pd.DataFrame(
{
"ramalan": tengah.round(1).values,
"batas_bawah": interval.iloc[:, 0].round(1).values,
"batas_atas": interval.iloc[:, 1].round(1).values,
},
index=tengah.index,
)
print(hasil)Output yang Dihasilkan:
ramalan batas_bawah batas_atas
2025-02-17 75.2 62.6 87.8
2025-02-18 73.9 58.7 89.1
2025-02-19 73.3 56.7 89.9
2025-02-20 73.0 55.5 90.6
2025-02-21 72.9 54.6 91.3
2025-02-22 72.9 53.8 91.9
2025-02-23 72.8 53.1 92.5Mari kita bedah hasilnya:
predicted_meanadalah titik tengah ramalan tiap hari;conf_int(alpha=0.05)mengembalikan DataFrame dua kolom — batas bawah dan atas — yang kita rangkai agar mudah dibaca.- Ramalan bergerak datar di sekitar 73: setelah differencing, ARIMA(1,1,1) hanya melihat rata-rata perubahan, sehingga ke depannya ia meneruskan level terakhir dengan sedikit penyesuaian — 75,2 lalu perlahan menuju 72,8.
- Interval melebar dari lebar 25,2 gelas (62,6-87,8) di hari pertama menjadi 39,4 gelas (53,1-92,5) di hari ketujuh — ketidakpastian menumpuk seiring horizon; kita akan mendalami perilaku ini pada chapter Keterbatasan Prediksi Deret Waktu .
- Yang tidak tampak sama pentingnya: ramalan ini datar, padahal data kita bergelombang mingguan. ARIMA dasar tidak mengenal
period— musiman harus masuk lewat perluasan bernama SARIMA (argumenseasonal_order) atau lewat differencing musimandiff(7). Model apa adanya meramal level mingguan tanpa irama harianya.
Rangkuman #
- ARIMA(p, d, q) = AR(p) nilai lampau + differencing d kali + MA(q) error lampau; “Integrated” berarti hasil dijumlah mundur ke satuan aslinya.
- Pemilihan orde sederhana: coba sedikit kandidat masuk akal, bandingkan AIC — makin kecil makin baik, dengan penalti parameter; selisih AIC < 2 sebaiknya dimenangkan model yang lebih sederhana.
get_forecast()memberi ramalan danconf_int(0.05)memberi interval 95%; interval melebar seiring panjang horizon.- ARIMA dasar tidak menangkap musiman mingguan kita — ramalannya datar; musiman butuh SARIMA atau differencing musiman, atau pendekatan lain yang lebih leluasa dengan fitur.
Keterbatasan terakhir itu bukan tamat melainkan pintu: kalau masalahnya adalah kebebasan memilih fitur — hari kalender, lag berapa pun, bahkan cuaca dan promo — maka kerangka yang paling natural justru bukan model deret khusus, melainkan machine learning biasa yang kita sulap menjadi model peramal. Chapter berikutnya, Forecasting dengan Machine Learning , mengerjakannya.