Membersihkan Data: Menangani Nilai Kosong
Belajar mendeteksi nilai kosong dengan isna(), lalu memilih strategi yang tepat: dropna() atau fillna() dengan mean, median, modus, dan forward fill.
Kenapa Data Kosong Itu Masalah Serius
Bayangkan kamu disuruh menghitung rata-rata nilai ujian satu kelas, tapi 5 siswa belum punya nilai. Kalau kamu diam-diam menganggap nilai mereka 0, rata-rata kelas anjlok dan gurunya panik tanpa alasan. Itu persis yang terjadi kalau kamu mengabaikan nilai kosong (NaN) di data. Nilai kosong bukan nol, dia berarti "tidak tahu", dan memperlakukannya sembarangan membuat analisis jadi bohong.
Untuk seorang data analyst, data berlubang adalah sarapan sehari-hari. Hasil export sistem kasir, formulir online yang kolomnya tidak wajib diisi, atau sensor yang sempat mati, semuanya meninggalkan lubang. Membersihkannya dengan strategi yang tepat adalah skill yang membedakan analis yang bisa dipercaya dari yang asal jalan, karena keputusan bisnis yang diambil dari data berlubang bisa salah total.
Mendeteksi Lubang dengan isna()
Langkah pertama selalu sama: ukur dulu seberapa parah lubangnya sebelum memutuskan cara menambalnya.
import pandas as pd
import numpy as np
df = pd.DataFrame({
"nama": ["Andi", "Budi", "Citra", "Dedi", "Eka"],
"umur": [25, np.nan, 30, np.nan, 28],
"kota": ["Jakarta", "Bandung", None, "Surabaya", None],
})
print(df.isna())
print(df.isna().sum())isna() mengembalikan True atau False untuk setiap sel, dan .sum() menghitung total NaN per kolom. Dari sini kamu tahu kolom mana yang parah dan mana yang cuma bolong sedikit, dan itu menentukan strategi yang kamu pakai.
Memilih Strategi: dropna() vs fillna()
Aturan praktisnya sederhana. Kalau baris kosongnya sedikit (misalnya di bawah 5 persen) dan datanya penting, buang saja dengan dropna(). Kalau kosongnya banyak, membuang baris berarti membuang informasi berharga, jadi isi dengan nilai yang masuk akal lewat fillna().
import pandas as pd
import numpy as np
penjualan = pd.DataFrame({
"produk": ["Kopi", "Teh", "Kopi", "Susu", "Teh"],
"harga": [15000, 8000, np.nan, 12000, 9000],
"kategori": ["Minuman", None, "Minuman", "Minuman", None],
"stok": [100, 50, np.nan, np.nan, 30],
})
# Strategi berbeda untuk tiap jenis kolom
penjualan["harga"] = penjualan["harga"].fillna(penjualan["harga"].mean())
penjualan["kategori"] = penjualan["kategori"].fillna(
penjualan["kategori"].mode()[0]
)
penjualan["stok"] = penjualan["stok"].ffill()
bersih = penjualan.dropna(subset=["produk"])
print(bersih)Peta strategi yang bisa kamu hafal:
mean(): kolom angka yang sebarannya normal, misalnya harga atau suhu.median(): kolom angka yang miring (skewed), misalnya gaji atau harga rumah, karena median kebal terhadap outlier.mode(): kolom kategori (teks), misalnya kota atau kategori produk, isi dengan nilai yang paling sering muncul.ffill()(forward fill): data deret waktu, misalnya stok harian atau harga saham, isi dengan nilai terakhir yang diketahui.
Catatan teknis: di pandas versi baru,
inplace=Truemulai ditinggalkan. Biasakan poladf["kolom"] = df["kolom"].fillna(...)supaya tidak kena warning chained assignment.
Jebakan Umum
SALAH: mengisi semua NaN dengan 0 tanpa pikir panjang.
df["gaji"] = df["gaji"].fillna(0) # rata-rata gaji jadi anjlok, menyesatkanBENAR: pilih strategi sesuai jenis kolomnya.
df["gaji"] = df["gaji"].fillna(df["gaji"].median())SALAH: memakai dropna() membabi buta di dataset kecil.
df.dropna() # dari 100 baris tersisa 20, analisis jadi tidak mewakiliBENAR: cek dulu proporsinya, dan pertimbangkan dropna(subset=[...]) hanya untuk kolom yang benar-benar kritis seperti ID transaksi.
Tantangan
Tambal Data Penjualan yang Bolong
Diberikan DataFrame penjualan dengan kolom harga (NaN di beberapa baris), kategori (None), dan stok (NaN). Isi harga dengan mean, kategori dengan modus, stok dengan forward fill, lalu tampilkan jumlah NaN yang tersisa per kolom.