Data Cleanup : Handling Missing Data

Data Cleanup : Handling Missing Data

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

python
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

python
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

python
df_drop = df.dropna()
print("Data setelah listwise deletion:")
print(df_drop)

2. Pairwise Deletion

python
df_pairwise = df.dropna(subset=['Usia', 'Gaji'])
print("\nData setelah pairwise deletion:")
print(df_pairwise)

b. Imputasi (Pengisian Nilai)

1. Imputasi Statistik

python
# 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

python
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

python
# 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

python
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

python
# 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

python
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

python
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

  1. Explorasi Data:
    python
    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)
  2. Pipeline Imputasi:
    python
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler
    
    num_pipeline = Pipeline([
        ('imputer', KNNImputer()),
        ('scaler', StandardScaler())
    ])
  3. Documentasi Keputusan:
    python
    """
    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

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *