Exponential smoothing meramal dengan memuluskan; model autoregressive (AR) meramal dengan regresi. Gagasan intinya satu kalimat: nilai hari ini adalah fungsi linear dari nilai-nilai sebelumnya ditambah noise. Kedengarannya sederhana, tetapi dari persamaan itulah seluruh keluarga ARIMA dibangun — dan memahaminya sekarang akan membuat chapter ARIMA terasa seperti menyusun potongan yang sudah dikenal. Pada chapter ini kita tulis persamaan AR(p), ukur kekuatan hubungan antar-lag lewat korelasi, lalu pasang model AutoReg dari statsmodels pada penjualan Toko Kopi Kita dan tafsirkan koefisiennya.

Ide Dasar AR: Regresi pada Nilai Lampau #

Model autoregressive orde p — ditulis AR(p) — menuliskan nilai sekarang sebagai kombinasi linear dari p nilai lampau:

text
y_t = c + phi_1 * y_(t-1) + phi_2 * y_(t-2) + ... + phi_p * y_(t-p) + eps_t

y_t    = nilai deret pada waktu t
c      = konstanta (intercept)
phi_k  = koefisien untuk lag ke-k
eps_t  = noise pada waktu t

Namanya menjelaskan dirinya sendiri: auto (diri sendiri) regressive (regresi) — regresi yang variabel bebasnya adalah salinan variabel terikat itu sendiri, digeser beberapa langkah ke belakang. Angka p menentukan seberapa jauh memori modelnya: AR(1) hanya melihat kemarin, AR(7) melihat satu pekan penuh. Jumlah lag yang tepat biasanya mengikuti struktur datanya — untuk pola mingguan, lag ke-7 adalah lag yang menyimpan informasi paling langsung: hari yang sama pekan lalu.

Mengukur Hubungan Antar-Lag dengan Korelasi #

Sebelum memilih p, kita ukur dulu lag mana yang benar-benar berhubungan dengan nilai sekarang. Caranya masih memakai jurus chapter pertama — shift() lalu .corr() — kali ini untuk delapan lag sekaligus, dari 1 sampai 14 hari.

python
import numpy as np
import pandas as pd

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

baris = []
for lag in [1, 2, 3, 4, 5, 6, 7, 14]:
    korelasi = deret.corr(deret.shift(lag))
    baris.append({"lag": lag, "korelasi": round(korelasi, 3)})
print(pd.DataFrame(baris).to_string(index=False))

Output yang Dihasilkan:

text
 lag  korelasi
   1     0.773
   2     0.545
   3     0.460
   4     0.448
   5     0.494
   6     0.708
   7     0.862
  14     0.872

Cara membaca tabelnya:

  1. Lag 1 (0,773) tinggi karena dua hal sekaligus: tren yang bergerak pelan (nilai kemarin dan hari ini sama-sama berada di level serupa) dan kontinuitas antar hari.
  2. Lag 2 sampai 5 melorot ke 0,45-0,55 — begitu keluar dari kedekatan harian, hubungannya melemah.
  3. Lag 6 dan 7 menanjak kembali ke 0,708 dan 0,862 — ini sidik jari musiman mingguan: Jumat bersama Jumat pekan lalu, Sabtu bersama Sabtu pekan lalu. Lag 14 (0,872) menegaskan hal yang sama dari jarak dua pekan.
  4. Tabel seperti ini adalah bentuk sederhana dari ACF (autocorrelation function) — statsmodels menyediakan plot_acf dan plot_pacf untuk menggambarkannya beserta batas keberartian; ACF menunjukkan hubungan total (langsung + tak langsung), sedangkan PACF (partial autocorrelation) mengisolasi pengaruh langsung tiap lag setelah lag-lain dikendalikan. Pasangan grafik itulah alat klasik memilih p dan q pada ARIMA.

Memasang Model AutoReg #

Korelasi menunjuk ke lag 7, jadi kita pasang AR(7): regresi nilai sekarang atas tujuh nilai pekan yang baru lewat. Kelas AutoReg dari statsmodels mengerjakannya dengan metode kuadrat terkecil — mekanisme yang sama dengan LinearRegression pada supervised learning.

python
import numpy as np
import pandas as pd
from statsmodels.tsa.ar_model import AutoReg

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 = AutoReg(deret, lags=7, old_names=False).fit()
print(model.params.round(3))
print()
ramalan = model.predict(start=42, end=48)
print(ramalan.round(1))

Output yang Dihasilkan:

text
const       7.360
gelas.L1    0.302
gelas.L2   -0.079
gelas.L3   -0.050
gelas.L4   -0.025
gelas.L5   -0.016
gelas.L6    0.251
gelas.L7    0.551
dtype: float64

2025-02-17    70.2
2025-02-18    65.0
2025-02-19    63.8
2025-02-20    68.0
2025-02-21    77.7
2025-02-22    83.8
2025-02-23    81.1
Freq: D, dtype: float64

Mari kita bedah hasilnya:

  1. AutoReg(deret, lags=7).fit() membangun 35 baris data latih (42 titik dikurangi 7 lag) — tiap baris berisi tujuh nilai lampau dan satu nilai sekarang — lalu menaksir koefisien phi_1 sampai phi_7 beserta konstanta.
  2. Koefisien terbesar adalah gelas.L7 (0,551): nilai hari yang sama pekan lalu adalah prediktor tunggal terkuat, persis seperti janji tabel korelasi. gelas.L6 (0,251) menyusul — hari yang bersebelahan dalam pola akhir pekan (Sabtu-Minggu) juga saling menjelaskan.
  3. gelas.L2 sampai gelas.L5 nyaris nol (-0,079 s.d. -0,016): hari Selasa yang jauh dari akhir pekan nyaris tak menambah informasi setelah kemarin dan minggu lalu diperhitungkan. Inilah persis wajah PACF yang dibicarakan di atas — koefisien AR memang mengendalikan lag-lag lain.
  4. predict(start=42, end=48) meramal tujuh hari setelah data berakhir; indeks tanggal dilanjutkan otomatis oleh statsmodels. Bentuk ramalannya kini bergelombang mingguan — menurun ke hari kerja awal pekan (63,8) lalu memuncak Sabtu (83,8) — sesuai musiman yang dipelajari.
  5. Jumlah koefisien lag sekitar 0,93 (0,302 - 0,079 - 0,050 - 0,025 - 0,016 + 0,251 + 0,551) nyaris menyentuh 1. Model hampir bersifat random walk-ish: ia memindahkan level hari ini ke besok hampir utuh — cara AR mengakomodasi tren tanpa benar-benar menstasionerkannya.

Rangkuman #

  • AR(p) menuliskan nilai sekarang sebagai kombinasi linear p nilai lampau plus noise; p adalah panjang memori model.
  • Tabel korelasi lag adalah ACF versi manual; lag 7 dan 14 yang tinggi pada data kita menandakan musiman mingguan yang layak masuk model.
  • AutoReg menaksir koefisien via kuadrat terkecil; koefisien lag 7 terbesar (0,551) dan lag tengah pekan nyaris nol — struktur mingguan terbaca pada bobotnya.
  • Memasang AR pada deret bertren membuat jumlah koefisien mendekati 1; jalur yang benar adalah differencing dulu, lalu AR — tepat kerangka ARIMA.

Kita kini menguasai dua bata bangunan ARIMA: differencing dari chapter Stasioneritas, dan AR dari chapter ini. Satu bata terakhir belum kita bahas — komponen moving average dalam artian model (bukan pemulusan): error kemarin yang ikut menjelaskan hari ini. Ketiganya dirangkai pada chapter berikutnya, ARIMA .

Referensi #

  1. statsmodels — Time Series Analysis (tsa)
  2. scikit-learn — LinearRegression