Data yang bolong (missing values) adalah masalah klasik yang hampir selalu muncul saat mengolah data mentah. Sebelum masuk ke tahap modeling atau analisis, kita harus memutuskan: apakah baris/kolom yang kosong itu dibuang (drop) atau diisi (fill)? Ini dia pembahasannya.
1. Kenapa Missing Values Bisa Terjadi?
- Kesalahan input manual
- Sensor atau sistem gagal merekam data
- Responden survei tidak menjawab pertanyaan tertentu
- Penggabungan (merge) data dari beberapa sumber yang tidak lengkap
- Data memang sengaja tidak tersedia untuk kondisi tertentu
Memahami penyebab missing value penting karena akan menentukan strategi terbaik: apakah datanya hilang secara acak (MCAR/MAR) atau ada pola tertentu (MNAR).
2. Opsi 1: Drop (Menghapus)
import pandas as pd
# Hapus baris yang punya missing value
df_dropped_rows = df.dropna()
# Hapus kolom yang punya missing value
df_dropped_cols = df.dropna(axis=1)
# Hapus baris hanya jika kolom tertentu kosong
df_dropped_subset = df.dropna(subset=['kolom_penting'])
# Hapus baris jika minimal 3 kolom terisi (threshold)
df_dropped_thresh = df.dropna(thresh=3)
Menghapus baris atau kolom yang mengandung nilai kosong.
Kapan Cocok Dipakai
- Jumlah data yang hilang sangat sedikit (misal < 5% dari total data)
- Data hilang benar-benar acak (MCAR), sehingga tidak menghilangkan pola penting
- Dataset besar, sehingga kehilangan beberapa baris tidak berdampak signifikan
- Kolom tertentu punya missing value sangat tinggi (>50-60%) dan tidak terlalu informatif, sehingga kolom itu sendiri lebih baik di-drop
Risiko
- Kehilangan informasi, apalagi kalau data yang hilang jumlahnya besar
- Bisa menimbulkan bias jika data yang hilang ternyata tidak acak (misal orang dengan gaji tinggi cenderung tidak mengisi kolom pendapatan)
- Mengurangi ukuran sampel, yang bisa melemahkan power statistik atau performa model
3. Opsi 2: Fill (Imputasi)
Mengisi nilai kosong dengan nilai pengganti, bukan menghapusnya.
a. Statistik Sederhana
# Isi dengan rata-rata (cocok untuk data numerik terdistribusi normal)
df['kolom'] = df['kolom'].fillna(df['kolom'].mean())
# Isi dengan median (lebih tahan terhadap outlier)
df['kolom'] = df['kolom'].fillna(df['kolom'].median())
# Isi dengan modus (cocok untuk data kategorikal)
df['kolom'] = df['kolom'].fillna(df['kolom'].mode()[0])
b. Forward Fill / Backward Fill (Data Time Series)
df['kolom'] = df['kolom'].ffill() # ambil nilai sebelumnya
df['kolom'] = df['kolom'].bfill() # ambil nilai sesudahnya
c. Interpolasi
df['kolom'] = df['kolom'].interpolate(method='linear')
d. Imputasi Berbasis Model
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
df_imputed = imputer.fit_transform(df)
Bisa juga menggunakan regresi, atau model seperti IterativeImputer dari scikit-learn untuk memprediksi nilai yang hilang berdasarkan kolom lain.
e. Kategori Khusus “Unknown”
df['kolom_kategorikal'] = df['kolom_kategorikal'].fillna('Unknown')
Cara ini sekaligus menyimpan informasi bahwa data itu hilang, yang kadang justru berguna sebagai fitur tersendiri.
Kapan Cocok Dipakai
- Jumlah data yang hilang cukup signifikan, sehingga sayang untuk dibuang
- Dataset berukuran kecil hingga menengah, di mana setiap baris berharga
- Ada pola atau hubungan antar kolom yang bisa dimanfaatkan untuk menebak nilai yang hilang
- Untuk data time series, di mana urutan data penting dan drop bisa merusak kontinuitas
Risiko
- Bisa memasukkan bias jika metode imputasi tidak tepat (misal isi rata-rata pada data yang skewed)
- Menciptakan nilai “palsu” yang seolah-olah asli, sehingga model bisa terlalu percaya diri (variance jadi under-estimated)
- Butuh pemahaman domain yang baik agar imputasi masuk akal
4. Perbandingan Singkat
| Aspek | Drop | Fill |
|---|---|---|
| Kesederhanaan | Sangat mudah | Bervariasi, ada yang mudah ada yang kompleks |
| Risiko bias | Tinggi jika data tidak MCAR | Tinggi jika metode imputasi kurang tepat |
| Ukuran data | Berkurang | Tetap |
| Cocok untuk | Missing value sedikit & acak | Missing value banyak/informasi berharga |
| Butuh domain knowledge | Rendah | Sedang-Tinggi |
5. Tips Praktis
- Cek dulu polanya — visualisasikan missing value (misal pakai
missingnodi Python) sebelum memutuskan strategi. - Jangan langsung drop semua — coba pahami dulu apakah hilangnya data itu acak atau ada maknanya.
- Kombinasikan strategi — kolom dengan missing value sangat tinggi bisa di-drop, sisanya diimputasi.
- Buat kolom indikator (misal
kolom_missing = 1jika awalnya kosong) sebelum imputasi, supaya model tetap punya sinyal bahwa data itu tadinya hilang. - Validasi dampaknya — coba bandingkan performa model/analisis sebelum dan sesudah drop/fill untuk memastikan keputusan yang diambil masuk akal.
Kesimpulan: Tidak ada jawaban “yang paling benar” antara drop dan fill — semua tergantung pada seberapa banyak data yang hilang, mengapa data itu hilang, dan seberapa penting setiap baris/kolom bagi analisis atau model yang dibangun.