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.

AspekKeterangan
Sistem pencatatAplikasi kasir Toko Kopi Kita
Penanggung jawabBu Rina (pemilik dan operator kasir)
Cara pengambilanFitur ekspor laporan harian ke berkas CSV
Waktu ekspor17 Januari 2026
Periode isi5-16 Januari 2026 (12 hari)
Lokasi berkasdata/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:

python
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:

text
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     int64

Mari kita bedah hasil pembacaan tersebut:

  1. df.shape bernilai (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.
  2. df.head(8): delapan baris pertama menunjukkan pola yang rapi — tiap tanggal memiliki empat baris, satu untuk tiap menu. Namun baris ketujuh memuat americano dengan gelas bernilai -; tanda ini biasanya berarti pencatatan kosong.
  3. df.dtypes: kolom gelas terbaca sebagai object, padahal isinya jumlah gelas yang seharusnya angka. Kolom bertipe object adalah 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:

KolomTipe saat dibacaArtiSatuan
tanggalobjectHari terjadinya penjualantanggal ISO YYYY-MM-DD
menuobjectNama minuman yang terjualteks
gelasobjectJumlah gelas terjualgelas
pendapatan_ribuint64Pendapatan penjualanribuan 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.