Strategi Data Hilang

Mendeteksi, memahami, dan menangani nilai hilang beserta justifikasi setiap perlakuan.

Daftar isi

Nilai hilang adalah keadaan normal pada data nyata, dan perlakuannya adalah keputusan analisis yang mengubah hasil, sehingga tidak boleh dijalankan sekadar mengikuti kebiasaan. Topik ini membedah tiga langkah yang berurutan, yaitu deteksi, pemahaman pola hilangnya, lalu perlakuan yang disertai justifikasi, semuanya pada dataset ukuran_udara.csv yang nilai hilangnya datang dalam tiga wujud sekaligus. Setelah membacanya, setiap pengisian atau penghapusan pada proyek memiliki alasan yang dapat dituliskan.

Wujud nilai hilang dan deteksinya#

Data hilang tidak selalu tampak sebagai sel kosong. Pada dataset latihan ini ia datang dalam tiga wujud, yaitu sel yang benar-benar kosong, teks kosong sebagai kode manual petugas, dan angka -999.0 sebagai kode mesin. Ketiganya hanya menjadi NaN bila pembacaan menetapkannya, dan inilah sebabnya topik membaca berkas menegaskan na_values sebelum analisis apa pun. Pembacaan yang salah membuat -999.0 ikut dirata-rata, dan hasilnya tampak wajar sambil salah.

Deteksi dilakukan per kolom dengan isna().sum(), dan skrip berikut menjalankannya di atas pembacaan yang sudah benar.

python strategi_data_hilang.py
"""Tiga langkah data hilang: deteksi, pemahaman, lalu perlakuan."""
import pandas as pd

data = pd.read_csv(
    "ukuran_udara.csv",
    na_values=["kosong", "-999.0"],
    dtype={"pm25": "string", "kelembapan": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["kelembapan"] = data["kelembapan"].str.replace(",", ".", regex=False).astype("float")
data["waktu"] = pd.to_datetime(data["waktu"], format="mixed", dayfirst=True)
data["stasiun"] = (
    data["stasiun"].str.strip().str.replace(r"\s+", " ", regex=True).str.title()
)

# langkah 1: deteksi per kolom
print(data[["pm25", "kelembapan"]].isna().sum().to_string())
print()

# langkah 2: pemahaman — di mana barisnya hilang
print(data[data["pm25"].isna()]["stasiun"].value_counts().to_string())
print()

# langkah 3: perlakuan — interpolasi waktu di dalam tiap stasiun
urut = data.sort_values("waktu")
urut["pm25_isi"] = urut.groupby("stasiun")["pm25"].transform(lambda s: s.interpolate())
print("terisi oleh interpolasi :", int(urut["pm25_isi"].notna().sum() - urut["pm25"].notna().sum()))
print("tetap hilang            :", int(urut["pm25_isi"].isna().sum()))
text Keluaran
pm25          9
kelembapan    3

stasiun
Stasiun A    5
Stasiun B    4

terisi oleh interpolasi : 8
tetap hilang            : 1

Sembilan nilai pm25 dan tiga kelembapan terdeteksi, dan distribusi ketidakhadirannya hampir seimbang antar stasiun, yaitu lima berbanding empat. Keseimbangan ini penting, sebab pola hilang yang menumpuk pada satu kelompok saja mengubah makna setiap perbandingan antar kelompoknya.

Memahami pola sebelum memilih perlakuan#

Perlakuan dipilih setelah pertanyaan “mengapa hilang” terjawab, dan jawaban umumnya berupa tiga kategori. Data hilang sepenuhnya acak membutuhkan perlakuan yang paling ringan, sedangkan data hilang karena proses yang diketahui menuntut perlakuan yang menghormati proses itu. Yang paling berbahaya adalah data yang hilang karena nilainya sendiri, misalnya sensor yang gagal justru saat polusi ekstrem, karena pengisiannya menghapus peristiwa yang justru paling dicari.

Pada dataset latihan ini, hilangnya lahir dari sensor yang tidak membaca pada jam tertentu, sehingga nilai di antara dua pengukuran yang berdekatan secara wajar diinterpolasi sepanjang waktu. Pemilihan interpolasi, bukan pengisian rata-rata, adalah justifikasinya, yaitu pola PM2.5 bergerak halus antar jam, sedangkan rata-rata keseluruhan mengabaikan urutan waktu.

Keluaran di atas menyisakan satu nilai yang tetap hilang, dan itulah pelajaran terpentingnya, yaitu interpolasi hanya mengisi nilai yang berada di antara dua tetangga. Pengukuran B pada jam paling awal hilang di tepi seri, sehingga tidak ada nilai sebelumnya, dan pilihannya tinggal mengisi mundur, membuang satu baris, atau membiarkannya hilang. Keputusan itu dituliskan, bukan didiamkan.

Perlakuan yang tersedia dan harganya#

Empat perlakuan menutup sebagian besar kebutuhan, dan tabel berikut merangkum harganya.

PerlakuanKapan cocokHarganya
Menghapus barishilang sedikit dan acaksampel mengecil, risiko bias bila tidak acak
Mengisi konstantakode yang bermaknamenipu statistik bila dianggap nilai nyata
Mengisi statistikcepat untuk tabel besarmeratakan sebaran, menurunkan korelasi
Interpolasideret waktu yang halusmengarang angka bila polanya sebenarnya melonjak

Harga pada kolom terakhir adalah alasan justifikasi tidak pernah opsional. Pengisian rata-rata pada data sensor yang lonjakannya justru peristiwa terpenting akan menghapus lonjakan itu dari laporan, dan kesalahan semacam ini tidak menimbulkan error apa pun.

Pada pekerjaan nyata, perlakuan yang sama dijalankan dengan dropna, fillna, atau interpolate sebagaimana skrip di atas, dan ketiganya diterapkan per kolom, bukan pada seluruh tabel sekaligus, karena kolom yang berbeda jarang berbagi sebab hilangnya.

Kesalahan umum#

Kesalahan pertama adalah menjalankan dropna() pada seluruh tabel tanpa melihat kolom mana yang hilang. Satu kolom opsional yang jarang terisi dapat membuang sebagian besar baris data, dan jumlah baris sebelum-sesudah yang dibandingkan lebih dahulu menangkapnya dalam sepuluh detik.

Kesalahan kedua adalah mengisi sebelum memahami polanya, terutama pada data yang hilang karena nilainya sendiri. Pola paling murah diperiksa adalah distribusi hilang per kelompok, seperti value_counts() pada skrip di atas, dan ketimpangan yang besar membatalkan pengisian netral apa pun.

Kesalahan ketiga adalah mengisi dengan angka yang berbentuk data, misalnya nol untuk kelembapan yang hilang. Nol adalah kelembapan yang mungkin secara fisik, sehingga kesalahannya tidak terlihat, sedangkan penanda NaN setidaknya memaksa setiap pemakai tabel mengambil posisi.

Ringkasan#

  • Nilai hilang datang dalam banyak wujud, dan semuanya dinetralkan pada saat pembacaan melalui na_values.
  • Deteksi per kolom dan pemahaman pola hilangnya mendahului setiap perlakuan, karena pola yang menumpuk pada satu kelompok mengubah makna analisis.
  • Interpolasi cocok untuk deret waktu yang halus, tetapi tidak mengisi nilai di tepi seri, dan keputusan atas sisanya dituliskan.
  • Setiap perlakuan memikul harga yang jelas, dan justifikasinya dicatat pada dokumentasi analisis.

Referensi#