Sessi 3: Data Wrangling dan Preprocessing (I)
Fokus: Memastikan *Veracity* (Kualitas) Data, Penanganan Data Hilang dan *Outlier*.
A. Konsep Data Wrangling dan Kualitas Data
Data Wrangling (atau *data cleaning*) adalah proses mengubah dan memetakan data dari format 'mentah' ke format yang lebih rapi dan tepat agar dapat digunakan untuk analisis. Proses ini sering memakan waktu 70-80% dari total waktu proyek Data Sains. Kualitas data yang buruk akan menyebabkan hasil model yang bias atau tidak akurat.
Pentingnya *Data Quality* dalam Eksperimen
Dalam Fisika dan Matematika, kualitas data (Veracity) sangat terkait dengan galat (error) pengukuran. Jika data mengandung nilai yang hilang atau pencilan, galat sistemik model kita akan meningkat, yang diukur secara matematis oleh Bias dan Variance.
B. Penanganan Data Hilang (*Missing Values*)
Data hilang (sering direpresentasikan sebagai NaN di Pandas) terjadi karena berbagai alasan (sensor rusak, kegagalan perekaman). Ada tiga strategi utama:
1. Inspeksi Data Hilang
Langkah pertama adalah mengetahui seberapa banyak data yang hilang di setiap kolom, biasanya dihitung dalam persentase.
2. Strategi Penghapusan (*Deletion*)
- Penghapusan Baris (Row Deletion): Menghapus seluruh baris jika terdapat
NaN. Digunakan jika jumlah data hilang sangat kecil (misalnya < 5% dari total baris) atau jika data hilang tidak terjadi secara acak (*Missing Not At Random*). - Penghapusan Kolom (Column Deletion): Menghapus seluruh kolom jika persentase data hilang terlalu tinggi (misalnya > 60%).
3. Strategi Imputasi (*Imputation*)
Mengisi nilai NaN dengan estimasi statistik.
- Imputasi Mean (Rata-rata): Digunakan untuk data berdistribusi normal (simetris).
- Imputasi Median: Digunakan untuk data yang memiliki *outlier* atau berdistribusi miring (*skewed*), karena Median kurang sensitif terhadap nilai ekstrem.
- Imputasi Modus: Digunakan untuk variabel kategorikal.
C. Studi Kasus Imputasi: Dataset Diabetes UCI
Kita akan menggunakan dataset Pima Indians Diabetes (dari UCI) yang beberapa nilai 0 pada kolom tertentu (misalnya *Blood Pressure*) sebenarnya merepresentasikan nilai hilang (karena tekanan darah tidak mungkin 0).
import pandas as pd
import numpy as np
# 1. Asumsi Data dimuat (contoh data fiktif dengan NaN)
data = {
'Pregnancies': [6, 1, 8, 1, 0, 5, 3],
'BloodPressure': [68, np.nan, 78, 60, 80, 74, np.nan],
'Glucose': [148, 85, 183, np.nan, 137, 116, 78],
'BMI': [33.6, 26.6, 23.3, 28.3, np.nan, 30.5, 31.0]
}
df_diabetes = pd.DataFrame(data)
# Mengubah nilai 0 yang tidak logis (misalnya BloodPressure=0) menjadi NaN (jika ini adalah data real)
# df_diabetes['BloodPressure'].replace(0, np.nan, inplace=True)
print("Data Awal dengan Missing Values (NaN):\n", df_diabetes)
# 2. Menghitung jumlah NaN per kolom
print("\nJumlah Missing Values:")
print(df_diabetes.isnull().sum())
# 3. Imputasi menggunakan Median (karena BloodPressure dan BMI mungkin skewed)
median_bp = df_diabetes['BloodPressure'].median()
median_glucose = df_diabetes['Glucose'].median()
median_bmi = df_diabetes['BMI'].median()
# Mengisi NaN
df_diabetes['BloodPressure'].fillna(median_bp, inplace=True)
df_diabetes['Glucose'].fillna(median_glucose, inplace=True)
df_diabetes['BMI'].fillna(median_bmi, inplace=True)
print("\nData Setelah Imputasi Median:")
print(df_diabetes)
print("\nJumlah Missing Values setelah Imputasi:")
print(df_diabetes.isnull().sum())
D. Penanganan Data Pencilan (*Outlier*)
Outlier adalah titik data yang nilainya jauh dari titik-titik data lain. Dalam ilmu data, *outlier* dapat merusak estimasi statistik (terutama *mean* dan *standard deviation* σ).
Metode Deteksi Kuantitatif: IQR dan Z-Score
1. Metode Interquartile Range (IQR): Digunakan untuk data yang tidak berdistribusi normal. Outlier adalah nilai di luar batas [Q1 - 1.5 × IQR, Q3 + 1.5 × IQR].
IQR = Q3 - Q1
2. Metode Z-Score: Digunakan untuk data yang mendekati distribusi normal. Nilai dianggap *outlier* jika Z-Score lebih besar dari batas threshold T (biasanya T = 3).Z = (x - μ) / σ
Di mana μ adalah rata-rata (*mean*) dan σ adalah deviasi standar (*standard deviation*).Contoh 4: Implementasi Deteksi Outlier dengan Z-Score
import numpy as np
from scipy import stats
# Contoh Vektor Data Pengukuran (dengan 1 outlier ekstrem: 150)
data_pengukuran = np.array([2.1, 2.3, 2.5, 2.2, 2.4, 150.0, 2.1, 2.3])
# Menghitung Z-Score untuk setiap titik data
z_scores = np.abs(stats.zscore(data_pengukuran))
# Menetapkan Threshold T = 3
threshold = 3
# Menemukan Outlier (True jika Z-Score > 3)
outliers = z_scores > threshold
# Menghapus outlier (hanya menyisakan data yang Z-Score-nya <= 3)
data_clean = data_pengukuran[~outliers]
print("Data Awal:", data_pengukuran)
print("Z-Scores (Absolut):", z_scores.round(2))
print("Indikator Outlier (Z > 3):", outliers)
print("Data Setelah Penghapusan Outlier:", data_clean)