5  Missing Values & Outliers (Reproducible, Berbasis Pipeline)

5.1 Missing Values & Outlier (Reproducible, Berbasis pipeline)

5.1.1 Mekanisme Missingness: MCAR, MAR, dan MNAR

Sebagian besar algoritma machine learning tidak dapat memproses nilai kosong secara langsung. Kita wajib menangani data yang tidak lengkap sebelum masuk ke tahap pemodelan. Namun, sebelum menyusun strategi imputasi di dalam pipeline, kita perlu memeriksa alasan di balik hilangnya data tersebut. Nilai kosong sering kali merupakan artefak yang membawa informasi spesifik tentang proses pengumpulan observasi. Tahap inspeksi dan diagnostik selalu mendahului otomatisasi.

Secara matematis, mekanisme hilangnya data (missingness mechanism) didefinisikan melalui probabilitas bersyarat dari matriks indikator kekosongan. Misalkan terdapat sekumpulan data \(Y\) yang terdiri dari bagian teramati \(Y_{obs}\) dan bagian kosong \(Y_{miss}\). Jika kita mendefinisikan matriks indikator \(R\) di mana nilai 1 berarti data hilang dan 0 berarti teramati, mekanisme missingness dinyatakan sebagai fungsi probabilitas \(P(R \mid Y_{obs}, Y_{miss}, \phi)\). Di sini, \(R\) merepresentasikan matriks indikator ketiadaan data, \(Y_{obs}\) adalah nilai atribut yang berhasil terekam, \(Y_{miss}\) adalah nilai atribut yang kosong, dan \(\phi\) merupakan parameter tidak diketahui yang menentukan proses hilangnya data. Berdasarkan hubungan ketergantungan ini, statistika membagi hilangnya data ke dalam tiga kategori utama.

Kategori pertama adalah Missing Completely At Random (MCAR). Pada kasus ini, kekosongan terjadi murni secara kebetulan dan peluang hilangnya data tidak dipengaruhi oleh variabel lain. Bentuk distribusinya disederhanakan menjadi \(P(R \mid Y_{obs}, Y_{miss}, \phi) = P(R \mid \phi)\). Contohnya, sensor pengukur angin gagal mengirimkan data sesaat akibat pemadaman listrik acak. Pada skenario MCAR, porsi data yang utuh tetap menjadi sampel representatif dari populasi awal.

Kategori kedua adalah Missing At Random (MAR). Peluang terjadinya nilai kosong bergantung pada variabel lain di dalam dataset, tetapi tidak dipengaruhi oleh nilai yang hilang itu sendiri. Persamaannya menjadi \(P(R \mid Y_{obs}, Y_{miss}, \phi) = P(R \mid Y_{obs}, \phi)\). Sebagai contoh, pasien berusia lanjut mungkin lebih sering mengosongkan riwayat olahraga. Pola kekosongan pada riwayat olahraga tersebut dapat dijelaskan menggunakan rentang usia. Memisahkan data berdasarkan usia akan menghasilkan sebaran kekosongan yang tampak acak pada masing-masing kelompok umur.

Kategori ketiga adalah Missing Not At Random (MNAR). Probabilitas hilangnya suatu nilai terikat langsung dengan isi dari nilai yang tidak teramati tersebut (\(Y_{miss}\)). Ketergantungan ini membuat persamaan probabilitas tidak dapat disederhanakan. Kasus klasiknya adalah survei pendapatan, di mana responden dengan angka kekayaan ekstrem sering kali menolak melapor demi privasi. Absennya data merupakan dampak langsung dari nominal kekayaan itu sendiri, sehingga pada kondisi MNAR, lokasi kekosongan justru mengandung sinyal pemodelan yang kuat.

%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph TD
    A[Analisis Missingness] --> B[MCAR: Hilang Acak Sempurna - Tanpa Hubungan Variabel]
    A --> C[MAR: Hilang Terikat Atribut Lain - e.g. Lansia Melewatkan Isian Web]
    A --> D[MNAR: Hilang Terikat Nilai Aslinya sendiri - e.g. Gaji Tinggi Malu Mengisi]
Figure 5.1: Perbandingan Pola Hilangnya Data pada Mekanisme MCAR, MAR, dan MNAR

Membedakan ketiga profil mekanisme di atas mencegah injeksi bias pada fase pelatihan. Jika kita mengisi data yang tergolong MNAR menggunakan nilai rata-rata, kita akan merusak batas distribusi asli dan menyamarkan keberadaan kelompok ekstrem dalam sampel.

Praktisi menggunakan sejumlah pustaka dan uji statistik untuk memfasilitasi proses inspeksi. Pertama, menggunakan visualisasi matriks. Pustaka ekosistem Python seperti missingno menyediakan visualisasi matriks korelasi nullity; korelasi tinggi pada matriks indikator antar-kolom kerap menandai adanya probabilitas kondisional berjenis MAR atau MNAR. Kedua, menggunakan uji MCAR Little. Uji statistik ini mengevaluasi deviasi observasi untuk memeriksa asumsi MCAR. Karena mempertahankan hipotesis awal MCAR merupakan bukti yang lemah, praktisi tetap memerlukan penilaian konteks domain yang kuat. Ketiga, pemodelan eksplisit. Pada kasus berkarakteristik MNAR, nilai kosong justru wajib dipertahankan karena membawa sinyal indikator eksplisit. Pendekatan deep learning modern bahkan telah secara fungsional memodelkan mekanisme sensor mandiri agar menghasilkan estimasi yang bebas bias.

Operasi imputasi missing values tidak berjalan serampangan. Pemahaman konseptual, inspeksi visual, serta pengetahuan konteks domain merupakan prasyarat mutlak sebelum mengubah teknik penanganan nilai kosong menjadi komponen pipeline permanen.

5.2 Imputasi Sebagai Komponen Pipeline

Praktik yang sering keliru dalam pengembangan model adalah memposisikan penanganan data kosong sebagai tahap pembersihan di awal proses. Data diisi menggunakan rata-rata atau median dari keseluruhan dataset, baru kemudian dibagi menjadi split training dan split test. Pendekatan ini memicu kebocoran informasi (data leakage) karena tahap imputasi tidak terisolasi dari data uji. Imputasi adalah transformasi struktural yang harus tertanam di dalam pipeline pemodelan.

Kebocoran terjadi karena perhitungan statistik merekam informasi dari kelompok evaluasi. Jika sekumpulan data \(X\) merupakan gabungan data latih dan data uji, persamaan rata-rata imputasi yang mengalami kebocoran adalah:

\[ \mu_{bocor} = \frac{1}{|X_{train}| + |X_{test}|} \left( \sum_{x \in X_{train}} x + \sum_{x \in X_{test}} x \right) \]

Suku \(\sum_{x \in X_{test}} x\) memastikan bahwa parameter pengisi pada data latih terdistorsi oleh distribusi pengujian. Akibatnya, model menangkap rentang nilai dari data masa depan saat fase pelatihan. Metrik evaluasi akan tampak tinggi, tetapi akurasi sebenarnya merosot tajam saat model memproses data riil.

%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph TD
    A1[Dataset Utuh] -->|Imputasi Menggunakan Statistik Keseluruhan| B1[Data Terimputasi]
    B1 -->|Split| C1[Train]
    B1 -->|Split| D1[Test]
Figure 5.2: Alur Imputasi Data Utuh yang Menyebabkan Kebocoran
%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph TD
    A2[Dataset Utuh] -->|Split| B2[Train Split]
    A2 -->|Split| C2[Test Split]
    B2 -->|Pipeline Fit Imputer| D2[Transformer Parameter Imputasi]
    D2 -->|Transform Train| E2[Train Bersih]
    C2 -->|Transform Test Murni| D2
    D2 -->|Output| F2[Test Bersih]
Figure 5.3: Alur Imputasi Aman Menggunakan Pipeline

Untuk menghindari kebocoran, modul imputasi (seperti SimpleImputer atau KNNImputer pada pustaka Scikit-Learn) harus diperlakukan sama seperti model prediktif, melalui pemisahan fase fit dan transform. Nilai pengisi dihitung eksklusif dari split training:

\[ \mu_{benar} = \frac{1}{|X_{train}|} \sum_{x \in X_{train}} x \]

Nilai parameter imputasi (\(\mu_{benar}\)) ini kemudian dikunci dan dipakai secara seragam untuk mengisi baris kosong pada split training maupun split test. Menyatukan imputasi sebagai komponen di dalam pipeline akan menjamin beberapa kondisi operasional. Pertama, tercipta isolasi yang ketat dalam validasi silang (cross-validation). Saat dievaluasi, kalkulasi parameter imputasi selalu diulang pada setiap lipatan pelatihan (fold), sehingga lipatan validasi tetap steril dan tidak menyumbang nilai perhitungan. Kedua, tercipta konsistensi inferensi di lingkungan produksi. Saat model beroperasi, baris data baru akan otomatis menerima perlakuan imputasi berdasarkan parameter statistik data latih lama, membebaskan praktisi dari keharusan memprogram ulang logika imputasi pada peladen. Ketiga, integritas metode imputasi iteratif yang kompleks (seperti imputasi berbasis algoritma klasifikasi) akan terus terjaga, karena seluruh kalkulasinya dipaksa untuk beroperasi murni di atas split training tanpa mendistorsi varians pengujian.

Meskipun riset menunjukkan bahwa imputasi median sederhana yang dilakukan di luar validasi silang terkadang dapat menawarkan sedikit keuntungan varians dengan mengorbankan bias (Jaeger dkk., 2020), aturan bakunya tetap ketat: seluruh perhitungan statistik pengganti harus diposisikan sebagai transformer setelah pemisahan data dilakukan.

5.3 Imputasi Sederhana vs. Berbasis Model

Pemilihan algoritma pengisian nilai kosong bergantung pada mekanisme missingness (MCAR, MAR, atau MNAR). Pendekatan imputasi terbagi ke dalam dua metode: metode univariat dasar yang memprioritaskan kecepatan kalkulasi dan metode multivariat yang berusaha mempertahankan struktur distribusi data asli.

5.3.1 Imputasi Univariat (Sederhana)

Imputasi sederhana mengisi sel data kosong menggunakan metrik statistik tunggal dari kolom yang sama, seperti rata-rata (mean), median, atau modus.

Karakteristik operasional pendekatan univariat utamanya terletak pada kecepatan komputasi. Metode ini sangat efisien karena hanya memerlukan proses agregasi linier satu arah pada satu kolom. Namun, pendekatan ini mengabaikan korelasi antar-variabel karena nilai penggantinya dihitung secara terisolasi. Jika sel kosong pada kolom berat badan diisi dengan nilai median populasi umum, estimasi tersebut sepenuhnya abai terhadap pengaruh atribut tinggi badan atau kelompok usia pada baris observasi yang sama. Selain itu, metode univariat memicu penyusutan varians yang tidak natural. Menginjeksikan titik data bernilai identik secara massal persis ke tengah distribusi akan langsung menekan penyebaran data asli. Penyusutan buatan ini mendistorsi nilai galat standar (standard error) saat tabel dipakai untuk melatih model prediktif pada tahap analitik hilir.

5.3.2 Imputasi Multivariat (Berbasis Model)

Untuk mempertahankan korelasi struktural antar-fitur, imputasi multivariat memperlakukan kolom berstatus missing sebagai variabel target prediksi, sementara lajur kolom utuh difungsikan secara bergantian sebagai matriks penjelas.

Dua algoritma klasik utama di kelas multivariat ini adalah K-Nearest Neighbors (KNN) dan Imputasi Iteratif (MICE). Algoritma KNN mengisi sel renggang melalui rata-rata nilai dari gabungan tetangga terdekatnya. Proses pencariannya mengeksekusi parameter jarak spesifik hanya dari rentang variabel yang bebas sel kosong. Di sisi lain, Multiple Imputation by Chained Equations (MICE) menyusun rantai prediksi dengan melatih fungsi regresi pada tiap-tiap target kolom secara berurutan dalam skema round-robin.

%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph LR
    A[Imputasi Awal Median] --> B[Prediksi Fitur 1 Menggunakan Fitur 2, 3]
    B --> C[Prediksi Fitur 2 Menggunakan Fitur 1, 3]
    C --> D[Prediksi Fitur 3 Menggunakan Fitur 1, 2]
    D -->|Iterasi Hingga Konvergen| B
Figure 5.4: Siklus Prediksi Berantai pada Algoritma MICE

Secara matematis, prediksi fungsi target pada skema imputasi iteratif dikalkulasikan dengan formula \(\hat{x}_{i,j}^{(t)} = f_j \left( x_{i,1}^{(t)}, \dots, x_{i,j-1}^{(t)}, x_{i,j+1}^{(t-1)}, \dots, x_{i,p}^{(t-1)} \right)\). Dalam persamaan tersebut, \(\hat{x}_{i,j}^{(t)}\) menyatakan angka proyeksi pada sel baris ke-\(i\) di kolom \(j\) untuk siklus ke-\(t\). Variabel \(f_j\) mewakili algoritma pengawasan (contohnya Random Forest atau regresi) yang ditugaskan khusus membedah varians kolom \(j\). Model ini mencerna deret data secara kontinu: meminjam pembaruan nilai kelompok indeks \(1\) sampai \(j-1\) dari iterasi terkini \((t)\), lalu memanfaatkan sisa rentang dari \(j+1\) hingga dimensi puncak \(p\) dari siklus masa lalu \((t-1)\). Modul arsitektur pustaka modern seperti IterativeImputer umumnya dikonfigurasi untuk memberikan prediksi nilai tunggal (single imputation) demi mereduksi kerumitan pipeline komputasi inferensi, walau hal ini menghilangkan visibilitas atas ketidakpastian angka penambalan (imputation uncertainty) yang biasanya dikelola lewat metodologi MICE murni.

5.3.3 Pendekatan Generatif Berbasis Deep Learning

Ketika merespons matriks fitur berukuran raksasa dengan jejak dependensi non-linier kompleks, deep learning menyuguhkan varian imputasi probabilistik representatif. Misalnya, arsitektur Masked Autoencoder mensimulasikan bagian data menjadi tutupan tersembunyi (mask), kemudian memaksa arsitektur self-supervised untuk menebak angka faktual yang sengaja digelapkan guna menggali pola struktur utamanya. Di sisi lain, Diffusion Models mengadaptasi kalkulasi pembalikan transmisi difusi sebaran derau ke dalam sel yang hilang untuk menghasilkan tebakan presisi tinggi. Terdapat pula arsitektur sadar-MNAR seperti not-MIWAE yang melepas batasan asumsi acak (MAR) secara matematis dan mengintegrasikan mekanisme missingness itu sendiri secara eksplisit untuk membaca variabel observasional ganda.

Dominasi tingkat performa arsitektur jaringan generasi baru ini hampir selalu menuntut biaya perangkat unit keras dengan limit kalkulasi ekstraksi maksimum. Banyak pakar komparatif metrik modern, direpresentasikan dalam dokumen analisis Näf (2026), merekomendasikan komputasi fungsional imputasi stokastik berbantuan regresi pohon berjejer (MICE-Random Forest) lantaran margin selisih kapabilitas prediksinya kerap kali sangat tipis dibandingkan kompilasi struktur generatif raksasa. Keberhasilan parameter probabilitas klasik menjustifikasi fungsinya baik sebagai baseline fungsional maupun parameter penyeimbang pada optimisasi utilitas ruang arsitektur generatif modern.

5.4 Missing Indicator Sebagai Sinyal

Ketika berhadapan dengan data yang tidak lengkap, proses imputasi secara otomatis menghapus sebuah informasi struktural: fakta bahwa observasi tersebut awalnya kosong. Ketidakhadiran sebuah nilai sering kali menyimpan sinyal prediktif yang lebih kuat daripada nilai tebakan yang dimasukkan oleh algoritma imputasi.

Untuk mempertahankan informasi ini, kita mengonstruksi fitur biner tambahan yang disebut missing indicator. Fitur ini memisahkan operasi pengisian nilai dari status ketersediaan data awal. Secara matematis, untuk sebuah fitur \(x^{(j)}\), indikator \(m^{(j)}\) didefinisikan melalui persamaan berikut:

\[ m_i^{(j)} = \begin{cases} 1, & \text{jika } x_i^{(j)} \text{ bernilai NaN (kosong)} \\ 0, & \text{jika } x_i^{(j)} \text{ terobservasi} \end{cases} \]

Di mana \(m_i^{(j)}\) adalah elemen indikator biner untuk observasi ke-\(i\) pada fitur ke-\(j\), dan \(x_i^{(j)}\) merepresentasikan nilai asli dari data sebelum melewati tahapan imputasi.

%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph LR
    A[Fitur Asal: Gaji - Berisi NaN] -->|Cabang 1: Imputasi Median| B[Gaji_Imputed: Nilai Asli + Median]
    A -->|Cabang 2: Evaluasi Kehadiran Data| C[Gaji_Is_Missing: Boolean 0/1]
Figure 5.5: Alur Transformasi Satu Fitur Asli Menjadi Fitur Berimputasi dan Missing Indicator

Pendekatan ini sangat relevan saat menangani mekanisme data Missing Not At Random (MNAR), di mana pola kekosongan memiliki korelasi dengan variabel target. Sebagai contoh, pada model penilaian risiko kredit, ketiadaan data “nomor telepon tempat kerja” sering kali bukan akibat kegagalan pencatatan sistem. Kekosongan tersebut dapat mengindikasikan riwayat pekerjaan yang tidak stabil, yang secara empiris merupakan sinyal probabilitas gagal bayar yang tinggi.

Keberadaan missing indicator mengubah cara model membaca dataset yang telah diimputasi. Algoritma akan menggunakan fitur hasil imputasi untuk mengidentifikasi pola pada populasi umum, sembari di saat yang sama memanfaatkan matriks indikator biner ini untuk menyesuaikan probabilitas prediksi berdasarkan fenomena ketiadaaan informasi tersebut. Pada model berbasis pohon (seperti Random Forest atau Gradient Boosting), tersedianya indikator ini memungkinkan algoritma membuat partisi percabangan logika (split) spesifik yang membedakan observasi dengan nilai asli dari observasi dengan nilai tebakan hasil perkiraan.

Secara teknis, komputasi indikator ini umumnya dirangkai dalam satu paket dengan objek imputasi di dalam pipeline (seperti mengaktifkan parameter add_indicator=True pada SimpleImputer di pustaka Scikit-Learn). Pembentukan indikator tunduk pada batasan fiksasi fit-transform untuk mencegah kebocoran data (data leakage). Pertama, fitur indikator ini dikunci secara fiksasi saat pelatihan; matriks biner hanya diregistrasi untuk kolom-kolom yang secara empiris terdeteksi memiliki nilai kosong di dalam set pelatihan (training set). Kedua, terdapat kekakuan saat inferensi; jika sebuah kolom terisi penuh di data pelatihan namun secara mengejutkan muncul dengan nilai kosong pada data baru di lingkungan produksi, pipeline tidak akan mengizinkan pembentukan kolom indikator baru secara dadakan, melainkan hanya akan menjalankan fungsi imputasinya saja.

Penggunaan missing indicator memiliki konsekuensi komputasional dan arsitektural. Praktik ini harus dilakukan secara selektif dengan mempertimbangkan dua efek samping struktural. Pertama adalah risiko inflasi dimensi; penambahan indikator untuk setiap kolom yang kehilangan data murni secara acak (MCAR) hanya akan mengekspansi ruang matriks (dimensionality) secara redundan tanpa menyuntikkan sinyal prediktif apa pun. Kedua adalah bahaya multikolinearitas struktural. Jika beberapa kolom memiliki pola kekosongan yang selalu muncul bersamaan (co-missing patterns)—misalnya fitur tanggal mulai kontrak dan tanggal akhir kontrak yang selalu kosong berbarengan—indikator yang dihasilkan untuk masing-masing kolom akan berkorelasi linier absolut. Korelasi ganda ini pada akhirnya merusak stabilitas komputasi matriks pada algoritma pemodelan parametrik seperti regresi linier.

5.5 Outlier: Deteksi vs. Penanganan

Selain penanganan missing values, nilai ekstrem atau outlier merupakan tantangan utama dalam merepresentasikan distribusi populasi. Outlier kerap diperlakukan sebagai data rusak yang harus segera dihapus. Praktik pembersihan reaktif ini berisiko menghilangkan varians data. Rekayasa fitur yang sistematis membagi manajemen outlier ke dalam dua tahap operasional terpisah: deteksi dan penanganan.

5.5.1 Deteksi: Mengobservasi Anomali

Tahap deteksi murni bertujuan menetapkan batas kenormalan suatu fitur. Algoritma hanya melabeli atau memberikan skor pada nilai yang secara matematis berada di luar distribusi mayoritas, tanpa melakukan modifikasi nilai.

Ekosistem analitik data mengelompokkan pendekatan deteksi pencilan ke dalam beberapa tingkatan. Pertama, metode univariat yang secara langsung mengukur jarak dari pusat distribusi, seperti penggunaan ambang batas rentang antarkuartil (IQR). Kedua, pendekatan multivariat, yakni penggunaan algoritma proksimitas seperti Isolation Forest dan Local Outlier Factor (LOF) untuk mengukur derajat keterasingan observasi di dalam ruang berdimensi banyak. Ketiga, deteksi probabilistik tanpa parameter; algoritma modern seperti ECOD (Empirical-CDF-based Outlier Detection) mengestimasi fungsi distribusi kumulatif empiris pada setiap dimensi untuk menghasilkan probabilitas anomali gabungan, menyingkirkan kebutuhan penyetelan ambang batas secara manual.

Implementasi antarmuka dalam pustaka seperti Scikit-Learn juga membedakan skenario analisis anomali ke dalam dua metode. Outlier detection melabeli data pelatihan yang memang sudah terkontaminasi anomali sejak awal (umumnya menggunakan fungsi fit_predict). Di sisi lain, novelty detection membangun profil normal secara eksklusif dari data bersih, lalu menggunakannya untuk mendeteksi penyimpangan hanya pada observasi baru (misalnya dengan memicu parameter novelty=True pada LOF).

Untuk data univariat, rata-rata dan deviasi standar mudah rusak oleh nilai ekstrem itu sendiri. Metode yang lebih tangguh (robust) mengganti deviasi standar dengan skor Z yang dimodifikasi (modified z-score) yang diturunkan dari Deviasi Absolut Median (MAD):

\[ MAD = \text{median}(|x_i - \text{median}(X)|) \]

\[ M_i = \frac{0.6745 \cdot (x_i - \text{median}(X))}{MAD} \]

Di mana \(x_i\) merepresentasikan nilai observasi fitur ke-\(i\) dan \(\text{median}(X)\) merupakan nilai tengah dari seluruh observasi fitur \(X\). Variabel \(MAD\) mengukur variabilitas dari penyebaran data di sekitar median yang kebal terhadap tarikan outlier. Terakhir, \(M_i\) adalah metrik anomali observasi; konstanta \(0.6745\) digunakan untuk menyelaraskan metrik ini agar sepadan dengan estimasi deviasi standar pada distribusi normal. Secara empiris, observasi dengan nilai \(|M_i| > 3.5\) umumnya dilabeli sebagai anomali.

%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph TD
    A[Sistem Pemrosesan] --> B[Cleaning Statis: Penggantian Permanen pada File Sumber]
    A --> C[Transformasi Dinamis: Objek Transformer Pipeline Berjalan On-the-fly]
Figure 5.6: Perbandingan Alur Eksekusi Data Cleaning Statis vs Transformasi Dinamis

5.5.2 Penanganan: Konteks Domain

Setelah algoritma menandai nilai-nilai ekstrem, tahap penanganan menentukan bentuk intervensi data. Keputusan ini bertumpu sepenuhnya pada konteks domain permasalahan, bukan semata pada metrik matematis. Anomali umumnya terbentuk oleh dua skenario berbeda. Skenario pertama adalah galat perekaman data. Ini mencakup nilai yang menyalahi hukum realitas, seperti umur manusia 150 tahun atau sensor suhu yang berbunyi angka absolut negatif. Kesalahan instrumen semacam ini sah untuk diperlakukan layaknya missing value, yang ditangani dengan memotong nilainya ke batas maksimum logis (capping) atau diimputasi ulang. Skenario kedua adalah sinyal nyata. Anomali sering merepresentasikan kejadian ekstrem yang memang valid di dunia nyata, seperti pembelanjaan harian bernilai ratusan juta rupiah. Nilai ini bisa menandakan kehadiran pelanggan korporat besar atau bahkan menjadi deteksi dini aktivitas penipuan. Menghapus atau memotong nilai transaksi ini secara buta justru akan menghilangkan sinyal prediktif yang paling diperlukan oleh algoritma. Pemisahan operasional antara deteksi dan penanganan memastikan praktisi data selalu mengevaluasi asal-usul nilai ekstrem sebelum mengonversinya, mencegah hilangnya informasi berharga secara permanen.

5.6 Transformasi Robust untuk Outlier

Outlier yang faktual dan valid menimbulkan dilema. Menghapus observasi membuang informasi dan mengurangi ukuran sampel data. Sebaliknya, membiarkan nilai ekstrem apa adanya dapat mendistorsi pelatihan. Algoritma yang sensitif terhadap magnitudo (seperti regresi linier atau metode berbasis jarak) rentan terhadap efek ini karena fungsi kerugiannya memberikan penalti besar pada titik ekstrem. Akibatnya, garis regresi tertarik kuat ke arah outlier hanya untuk meminimalkan kerugian pada titik tersebut, sehingga mengorbankan akurasi mayoritas data. Transformasi robust meredam pengaruh nilai ekstrem ini tanpa menghancurkan informasi posisinya.

Terdapat tiga metode utama untuk menangani nilai ekstrem melalui pendekatan transformasi.

Metode pertama adalah pemangkasan (capping atau winsorizing). Daripada membuang baris data, kita menetapkan ambang batas atas dan batas bawah; setiap nilai yang melampauinya dipangkas dan disamakan dengan batas tersebut. Sebagai contoh, jika batas ditetapkan pada persentil ke-99, observasi pendapatan yang melebihi titik tersebut diubah menjadi sama persis dengan nilai persentil itu. Individu terkait tetap berada di kelompok teratas, tetapi magnitudo absolutnya terkendali. Implementasi yang sejalan dengan praktik pipeline yang benar akan mempelajari batas pemangkasan ini murni dari data latih dan menerapkannya kembali secara persis pada saat pemrosesan data uji.

Ambang batas pemangkasan ini umumnya dihitung menggunakan tiga jenis pendekatan matematis. Pendekatan berbasis kuantil memotong distribusi menurut proporsi absolut, misalnya menyisihkan 1% data terendah dan tertinggi. Pendekatan berbasis Rentang Antarkuartil (IQR) menggunakan rentang antar-persentil sebagai basis turunan pagar anomali Tukey. Sementara itu, pendekatan berbasis Deviasi Absolut Median (MAD) menjadi alternatif robust dari standar deviasi konvensional. Standar deviasi biasa akan selalu rusak jika dihadapkan pada pencilan raksasa karena nilai ekstrem tersebut otomatis ikut membesarkan hasil kalkulasi rata-rata dan varians; perhitungan berbasis MAD kebal terhadap distorsi tersebut karena ia bersandar kuat pada pengukuran median.

Persamaan modified z-score menggunakan rumusan:

\[ M_i = \frac{0.6745 \cdot (x_i - \tilde{x})}{\text{MAD}} \]

Di mana \(M_i\) mewakili skor modifikasi untuk observasi ke-\(i\), \(x_i\) adalah nilai titik data, \(\tilde{x}\) adalah median dari distribusi fitur, dan \(\text{MAD}\) merupakan deviasi absolut median itu sendiri (yakni median dari selisih absolut setiap observasi terhadap \(\tilde{x}\)). Faktor \(0.6745\) digunakan semata-mata untuk menyejajarkan skor dengan rentang distribusi normal baku. Titik data yang melewati rentang absolut \(|M_i| > 3.5\) biasanya dipangkas atau ditandai sebagai outlier.

%%{init: {'theme': 'neutral', 'themeVariables': { 'edgeLabelBackground': '#ffffff' }}}%%
graph TD
    X_train[X_train] -->|fit| Pipeline[Transformer Pipeline]
    X_train -->|transform| X_train_clean[X_train_clean]
    X_test[X_test] -->|transform murni| Pipeline
    Pipeline -->|transform| X_test_clean[X_test_clean]
Figure 5.7: Arsitektur Pipeline Pemrosesan Data: Aliran X_train dan X_test

Selain pemangkasan, penyesuaian distribusi fitur melalui penskalaan juga lazim digunakan. Metode kedua adalah penskalaan robust (robust scaling). Penskalaan standar berbasis z-score menjadi sangat rentan karena rata-rata dan standar deviasinya terseret oleh outlier. Penskalaan robust memusatkan data dengan median dan menskalakannya menggunakan IQR. Pengukuran ini murni memakai titik data di pusat distribusi (persentil ke-25 sampai ke-75), yang membuat skala fitur tetap stabil meskipun terdapat deretan nilai raksasa di ujung rentang distribusi.

Metode ketiga adalah pemampatan distribusi (log / power transform). Memampatkan skala terbukti efektif memfasilitasi data yang didominasi nilai kecil namun memiliki ekor panjang ke sisi kanan. Transformasi logaritmik atau penerapan power transform menekan nilai-nilai dominan ekstrem agar rentang magnitudonya bergeser mendekati sisa distribusi mayoritas. Operasi ini mengecilkan jarak absolut antar-observasi tanpa mendisrupsi urutan ordinal; nilai maksimal tetap di puncak, sehingga model tidak terdistorsi akibat besaran asimetris saat pelatihan.

5.7 Batas Antara Data Cleaning dan Rekayasa Fitur

Dalam alur kerja ilmu data, batasan antara data cleaning dan rekayasa fitur kerap beririsan karena keduanya bertugas mengubah wujud data mentah sebelum dieksekusi oleh model machine learning. Pemahaman tentang batas operasional kedua proses ini berguna untuk merancang pipeline yang kebal terhadap kebocoran data (data leakage), sekaligus mendefinisikan ruang lingkup teknis yang dibahas dalam buku ini.

Data cleaning berfokus pada koreksi fakta untuk memastikan sebuah dataset merepresentasikan keadaan dunia nyata secara akurat. Validitas dari pembersihan data bersifat mutlak dan tidak akan berubah meskipun kita mengganti algoritma pemodelan. Pertama, perbaikan ini terfokus pada fakta yang salah, format yang tidak konsisten, atau duplikasi entitas. Kedua, titik eksekusinya bersifat statis dan global; ia dieksekusi satu kali pada keseluruhan data sebelum proses pemodelan atau pembagian data dimulai. Contoh tindakannya meliputi mengurai teks string “1,200.50” agar terbaca secara benar sebagai nilai numerik, menghapus observasi usia 150 tahun yang mustahil secara biologis, atau melakukan deduplikasi terhadap baris data yang tercatat berulang akibat kesalahan sistem pencatatan.

Di sisi lain, rekayasa fitur beroperasi di ranah representasi. Fokus utamanya bukan lagi menguji kebenaran fakta dasar, melainkan memanipulasi bentuk data agar algoritma dapat mengekstrak sinyal darinya dengan efisien. Pertama, manipulasi ini bertujuan mengubah distribusi, skala, atau format representasi sebagai keputusan desain yang disesuaikan secara khusus dengan kebutuhan algoritma tertentu. Kedua, titik eksekusinya bersifat dinamis dan harus diikat kuat di dalam pipeline pembelajaran untuk menjaga batasan isolasi data latih. Contoh tindakannya mencakup mengaplikasikan robust scaler pada sebuah fitur agar metrik jarak SVM dapat konvergen, mencetak missing indicator baru untuk menampung sinyal informasi, atau melakukan imputasi nilai yang hilang berdasarkan pola distribusi observasi latih.

Kriteria pembatas operasional paling tegas antara kedua proses ini bersandar pada literatur kebocoran data (IBM, 2024), yakni dengan mengajukan satu pengujian: apakah transformasi tersebut bergantung pada pembagian train/test split?

Secara matematis, perbedaan sifat eksekusi ini dapat dirumuskan melalui definisi fungsi pemrosesan:

\[ X_{bersih} = C(X_{mentah}) \quad \text{vs} \quad X_{fitur} = T_{\theta}(X_{bersih}) \]

Fungsi pembersihan \(C\) diterapkan secara seragam pada seluruh observasi \(X_{mentah}\) tanpa mengamati interaksi antar-baris. Sebaliknya, transformasi fitur \(T\) dikendalikan oleh matriks parameter \(\theta\) (misalnya batas parameter kuartil pada scaler atau nilai rata-rata pada imputer) yang secara eksklusif dipelajari hanya dari subset data latih. Menghitung \(\theta\) menggunakan data pengujian adalah asal mula terjadinya data leakage.

[GAMBAR 5.7: Skema - Perbandingan alur eksekusi data cleaning statis melawan transformasi representasi dinamis yang dikurung oleh pembagian train/test]

Batas operasional ini juga membatasi cakupan materi yang dieksplorasi di dalam bab-bab berikutnya. Buku ini tidak membahas tutorial manipulasi teks mentah, penggunaan fungsi regex untuk menyortir format kotor, atau instruksi teknik deduplikasi basis data. Titik berat kita dikhususkan sepenuhnya pada desain dan penerapan operasional \(T_{\theta}\), yakni rekayasa representasi yang berinteraksi langsung dengan mekanisme pembelajaran mesin.

5.8 Studi Kasus: Pipeline Imputasi dan Penanganan Robust yang Reproducible

Penerapan taktik penanganan missing values dan outlier secara terpisah pada tahap prapemrosesan rentan memicu kebocoran data (data leakage). Jika kalkulasi batas outlier atau rata-rata imputasi dilakukan sebelum membagi set pelatihan dan pengujian, informasi dari set pengujian akan ikut merembes dan memengaruhi model. Untuk mencegah kontaminasi ini, seluruh komponen transformasi harus disatukan ke dalam arsitektur pipeline.

Sebagai contoh, tinjau sebuah dataset medis untuk prediksi risiko penyakit yang memiliki dua anomali struktural: 1. Ketiadaan data yang tidak acak: Fitur “jumlah tes darah” mengandung missing values bertipe Missing Not At Random (MNAR). Pasien berisiko tinggi lebih sering menjalani observasi laboratorium. Kekosongan data di kolom ini merepresentasikan ketiadaan tes karena pasien relatif sehat. 2. Ekor distribusi yang panjang: Fitur “kadar protein” memiliki nilai ekstrem yang valid secara biologis, bukan akibat kesalahan sensor. Jika tidak dibatasi, magnitudo ekstrem ini akan merusak konvergensi dan stabilitas skala model linier.

Berdasarkan diagnosis di atas, kita merancang spesifikasi pipeline berurutan: 1. Ekstraksi indikator: Menambahkan MissingIndicator (atau mengaktifkan argumen add_indicator=True pada objek imputer) untuk menyalin lokasi sel yang kosong menjadi sebuah fitur biner baru. 2. Imputasi berbasis model: Menjalankan algoritma IterativeImputer atau KNNImputer untuk menaksir nilai numerik pada sel yang kosong dengan memetakan korelasi antar-atribut medis. 3. Pembatasan ekstrem (capping): Menerapkan objek Winsorizer untuk memangkas magnitudo nilai di atas batas persentil ke-95. 4. Penyesuaian skala (scaling): Melakukan standardisasi dengan RobustScaler menggunakan perhitungan median dan Interquartile Range (IQR), sehingga skala fitur akhir tetap stabil terhadap sisa residu outlier.

[GAMBAR 5.5: Diagram Blok - Arsitektur pipeline pemrosesan data yang menunjukkan aliran X_train menuju fungsi fit, dan X_test menuju fungsi transform dengan parameter terkunci]

Secara matematis, pipeline mengeksekusi komposisi fungsi transformasi secara berantai pada data observasi (\(X_{\text{in}}\)). Parameter transformasi di setiap tahap akan dikunci dengan mengandalkan statistik yang dipelajari mutlak dari data latih melalui persamaan \(X_{\text{out}} = T_n(T_{n-1}( \dots T_1(X_{\text{in}} \mid \theta_1) \dots \mid \theta_{n-1}) \mid \theta_n)\). Pada perumusan tersebut, \(T_i\) adalah representasi matematis dari fungsi transformasi pada tahap ke-\(i\) (seperti fungsi pemotongan distribusi atau fungsi pergeseran skala), dan \(\theta_i\) mewakili parameter statistik spesifik (seperti batas kuantil, median, atau bobot imputasi) yang dikalkulasi secara eksklusif saat algoritma memproses split pelatihan. Pemanggilan fungsi fit() pada blok pipeline akan merekam pola indikator variabel, distribusi relasional, dan batas persentil tanpa melihat satu pun observasi dari set pengujian. Saat dieksekusi di dalam skema validasi silang (cross-validation), struktur ini memaksa prosedur imputasi dan estimasi statistik beroperasi secara terisolasi murni di dalam setiap porsi lipatan (fold).

Sebagai catatan evaluasi teknis, literatur menunjukkan satu pengecualian: metode imputasi univariat statis tanpa pengawasan (seperti imputasi nilai rata-rata biasa) yang dieksekusi sebelum pemisahan lipatan cross-validation memang terkadang memunculkan bias yang dapat diabaikan sembari mempercepat komputasi. Namun, untuk metode imputasi iteratif dan tersupervisi, keseluruhan kalkulasinya wajib diletakkan secara ketat di dalam pipeline guna menghindari ilusi akurasi evaluasi yang fiktif.

import numpy as np
import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.experimental import enable_iterative_imputer  # Wajib diimpor sebelum IterativeImputer
from sklearn.impute import IterativeImputer
from sklearn.preprocessing import RobustScaler
from sklearn.pipeline import Pipeline

class Winsorizer(BaseEstimator, TransformerMixin):
    """
    Transformer kustom untuk memotong (cap/clip) nilai outlier ekstrem 
    berdasarkan nilai persentil batas bawah dan batas atas.
    """
    def __init__(self, lower_quantile=0.05, upper_quantile=0.95):
        self.lower_quantile = lower_quantile
        self.upper_quantile = upper_quantile
        self.lower_bounds_ = None
        self.upper_bounds_ = None
        
    def fit(self, X, y=None):
        X_df = pd.DataFrame(X)
        self.lower_bounds_ = X_df.quantile(self.lower_quantile).values
        self.upper_bounds_ = X_df.quantile(self.upper_quantile).values
        return self
        
    def transform(self, X):
        X_df = pd.DataFrame(X).copy()
        for col_idx in range(X_df.shape[1]):
            X_df.iloc[:, col_idx] = np.clip(
                X_df.iloc[:, col_idx], 
                self.lower_bounds_[col_idx], 
                self.upper_bounds_[col_idx]
            )
        return X_df.values

# Membangun arsitektur pipeline pemrosesan data medis terintegrasi
medical_pipeline = Pipeline([
    ('imputer', IterativeImputer(max_iter=10, random_state=42, add_indicator=True)),
    ('outlier_clipper', Winsorizer(lower_quantile=0.01, upper_quantile=0.95)),
    ('scaler', RobustScaler())
])

# Simulasi data medis pasien (misalnya: Tekanan Darah, Kadar Gula Darah, Kadar Protein)
np.random.seed(42)
X_raw = np.random.normal(loc=100, scale=20, size=(100, 3))
X_raw[0, 0] = 400.0  # Sisipkan outlier ekstrem atas
X_raw[1, 1] = 2.0    # Sisipkan outlier ekstrem bawah
X_raw[5:15, 0] = np.nan  # Sisipkan missing values (NaN)
X_raw[12:20, 2] = np.nan

# Melatih pipeline sekaligus mentransformasikan data latih secara aman
X_processed = medical_pipeline.fit_transform(X_raw)

print(f"Dimensi data asli: {X_raw.shape}")
print(f"Dimensi data terproses (termasuk kolom indikator missing): {X_processed.shape}")
print(f"Nilai maksimum setelah pemrosesan: {np.max(X_processed):.4f}")