Data yang asal-usulnya tidak jelas akan selalu diragukan, terutama saat angkanya mengejutkan. Pada bagian ini kita mendokumentasikan dari mana data Toko Kopi Kita berasal, bagaimana data tersebut sampai ke tangan kita, dan seperti apa wujud isinya ketika pertama kali dibaca. Proses ini disebut pencatatan asal data (provenance) — kebiasaan yang sudah kita bahas pada chapter Pencatatan Asal Data dan sekarang kita praktikkan.
Asal-Usul Data Toko Kopi Kita #
Alur datanya sederhana dan bisa dilacak mundur. Setiap transaksi di kasir tercatat di aplikasi, lalu Bu Rina memakai fitur ekspor laporan untuk menyalinnya menjadi berkas CSV pada 17 Januari 2026, sehari setelah periode data berakhir. Kita menerima berkas penjualan_kotor.csv dan menyimpannya di folder data/ proyek tanpa mengubah satu karakter pun.
| Aspek | Keterangan |
|---|---|
| Sistem pencatat | Aplikasi kasir Toko Kopi Kita |
| Penanggung jawab | Bu Rina (pemilik dan operator kasir) |
| Cara pengambilan | Fitur ekspor laporan harian ke berkas CSV |
| Waktu ekspor | 17 Januari 2026 |
| Periode isi | 5-16 Januari 2026 (12 hari) |
| Lokasi berkas | data/penjualan_kotor.csv |
Tabel kecil seperti ini kelihatan sepele, tetapi menyelamatkan kita nanti. Ketika laporan akhir memuat angka yang mengejutkan, pertanyaan pertama Bu Rina hampir pasti “datanya dari mana?” — dan kita bisa menjawabnya dalam satu kalimat. Nama berkasnya pun jujur: penjualan_kotor.csv menyatakan bahwa isinya masih data mentah yang belum diperiksa, bukan data bersih siap analisis.
Membaca Berkas dan Mengintip Isinya #
Kita baca berkas tersebut dengan pandas — sama seperti latihan pada chapter Membaca File CSV
, hanya saja kali ini path-nya menunjuk ke folder data/ di atas folder bagian ini. Perhatikan bahwa setiap blok kode pada proyek ini dirancang berdiri sendiri, jadi ia bisa dijalankan dari folder bagian mana pun tanpa bergantung pada blok sebelumnya:
import pandas as pd
df = pd.read_csv("../data/penjualan_kotor.csv")
print("Dimensi data mentah:", df.shape)
print("\nDelapan baris pertama:")
print(df.head(8).to_string(index=False))
print("\nTipe data tiap kolom:")
print(df.dtypes.to_string())Output yang Dihasilkan:
Dimensi data mentah: (50, 4)
Delapan baris pertama:
tanggal menu gelas pendapatan_ribu
2026-01-05 kopi susu 34 748
2026-01-05 matcha latte 21 525
2026-01-05 americano 18 324
2026-01-05 teh tawar 15 150
2026-01-06 kopi susu 31 682
2026-01-06 matcha latte 19 475
2026-01-06 americano - 288
2026-01-06 teh tawar 12 120
Tipe data tiap kolom:
tanggal object
menu object
gelas object
pendapatan_ribu int64Mari kita bedah hasil pembacaan tersebut:
df.shapebernilai(50, 4): 50 baris dan 4 kolom. Hitungan kasar kita berbeda — 12 hari dikali 4 menu seharusnya 48 baris. Selisih dua baris ini adalah petunjuk pertama bahwa data mentah memuat masalah.df.head(8): delapan baris pertama menunjukkan pola yang rapi — tiap tanggal memiliki empat baris, satu untuk tiap menu. Namun baris ketujuh memuatamericanodengan gelas bernilai-; tanda ini biasanya berarti pencatatan kosong.df.dtypes: kolomgelasterbaca sebagaiobject, padahal isinya jumlah gelas yang seharusnya angka. Kolom bertipeobjectadalah sinyal klasik bahwa di dalamnya ada nilai non-angka — dan kita memang melihat tanda-pada baris ketujuh.
Struktur Empat Kolom #
Empat kolom tersebut memikul peran yang berbeda:
| Kolom | Tipe saat dibaca | Arti | Satuan |
|---|---|---|---|
tanggal | object | Hari terjadinya penjualan | tanggal ISO YYYY-MM-DD |
menu | object | Nama minuman yang terjual | teks |
gelas | object | Jumlah gelas terjual | gelas |
pendapatan_ribu | int64 | Pendapatan penjualan | ribuan rupiah |
Satuan pendapatan_ribu perlu ditegaskan: nilai 748 berarti Rp748.000, bukan Rp748. Kesalahan membaca satuan adalah jenis kekeliruan yang paling memalukan karena seluruh laporan akan salah seribu kali lipat. Kita juga mencatat konvensi lain dari pengamatan awal: satu baris berarti satu menu pada satu tanggal, dan tiap tanggal idealnya muncul tepat empat kali.
Pembacaan awal ini sudah menghadirkan tiga pertanyaan: mengapa ada 50 baris padahal seharusnya 48, mengapa kolom gelas tidak berupa angka, dan berapa banyak tanda - yang tersembunyi di 42 baris lainnya. Pertanyaan-pertanyaan itu bukan gangguan — justru itulah pekerjaan berikutnya. Pada Bagian 4: Memvalidasi Data
kita periksa seluruh masalah kualitas secara sistematis sebelum percaya pada angka apa pun.