TL;DR
Prophet adalah pustaka peramalan buatan Meta yang cuma butuh dua kolom data: ds untuk tanggal dan y untuk nilai yang mau diramal. Buat penjualan bulanan toko lokal, kamu perlu minimal 24 titik data supaya pola tahunan kebaca, dan idealnya 36 titik ke atas. Efek Lebaran nggak bisa ditangkap pola tahunan biasa karena tanggalnya geser tiap tahun, jadi harus didaftarkan manual lewat tabel hari libur. Hasil ramalannya keluar sebagai yhat plus rentang bawah dan atas, dan rentang itu yang lebih penting dipakai buat keputusan stok daripada satu angka tengah.
Prophet bisa bikin ramalan penjualan bulanan cuma dari dua kolom: tanggal dan nilai. Nggak perlu paham statistik deret waktu buat mulai.
Yang bikin dia cocok buat toko lokal di Indonesia: efek Lebaran bisa dimasukin secara eksplisit. Ini penting, soalnya tanggal Lebaran geser sekitar 11 hari tiap tahun, jadi model musiman biasa nggak bisa nangkap.
Di bawah ini alur lengkapnya pakai data toko_berkah: siapin data, latih model, masukin hari libur, baca hasil, dan ukur seberapa meleset ramalannya.
Prophet adalah pustaka Python dan R buatan Meta buat peramalan deret waktu. Dia memecah data jadi tiga bagian: tren jangka panjang, pola musiman berulang, dan efek hari libur. Ketiganya dijumlahkan jadi ramalan.
Prophet cocok kalau data kamu punya pola musiman yang jelas, jumlah titik datanya sedang, dan ada hari libur yang berpengaruh besar. Untuk penjualan toko lokal, tiga syarat itu biasanya kepenuhan.
Prophet kurang cocok kalau data kamu kurang dari 24 bulan, atau kalau penjualan kamu dikendalikan hal yang nggak berulang kayak promo besar yang jadwalnya acak. Model ini pada dasarnya sejenis regresi terhadap waktu, jadi dia cuma bisa belajar dari pola yang pernah kelihatan.
Prophet cuma nerima dua nama kolom, dan namanya nggak bisa diganti: ds buat tanggal, y buat nilai yang mau diramal. Tanggal harus bertipe datetime, nilai harus angka.
import pandas as pd
from prophet import Prophet
df = pd.read_csv("penjualan_bulanan_toko_berkah.csv")
# kolom asli: bulan, omzet
df = df.rename(columns={"bulan": "ds", "omzet": "y"})
df["ds"] = pd.to_datetime(df["ds"])
df = df.sort_values("ds").reset_index(drop=True)
print(df.shape)
print(df.head())
Kalau kamu belum punya Prophet, install dulu:
pip install prophet
Model paling dasar cuma tiga baris. Buat data bulanan, matiin pola mingguan dan harian, soalnya nggak ada informasi mingguan di data yang udah diagregasi per bulan.
m = Prophet(
yearly_seasonality=True,
weekly_seasonality=False,
daily_seasonality=False,
seasonality_mode="multiplicative",
)
m.fit(df)
future = m.make_future_dataframe(periods=6, freq="MS")
forecast = m.predict(future)
print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail(6))
Dua pilihan yang perlu kamu pahami:
freq="MS" artinya awal bulan. Kalau kamu pakai freq="D" di data bulanan, Prophet bakal bikin 6 hari ke depan, bukan 6 bulan.
seasonality_mode="multiplicative" artinya efek musiman dihitung sebagai persentase dari tren, bukan tambahan tetap. Buat penjualan yang tumbuh, ini biasanya lebih pas. Kalau omzet toko kamu naik dua kali lipat dalam tiga tahun, lonjakan Lebaran juga ikut membesar, dan mode ini yang nangkap itu.
Ini bagian yang paling sering dilewatin waktu orang pakai Prophet buat data Indonesia.
Pola tahunan Prophet dihitung dari posisi hari dalam kalender Masehi. Lebaran ngikutin kalender Hijriah, jadi tiap tahun mundur sekitar 11 hari. Buat Prophet, lonjakan Mei 2022 dan Maret 2025 kelihatan sebagai dua kejadian terpisah yang nggak berhubungan.
Solusinya bikin tabel hari libur sendiri:
lebaran = pd.DataFrame({
"holiday": "lebaran",
"ds": pd.to_datetime([
"2022-05-02",
"2023-04-22",
"2024-04-10",
"2025-03-31",
"2026-03-20",
]),
"lower_window": -30,
"upper_window": 7,
})
m = Prophet(
yearly_seasonality=True,
weekly_seasonality=False,
daily_seasonality=False,
seasonality_mode="multiplicative",
holidays=lebaran,
)
m.fit(df)
lower_window=-30 artinya efeknya mulai kerasa 30 hari sebelum hari H. Buat toko kelontong, belanja Ramadan naik jauh sebelum Lebaran, jadi jendela sebulan itu masuk akal. upper_window=7 nutup minggu setelahnya.
Tanggal 2026 di atas masih perkiraan sampai ada penetapan resmi. Perbarui filenya tiap tahun.
Buat libur nasional lain, Prophet punya jalan pintas:
m.add_country_holidays(country_name="ID")
Fungsi ini ngandalin paket holidays, jadi cek dulu versinya udah mendukung Indonesia atau belum. Cara pakainya ada di dokumentasi resmi Prophet soal hari libur.
Hasil predict punya banyak kolom, tapi yang kepakai sehari-hari cuma empat.
| Kolom | Artinya |
|---|---|
ds | Tanggal yang diramal |
yhat | Nilai ramalan tengah |
yhat_lower | Batas bawah rentang ketidakpastian |
yhat_upper | Batas atas rentang ketidakpastian |
Aturan pakainya: buat komunikasi ke manajemen, sebut rentangnya, bukan angka tengahnya. "Perkiraan omzet November antara Rp 44 juta sampai Rp 57 juta" jauh lebih jujur dari "Rp 50,5 juta".
Buat lihat komponennya secara terpisah:
fig1 = m.plot(forecast)
fig2 = m.plot_components(forecast)
Grafik komponen ini yang paling berguna buat diskusi. Dia misahin tren, pola tahunan, dan efek Lebaran jadi tiga garis terpisah, jadi kamu bisa nunjukin ke pemilik toko bagian mana yang naik dan kenapa.
Jangan percaya model yang belum diuji ke data yang belum pernah dia lihat. Prophet punya alat bawaan buat ini.
from prophet.diagnostics import cross_validation, performance_metrics
df_cv = cross_validation(
m,
initial="730 days",
period="180 days",
horizon="180 days",
)
df_p = performance_metrics(df_cv)
print(df_p[["horizon", "mape", "rmse"]].head())
Cara bacanya: initial berapa lama data dipakai buat latihan pertama, period seberapa sering titik potongnya digeser, horizon seberapa jauh ke depan yang diuji tiap kali.
Angka yang paling gampang dijelasin ke orang non teknis itu MAPE, rata-rata persentase meleset. MAPE 8% artinya ramalan kamu rata-rata meleset 8% dari angka sebenarnya.
Selalu bandingkan sama pembanding sederhana. Metode paling malas: pakai angka bulan yang sama tahun lalu sebagai ramalan. Kalau Prophet nggak bisa ngalahin metode itu, pakai yang sederhana aja.
Dataset latihan toko_berkah punya 45 bulan penjualan, dari Januari 2022 sampai September 2025. Omzet bulanan rata-rata Rp 198 juta, dengan bulan terendah Rp 142 juta dan tertinggi Rp 312 juta.
Hasil model setelah efek Lebaran dimasukin:
| Model | MAPE | Catatan |
|---|---|---|
| Ramalan malas (bulan sama tahun lalu) | 15,2% | Pembanding dasar |
| Prophet tanpa hari libur | 12,7% | Lebaran meleset jauh |
| Prophet dengan tabel Lebaran | 8,4% | Dipakai |
Yang menarik ada di grafik komponen. Efek Lebaran ketahan di angka plus 34% di atas garis tren, dan puncaknya jatuh sekitar 12 hari sebelum hari H, bukan di hari H-nya.
Ini nyambung sama pola belanja kebutuhan pokok: orang borong beras, minyak, dan gula dua minggu sebelum Lebaran, terus toko sepi di minggu Lebaran karena banyak yang mudik.
Ramalan enam bulan ke depan buat toko ini:
| Bulan | yhat | Rentang |
|---|---|---|
| Okt 2025 | Rp 204 juta | Rp 181 juta sampai Rp 228 juta |
| Nov 2025 | Rp 211 juta | Rp 186 juta sampai Rp 237 juta |
| Des 2025 | Rp 243 juta | Rp 214 juta sampai Rp 274 juta |
| Jan 2026 | Rp 196 juta | Rp 169 juta sampai Rp 224 juta |
| Feb 2026 | Rp 218 juta | Rp 188 juta sampai Rp 250 juta |
| Mar 2026 | Rp 289 juta | Rp 248 juta sampai Rp 333 juta |
Maret 2026 melonjak karena Lebaran jatuh di bulan itu. Rentangnya juga paling lebar, yang masuk akal: bulan yang paling nggak biasa juga paling susah diramal.
Buat keputusan stok, angka yang aku pakai bukan Rp 289 juta, tapi batas atasnya. Barang kayak beras dan minyak nggak cepat basi, jadi kelebihan stok lebih murah biayanya dibanding kehabisan di puncak musim. Logika ini yang aku tuangin ke dashboard stok barang.
changepoint_prior_scale nggak akan nolong kalau ada tiga bulan yang angkanya salah input.Alur lengkap dari nol sampai grafik pertama ada di panduan quick start resmi Prophet.
Buat data bulanan, minimal 24 titik atau dua tahun, supaya Prophet bisa lihat pola tahunan terulang minimal sekali. Di bawah itu, hasilnya lebih mirip garis tren lurus daripada ramalan musiman. Kalau kamu punya 36 titik ke atas, pola musimannya jauh lebih stabil. Data harian butuh lebih sedikit rentang waktu, tapi tetap idealnya menutup dua siklus tahunan.
Karena pola tahunan Prophet dihitung berdasarkan posisi hari dalam kalender Masehi, sementara Lebaran ngikutin kalender Hijriah dan mundur sekitar 11 hari tiap tahun. Buat Prophet, lonjakan bulan Mei 2022 dan Maret 2025 kelihatan sebagai dua kejadian yang nggak berhubungan. Solusinya daftarin tanggal Lebaran tiap tahun secara manual sebagai tabel hari libur.
yhat itu nilai ramalan tengah, angka yang paling mungkin menurut model. yhat_lower dan yhat_upper batas bawah dan atas dari rentang ketidakpastian, standarnya 80 persen. Buat keputusan stok, pakai rentangnya, bukan angka tengahnya. Kalau ramalan Oktober 47 juta dengan rentang 41 sampai 54 juta, siapin stok buat skenario 54 juta kalau barangnya awet.
Tergantung datanya. Kalau penjualan kamu datar tanpa musiman jelas, rata-rata bergerak sering sama akuratnya dan jauh lebih gampang dijelasin ke atasan. Prophet unggul waktu ada pola musiman kuat, tren yang berubah arah, atau hari libur yang geser tiap tahun. Selalu bandingkan hasilnya sama metode sederhana dulu sebelum mutusin pakai yang mana.
Bisa. Google Colab dan marimo di molab udah menyediakan Python siap pakai di browser, tinggal jalanin pip install prophet di sel pertama. Cara ini yang paling cepat buat nyoba, apalagi kalau laptop kantor kamu dikunci dan nggak bisa install software. Data cukup diunggah sebagai CSV dua kolom.
Tiga hal yang nentuin kualitas ramalan Prophet kamu: jumlah data minimal dua tahun, tabel Lebaran yang diisi manual, dan kebiasaan bandingin hasilnya sama metode sederhana.
Kalau kamu mulai hari ini, cukup siapin file CSV dua kolom berisi omzet bulanan tiga tahun terakhir. Sepuluh baris kode pertama di artikel ini udah cukup buat dapet grafik pertama.
Angka ramalannya baru berguna kalau masuk ke rutinitas kerja. Taruh di kartu terpisah di dashboard rapat mingguan penjualan, biar tiap Senin kamu bisa bandingin ramalan sama kenyataan.
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.