Enam chapter terakhir memberi kita banyak alat: dropna(), fillna(), ffill(), bfill(), interpolate(), pengisian per kelompok, mask IQR, z-score, dan clip(). Alat yang banyak justru menimbulkan pertanyaan baru — mana yang harus dipilih untuk data yang ada di tangan? Chapter penutup section ini menyusun semua pilihan menjadi dua peta keputusan ringkas, lalu membuktikannya dalam satu pipeline yang mengolah data suhu gudang dari diagnosa hingga validasi. Tidak ada pilihan yang benar untuk semua kasus; yang ada adalah pilihan yang bisa dipertanggungjawabkan untuk konteks tertentu.
Peta Keputusan Missing #
Pertanyaan pertama selalu tentang pola (MCAR, MAR, atau MNAR dari chapter pembuka section ini), pertanyaan kedua tentang struktur data:
| Situasi | Strategi utama | Risiko bila salah pakai |
|---|---|---|
| Baris tidak bisa dipercaya sama sekali | dropna() | Informasi ikut terbuang |
| Sel kosong bermakna nol atau label khusus | fillna(0) / fillna("Tidak Diketahui") | Arti “tidak diketahui” tercampur arti “nol” |
| Distribusi perlu dipertahankan | fillna(median) | Mean lebih mudah terdistorsi outlier |
| Data berurutan, lubang pendek | ffill() / bfill() + limit | Nilai basi disalin berulang |
| Besaran kontinu berubah landai | interpolate() | Pecahan tak bermakna untuk nilai hitungan |
| Data terbagi kelompok | Pengisian per kelompok (groupby + ffill/transform) | Nilai antar kelompok saling bocor |
Satu kolom bisa menuntut lebih dari satu strategi, misalnya ffill() dengan limit_area="inside" pada deret waktu sekaligus median per kelompok untuk lubang di awal deret.
Peta Keputusan Outlier #
Deteksi dan tindakan adalah dua keputusan terpisah. Untuk deteksi, IQR menjadi pilihan utama karena tahan terhadap outlier, sedangkan z-score melengkapi pada data besar yang mendekati normal. Untuk tindakan, urutan pertimbangannya begini: periksa sumbernya lebih dulu; nilai yang sah dan penting dipertahankan; nilai kesalahan yang barisnya masih berguna dibatasi dengan clip(); baris yang tidak bisa dipercaya dibuang.
Pipeline Lengkap pada Data Gudang #
Skrip berikut menggabungkan semuanya dalam lima langkah pada deret suhu 1-14 Januari 2026 yang memuat empat lubang dan dua outlier:
"""Pipeline penanganan missing dan outlier pada data suhu gudang."""
import pandas as pd
import numpy as np
kalender = pd.date_range("2026-01-01", periods=14, freq="D")
suhu = pd.Series(
[
22.5, 23.1, np.nan, 24.0, 24.8, np.nan, np.nan,
25.5, 41.0, 25.2, 12.0, 23.8, 24.1, np.nan,
],
index=kalender,
name="suhu",
)
print("Langkah 1 - Diagnosa:")
print("Sel kosong :", int(suhu.isna().sum()))
print(suhu.describe().to_string(float_format="%.2f"))
print()
print("Langkah 2 - Missing: ffill() untuk deret harian sensor:")
suhu_isi = suhu.ffill()
print("Sisa sel kosong:", int(suhu_isi.isna().sum()))
print()
print("Langkah 3 - Outlier: batas IQR pada data yang sudah terisi:")
q1 = suhu_isi.quantile(0.25)
q3 = suhu_isi.quantile(0.75)
iqr = q3 - q1
bawah = round(q1 - 1.5 * iqr, 2)
atas = round(q3 + 1.5 * iqr, 2)
print(f"Q1={round(q1, 2)} Q3={round(q3, 2)} IQR={round(iqr, 2)}")
print(f"Batas=[{bawah}, {atas}]")
mask_outlier = (suhu_isi < bawah) | (suhu_isi > atas)
print("Nilai di luar batas:", suhu_isi[mask_outlier].tolist())
print()
print("Langkah 4 - Winsorization dengan clip() ke batas IQR:")
suhu_akhir = suhu_isi.clip(lower=bawah, upper=atas)
print("Nilai yang dipotong:", suhu_isi[mask_outlier].tolist())
print("Menjadi :", suhu_akhir[mask_outlier].tolist())
print("Mean :", round(suhu_isi.mean(), 2), "->", round(suhu_akhir.mean(), 2))
print("Std :", round(suhu_isi.std(), 2), "->", round(suhu_akhir.std(), 2))
print()
print("Langkah 5 - Validasi akhir:")
print("Sisa sel kosong :", int(suhu_akhir.isna().sum()))
print("Nilai di luar batas :", int(((suhu_akhir < bawah) | (suhu_akhir > atas)).sum()))
print(suhu_akhir.describe().to_string(float_format="%.2f"))Output yang Dihasilkan:
Langkah 1 - Diagnosa:
Sel kosong : 4
count 10.00
mean 24.60
std 6.97
min 12.00
25% 23.28
50% 24.05
75% 25.10
max 41.00
Langkah 2 - Missing: ffill() untuk deret harian sensor:
Sisa sel kosong: 0
Langkah 3 - Outlier: batas IQR pada data yang sudah terisi:
Q1=23.28 Q3=24.8 IQR=1.52
Batas=[20.99, 27.09]
Nilai di luar batas: [41.0, 12.0]
Langkah 4 - Winsorization dengan clip() ke batas IQR:
Nilai yang dipotong: [41.0, 12.0]
Menjadi : [27.09, 20.99]
Mean : 24.49 -> 24.13
Std : 5.81 -> 1.46
Langkah 5 - Validasi akhir:
Sisa sel kosong : 0
Nilai di luar batas : 0
count 14.00
mean 24.13
std 1.46
min 20.99
25% 23.28
50% 24.10
75% 24.80
max 27.09Mari kita telaah setiap langkahnya:
- Langkah 1 (baris 15-17): diagnosa menghitung empat sel kosong dan menampilkan
describe(); lompatanmin 12.00danmax 41.00terhadap kuartil23.28-25.10adalah sinyal outlier pertama. - Langkah 2 (baris 20-22): karena ini deret harian sensor dengan lubang pendek,
ffill()dipilih dan sisa sel kosong nol. - Langkah 3 (baris 25-35): batas IQR dihitung ulang pada data terisi — penting, karena jumlah nilai berubah — menghasilkan batas
[20.99, 27.09]dan dua outlier41.0serta12.0. - Langkah 4 (baris 38-43): kedua outlier dibatasi ke batas IQR dengan
clip(); mean turun dari24.49ke24.13dan std dari5.81ke1.46. - Langkah 5 (baris 46-49): validasi memastikan sisa sel kosong nol dan nilai di luar batas nol, lalu
describe()akhir memperlihatkan distribusi yang jauh lebih rapat.
Keputusan pada langkah 2 dan 4 baru bisa diambil karena konteksnya diketahui: log sensor harian (menguntungkan ffill()) dan pembacaan ekstrem yang menyerupai kesalahan sensor (menguntungkan pembatasan). Bila analisisnya justru tentang suhu ekstrem, langkah 4 wajib dibatalkan — outlier itu adalah datanya.
Dokumentasikan Setiap Keputusan #
Pipeline yang baik meninggalkan jejak. Empat kebiasaan kecil membuat hasil kita dapat diaudit:
- Simpan mask deteksi ke variabel bernama jelas, misalnya
mask_outlier, alih-alih menulis ulang perbandingannya. - Catat jumlah sel yang diubah setiap langkah, seperti
int(berubah.sum())pada chapter Winsorization. - Bandingkan
describe()sebelum dan sesudah sebagai bukti dampak transformasi. - Jaga data asli tetap utuh dengan menetapkan hasil ke variabel baru (
suhu_akhir), sesuai pola Copy-on-Write pandas 3.0.
Dengan kerangka ini, section Missing Data dan Outlier Lanjutan selesai — kita kini mampu mendiagnosis, mengisi, dan menjinakkan data tanpa menutup mata terhadap maknanya. Data yang bersih baru terasa hidup ketika dilihat; kejanggalan yang tadinya kita tangani dengan angka bisa terlihat sekilas lewat grafik. Section berikutnya, Visualisasi Data, membuka jalan itu dari Chapter Pengenalan Plotting Pandas.