TL;DR
Baseline forecasting adalah metode peramalan paling sederhana yang dipakai sebagai pembanding, misalnya naive (ramalan besok = nilai hari ini) dan seasonal naive (ramalan Senin depan = nilai Senin lalu). Model rumit baru layak dipakai kalau errornya lebih kecil dari baseline ini. Di data harian toko_berkah, seasonal naive mingguan ngasih MAE Rp 412.000 dan ngalahin rata-rata bergerak 7 hari yang MAE-nya Rp 486.000.
Ramalan penjualan yang paling susah dikalahkan sering kali yang paling malas: angka Senin depan sama dengan angka Senin kemarin.
Namanya baseline forecasting. Metode ini nggak punya parameter, nggak butuh training, dan bisa kamu tulis dalam satu baris kode. Tugas dia bukan jadi ramalan final, tapi jadi garis pembanding yang harus dikalahkan model lain.
Aku pakai data penjualan harian toko_berkah buat nunjukin angkanya. Hasilnya bikin aku nunda pasang model yang lebih rumit.
Baseline forecasting adalah metode peramalan paling sederhana yang dipakai sebagai titik nol pembanding. Ramalannya cuma nyalin nilai masa lalu tanpa ngitung apa-apa. Kalau model yang kamu bangun errornya nggak lebih kecil dari baseline ini, model itu nggak nambah nilai apa pun dan mending nggak usah dipakai.
Empat bentuk yang paling sering kepakai:
| Nama | Aturannya | Cocok waktu |
|---|---|---|
| Naive | Ramalan besok = nilai hari ini | Data yang gerakannya lambat |
| Seasonal naive | Ramalan Senin depan = nilai Senin lalu | Ada pola harian atau bulanan |
| Mean | Ramalan = rata-rata seluruh riwayat | Data yang muter di sekitar satu angka |
| Drift | Naive plus kemiringan rata-rata riwayat | Ada tren naik atau turun jelas |
Definisi lengkap keempatnya ada di buku Forecasting: Principles and Practice karya Hyndman dan Athanasopoulos, yang bisa dibaca gratis.
Tiga alasan yang paling sering aku temuin di data bisnis Indonesia.
Datanya pendek. Toko yang buka dua tahun punya sekitar 700 baris data harian. Model dengan puluhan parameter butuh lebih banyak dari itu buat belajar pola beneran, jadi dia sering hafal keributan acak.
Polanya kuat dan gampang. Warung dekat kantor rame Senin sampai Jumat, sepi Sabtu Minggu. Seasonal naive nangkep pola itu tanpa diajarin.
Kejutan besarnya datang dari luar data. Lebaran, banjir, jalan depan toko ditutup proyek. Nggak ada model deret waktu yang bisa nebak itu dari riwayat penjualan doang.
Aku bukan lagi bilang model canggih nggak berguna. Poinnya, kamu perlu tau berapa nilai tambahnya sebelum ngeluarin ongkos ngerawatnya.
Bagian ini butuh satu fungsi doang: shift. Dia geser kolom ke bawah sejumlah baris yang kamu minta.
import pandas as pd
df = pd.read_csv("penjualan_harian.csv", parse_dates=["tanggal"])
df = df.sort_values("tanggal").reset_index(drop=True)
# Baseline 1: naive, ramalan hari ini = penjualan kemarin
df["naive"] = df["omzet"].shift(1)
# Baseline 2: seasonal naive mingguan, ramalan = 7 hari lalu
df["snaive"] = df["omzet"].shift(7)
# Pembanding: rata-rata bergerak 7 hari
df["ma7"] = df["omzet"].shift(1).rolling(7).mean()
Perhatikan shift(1) sebelum rolling di baris terakhir. Tanpa itu, rata-ratanya ikut ngitung penjualan hari yang lagi diramal, dan itu curang. Kesalahan ini namanya kebocoran data, dan dia bikin hasil evaluasimu keliatan bagus padahal nggak.
Kalau kamu lebih sering kerja di database, pola yang sama bisa ditiru pakai window function seperti di artikel rata-rata bergerak 7 hari di SQL.
Pakai satu angka error yang gampang dijelasin. Aku pilih MAE, rata-rata selisih mutlak antara ramalan dan kenyataan, karena satuannya tetap rupiah.
from sklearn.metrics import mean_absolute_error
uji = df.dropna().copy()
for kolom in ["naive", "snaive", "ma7"]:
mae = mean_absolute_error(uji["omzet"], uji[kolom])
print(kolom, round(mae))
Tiga catatan waktu ngukur:
Kalau kamu perlu penyegaran soal cara milih angka pengukur, baca dulu definisi metric.
Datanya 182 hari penjualan sebuah toko kelontong, Mei sampai Oktober. Rata-rata omzet harian Rp 2.740.000. Aku pakai 140 hari pertama sebagai riwayat dan 42 hari terakhir buat pengujian.
Hasilnya:
| Metode | MAE | Error terburuk | Catatan |
|---|---|---|---|
| Naive (kemarin) | Rp 597.000 | Rp 2.310.000 | Kacau tiap Sabtu dan Senin |
| Seasonal naive 7 hari | Rp 412.000 | Rp 1.640.000 | Paling kecil errornya |
| Rata-rata bergerak 7 hari | Rp 486.000 | Rp 1.880.000 | Ratain pola akhir pekan |
| Rata-rata seluruh riwayat | Rp 731.000 | Rp 2.960.000 | Buta sama pola mingguan |
Seasonal naive menang dengan MAE Rp 412.000, sekitar 15% dari omzet harian rata-rata. Rata-rata bergerak kalah 18% dari seasonal naive, dan alasannya masuk akal: dia ngeratain hari Sabtu yang omzetnya 2,1 kali hari Selasa.
Ada satu hari yang bikin semua metode meleset jauh, yaitu tanggal 17 Agustus. Omzetnya lompat ke Rp 6.100.000 gara-gara lomba di kompleks. Itu bukan kesalahan model, itu outlier yang penyebabnya ada di kalender, bukan di data penjualan.
Kesimpulan praktis buat toko ini: pakai seasonal naive sebagai angka dasar, terus tambahin penyesuaian manual buat tanggal merah. Model deret waktu yang lebih rumit baru dicoba kalau data promo dan jadwal libur udah tercatat rapi.
shift bikin baseline-nya jelek tanpa alasan.Baseline forecasting adalah ramalan paling sederhana yang kamu pakai sebagai garis pembanding. Bentuk paling umum ada dua: naive, yang bilang nilai besok sama dengan nilai hari ini, dan seasonal naive, yang bilang nilai Senin depan sama dengan nilai Senin kemarin. Angka errornya jadi patokan. Model apa pun yang kamu bikin harus lebih kecil errornya dari itu supaya layak dipakai.
Soalnya data penjualan harian punya pola berulang yang kuat dan riwayat yang pendek. Model dengan banyak parameter butuh data banyak buat belajar. Kalau kamu cuma punya 200 hari data, model itu lebih sering hafal keributan acak daripada pola sesungguhnya. Baseline nggak punya parameter buat dihafal, jadi dia lebih tahan waktu datanya sedikit.
Buat mulai, pakai MAE karena satuannya sama dengan datamu, jadi gampang dijelasin ke atasan: rata-rata meleset Rp 412.000 per hari. RMSE bikin kesalahan besar kena hukuman lebih berat, cocok kalau salah besar itu mahal. MAPE hindari kalau datamu pernah nol atau mendekati nol, soalnya pembagiannya meledak.
Minimal delapan minggu supaya kamu punya cukup hari yang sama buat dibandingkan, dan idealnya enam bulan biar pengaruh musim mulai kelihatan. Kurang dari delapan minggu, satu hari libur nasional aja udah cukup buat bikin angka errornya nggak bisa dipercaya. Kalau datamu memang segitu, sebut aja hasilnya sebagai perkiraan kasar.
Model tambahan baru masuk akal kalau kamu punya informasi yang nggak dimiliki baseline. Contohnya jadwal promo, kalender libur, harga kompetitor, atau cuaca. Baseline cuma tau riwayat penjualan. Kalau kamu bisa masukin faktor luar itu dan errornya turun jauh di bawah baseline, model itu layak dirawat. Kalau turunnya cuma dua persen, ongkos perawatannya nggak sepadan.
Dua hal yang perlu nempel:
shift(7) udah cukup.Ambil data penjualan enam bulan terakhir di tempat kerjamu, hitung MAE seasonal naive-nya, dan simpan angkanya. Itu jadi patokan buat semua percobaan berikutnya.
Kalau kamu lebih nyaman kerja di spreadsheet, cara serupa bisa dijalanin lewat rumus FORECAST di Excel. Buat ngerapihin datanya dulu, fungsi AVERAGE dan MEDIAN biasanya yang pertama kepakai.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.