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.
"""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()))pm25 9
kelembapan 3
stasiun
Stasiun A 5
Stasiun B 4
terisi oleh interpolasi : 8
tetap hilang : 1Sembilan 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.
| Perlakuan | Kapan cocok | Harganya |
|---|---|---|
| Menghapus baris | hilang sedikit dan acak | sampel mengecil, risiko bias bila tidak acak |
| Mengisi konstanta | kode yang bermakna | menipu statistik bila dianggap nilai nyata |
| Mengisi statistik | cepat untuk tabel besar | meratakan sebaran, menurunkan korelasi |
| Interpolasi | deret waktu yang halus | mengarang 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#
- Working with missing data — pandas documentation — dokumentasi resmi deteksi dan pengisian data hilang.
- Python for Data Analysis, 3rd Edition — Wes McKinney, O’Reilly — bab data hilang yang menjadi rujukan klasik perlakuan dan justifikasinya.