Seluruh chapter sebelumnya membangun alat untuk menjelaskan deret waktu; chapter penutup section ini menghadapi tugas yang lebih menuntut: memprediksi, lalu menilai prediksi itu. Prediksi selalu berupa angka tunggal — “harga Nov sekitar 14300” — dan kualitasnya baru terukur setelah kenyataan tiba. Evaluasi forecast adalah disiplin mengukur jarak antara keduanya dengan angka yang tidak memihak model apa pun: seberapa jauh prediksi meleset, diringkas menjadi MAE, RMSE, dan MAPE. Untuk itu kita membagi dua belas bulan beras menjadi bagian latihan dan bagian ujian, memasang tiga model dengan tingkat kerumitan yang berbeda, dan membiarkan dua bulan terakhir menentukan urutan mereka.

Train dan Test untuk Deret Waktu #

Evaluasi yang jujur membutuhkan data yang tidak dipakai saat model dibentuk — kalau model dinilai pada data yang sama dengan bahan latihannya, skornya mencerminkan kemampuan mengingat, bukan memprediksi. Pada data cross-sectional kita bisa membagi observasi secara acak; pada deret waktu pembagian harus mengikuti arah waktu. Tujuan kita memprediksi masa depan, sehingga bagian ujian harus berada sepenuhnya setelah bagian latihan:

BagianBulanPeran
TrainJan-Okt (10 bulan)menaksir parameter model
TestNov-Des (2 bulan)mengukur kualitas prediksi

Mengapa urutan tidak boleh diacak? Karena pengacakan membocorkan masa depan ke masa lalu — model yang berlatih memakai seluruh deret acak bisa saja “melihat” harga Des sebelum diminta memprediksi harga Nov. Kebocoran semacam ini (data leakage) membuat skor evaluasi tampak bagus di atas kertas, lalu gagal ketika model dipakai sungguhan.

Baseline Naive dan Seasonal Naive #

Sebelum memasang model rumit, kita perlu baseline — model sederhana yang menjadi tolok ukur minimum. Dua baseline paling lazim pada deret waktu:

text
naive          : ŷt = Yt-1
seasonal naive : ŷt = Yt-m     (m = panjang periode musiman)

Notasi ŷ (dibaca “y-topi”) adalah nilai prediksi, konvensi yang sama dengan chapter Simple Linear Regression. Naive memprediksi bulan ini dengan nilai bulan lalu — “besar seperti kemarin”; seasonal naive memprediksi dengan nilai periode musim yang sama pada putaran sebelumnya. Untuk es krim kuartalan dengan m = 4, prediksi Q1 tahun ketiga adalah 190 porsi — penjualan Q1 tahun kedua. Data beras kita hanya menutup satu tahun, sehingga seasonal naive tidak tersedia dan kita bekerja dengan naive.

Baseline bukan sekadar formalitas. Model yang canggih hanya layak dipakai bila terbukti mengalahkan naive; bila kalah, kerumitannya tidak membeli apa-apa dan model sederhana justru lebih bisa dipercaya. Prinsip yang sama dipakai layanan prakiraan resmi — pembandingan dengan metode sederhana merupakan praktik standar yang juga dirangkum dalam NIST/SEMATECH e-Handbook .

Empat Metrik Error #

Error prediksi pada periode t didefinisikan sebagai selisih nilai aktual terhadap prediksi, dan keempat metrik merangkum barisan error tersebut:

text
et = Yt − ŷt

MAE  = Σ|et| / n
MSE  = Σ(et)² / n
RMSE = √(MSE)
MAPE = (Σ |et / Yt| / n) × 100 persen

MAE (mean absolute error) adalah rata-rata besaran meleset dalam satuan asal — untuk harga beras berarti rupiah, sehingga mudah dimaknai: “rata-rata prediksi meleset sekian rupiah”. MSE (mean squared error) mengkuadratkan setiap error lebih dulu, sehingga kesalahan besar diberi bobot jauh lebih berat daripada kesalahan kecil; konsekuensinya satuan menjadi rupiah kuadrat, dan RMSE menariknya kembali ke satuan rupiah dengan tetap mempertahankan kecondongan menghukum kesalahan besar. MAPE (mean absolute percentage error) membagi setiap error dengan nilai aktualnya, sehingga hasilnya berupa persen — berguna untuk membandingkan kualitas prediksi antar komoditas dengan skala harga berbeda. Satu kehati-hatian pada MAPE: bila nilai aktual mendekati nol, pembagian membuat persentasenya membengkak tanpa batas yang wajar.

Menghitung Naive pada Dua Bulan Test #

Prediksi Nov memakai informasi terakhir yang tersedia sebelum November dimulai — harga Okt sebesar 14200. Prediksi Des memakai harga Nov sebesar 14500, karena saat Desember diprediksi, November sudah terjadi. Kedua langkah dihitung penuh:

text
prediksi Nov = harga Okt = 14200
e(Nov) = 14500 − 14200 = 300

prediksi Des = harga Nov = 14500
e(Des) = 14400 − 14500 = −100

MAE  = (300 + 100) / 2 = 200
MSE  = (300² + 100²) / 2 = 100000 / 2 = 50000
RMSE = √50000 ≈ 223.61
MAPE = ((300/14500) + (100/14400)) / 2 × 100 ≈ 1.38 persen

Dua bulan ujian menghasilkan dua error: 300 dan −100 (tanda negatif berarti prediksi melebihi aktual). Naive rata-rata meleset 200 Rp, atau 1.38 persen bila dihitung relatif terhadap harga — MAPE yang kecil menandakan prediksi “harga bulan lalu” cukup akurat untuk deret yang pergerakan bulannya kecil. RMSE (223.61) lebih besar daripada MAE (200) karena error 300 memperoleh bobot besar setelah dikuadratkan — pola hubungan kedua metrik yang selalu berlaku bila error tidak sama besar.

Naive vs Mean vs Tren #

Model kedua adalah mean: prediksi kedua bulan ujian sama-sama diisi mean train, 133300 / 10 = 13330. Model ini secara diam-diam memasang asumsi deret stasioner — level tidak berpindah — padahal chapter pengenalan kita sudah menunjukkan mean beras berpindah. Model ketiga adalah tren linear, dengan parameter yang ditaksir hanya dari 10 bulan train:

text
b1 = (10 × 748000 − 55 × 133300) / (10 × 385 − 55²)
   = 148500 / 825
   = 180
b0 = (133300 − 180 × 55) / 10 = 12340

ŷ(Nov) = 12340 + 180 × 11 = 14320
ŷ(Des) = 12340 + 180 × 12 = 14500

Slope 180 Rp per bulan pada train sedikit di bawah slope 181.82 dari dua belas bulan penuh — wajar, karena dua bulan ujian tidak ikut ditaksir. Ketiga model kini diadu pada bulan yang sama:

Modelŷ Novŷ DesMAERMSEMAPE
naive1420014500200.00223.611.38 persen
mean13330133301120.001121.127.75 persen
tren linear1432014500140.00145.600.97 persen

Urutannya mudah dijelaskan. Mean kalah telak — lebih dari lima kali lipat dibanding naive — karena 13330 adalah level tengah tahun, jauh di bawah harga Nov-Des; asumsi stasioneritasnya tidak terpenuhi. Naive menangkap level terkini tetapi tidak menangkap arah, sehingga prediksi Nov-nya tertinggal 300. Tren menang karena memodelkan arah itu sendiri: prediksi 14320 dan 14500 berjarak 180 dan −100 dari aktual. Pelajaran praktisnya: asumsi model harus cocok dengan struktur data, dan model paling sederhana sekalipun wajib diadu dengan baseline sebelum dipercaya.

Overfitting dan Evaluasi Out-of-Sample #

Dekomposisi es krim pada chapter sebelumnya menghasilkan residual tepat nol — kecocokan sempurna pada data pembentuknya. Kejadian serupa mudah direkayasa: model yang cukup kompleks dapat menempel rapat pada setiap lembah dan puncak data latih. Tetapi menempel bukan memprediksi; model yang “menghafal” gejolak latih akan membawa hafalan yang keliru ke periode berikutnya, dan kemampuan prediksinya bisa lebih buruk daripada model sederhana. Inilah yang dinamai overfitting.

Ujian yang tidak bisa ditipu adalah evaluasi out-of-sample — data yang tidak pernah dilihat model selama pembentukannya, seperti dua bulan test kita. Ketika tren linear memenangi tabel di atas, kemenangannya terjadi di atas data yang model itu belum pernah sentuh; itulah satu-satunya bukti kemampuan prediksi yang bisa dipercaya sebelum model dipakai sungguhan. Latihan interaktif galat prediksi dan ringkasan data tersedia di Khan Academy , dan OpenIntro Statistics membahasnya dalam bab regresi.

Residual Forecast dan Walk-Forward #

Metrik angka bukan akhir pemeriksaan — barisan errornya juga perlu dibaca. Error yang tersisa setelah model terpasang idealnya menyerupai noise: kecil, dan naik-turun tanpa pola. Bila error masih berpola — misalnya selalu positif ketika harga naik, atau berulang setiap tiga bulan — model belum menghabiskan informasi yang tersedia di data, dan pola pada error itu adalah petunjuk perbaikan berikutnya. Pemeriksaan ini kelanjutan langsung dari pembacaan residual pada dekomposisi, kali ini diterapkan ke prediksi.

Praktik evaluasi yang paling meniru pemakaian nyata adalah walk-forward validation. Model dilatih sampai Okt, memprediksi Nov, error dicatat; kemudian harga Nov yang sudah terjadi masuk ke data latih, model ditaksir ulang, lalu memprediksi Des. Proses bergulir ini menjalankan re-estimasi pada setiap langkah, sehingga skor akhir mencerminkan kondisi pemakaian sebenarnya — model yang selalu diperbarui ketika data baru tiba. Pada data kita yang pendek, dua bulan test memadai untuk ilustrasi; pada deret bertahun-tahun, walk-forward menjadi standar sebelum model dipercaya menangani keputusan berharga.

Menghitung Metrik dengan Python #

Cuplikan berikut menghitung MAE, RMSE, dan MAPE untuk ketiga model:

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

naive = [latih[-1], aktual[0]]
rata_latih = sum(latih) / len(latih)
model_mean = [rata_latih, rata_latih]

t = list(range(1, 11))
n = len(latih)
st = sum(t)
st2 = sum(x * x for x in t)
sy = sum(latih)
sty = sum(x * y for x, y in zip(t, latih))
b1 = (n * sty - st * sy) / (n * st2 - st * st)
b0 = (sy - b1 * st) / n
model_tren = [b0 + b1 * 11, b0 + b1 * 12]

def metrik(prediksi):
    e = [a - p for a, p in zip(aktual, prediksi)]
    mae = sum(abs(x) for x in e) / len(e)
    mse = sum(x * x for x in e) / len(e)
    rmse = mse ** 0.5
    mape = sum(abs(x) / a for x, a in zip(e, aktual)) / len(e) * 100
    return mae, rmse, mape

print(f"{'model':<6}{'MAE':>10}{'RMSE':>10}{'MAPE':>9}")
for nama, model in [("naive", naive), ("mean", model_mean), ("tren", model_tren)]:
    mae, rmse, mape = metrik(model)
    print(f"{nama:<6}{mae:>10.2f}{rmse:>10.2f}{mape:>8.2f}%")

Output yang Dihasilkan:

text
model        MAE      RMSE     MAPE
naive     200.00    223.61    1.38%
mean     1120.00   1121.12    7.75%
tren      140.00    145.60    0.97%

Mari kita bedah kode di atas:

  1. Baris 5 (naive): prediksi Nov diambil dari latih[-1] (harga Okt), prediksi Des dari aktual[0] (harga Nov yang sudah terjadi) — sesuai aturan hanya memakai informasi yang tersedia.
  2. Baris 8-15 (b1 dan b0): regresi tren ditaksir hanya dari 10 bulan latih, menghasilkan b1 = 180 dan b0 = 12340, lalu prediksi 14320 dan 14500 untuk dua bulan ujian.
  3. Baris 17-23 (metrik): function menghitung MAE, RMSE (√MSE), dan MAPE dari barisan error; MSE sengaja tidak dicetak agar tabel ringkas.
  4. Baris 25-28 (loop): ketiga model melewati metrik yang sama — pembandingan yang adil karena ujian dan penghukuman identik bagi semuanya.

Tiga model sederhana telah diadu dan tren linear keluar sebagai yang terbaik pada dua bulan ujian beras — tetapi kejuaraan ini melekat pada data dan periode itu, bukan jaminan permanen. Dengan ini rangkaian teori deret waktu kita tuntas: komponen dikenali, diukur, dipecah, dan prediksinya dinilai secara jujur. Section berikutnya, Statistika dengan Python, membawa seluruh perhitungan manual ini — mean, regresi waktu, moving average, dekomposisi, hingga metrik forecast — ke dalam kode yang dapat dijalankan ulang pada data berukuran nyata.