Saya kira harga cabai naik menjelang Ramadan. Datanya bilang lain
7 September 2026·9 menit baca
Satu proyek dikerjakan dari awal sampai selesai, termasuk skrip yang mati, angka pertama yang salah, dan pemeriksaan yang membalik kesimpulannya.
Semua orang tahu harga cabai naik menjelang Ramadan. Saya juga mengira begitu, cukup yakin sampai menulisnya sebagai soal latihan di halaman portofolio situs ini: “Berapa besar kenaikan harga cabai menjelang Ramadan.”
Pertanyaannya sudah mengandaikan jawabannya.
Tulisan ini mengerjakan soal itu sampai selesai, dengan data sungguhan. Saya tidak menunjukkan hasil yang rapi. Saya menunjukkan seluruh jejak kerjanya: skrip yang mati, angka pertama yang salah, dan pemeriksaan yang akhirnya membalik kesimpulan saya sendiri.
Kalau Anda sedang membuat portofolio, jangan tiru grafiknya. Tiru bagian di mana saya salah.
Datanya
Harga pangan harian di Bandung, dari Pusat Informasi Harga Pangan Strategis milik Bank Indonesia. Saya mengambilnya lewat salinan di GitHub, bukan dari PIHPS langsung. Itu perlu disebut apa adanya, karena portal aslinya menyimpan filenya di balik JavaScript. Tidak ada satu pun cara mengunduhnya dengan satu perintah.
Dua hal yang membatasi seluruh tulisan ini, dan lebih baik Anda tahu sekarang daripada di paragraf terakhir:
- Datanya berhenti Desember 2020. Ini gambaran 2018 sampai 2020, bukan potret pasar hari ini.
- Ini Bandung saja. Apa pun yang saya temukan, tidak otomatis berlaku di kota lain.
Filenya 823 baris, satu baris per hari, 32 kolom komoditas.
Percobaan pertama mati di baris kedelapan
Saya menulis skrip pemeriksaan sederhana: baca filenya, ubah kolom harga jadi angka, hitung rentangnya. Skripnya berhenti dengan pesan ini:
ValueError: could not convert string to float: '-'
Sepuluh baris di file itu memakai tanda strip untuk menandai harga yang tidak
ada. Bukan sel kosong. Bukan angka nol. Karakter - yang diketik apa adanya.
Ini bukan hal langka. Halaman portofolio situs ini bahkan sudah menuliskannya sebagai peringatan, dan saya tetap kena. Itu sebabnya saya menaruhnya di sini alih-alih membersihkannya diam-diam. Kalau nanti skrip Anda mati dengan pesan serupa, Anda tahu itu bagian normal dari pekerjaan ini, bukan tanda Anda tidak berbakat.
Keputusan yang saya ambil: sepuluh baris itu dibuang, tidak diisi nol. Nol berarti “harganya nol rupiah”, dan itu pernyataan yang berbeda jauh dari “harganya tidak diketahui”. Sisa yang dipakai 813 baris.
Dua hal yang saya temukan sebelum menghitung apa pun
Sebelum menjawab pertanyaannya, saya menghitung dulu seberapa lengkap datanya. Bagian ini yang paling sering dilewati orang, dan yang paling sering membuat angka akhirnya salah.
Pertama: 391 hari kalender tidak punya baris sama sekali. Dari 1.214 hari antara September 2017 dan Desember 2020, hampir sepertiganya hilang. Polanya langsung menjelaskan dirinya: 346 dari 391 hari itu Sabtu atau Minggu. Pasar tutup, jadi tidak ada survei harga.
Artinya kalimat “rata-rata harga bulan April” dari data ini sebenarnya berarti “rata-rata hari kerja di bulan April”. Perbedaannya kecil, tapi ia harus ditulis, bukan didiamkan.
Kedua, dan ini yang lebih mengganggu: 480 dari 812 hari punya harga persis sama dengan hari sebelumnya. Hampir enam dari sepuluh.
Untuk sebagian komoditas, angkanya lebih ekstrem. Harga daging sapi tidak berubah 385 hari berturut-turut. Harga beras 106 hari.
Data yang terlihat harian ternyata tidak diukur ulang tiap hari. Sebagian angkanya dibawa maju dari survei sebelumnya, dan tidak ada satu kolom pun di file itu yang memberi tahu Anda hari mana yang mana.
Jawaban pertama saya, dan kenapa ia tidak berarti apa-apa
Cara paling wajar terpikir: bandingkan bulan Ramadan dengan bulan biasa. Ramadan 2018 jatuh di bulan Mei, jadi saya bandingkan rata-rata Mei dengan rata-rata Maret.
| Tahun | Maret | Mei | Selisih |
|---|---|---|---|
| 2018 | 47.738 | 40.000 | −16,2% |
| 2019 | 32.750 | 42.083 | +28,5% |
| 2020 | 64.464 | 33.035 | −48,8% |
Turun 16 persen, naik 28 persen, turun 49 persen. Tiga tahun, tiga jawaban yang saling bertentangan.
Angka-angka ini benar hitungannya dan tetap tidak berarti apa-apa, karena Ramadan bergeser sekitar sebelas hari tiap tahun di kalender Masehi. Ramadan 2018 dimulai 17 Mei, 2019 pada 6 Mei, dan 2020 pada 24 April. Membandingkan “bulan Mei” di tiga tahun itu berarti membandingkan tiga posisi yang berbeda terhadap Ramadan.
Ini jenis kesalahan yang paling berbahaya di pekerjaan data: hitungannya benar, kodenya jalan, tabelnya rapi, dan pertanyaannya tidak pernah terjawab.
Jawaban kedua: sejajarkan pada hari sebelum Ramadan
Perbaikannya berhenti memakai kalender Masehi. Untuk tiap tahun, saya hitung mundur dari tanggal 1 Ramadan.
- Harga dasar: nilai tengah dari 90 hari yang berakhir 45 hari sebelum Ramadan. Periode tenang, jauh dari pengaruhnya.
- Puncak: harga tertinggi dalam 30 hari sebelum Ramadan.
| Tahun | Dasar | Puncak | Puncak dibagi dasar |
|---|---|---|---|
| 2018 | 46.875 | 48.750 | 1,04× |
| 2019 | 33.750 | 40.000 | 1,19× |
| 2020 | 67.500 | 65.000 | 0,96× |
Tahun 2019 naik 19 persen. Tahun 2018 naik 4 persen. Tahun 2020 justru turun.
Di titik ini saya hampir berhenti dan menulis kesimpulan: “kenaikannya ada, tapi kecil dan tidak konsisten.” Kalimat itu terdengar wajar, dan seluruh tabel di atas mendukungnya.
Itu akan jadi kesalahan.
Pemeriksaan yang membalik kesimpulannya
Angka mana pun yang lahir dari sebuah pilihan harus diuji terhadap pilihan itu. Saya memilih jendela 30 hari, dan saya memilih memakai puncak. Keduanya keputusan saya, bukan keputusan datanya.
Jadi saya ulangi dengan pilihan yang berbeda.
Kalau jendelanya digeser:
| Tahun | 14 hari | 30 hari | 45 hari |
|---|---|---|---|
| 2018 | 0,91× | 1,04× | 1,17× |
| 2019 | 1,19× | 1,19× | 1,19× |
| 2020 | 0,65× | 0,96× | 1,04× |
Tahun 2018 berpindah dari turun jadi naik hanya karena jendelanya dilebarkan. Yang 2020 lebih ekstrem lagi: dari turun 35 persen jadi naik 4 persen. Cuma 2019 yang tidak bergerak sama sekali.
Kalau puncak diganti nilai tengah, karena satu hari ekstrem bisa menarik puncak sendirian:
| Tahun | Pakai puncak | Pakai nilai tengah |
|---|---|---|
| 2018 | 1,04× | 0,91× |
| 2019 | 1,19× | 1,00× |
| 2020 | 0,96× | 0,56× |
Seluruh kenaikan yang tadi terlihat menguap.
Kalau komoditasnya diganti jadi cabai rawit merah, pertanyaan yang sama menghasilkan 0,79×, 1,33×, dan 1,00×. Jawabannya bahkan tergantung cabai mana yang Anda maksud.
Jadi jawabannya apa
Untuk cabai merah di Bandung, 2018 sampai 2020, saya tidak menemukan kenaikan harga menjelang Ramadan yang bertahan saat cara menghitungnya diubah.
Satu tahun, 2019, memang naik, dan naiknya nyata: 19 persen, dan angkanya tidak bergerak di jendela mana pun yang saya coba. Grafik di atas memperlihatkannya sebagai satu-satunya garis yang mendaki.
Dua tahun lainnya justru turun. Untuk 2020 ada penjelasan yang gampang ditebak, dan saya tidak bisa membuktikannya dari data ini: Maret dan April tahun itu adalah bulan-bulan pertama pandemi.
Sejauh yang bisa saya sebut: tiga tahun data ini tidak mendukung dugaan bahwa harga cabai selalu naik menjelang Ramadan. Kalau ada yang menyatakannya dari data yang sama, kemungkinan besar dia memilih satu tahun dan satu cara menghitung yang kebetulan cocok.
Kalau ini masuk portofolio Anda
Pekerjaan ini layak ditunjukkan bukan gara-gara grafiknya. Grafik begitu bisa dibuat siapa saja dalam sepuluh menit.
Lima hal ini yang layak ditunjukkan, dan semuanya ada di atas:
- Sepuluh baris dibuang karena bertanda strip, dan alasannya ditulis
- 391 hari hilang dihitung dulu sebelum apa pun dirata-ratakan
- Angka pertama dinyatakan salah, bukan dihapus dari catatan
- Kesimpulan diuji terhadap tiga pilihan berbeda
- Batas datanya disebut di awal, bukan diselipkan di akhir
Kalau seseorang bertanya “kenapa jendelanya 30 hari”, jawabannya ada. Itu yang membedakan satu pekerjaan selesai dari satu grafik yang cantik.
Kalau ingin mengulang sendiri
Datanya satu file CSV, bisa diunduh langsung. Pertanyaannya boleh Anda ganti jadi komoditas lain, kota lain kalau ketemu datanya, atau hari besar lain.
Satu hal jangan diganti: setelah dapat angkanya, ulangi dengan cara menghitung yang berbeda. Kalau angkanya ikut berubah, berarti Anda menemukan pilihan Anda sendiri, belum menemukan polanya.