Data yang belum diperiksa adalah data yang belum layak dipercaya. Pada Bagian 2 kita sudah melihat dua tanda kejanggalan — 41 baris padahal harapan 40, dan tipe kolom harga yang mencurigakan. Bagian ini membedah keduanya secara sistematis dengan lima pemeriksaan baku, lalu melokalisasi setiap masalah yang ditemukan sampai ke barisnya. Tujuan akhirnya satu: daftar masalah yang jelas menjadi bahan kerja pembersihan pada Bagian 4.
Daftar Pemeriksaan Sebelum Percaya #
Validasi bukan langkah seremonial; tiap pemeriksaan menjawab pertanyaan spesifik yang kalau diabaikan akan merusak analisis di hilir. Lima pemeriksaan kita adalah:
| Pemeriksaan | Alat pandas | Pertanyaan yang dijawab |
|---|---|---|
| Dimensi | df.shape | Jumlah baris dan kolom sesuai harapan? |
| Tipe kolom | df.dtypes | Kolom harga terbaca sebagai angka? |
| Baris duplikat | df.duplicated() | Ada pengamatan yang tercatat dua kali? |
| Sel kosong | pembandingan == "-" | Ada harga yang tidak terisi? |
| Konsistensi nama | value_counts() | Lima komoditas tampil dengan nama seragam? |
Pilihan pemeriksaan ini mengikuti wujud data kita: tabel kecil, tiga kolom, kategori berupa nama. Untuk data dengan kolom tanggal atau jumlah besar, daftar pemeriksaannya akan bertambah — tetapi pola berpikirnya sama.
Memeriksa Dimensi dan Tipe #
Blok berikut berdiri sendiri: membaca ulang berkas data, lalu mencetak dimensi dan tipe tiap kolom:
import pandas as pd
df = pd.read_csv("../data/harga_komoditas.csv")
print("Dimensi:", df.shape)
print()
print(df.dtypes)Output yang Dihasilkan:
Dimensi: (41, 3)
minggu object
komoditas object
harga_rata_ribu object
dtype: objectDua temuan dari enam baris keluaran di atas:
(41, 3): satu baris lebih banyak daripada 8 pekan × 5 komoditas = 40. Ada pengamatan yang tercatat dua kali, atau ada pasangan pekan-komoditas yang tidak seharusnya ada.harga_rata_ribubertipeobject: padahal isinya harusnya angka desimal. pandas menentukan tipe dari seluruh isi kolom; satu sel non-angka saja sudah cukup menurunkan seluruh kolom menjadiobject. Itulah sebabnya sepuluh baris pertama pada Bagian 2 tampak sehat padahal kolomnya bermasalah — masalahnya bersembunyi di baris yang belum kita lihat.
Memeriksa Duplikat, Sel Kosong, dan Nama Komoditas #
Tiga pemeriksaan berikutnya membidik tiga jenis masalah yang paling sering menyusup ke data yang diketik manual:
import pandas as pd
df = pd.read_csv("../data/harga_komoditas.csv")
print("Baris duplikat :", df.duplicated().sum())
print("Sel harga bernilai '-' :", (df["harga_rata_ribu"] == "-").sum())
print()
print(df["komoditas"].value_counts())Output yang Dihasilkan:
Baris duplikat : 1
Sel harga bernilai '-' : 1
komoditas
beras 8
cabai merah 8
bawang merah 8
ayam broiler 8
gula pasir 8
Cabai Merah 1
Name: count, dtype: int64Mari kita baca keluaran tersebut satu per satu:
df.duplicated().sum()bernilai 1: satu baris tercatat dua kali. Satu-satunya penyebab yang masuk akal untuk data ini adalah entri ganda saat pencatatan.== "-"menemukan 1: satu sel harga berisi tanda strip, bukan angka. Tanda seperti ini lazim dipakai pencatat manusia untuk “tidak ada data”, dan inilah biang kolom harga berubah menjadiobject.value_counts()membocorkan masalah terakhir: lima nama muncul tepat 8 kali — termasukcabai merah— tetapi di baris paling bawah ada satu entri asing:Cabai Merahdengan huruf kapital, terhitung sekali. Bagi pandas, “cabai merah” dan “Cabai Merah” adalah dua komoditas berbeda; akibatnya pekan M7 cabai lewat sebagai komoditas lain, dan statistik cabai kehilangan satu pekan tanpa peringatan apa pun. (Angka 8 padacabai merahpun sebenarnya menipu: satu di antaranya adalah baris duplikat temuan pertama.)
Menemukan Lokasi Masalah #
Mengetahui ada masalah belum cukup; kita perlu tahu di baris mana agar keputusan pembersihannya tepat:
import pandas as pd
df = pd.read_csv("../data/harga_komoditas.csv")
print("Baris duplikat:")
print(df[df.duplicated(keep=False)])
print()
print("Baris dengan sel harga kosong:")
print(df[df["harga_rata_ribu"] == "-"])
print()
print("Baris dengan nama komoditas tak konsisten:")
print(df[df["komoditas"] == "Cabai Merah"])Output yang Dihasilkan:
Baris duplikat:
minggu komoditas harga_rata_ribu
11 M3 cabai merah 42.0
12 M3 cabai merah 42.0
Baris dengan sel harga kosong:
minggu komoditas harga_rata_ribu
28 M6 bawang merah -
Baris dengan nama komoditas tak konsisten:
minggu komoditas harga_rata_ribu
32 M7 Cabai Merah 44.0Ketiga potongan di atas melokalisasi masalah secara presisi: baris 11 dan 12 adalah M3 cabai merah yang sama persis tercatat dua kali; baris 28 adalah M6 bawang merah dengan harga -; baris 32 adalah M7 cabai merah yang ditulis dengan huruf kapital. Perhatikan pemakaian keep=False pada duplicated(): tanpa argumen itu, hanya baris kedua yang ditandai dan kita tidak akan tahu pasangannya yang mana.
Tiga Masalah yang Ditemukan #
Validasi selesai dengan daftar masalah berikut:
| Nomor | Masalah | Lokasi | Dampak bila dibiarkan |
|---|---|---|---|
| 1 | Baris duplikat M3 cabai merah | baris 11–12 | Statistik cabai terdistorsi: M3 terhitung dua kali |
| 2 | Sel harga kosong - M6 bawang merah | baris 28 | Kolom harga tetap object; hitungan numerik bermasalah |
| 3 | Nama tak konsisten Cabai Merah M7 | baris 32 | Pekan M7 cabai lewat sebagai komoditas lain |
Ringkasan Bagian 3 #
Lima pemeriksaan baku menemukan tiga masalah: satu baris duplikat, satu sel harga kosong, dan satu nama komoditas yang tidak seragam — lengkap dengan lokasi barisnya. Kolom harga juga terkonfirmasi berubah tipe menjadi object akibat tanda -.
Daftar ini menjadi kontrak kerja Bagian 4: Membersihkan Data : satu masalah dibuang, satu diisi dengan cara yang kita pertanggungjawabkan, dan satu diseragamkan.