Seluruh proyek sebelumnya — klasifikasi churn, regresi harga rumah, segmentasi pelanggan — mengolah tabel yang barisnya bisa dibaca dalam urutan apa pun: satu pelanggan tidak membuat pelanggan lain lebih mudah ditebak. Deret waktu membatalkan kelonggaran tersebut. Pada data penjualan harian, baris hari ini adalah kelanjutan langsung dari baris kemarin; urutan bukan detail teknis melainkan struktur informasinya sendiri. Proyek ini menghadapi konsekuensinya dari awal sampai akhir: split yang wajib kronologis, fitur yang wajib lahir dari masa lalu, dan validasi yang wajib meniru cara model dipakai di dunia nyata — meramal hari yang belum terjadi.

Masalah Peramalan Penjualan Harian #

Toko ritel perlu tahu penjualan dua pekan ke depan untuk mengatur pemesanan stok: ramalan terlalu rendah membuat barang habis di akhir pekan yang ramai, ramalan terlalu tinggi mengikat kas di barang yang lambat terjual. Target proyek ini sederhana dinyatakan namun berdampak langsung: prediksi penjualan harian sepanjang horizon 14 hari dengan galat rata-rata sekecil mungkin, diukur dalam unit per hari. Tolok ukur keberhasilannya bertingkat — model harus mengalahkan baseline statistik pada satu split, lalu membuktikan keunggulan tersebut stabil lintas beberapa periode uji berurutan lewat validasi walk-forward.

Proyek menempuh rute baseline statistik → model machine learning berbasis fitur lag: dekomposisi musiman diaproksimasi lewat rata-rata per hari-minggu dan per bulan, sementara ketergantungan antar-nilai ala ARIMA ditangkap lewat fitur lag 1, 7, dan 14. Rute ML dipilih karena mudah diperluas dengan fitur kalender dan mudah diintegrasikan ke pipeline scikit-learn.

Dataset Deret Penjualan 730 Hari #

Dataset dibangkitkan sintetis oleh skrip 01_bangun_data.py dengan np.random.default_rng(42) dan tanggal literal mulai 2023-01-01 — bukan tanggal komputer yang berjalan — sehingga siapa pun yang menjalankan ulang skrip mendapat berkas CSV identik bit demi bit. Deret 730 hari memuat dua tahun penuh dengan komponen yang lazim pada ritel:

  • tanggal — hari kalender dari 2023-01-01 sampai 2024-12-30;
  • penjualan_unit — unit terjual per hari: level dasar 120 unit, tren naik 0,05 unit per hari, musiman mingguan dengan akhir pekan tinggi, musiman tahunan ringan dengan puncak Desember, lonjakan promo serta penurunan hari libur pada 12 tanggal tetap, dan derau normal.

Dua belas tanggal event sengaja ditanam tanpa kolom penanda, meniru kondisi nyata: kalender promo ada di kepala tim pemasaran, tetapi tidak otomatis hadir di data. Model tanpa fitur kalender akan meleset di tanggal-tanggal itu — dan justru kegagalan tersebut yang menjadi temuan jujur proyek ini.

Struktur dan Artefak Proyek #

text
proyek-forecasting-penjualan/
├── _index.md
├── bagian/
│   ├── part-1-eksplorasi-deret-waktu/
│   ├── part-2-baseline-statistik/
│   ├── part-3-model-machine-learning/
│   └── part-4-validasi-walk-forward/
├── data/
│   └── penjualan.csv
├── src/
│   ├── 01_bangun_data.py
│   ├── 02_eksplorasi.py
│   ├── 03_baseline.py
│   ├── 04_model_ml.py
│   └── 05_laporan.py
└── laporan/
    └── laporan-forecasting.txt

Kelima skrip di src/ dirancang dijalankan dari root proyek sehingga path relatif data/penjualan.csv dan laporan/... selalu konsisten. Laporan akhir berformat teks polos karena berkas .md di dalam bundle akan dirender Hugo sebagai halaman kursus — laporan/laporan-forecasting.txt adalah artefak analisis untuk dibaca apa adanya.

Tahapan Pengerjaan #

Proyek dikerjakan dalam empat bagian berurutan; setiap bagian menghasilkan skrip yang dapat dijalankan ulang kapan saja:

  1. Bagian 1: Eksplorasi Deret Waktu — bangkitkan dataset, periksa kesinambungan harian, lalu baca musiman mingguan, tren, dan autocorrelation dari angka.
  2. Bagian 2: Baseline Statistik — nilai naive, rata-rata 7 hari, dan seasonal-naive mingguan pada holdout 14 hari terakhir.
  3. Bagian 3: Model Machine Learning — ubah deret menjadi tabel fitur lag dan kalender, latih GradientBoostingRegressor, dan bandingkan dengan baseline pada split yang sama.
  4. Bagian 4: Validasi Walk-Forward — uji stabilitas model pada lima jendela bergulir, lalu rakit laporan proyek dari angka hidup.

Disiplin Deret Waktu dan Determinisme #

Tiga aturan dipegang sepanjang proyek. Pertama, split selalu kronologis — data uji selalu berada setelah data latih, tanpa pengacakan baris. Kedua, fitur lag hanya boleh memuat nilai masa lalu; ramalan multi-hari dijalankan rekursif agar prediksi model sendiri — bukan nilai aktual masa depan — yang menjadi masukan hari berikutnya. Ketiga, validasi walk-forward meniru pemakaian produksi: model dilatih ulang dari nol di tiap jendela dengan history yang terus membesar. Seluruh proyek deterministik: satu generator berseed 42, random_state=42 pada estimator, tanpa pencetakan waktu atau path absolut — setiap skrip selesai dalam hitungan detik dan dapat diverifikasi ulang dengan hasil identik:

bash
cd content/machine-learning/proyek/proyek-forecasting-penjualan
python3 src/01_bangun_data.py
python3 src/02_eksplorasi.py
python3 src/03_baseline.py
python3 src/04_model_ml.py
python3 src/05_laporan.py

Mulailah dari Bagian 1: Eksplorasi Deret Waktu — di sana deret dibangkitkan, gerbang kualitas kesinambungan dilewati, dan tiga pola penentu (musiman mingguan, tren naik, event kalender) mulai terbaca dari angka sebelum satu pun model dirakit.

Referensi Resmi #