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:

PemeriksaanAlat pandasPertanyaan yang dijawab
Dimensidf.shapeJumlah baris dan kolom sesuai harapan?
Tipe kolomdf.dtypesKolom harga terbaca sebagai angka?
Baris duplikatdf.duplicated()Ada pengamatan yang tercatat dua kali?
Sel kosongpembandingan == "-"Ada harga yang tidak terisi?
Konsistensi namavalue_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:

python
import pandas as pd

df = pd.read_csv("../data/harga_komoditas.csv")
print("Dimensi:", df.shape)
print()
print(df.dtypes)

Output yang Dihasilkan:

text
Dimensi: (41, 3)

minggu             object
komoditas          object
harga_rata_ribu    object
dtype: object

Dua temuan dari enam baris keluaran di atas:

  1. (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.
  2. harga_rata_ribu bertipe object: padahal isinya harusnya angka desimal. pandas menentukan tipe dari seluruh isi kolom; satu sel non-angka saja sudah cukup menurunkan seluruh kolom menjadi object. 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:

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

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

Mari kita baca keluaran tersebut satu per satu:

  1. df.duplicated().sum() bernilai 1: satu baris tercatat dua kali. Satu-satunya penyebab yang masuk akal untuk data ini adalah entri ganda saat pencatatan.
  2. == "-" 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 menjadi object.
  3. value_counts() membocorkan masalah terakhir: lima nama muncul tepat 8 kali — termasuk cabai merah — tetapi di baris paling bawah ada satu entri asing: Cabai Merah dengan 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 pada cabai merah pun 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:

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

text
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.0

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

NomorMasalahLokasiDampak bila dibiarkan
1Baris duplikat M3 cabai merahbaris 11–12Statistik cabai terdistorsi: M3 terhitung dua kali
2Sel harga kosong - M6 bawang merahbaris 28Kolom harga tetap object; hitungan numerik bermasalah
3Nama tak konsisten Cabai Merah M7baris 32Pekan 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.