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:

SituasiStrategi utamaRisiko bila salah pakai
Baris tidak bisa dipercaya sama sekalidropna()Informasi ikut terbuang
Sel kosong bermakna nol atau label khususfillna(0) / fillna("Tidak Diketahui")Arti “tidak diketahui” tercampur arti “nol”
Distribusi perlu dipertahankanfillna(median)Mean lebih mudah terdistorsi outlier
Data berurutan, lubang pendekffill() / bfill() + limitNilai basi disalin berulang
Besaran kontinu berubah landaiinterpolate()Pecahan tak bermakna untuk nilai hitungan
Data terbagi kelompokPengisian 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:

python
"""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:

text
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.09

Mari kita telaah setiap langkahnya:

  1. Langkah 1 (baris 15-17): diagnosa menghitung empat sel kosong dan menampilkan describe(); lompatan min 12.00 dan max 41.00 terhadap kuartil 23.28-25.10 adalah sinyal outlier pertama.
  2. Langkah 2 (baris 20-22): karena ini deret harian sensor dengan lubang pendek, ffill() dipilih dan sisa sel kosong nol.
  3. 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 outlier 41.0 serta 12.0.
  4. Langkah 4 (baris 38-43): kedua outlier dibatasi ke batas IQR dengan clip(); mean turun dari 24.49 ke 24.13 dan std dari 5.81 ke 1.46.
  5. 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:

  1. Simpan mask deteksi ke variabel bernama jelas, misalnya mask_outlier, alih-alih menulis ulang perbandingannya.
  2. Catat jumlah sel yang diubah setiap langkah, seperti int(berubah.sum()) pada chapter Winsorization.
  3. Bandingkan describe() sebelum dan sesudah sebagai bukti dampak transformasi.
  4. 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.