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:

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

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

Mari kita baca temuan tersebut satu per satu:

  1. (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.
  2. 3 sel gelas bernilai -: tanda ini adalah cara aplikasi kasir menandai pencatatan yang kosong, bukan angka. Inilah penyebab kolom gelas terbaca sebagai object.
  3. 1 pendapatan bernilai 0: tidak mungkin ada penjualan 17 gelas tanpa pendapatan; nilai ini hampir pasti galat pencatatan.
  4. value_counts() memuat 5 nilai menu: seharusnya hanya 4 menu. Nilai Kopi Susu muncul satu kali dengan huruf kapital — dua nilai berbeda bagi komputer, padahal sama bagi manusia. Perhatikan juga teh tawar muncul 13 kali dan kopi susu 12 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:

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

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

Tunggu — perhatikan baik-baik hasil di atas:

  1. duplicated(keep=False): parameter keep=False membuat 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.
  2. 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.
  3. 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:

MasalahJumlahDampak bila dibiarkanRencana penanganan
Baris duplikat persis2Pendapatan terhitung gandaBuang baris salinan
Sel gelas bernilai -3Kolom gelas tidak bisa dijumlahkanIsi ulang dari harga satuan menu
Nama menu Kopi Susu1Menu terpisah saat agregasi per menuSeragamkan ke huruf kecil
Pendapatan bernilai 01Total pendapatan kurangHitung 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 .