Pengertian Missing Data
Missing data adalah kondisi ketika dataset memiliki nilai yang hilang atau tidak tercatat. Nilai ini biasanya direpresentasikan sebagai:
NaN
(Not a Number)None
(Python)NA
(R/statistik)- Nilai kosong (
""
,0
, atau-999
)
Penyebab Missing Data:
- Kesalahan input data
- Sensor gagal merekam
- Responden menolak menjawab
- Data tidak relevan untuk kasus tertentu
Jenis-Jenis Missing Data
a. MCAR (Missing Completely At Random)
- Tidak ada pola kehilangan data
- Contoh: Formulir yang hilang secara acak
b. MAR (Missing At Random)
- Kehilangan terkait variabel lain yang terobservasi
- Contoh: Tinggi badan tidak diisi oleh responden perempuan
c. MNAR (Missing Not At Random)
- Kehilangan terkait nilai yang hilang itu sendiri
- Contoh: Orang dengan gaji tinggi menolak menyebutkan pendapatan
Deteksi Missing Data
a. Menggunakan Pandas
import pandas as pd import numpy as np # Contoh dataset data = { 'Nama': ['Andi', 'Budi', None, 'Dedi'], 'Usia': [25, np.nan, 30, 22], 'Gaji': [5000000, 6000000, None, 4500000] } df = pd.DataFrame(data) # Cek missing values print("Jumlah Missing Values per Kolom:") print(df.isnull().sum()) print("\nTotal Missing Values:") print(df.isnull().sum().sum())
Output:
Jumlah Missing Values per Kolom: Nama 1 Usia 1 Gaji 1 dtype: int64 Total Missing Values: 3
b. Visualisasi Missing Data
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(8,4)) sns.heatmap(df.isnull(), cbar=False, cmap='viridis') plt.title('Peta Missing Values') plt.show()
4. Teknik Penanganan Missing Data
a. Penghapusan (Deletion)
1. Listwise Deletion
df_drop = df.dropna() print("Data setelah listwise deletion:") print(df_drop)
2. Pairwise Deletion
df_pairwise = df.dropna(subset=['Usia', 'Gaji']) print("\nData setelah pairwise deletion:") print(df_pairwise)
b. Imputasi (Pengisian Nilai)
1. Imputasi Statistik
# Imputasi mean untuk numerik df['Usia'].fillna(df['Usia'].mean(), inplace=True) # Imputasi modus untuk kategorik df['Nama'].fillna(df['Nama'].mode()[0], inplace=True) print("\nData setelah imputasi statistik:") print(df)
2. Imputasi Lanjutan
from sklearn.impute import KNNImputer # Hanya untuk data numerik imputer = KNNImputer(n_neighbors=2) df[['Usia', 'Gaji']] = imputer.fit_transform(df[['Usia', 'Gaji']]) print("\nData setelah KNN imputation:") print(df)
c. Klasifikasi Khusus Missing
# Tambah kolom flag missing df['Gaji_missing'] = df['Gaji'].isnull().astype(int) # Isi missing dengan nilai khusus df['Gaji'].fillna(-999, inplace=True) print("\nData dengan flag missing:") print(df)
Teknik Lanjutan
a. Multiple Imputation
from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imp = IterativeImputer(max_iter=10, random_state=0) df[['Usia', 'Gaji']] = imp.fit_transform(df[['Usia', 'Gaji']]) print("\nData setelah multiple imputation:") print(df)
b. Time-Series Imputation
# Untuk data deret waktu ts_data = pd.Series([1, np.nan, np.nan, 4, 5, np.nan, 7]) ts_filled = ts_data.interpolate(method='time') print("\nTime series setelah imputasi:") print(ts_filled)
Evaluasi Imputasi
a. Membuat Data Validasi
from sklearn.model_selection import train_test_split # Buat data dengan missing values artifisial complete_data = pd.DataFrame({ 'A': np.random.normal(0, 1, 100), 'B': np.random.randint(0, 10, 100) }) # Hilangkan 20% data secara acak missing_mask = np.random.random(complete_data.shape) < 0.2 artificial_missing = complete_data.copy() artificial_missing[missing_mask] = np.nan # Bandingkan dengan data asli print("Error setelah imputasi:") print(np.mean((complete_data - artificial_missing.fillna(0))**2))
b. Cross-Validation untuk Imputasi
from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error def evaluate_imputation(X_missing, X_true, imputer): X_imputed = imputer.fit_transform(X_missing) return mean_squared_error(X_true, X_imputed) print("MSE KNN Imputer:", evaluate_imputation(artificial_missing, complete_data, KNNImputer())) print("MSE Mean Imputer:", evaluate_imputation(artificial_missing, complete_data, SimpleImputer()))
Best Practices
- Explorasi Data:
def explore_missing(df): # Hitung persentase missing missing_percent = df.isnull().mean() * 100 # Visualisasi plt.figure(figsize=(10,4)) missing_percent.plot(kind='bar') plt.title('Persentase Missing Values per Kolom') plt.ylabel('Persentase (%)') plt.show() return missing_percent explore_missing(df)
- Pipeline Imputasi:
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler num_pipeline = Pipeline([ ('imputer', KNNImputer()), ('scaler', StandardScaler()) ])
- Documentasi Keputusan:
""" Prosedur Penanganan Missing Values: 1. Kolom 'Usia': Imputasi median karena distribusi miring 2. Kolom 'Gaji': Imputasi KNN karena korelasi tinggi dengan 'Usia' 3. Kolom 'Nama': Hapus row karena kategorikal dan tidak bisa diimputasi """
Referensi
- Pandas Documentation: Working with Missing Data
- Scikit-learn: Imputation
- Book: “Flexible Imputation of Missing Data” by Stef van Buuren