Chapter Line Chart ditutup dengan satu janji: moving average, garis perata yang diletakkan di atas harga mentah untuk meredam gejolak jangka pendek. Janji itu kita tepati sekarang. Harga beras naik dalam tren yang jelas, tetapi harga turun tipis empat kali — pada Mar, Jun, Sep, dan Des — dan pembaca grafik bisa salah menafsirkan satu penurunan sebagai awal pembalikan arah. Moving average mengganti setiap titik data dengan rata-rata beberapa periode di sekitarnya sehingga gejolak kecil saling meniadakan dan arah besar semakin terbaca. Chapter ini menghitung MA(3) dan MA(5) pada dua belas bulan beras, membandingkan efek lebar jendela, lalu menandai batas-batas alat ini sebelum kita melangkah ke dekomposisi.

Ide Perata: Rata-rata Bergerak #

Moving average adalah mean yang digeser maju bersama waktu: pada setiap bulan, kita hitung rata-rata k bulan terakhir yang berakhir tepat pada bulan tersebut. Banyaknya periode yang dirata-ratakan (k) disebut lebar jendela. Rumusnya:

text
MA(k) pada bulan t = (Yt-k+1 + Yt-k+2 + ... + Yt) / k

MA(3) pada bulan t = (Yt-2 + Yt-1 + Yt) / 3

Perata berhasil karena dua sumber pergerakan bersifat berbeda. Fluktuasi jangka pendek naik-turun di sekitar tren secara bergantian, sehingga menjumlahkan beberapa bulan membuat bagian naik dan bagian turun saling menutup — persis logika mean dari chapter Mean yang kali ini diberlakukan bergeser. Tren yang bergerak konsisten searah tidak saling meniadakan, melainkan terakumulasi, sehingga bentuknya bertahan dalam rata-rata. Definisi “berakhir pada bulan t” kita pilih karena praktis: nilai MA pada bulan berjalan hanya memakai informasi yang sudah tersedia, sehingga bisa langsung dipakai sebagai kandidat prediksi bulan berikutnya.

Menghitung MA(3) pada Harga Beras #

Nilai pertama dihitung penuh sebagai contoh, selebihnya mengikuti pola yang sama:

text
MA(3) bulan 3 = (12500 + 12800 + 12700) / 3
              = 38000 / 3
              = 12666.67   (dibulatkan ke dua desimal)

Tabel lengkap dua belas bulan — dua bulan pertama belum memiliki nilai karena jendelanya belum terisi penuh:

BulanHarga (Rp/kg)MA(3) (Rp/kg)
Jan12500—
Feb12800—
Mar1270012666.67
Apr1310012866.67
Mei1340013066.67
Jun1330013266.67
Jul1360013433.33
Agu1390013600.00
Sep1380013766.67
Okt1420013966.67
Nov1450014166.67
Des1440014366.67

Sepuluh nilai MA(3) menampilkan sifat yang menonjol: barisan naik setiap bulan tanpa kecuali, padahal harga mentah turun empat kali. Gejolak turun 100 Rp terbagi rata ke dalam jendela tiga bulan, sehingga kenaikan bulanan MA hanya berkisar antara 166.67 dan 200 Rp — jauh lebih landai dan mudah dibaca arahnya. Inilah kegunaan pertama moving average: mendeteksi tren di balik noise dengan cara menyaring noise-nya terlebih dahulu.

Efek Lebar Jendela: MA(3) vs MA(5) #

Jendela yang berbeda menghasilkan garis perata yang berbeda. MA(5) tersedia mulai bulan Mei; tabel berikut membandingkan keduanya pada empat bulan terakhir:

BulanHarga (Rp/kg)MA(3) (Rp/kg)MA(5) (Rp/kg)
Sep1380013766.6713600.00
Okt1420013966.6713760.00
Nov1450014166.6714000.00
Des1440014366.6714160.00

Dua efek bekerja serentak. Pertama, kehalusan: pada setiap pergantian bulan satu bulan baru masuk jendela dan satu bulan lama keluar, sehingga perubahan MA(k) sama dengan (nilai masuk − nilai keluar) / k. Lompatan harga 400 Rp pada Okt (dari 13800 ke 14200) hanya menggerakkan MA(5) sebesar (14200 − 13400) / 5 = 160 Rp, sebab lompatan itu terbagi lima — makin lebar jendela, makin kuat gejolak diredam. Kedua, lag: pada deret menanjak, MA(k) selalu tertinggal karena jendelanya masih memuat harga lama yang lebih rendah. Pada Des, MA(5) = 14160 masih menyertakan harga Agu dan Sep, sementara MA(3) = 14366.67 hanya memuat tiga bulan termutakhir; jarak keduanya 206.67 Rp.

Pilihan jendelaKehalusanKecepatan meresponsBesarnya lag
Kecil (k = 3)sedangtinggikecil
Besar (k = 5)tinggirendahbesar

Kelemahan Moving Average #

Moving average memiliki batas yang perlu diakui sejak awal. Nilai MA(k) baru tersedia mulai bulan ke-k, sehingga ujung awal deret kosong — pada beras kita, dua bulan pertama tidak punya MA(3) dan empat bulan pertama tidak punya MA(5). Pada ujung akhir, lag bekerja melawan pembaca: MA(3) Des sebesar 14366.67 masih 33.33 di bawah harga aktual 14400, dan MA(5) tertinggal 240 Rp, karena keduanya dirata-ratakan dari harga-harga yang lebih rendah.

Keterbatasan yang paling menentukan: moving average bukan alat prediksi jangka panjang. Prediksi bulan ke-13 dengan MA(3) hanya menghasilkan 14366.67 — level bulan Des yang diperpanjang datar — dan bila hasil prediksi itu dirantai berulang, barisan prediksi mendatar karena tidak ada informasi arah yang masuk. Pergerakan harga berikutnya justru dibawa oleh model tren dari chapter Tren dan Musiman atau oleh keluarga exponential smoothing di bawah. Ditambah lagi, pemilihan k bersifat subjektif: jendela yang berbeda memberi kisah kehalusan dan lag yang berbeda, sehingga pilihan k sebaiknya punya alasan — misalnya disamakan dengan periode musiman.

Jendela Genap dan Centered MA #

MA(4) pada data kuartalan menghadapi satu keanehan: jendela empat kuartal tidak punya titik tengah, sehingga hasilnya jatuh di antara dua kuartal — posisi 2.5, 3.5, dan seterusnya. Solusinya, dua nilai MA(4) yang berurutan dirata-ratakan kembali sehingga hasilnya duduk tepat pada posisi kuartal; hasilnya disebut MA terpusat (centered MA, atau MA 2×4). Teknik ini dipakai penuh pada chapter Time Series Decomposition sebagai penaksir tren.

Dari Weighted MA ke Exponential Smoothing #

MA memberi bobot sama (1/k) kepada seluruh bulan dalam jendela dan bobot nol kepada bulan di luarnya — pilihan yang kasar, sebab data terbaru biasanya lebih relevan daripada data lama. Weighted MA memperbaikinya dengan bobot yang menurun untuk periode yang semakin lampau. Bentuk yang paling banyak dipakai adalah exponential smoothing: bobot menurun secara geometris dan dikendalikan satu parameter pemulus α, sehingga seluruh riwayat ikut dihitung dengan pengaruh yang terus mengecil. Keluarga Holt-Winters memperluas exponential smoothing dengan komponen tren dan musiman; keduanya tersedia pada pustaka statsmodels dan menjadi materi pengayaan setelah fondasi section ini dikuasai.

Menghitung MA(3) dan MA(5) dengan Python #

Cuplikan berikut menghitung kedua moving average dengan satu function:

python
beras = [12500, 12800, 12700, 13100, 13400, 13300,
         13600, 13900, 13800, 14200, 14500, 14400]

def moving_average(data, k):
    hasil = []
    for t in range(k, len(data) + 1):
        hasil.append((t, sum(data[t - k:t]) / k))
    return hasil

for label, k in [("MA(3)", 3), ("MA(5)", 5)]:
    print(label)
    for t, nilai in moving_average(beras, k):
        print(f"  bulan {t:2d}: {nilai:8.2f}")

Output yang Dihasilkan:

text
MA(3)
  bulan  3: 12666.67
  bulan  4: 12866.67
  bulan  5: 13066.67
  bulan  6: 13266.67
  bulan  7: 13433.33
  bulan  8: 13600.00
  bulan  9: 13766.67
  bulan 10: 13966.67
  bulan 11: 14166.67
  bulan 12: 14366.67
MA(5)
  bulan  5: 12900.00
  bulan  6: 13060.00
  bulan  7: 13220.00
  bulan  8: 13460.00
  bulan  9: 13600.00
  bulan 10: 13760.00
  bulan 11: 14000.00
  bulan 12: 14160.00

Mari kita bedah kode di atas:

  1. Baris 4-8 (moving_average): irisan data[t - k:t] selalu berakhir tepat pada bulan t, sesuai definisi trailing yang kita pilih; nilai disimpan bersama posisi bulannya.
  2. Baris 13 (for t, nilai ...): MA(3) menghasilkan 10 nilai dan MA(5) hanya 8 — makin lebar jendela, makin banyak titik awal yang kosong.
  3. Baris terakhir tiap kelompok: MA(3) Des 14366.67 berbanding MA(5) 14160.00 menampilkan lag 206.67 Rp — bukti angka dari perbandingan jendela di atas.

Pada pandas, operasi seperti ini diselesaikan satu panggilan melalui rolling(k).mean() — dokumentasinya di pandas.pydata.org — dan akan kita pakai pada Section Statistika dengan Python. Moving average memangkas gejolak dan menonjolkan arah, tetapi hasilnya masih satu garis; dari mana gejolak itu berasal belum dijelaskan. Chapter Time Series Decomposition melangkah lebih jauh dengan memecah deret menjadi tren, musiman, dan residual secara bersamaan, memakai moving average terpusat sebagai alat utamanya.