Analisis pada data yang salah lebih berbahaya daripada tidak menganalisis sama sekali, karena hasilnya terlihat meyakinkan padahal keliru. Pada bagian ini kita memeriksa data mentah Toko Kopi Kita dengan daftar periksa kualitas: bentuk data, duplikat, sel kosong, konsistensi nama, dan nilai yang tidak masuk akal. Kerangka pemeriksaan ini mengikuti materi chapter Validasi Kualitas Data — sekarang kita terapkan pada berkas nyata.
Empat Pemeriksaan Pertama #
Pemeriksaan pertama selalu berupa penghitungan sederhana yang bisa dilakukan cepat: berapa banyak baris, berapa banyak baris duplikat, berapa banyak sel kosong yang ditandai -, dan berapa banyak pendapatan yang tercatat nol. Setelah itu kita lihat nilai unik pada kolom menu untuk memeriksa konsistensi penamaan:
import pandas as pd
df = pd.read_csv("../data/penjualan_kotor.csv")
print("Jumlah baris dan kolom :", df.shape)
print("Baris duplikat persis :", df.duplicated().sum())
print("Sel gelas bernilai '-' :", (df["gelas"] == "-").sum())
print("Pendapatan bernilai 0 :", (df["pendapatan_ribu"] == 0).sum())
print("\nNilai unik kolom menu:")
print(df["menu"].value_counts().to_string())Output yang Dihasilkan:
Jumlah baris dan kolom : (50, 4)
Baris duplikat persis : 2
Sel gelas bernilai '-' : 3
Pendapatan bernilai 0 : 1
Nilai unik kolom menu:
menu
teh tawar 13
kopi susu 12
matcha latte 12
americano 12
Kopi Susu 1Mari kita baca temuan tersebut satu per satu:
(50, 4)dengan 2 baris duplikat: 50 baris mentah dikurangi 2 duplikat menghasilkan 48 baris — tepat 12 hari dikali 4 menu. Jumlah baris kini masuk akal.- 3 sel gelas bernilai
-: tanda ini adalah cara aplikasi kasir menandai pencatatan yang kosong, bukan angka. Inilah penyebab kolomgelasterbaca sebagaiobject. - 1 pendapatan bernilai 0: tidak mungkin ada penjualan 17 gelas tanpa pendapatan; nilai ini hampir pasti galat pencatatan.
value_counts()memuat 5 nilai menu: seharusnya hanya 4 menu. NilaiKopi Susumuncul satu kali dengan huruf kapital — dua nilai berbeda bagi komputer, padahal sama bagi manusia. Perhatikan jugateh tawarmuncul 13 kali dankopi susu12 kali, padahal tiap menu seharusnya muncul 12 kali — ini efek baris duplikat yang ikut terhitung.
Menelusuri Baris Bermasalah #
Agregat memberi tahu ada berapa masalah; langkah berikutnya adalah menunjukkan letaknya. Kita tampilkan baris duplikat beserta baris aslinya memakai duplicated(keep=False), lalu saring baris dengan masalah lain memakai gabungan kondisi:
import pandas as pd
df = pd.read_csv("../data/penjualan_kotor.csv")
print("Baris duplikat persis (beserta baris aslinya):")
print(df[df.duplicated(keep=False)].to_string(index=False))
print("\nBaris dengan masalah lain:")
mask = (
(df["gelas"] == "-")
| (df["pendapatan_ribu"] == 0)
| (df["menu"] != df["menu"].str.lower())
)
print(df[mask].to_string(index=False))Output yang Dihasilkan:
Baris duplikat persis (beserta baris aslinya):
tanggal menu gelas pendapatan_ribu
2026-01-07 kopi susu 36 792
2026-01-07 kopi susu 36 792
2026-01-11 teh tawar 24 240
2026-01-11 teh tawar 24 240
Baris dengan masalah lain:
tanggal menu gelas pendapatan_ribu
2026-01-06 americano - 288
2026-01-08 Kopi Susu 33 726
2026-01-09 teh tawar - 160
2026-01-12 teh tawar 17 0
2026-01-15 matcha latte - 650Tunggu — perhatikan baik-baik hasil di atas:
duplicated(keep=False): parameterkeep=Falsemembuat pandas menampilkan baris asli sekaligus salinannya, sehingga kita melihat dua pasang baris kembar: penjualan kopi susu 7 Januari dan teh tawar 11 Januari. Keduanya tersalin dua kali, kemungkinan karena ekspor dijalankan berulang.- Operator
|: tiga kondisi digabung dengan operator “atau”, jadi satu baris cukup memenuhi satu kondisi untuk ditampilkan. Kondisi ketiga (df["menu"] != df["menu"].str.lower()) menangkap nama menu yang tidak sama dengan versi huruf kecilnya — cara ringkas menemukan ketidaksesuaian kapitalisasi. - Lima baris masalah lain: tiga baris gelas kosong (6, 9, dan 15 Januari), satu nama menu kapital (8 Januari), dan satu pendapatan nol (12 Januari). Kabar baiknya, tidak ada satu baris pun yang memuat dua masalah sekaligus, jadi tiap masalah bisa ditangani terpisah.
Tabel Temuan dan Rencana Penanganan #
Kita rangkum seluruh temuan beserta rencana penanganannya — daftar ini menjadi kontrak kerja untuk Bagian 5:
| Masalah | Jumlah | Dampak bila dibiarkan | Rencana penanganan |
|---|---|---|---|
| Baris duplikat persis | 2 | Pendapatan terhitung ganda | Buang baris salinan |
Sel gelas bernilai - | 3 | Kolom gelas tidak bisa dijumlahkan | Isi ulang dari harga satuan menu |
Nama menu Kopi Susu | 1 | Menu terpisah saat agregasi per menu | Seragamkan ke huruf kecil |
| Pendapatan bernilai 0 | 1 | Total pendapatan kurang | Hitung ulang dari gelas dikali harga satuan |
Empat masalah, empat penanganan, semuanya bersumber dari pola yang bisa kita perbaiki tanpa menebak. Pola duplikat dan missing values ini memang dua masalah paling umum di data mentah — cara menanganinya sudah kita bahas pada chapter Menangani Data Duplikat dan Menangani Missing Values . Saatnya menjalankan rencananya pada Bagian 5: Membersihkan Data .