Pertanyaan analisis sudah tersusun; sekarang kita mengenal bahan bakunya. Pada bagian ini kita membedah dari mana angka harga berasal, bagaimana cara pencatatannya, dan bagaimana bentuk berkas harga_komoditas.csv yang akan menemani kita sampai akhir proyek. Mengenal asal data sejak awal membuat kita tahu batas tafsirnya nanti: kesimpulan tidak boleh lebih kuat daripada data yang menopangnya.
Dari Mana Data Ini Berasal #
Data harga warung Bu Warni lahir dari dua sumber yang saling melengkapi. Setiap pekan, Bu Warni mencatat harga yang benar-benar ia bayar saat berbelanja dari nota belanja warung; untuk bahan yang pekan itu tidak ia beli, ia memakai harga rata-rata yang dipapankannya dari satu pasar tradisional di sekitar warung. Dari keduanya, diambil satu angka per bahan per pekan: harga rata-rata pekan tersebut.
| Sumber | Peran | Kekuatan | Kelemahan |
|---|---|---|---|
| Nota belanja warung | Harga aktual yang dibayar | Persis seperti pengeluaran nyata | Hanya bahan yang memang dibeli |
| Harga pasar di sekitar warung | Pembanding dan pengisi bahan yang tidak dibeli | Tersedia setiap pekan | Rata-rata, bukan harga transaksi |
Pola dua sumber seperti ini umum pada data usaha kecil: sumber utama kaya tetapi berlubang, sumber sekunder melengkapinya. Pada Bagian 3 kita akan melihat bahwa hasil kombinasinya pun masih menyimpan masalah kecil yang perlu diperiksa.
Mencatat Asal-Usul Data #
Asal-usul data (provenance) adalah catatan singkat yang menjawab: siapa yang mencatat, dari mana, kapan, dan dalam satuan apa. Catatan ini kelihatannya sepele untuk dataset 41 baris, tetapi ketika analisis dikerjakan ulang tiga bulan kemudian — oleh kita sendiri atau orang lain — catatan inilah yang membuat angka-angkanya bisa dipercaya. Kita simpan sebagai data juga, bukan sekadar ingatan:
provenance = {
"pencatat": "Bu Warni (pemilik warung)",
"sumber_utama": "nota belanja mingguan warung",
"sumber_pembanding": "harga rata-rata satu pasar tradisional di Surabaya",
"periode": "M1-M8, pekan mulai 5 Januari s.d. 23 Februari 2026",
"satuan": "ribu rupiah per kilogram",
}
for kunci, nilai in provenance.items():
print(f"{kunci:18}: {nilai}")Output yang Dihasilkan:
pencatat : Bu Warni (pemilik warung)
sumber_utama : nota belanja mingguan warung
sumber_pembanding : harga rata-rata satu pasar tradisional di Surabaya
periode : M1-M8, pekan mulai 5 Januari s.d. 23 Februari 2026
satuan : ribu rupiah per kilogramLima baris keluaran itu adalah kontrak data kita: siapa pun yang membaca analisis ini tahu bahwa angkanya berlaku untuk satu warung, satu pasar, delapan pekan, dan satuan ribu rupiah per kilogram. Materi tentang memilih dan menimbang sumber data dibahas tuntas pada chapter Sumber Data , dan kebiasaan mencatat asal-usulnya dibahas pada Pencatatan Asal Data .
Struktur Berkas CSV #
Berkas data/harga_komoditas.csv memakai format panjang: satu baris berisi satu pengamatan, yaitu harga satu komoditas pada satu pekan. Format ini disebut juga tidy — tiap kolom adalah satu variabel, tiap baris satu pengamatan — dan merupakan bentuk paling ramah untuk pandas.
| Kolom | Tipe | Makna |
|---|---|---|
minggu | teks | Penanda pekan M1–M8; M1 = pekan mulai 5 Januari 2026 |
komoditas | teks | Nama bahan: beras, cabai merah, bawang merah, ayam broiler, gula pasir |
harga_rata_ribu | angka | Harga rata-rata pekan itu, ribu rupiah per kilogram |
Dengan 8 pekan dan 5 komoditas, kita berharap menemukan 8 × 5 = 40 baris. Kenyataannya, seperti akan kita lihat sebentar lagi, jumlah barisnya tidak persis 40 — dan selisih itulah bahan Bagian 3.
Membaca Sekilas dengan pandas #
Ketika kode pada bagian-bagian proyek ini dijalankan, direktori kerjanya adalah folder bagian, sehingga berkas data berada satu tingkat di atasnya — itulah sebabnya path yang dipakai adalah ../data/harga_komoditas.csv. Berikut bacaan pertama kita:
import pandas as pd
df = pd.read_csv("../data/harga_komoditas.csv")
print("Jumlah baris :", df.shape[0])
print("Jumlah kolom :", df.shape[1])
print("Nama kolom :", list(df.columns))
print()
print(df.head(10))Output yang Dihasilkan:
Jumlah baris : 41
Jumlah kolom : 3
Nama kolom : ['minggu', 'komoditas', 'harga_rata_ribu']
minggu komoditas harga_rata_ribu
0 M1 beras 13.0
1 M1 cabai merah 38.0
2 M1 bawang merah 30.0
3 M1 ayam broiler 33.0
4 M1 gula pasir 17.5
5 M2 beras 13.2
6 M2 cabai merah 40.0
7 M2 bawang merah 34.0
8 M2 ayam broiler 33.5
9 M2 gula pasir 17.6Mari kita telaah keluaran di atas:
df.shape[0]bernilai 41: harapan kita 40, kenyataannya 41. Ada satu baris lebih, dan kita belum tahu yang mana.df.head(10): sepuluh baris pertama menampilkan pekan M1 dan M2 utuh — lima komoditas per pekan, harga dalam angka desimal. Semua terlihat sehat di wilayah ini.- Kolom
harga_rata_ribu: pada sepuluh baris pertama tampil sebagai angka, tetapi tipe kolomnya belum tentu numerik di seluruh berkas — pandas memutuskan tipe berdasarkan seluruh isi kolom, dan satu sel bermasalah sudah cukup mengubahnya.
Fungsi read_csv() punya banyak opsi untuk berkas yang tidak rapi; daftar lengkapnya ada di dokumentasi pandas untuk read_csv
. Kita sengaja tidak memakai opsi khusus apa pun saat memuat: kita ingin melihat data sekecil apa adanya sebelum memperlakukannya.
Ringkasan Bagian 2 #
Data harga berasal dari nota belanja warung yang dilengkapi harga pasar, dengan asal-usul yang tercatat dan struktur panjang tiga kolom. Pembacaan pertama sudah menemukan kejanggalan pertama: 41 baris padahal seharusnya 40, dan tipe kolom harga yang belum tentu numerik.
Kejanggalan itu tidak kita tebak-tebak. Pada Bagian 3: Memvalidasi Data kita memeriksanya secara sistematis: dimensi, tipe kolom, duplikat, sel kosong, dan konsistensi nama komoditas.