Efek Ramadan dan Lebaran pada Model Peramalan Penjualan
TL;DR
Ramadan ngikutin kalender Hijriah yang setahunnya sekitar 354 hari, jadi tanggalnya maju sekitar 10 sampai 11 hari tiap tahun di kalender Masehi. Model peramalan yang cuma baca pola per bulan bakal nyari lonjakan di bulan yang salah. Solusinya bukan nambah data, tapi ganti sumbu waktunya: bikin variabel jarak hari ke Idul Fitri, lalu masukin sebagai penjelas tambahan ke model. Di data toko_berkah, langkah ini nurunin error peramalan Maret sampai Mei dari 31,4 persen jadi 9,8 persen.
Model peramalan penjualan di Indonesia sering meleset paling parah di bulan Maret sampai Mei. Penyebabnya satu: Ramadan ngikutin kalender Hijriah, jadi tanggalnya maju sekitar 10 sampai 11 hari tiap tahun di kalender Masehi.
Model yang cuma belajar pola per bulan bakal nyari lonjakan di bulan yang salah. Dan makin lama datanya, makin kacau, karena polanya nyebar ke dua bulan berbeda.
Aku ketemu masalah ini waktu bantu toko kelontong online bikin rencana stok, dan solusinya ternyata nggak butuh model yang lebih canggih.
Kenapa Ramadan bikin model peramalan meleset?
Kalender Hijriah setahunnya sekitar 354 hari, sedangkan kalender Masehi 365 hari. Selisih 11 hari itu numpuk tiap tahun, jadi Ramadan terus bergeser maju. Model peramalan standar nganggep musim itu berulang di posisi yang tetap, misalnya tiap Desember naik. Asumsi itu langsung rusak buat Ramadan.
Lihat pergeserannya dalam tiga tahun terakhir:
| Tahun | Awal Ramadan | Idul Fitri |
|---|---|---|
| 2023 | 23 Maret | 22 April |
| 2024 | 12 Maret | 10 April |
| 2025 | 1 Maret | 31 Maret |
Dalam dua tahun, puncak belanja Lebaran pindah dari akhir April ke akhir Maret. Itu jarak tiga minggu.
Kalau kamu latih model pakai data 2023 sampai 2025 dengan variabel bulan, model bakal lihat April 2023 ramai, April 2024 ramai, Maret 2025 ramai. Kesimpulan yang dia ambil: Maret dan April sama-sama agak ramai. Padahal yang benar, salah satunya ramai banget dan satunya biasa.
Hasilnya peramalan kamu kurang stok di pekan puncak dan kelebihan stok di pekan biasa. Dua-duanya mahal.
Pola apa yang sebenernya terjadi di data penjualan?
Dari data harian toko_berkah selama tiga siklus Ramadan, polanya konsisten dan kepecah jadi empat fase.
Fase 1, dua minggu sebelum Ramadan. Penjualan naik tipis sekitar 8 persen. Orang mulai stok bahan pokok.
Fase 2, dua minggu pertama Ramadan. Naik 34 persen dari pekan biasa. Sirup, kurma, dan tepung yang paling gerak.
Fase 3, sepuluh hari terakhir sebelum Idul Fitri. Ini puncaknya. Naik 118 persen dari pekan biasa, dengan hari tertinggi jatuh di H-4 sampai H-2.
Fase 4, dua minggu setelah Idul Fitri. Anjlok 41 persen di bawah pekan biasa. Banyak pembeli lagi mudik atau baru balik dan belum belanja rutin.
Yang paling sering dilupain analis adalah fase 4. Model yang cuma dikasih tahu soal lonjakannya bakal bikin kamu numpuk stok yang baru habis dua bulan kemudian.
Efeknya juga beda jauh per kategori:
| Kategori | Puncak vs pekan biasa | Pasca Lebaran |
|---|---|---|
| Sirup & minuman manis | +312% | -58% |
| Kue kering & camilan | +267% | -63% |
| Beras, minyak, tepung | +94% | -35% |
| Sabun & kebersihan | +21% | -12% |
| Popok & perlengkapan bayi | +6% | -4% |
Satu faktor pengali buat seluruh toko bakal salah di dua ujung. Sirup kurang pesan, popok kebanyakan.
Gimana cara masukin efek Ramadan ke model?
Intinya kamu ganti sumbu waktunya. Alih-alih nanya "ini bulan apa", model dikasih tahu "ini hari ke berapa dari Idul Fitri".
Langkahnya:
- Bikin tabel referensi berisi tanggal awal Ramadan dan Idul Fitri untuk tiap tahun di data kamu, plus tahun yang mau diramal.
- Tambahin kolom
hari_ke_lebarandi data harian. Isinya selisih hari antara tanggal transaksi dan tanggal Idul Fitri terdekat. Nilai negatif berarti sebelum Lebaran, positif berarti sesudah. - Batasi rentangnya, misalnya cuma dari -45 sampai +21. Di luar rentang itu isi 0 atau tandai sebagai periode normal.
- Bikin kolom penanda fase pakai logika kondisi. Di spreadsheet bisa pakai IF bertingkat, di SQL pakai CASE WHEN.
- Masukin kolom fase itu sebagai variabel penjelas tambahan ke model, bukan sebagai pengganti tren dan musim mingguan.
Kalau kamu pakai SARIMAX di statsmodels, variabel ini masuk lewat argumen exog. Dokumentasi parameternya ada di halaman resmi statsmodels. Isi exog waktu latihan dan waktu ramalan harus punya kolom yang sama persis.
Kalau kamu kerja di spreadsheet, prinsipnya nggak berubah. Hitung rata-rata penjualan per nilai hari_ke_lebaran dari tahun-tahun sebelumnya, lalu pakai itu sebagai faktor pengali terhadap peramalan dasar.
Model regresi juga bisa dipakai buat ngukur besaran efeknya secara terpisah. Cara bacanya mirip dengan yang dibahas di panduan regresi linear.
Contoh kasus toko_berkah: error turun dari 31,4 persen jadi 9,8 persen
Data yang dipakai: penjualan harian 1 Januari 2023 sampai 31 Desember 2024, dipakai buat ngeramal Januari sampai Juni 2025.
Model pertama cuma pakai tren plus musim mingguan dan bulanan. Model kedua sama persis, cuma ditambah variabel fase Ramadan tadi.
| Periode | Error model dasar | Error model dengan fase Ramadan |
|---|---|---|
| Januari - Februari 2025 | 7,2% | 7,4% |
| Maret - Mei 2025 | 31,4% | 9,8% |
| Juni 2025 | 8,9% | 8,1% |
Di bulan normal, dua model hampir sama. Bedanya cuma kelihatan di periode yang kena efek Ramadan, dan di situ selisihnya besar.
Yang paling kerasa di operasional: model dasar ngeramal puncak penjualan jatuh di minggu kedua April 2025. Yang sebenarnya terjadi, puncaknya di minggu keempat Maret. Meleset tiga minggu.
Buat toko, meleset tiga minggu artinya kiriman dari supplier datang setelah pembelinya pulang kampung.
Gimana kalau datanya cuma satu atau dua tahun?
Jangan biarin model yang nebak besaran efeknya. Dengan satu siklus Ramadan, model nggak bisa bedain mana lonjakan Ramadan dan mana kejadian sekali lewat.
Cara yang lebih aman: hitung faktor pengalinya secara manual.
Ambil rata-rata penjualan harian di periode normal sebagai patokan. Lalu hitung rasio tiap fase terhadap patokan itu dari data tahun lalu. Tempelin rasio itu ke hasil peramalan dasar kamu.
Cara ini kasar, tapi jauh lebih baik daripada model yang percaya diri di bulan yang salah.
Kalau kamu belum punya data internal sama sekali, mulai dari mencatat dulu tahun ini. Satu siklus tercatat rapi lebih berharga dari tiga tahun data yang tanggal Lebarannya nggak pernah dicatat.
Kesalahan umum
Nganggep lonjakan Ramadan sebagai outlier lalu dibuang. Ini kejadian berulang yang bisa diprediksi, bukan gangguan. Membuangnya bikin model kamu bersih tapi nggak berguna di bulan yang paling nentuin omzet.
Nyamain efeknya buat semua produk. Selisih antara +312 persen dan +6 persen kelewat besar buat dirata-ratain.
Lupa masukin tanggal Lebaran tahun depan. Variabel hari_ke_lebaran harus tersedia buat periode yang mau diramal. Kalau kolomnya kosong di masa depan, modelnya nggak bisa jalan.
Modelin lonjakannya doang. Penurunan pasca Lebaran sama pentingnya buat rencana stok.
Ngukur akurasi cuma dari rata-rata setahun. Error tahunan 12 persen kedengarannya bagus sampai kamu sadar 31 persen dari error itu numpuk di tiga bulan yang paling penting. Selalu pecah evaluasi per periode.
Pertanyaan yang sering muncul
Kenapa nggak cukup nambahin variabel bulan aja?
Karena Ramadan pindah bulan. Tahun 2023 puncaknya April, tahun 2025 akhir Maret. Variabel bulan bakal ngajarin model bahwa April selalu ramai, padahal tahun depan lonjakannya udah geser lagi. Yang kamu butuhin variabel jarak hari ke Idul Fitri.
Apakah efek Ramadan sama buat semua produk?
Nggak. Di toko_berkah, sirup naik 312 persen sementara popok cuma 6 persen. Kalau semua produk diramal pakai satu faktor, kategori yang nggak kena efeknya bakal dipesan kebanyakan. Hitung faktornya per kategori.
Apakah libur nasional lain perlu dimasukin juga?
Masukin yang efeknya kelihatan di data kamu, bukan semuanya. Kalau selisih penjualan di sekitar tanggal itu di bawah 10 persen dibanding hari biasa, nambahin variabelnya cuma bikin model lebih rumit tanpa hasil.
Model apa yang paling cocok buat pola kayak gini?
Yang penting bukan jenis modelnya, tapi apakah dia nerima variabel penjelas tambahan. SARIMAX, regresi dengan variabel musiman, dan model berbasis pohon keputusan semuanya bisa. Model yang nggak nerima variabel luar bakal selalu kesulitan di kasus ini.
Langkah berikutnya
Dua hal yang paling nentuin hasil di kasus ini. Pertama, ganti sumbu waktu dari nama bulan jadi jarak hari ke Idul Fitri. Kedua, pisahin faktornya per kategori produk, karena selisih antar kategori kelewat besar.
Buat rencana stok setelah peramalannya jadi, kamu bisa langsung pakai template stok barang di Excel. Kalau mau ngukur besaran tiap fase secara terpisah, mulai dari regresi linear.
Mulai sekarang, catat tanggal Idul Fitri di tabel referensi kamu. Tahun depan kamu bakal butuh kolom itu.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Pandas groupby: Agregasi Data ala Pivot di Python (2026)
groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.
Pandas read_excel: Baca File Excel di Python
pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.