Membersihkan Data: Menangani Duplikat
Kenali baris ganda dengan duplicated(), buang dengan drop_duplicates(), dan atur subset serta keep supaya data transaksi tidak dihitung dua kali.
Kenapa Duplikat Itu Berbahaya
Bayangkan struk belanja yang tidak sengaja terfotokopi dua kali, lalu kamu menghitung total omzet dari tumpukan struk itu. Omzetmu terlihat dua kali lipat, padahal uang yang masuk tetap sama. Itulah efek baris duplikat di data: semua angka turunan (total, rata-rata, jumlah transaksi) ikut membengkak dan keputusan bisnis jadi salah arah.
Untuk data analyst, duplikat adalah sumber bug paling sunyi. Data transaksi bisa ganda karena tombol bayar ditekan dua kali, proses import dijalankan dua kali, atau sistem kasir yang sempat error lalu retry. Kamu tidak akan sadar kalau tidak mengecek secara eksplisit, karena tidak ada error yang muncul, angkanya hanya diam-diam salah.
Mendeteksi Duplikat dengan duplicated()
Fungsi duplicated() menandai baris yang sama persis dengan baris sebelumnya.
import pandas as pd
df = pd.DataFrame({
"order_id": ["A1", "A2", "A1", "A3", "A2"],
"produk": ["Kopi", "Teh", "Kopi", "Susu", "Teh"],
"total": [15000, 8000, 15000, 12000, 8000],
})
print(df.duplicated())
print("Jumlah duplikat:", df.duplicated().sum())Perhatikan, duplicated() menandai kemunculan kedua dan seterusnya, bukan yang pertama. Jadi dari lima baris di atas, dua baris ditandai sebagai duplikat.
Menghapus dengan drop_duplicates() dan subset
drop_duplicates() membuang baris yang ditandai duplikat. Tapi hati-hati, dalam data nyata jarang ada baris yang 100 persen identik. Yang biasanya duplikat adalah kunci transaksinya, misalnya order_id yang sama muncul dua kali karena double submit.
import pandas as pd
transaksi = pd.DataFrame({
"order_id": ["A1", "A2", "A1", "A3"],
"produk": ["Kopi", "Teh", "Kopi", "Susu"],
"waktu": ["10:01", "10:02", "10:01", "10:05"],
"total": [15000, 8000, 15000, 12000],
})
# Duplikat berdasarkan kunci transaksi, simpan kemunculan pertama
bersih = transaksi.drop_duplicates(subset=["order_id"], keep="first")
print(bersih)
print("Omzet bersih:", bersih["total"].sum())Parameter pentingnya:
subset: kolom yang dijadikan patokan duplikat. Kalau tidak diisi, seluruh kolom dibandingkan.keep="first": simpan kemunculan pertama (paling umum untuk double submit).keep="last": simpan kemunculan terakhir, berguna kalau baris terakhir adalah status terbaru (misalnya update status pesanan).keep=False: buang semua baris yang punya kembaran, tidak menyisakan satu pun.
Catatan teknis: sebelum menghapus, selalu simpan dulu jumlah duplikatnya (
df.duplicated(subset=[...]).sum()) sebagai bukti di laporan pembersihan datamu. Analis yang baik bisa menjelaskan berapa baris yang dibuang dan kenapa.
Jebakan Umum
SALAH: drop_duplicates() tanpa subset di data transaksi.
df.drop_duplicates() # dua pelanggan beli item sama persis ikut terhapusBENAR: tentukan kunci uniknya secara eksplisit.
df.drop_duplicates(subset=["order_id"])Dua pelanggan yang kebetulan membeli barang sama di waktu sama adalah transaksi sah, bukan duplikat. Tanpa subset, mereka ikut terbuang dan omzetmu malah kekecilan.
SALAH: selalu pakai keep="first" padahal butuh data terbaru.
status.drop_duplicates(subset=["order_id"], keep="first")BENAR: kalau kolomnya menyimpan status yang diperbarui (misalnya "diproses" menjadi "selesai"), pakai keep="last" supaya yang tersimpan adalah status paling mutakhir.
Tantangan
Bersihkan Transaksi Ganda
DataFrame transaksi memiliki kolom order_id, produk, dan total. Beberapa order_id muncul dua kali karena tombol bayar ditekan dua kali. Hapus duplikat berdasarkan order_id (simpan yang pertama), lalu hitung total omzet yang benar dan jumlah baris yang dibuang.