×

Cara Menangani Data Hilang Sebelum Melatih Model

Meja kerja analis data dengan laptop menampilkan tabel berisi sel kosong dan catatan tangan

Cara Menangani Data Hilang Sebelum Melatih Model

Kamu membuka dataset hasil ekspor dari sistem internal, menjalankan df.info(), dan melihat beberapa kolom punya jumlah nilai kosong yang tidak sedikit. Model masih bisa dilatih, tapi hasilnya sering mengecewakan kalau kolom kosong itu dibiarkan. Panduan ini membahas cara menangani data hilang langkah demi langkah, dari memeriksa pola kosong sampai memilih metode imputasi yang masuk akal untuk kasusmu.

Kenapa Data Hilang Tidak Bisa Diabaikan

Banyak algoritma machine learning menolak baris yang punya nilai kosong. Scikit-learn, misalnya, akan melempar error saat menerima array berisi NaN pada sebagian besar estimator. Kamu bisa membuang baris tersebut, tapi jumlah data yang tersisa bisa jauh lebih kecil dari yang kamu bayangkan.

Masalah lain muncul ketika data hilang tidak acak. Kalau kolom pendapatan kosong hanya pada responden usia muda, membuang baris itu membuat modelmu kehilangan satu kelompok umur secara sistematis. Model jadi bias, dan metrik evaluasi di data uji terlihat bagus padahal tidak mencerminkan populasi sebenarnya.

Ada juga kasus di mana nilai kosong sebenarnya menyimpan informasi. Pada formulir pendaftaran, kolom nomor telepon yang kosong bisa berarti pengguna sengaja tidak mengisi karena tidak wajib. Informasi itu hilang begitu kamu mengisi kolom tersebut dengan nilai rata-rata.

Langkah 1: Ukur Sebaran Nilai Kosong

Sebelum memutuskan apa pun, kumpulkan angka. Hitung jumlah dan persentase nilai kosong per kolom, lalu lihat bagaimana sebarannya di seluruh dataset.

import pandas as pd

df = pd.read_csv("data_pelanggan.csv")

ringkasan = pd.DataFrame({
    "jumlah_kosong": df.isna().sum(),
    "persen_kosong": (df.isna().mean() * 100).round(2),
    "tipe_data": df.dtypes.astype(str),
})

ringkasan = ringkasan[ringkasan["jumlah_kosong"] > 0]
print(ringkasan.sort_values("persen_kosong", ascending=False))

Kolom dengan nilai kosong di bawah satu persen biasanya aman dibuang barisnya. Kolom dengan nilai kosong di atas lima puluh persen perlu dipertimbangkan ulang: apakah kolom itu benar-benar berguna, atau justru menambah derau.

Periksa apakah nilai kosong berpola

Angka saja tidak cukup. Kamu perlu tahu apakah nilai kosong tersebar acak atau mengelompok pada segmen tertentu. Cara cepatnya, bandingkan distribusi kolom lain antara baris yang kosong dan baris yang terisi.

kolom_target = "pendapatan"

print(df[df[kolom_target].isna()]["usia"].describe())
print(df[df[kolom_target].notna()]["usia"].describe())

Kalau rata-rata usia pada dua kelompok itu berbeda jauh, nilai kosong di kolom pendapatan tidak acak. Imputasi dengan nilai tengah global akan menarik distribusi ke arah yang salah.

Langkah 2: Pilih Strategi Berdasarkan Jenis Kolom

Perlakuan untuk kolom numerik dan kategorikal berbeda. Begitu juga ketika nilai kosong punya makna sendiri.

  • Buang baris kalau nilai kosong sedikit dan tersebar acak. Ini pilihan paling sederhana dan paling kecil risikonya.
  • Buang kolom kalau persentase kosongnya sangat tinggi dan kolom itu tidak punya dasar teori kuat untuk dipertahankan.
  • Isi dengan nilai tengah untuk kolom numerik yang distribusinya miring, karena rata-rata mudah tertarik nilai ekstrem.
  • Isi dengan modus untuk kolom kategorikal yang jumlah kategorinya sedikit.
  • Beri label khusus seperti "tidak_diketahui" ketika nilai kosong membawa arti tersendiri.
  • Imputasi berbasis model ketika hubungan antar kolom cukup kuat dan kamu punya data cukup banyak.

Urutan penerapan juga penting. Lakukan pemisahan data latih dan uji lebih dulu, lalu hitung nilai imputasi hanya dari data latih. Kalau kamu menghitung rata-rata dari seluruh dataset sebelum pemisahan, informasi dari data uji bocor ke proses pelatihan dan skor evaluasimu jadi terlalu optimistis.

Langkah 3: Terapkan Imputasi di Dalam Pipeline

Cara paling aman adalah membungkus langkah imputasi ke dalam pipeline. Dengan begitu, nilai imputasi dihitung ulang setiap kali pipeline dipanggil pada data baru, dan tidak ada kebocoran informasi.

from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X = df.drop(columns=["berhenti_berlangganan"])
y = df["berhenti_berlangganan"]

X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

kolom_numerik = X.select_dtypes(include="number").columns
kolom_kategori = X.select_dtypes(exclude="number").columns

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

transformasi = ColumnTransformer([
    ("numerik", Pipeline([
        ("isi", SimpleImputer(strategy="median")),
        ("skala", StandardScaler()),
    ]), kolom_numerik),
    ("kategori", Pipeline([
        ("isi", SimpleImputer(strategy="most_frequent")),
        ("encode", OneHotEncoder(handle_unknown="ignore")),
    ]), kolom_kategori),
])

model = Pipeline([
    ("transformasi", transformasi),
    ("klasifikasi", LogisticRegression(max_iter=1000)),
])

model.fit(X_latih, y_latih)
print(model.score(X_uji, y_uji))

Pola ini membuat proses imputasi ikut tersimpan bersama model. Saat kamu menyimpan model ke disk dan memuatnya kembali di layanan prediksi, aturan imputasi yang sama tetap berlaku.

Langkah 4: Bandingkan Beberapa Strategi

Jangan langsung percaya satu metode. Jalankan beberapa skenario dan bandingkan performanya pada data uji yang sama. Karena data uji ini tidak pernah dilihat model selama pelatihan, perbandingannya cukup adil.

  1. Latih model dengan baris kosong dibuang.
  2. Latih model dengan imputasi nilai tengah.
  3. Latih model dengan imputasi berbasis model, misalnya IterativeImputer.
  4. Catat skor akurasi, presisi, dan recall untuk setiap skenario.
  5. Pilih yang paling seimbang, bukan yang angkanya paling tinggi di satu metrik saja.

Akurasi tinggi bisa menyesatkan kalau kelasnya tidak seimbang. Untuk kasus seperti itu, lihat juga matriks konfusi supaya kamu tahu jenis kesalahan yang paling sering muncul, bukan hanya berapa banyak prediksi yang benar. Cara membaca confusion matrix dibahas lebih rinci di artikel terpisah, termasuk cara menafsirkan false positive dan false negative pada data yang timpang.

Langkah 5: Dokumentasikan Keputusanmu

Setiap kolom yang kamu isi atau buang adalah keputusan yang memengaruhi hasil. Tuliskan alasan di catatan proyek atau di dalam buku catatan eksperimen. Ketika tiga bulan kemudian ada yang bertanya kenapa kolom tertentu dibuang, kamu punya jawaban yang bisa ditelusuri.

Hal yang sama berlaku untuk kode. Beri komentar singkat pada baris imputasi yang tidak lazim, misalnya ketika kamu sengaja mempertahankan nilai kosong sebagai kategori terpisah. Orang yang membaca kodemu nanti belum tentu tahu konteks datanya.

Kapan sebaiknya tidak mengimputasi

Ada kalanya membiarkan nilai kosong justru lebih jujur. Kalau kolom itu adalah target prediksi, kamu tidak bisa mengisinya dengan tebakan karena akan menciptakan label palsu. Kalau kolom itu baru diisi setelah kejadian tertentu, nilai kosong pada periode sebelumnya memang wajar dan mengisinya justru menciptakan informasi yang tidak ada.

Untuk data deret waktu, imputasi sederhana sering merusak pola. Interpolasi linear atau metode khusus deret waktu biasanya lebih tepat, dan penanganannya perlu memperhatikan urutan waktu, bukan sekadar nilai tetangga di tabel.

Ringkasan

Menangani data hilang dimulai dari mengukur sebarannya, bukan dari memilih metode favorit. Periksa apakah nilai kosong berpola, pilih strategi sesuai jenis kolom, dan bungkus semuanya dalam pipeline agar tidak ada kebocoran data. Setelah itu, bandingkan beberapa skenario pada data uji yang sama sebelum memutuskan.

Pertanyaan yang Sering Diajukan

Apakah membuang baris dengan nilai kosong selalu salah?

Tidak. Kalau jumlahnya kecil, tersebar acak, dan kamu punya data yang cukup banyak, membuang baris adalah pilihan yang paling sederhana. Yang perlu dihindari adalah membuang baris dalam jumlah besar tanpa memeriksa apakah ada pola tertentu di baliknya.

Metode imputasi mana yang paling akurat?

Tidak ada satu metode yang selalu menang. Hasilnya bergantung pada hubungan antar kolom, jumlah data, dan jenis model yang dipakai. Cara paling praktis adalah mencoba dua sampai tiga metode lalu membandingkan performanya pada data uji yang sama.

Bagaimana kalau nilai kosong ada di kolom target?

Baris dengan target kosong tidak bisa dipakai untuk pelatihan supervised karena labelnya tidak diketahui. Sebaiknya baris itu dikeluarkan dari data latih, kecuali kamu memang punya sumber lain untuk melengkapi label tersebut secara sah.

You May Have Missed