Bab 4 ~5 jam
Pembersihan & Eksplorasi Data
Data scientist menghabiskan 60-80% waktu mereka untuk persiapan data. Bab ini membahas teknik penting untuk membersihkan, mentransformasi, dan mengeksplorasi data.
4.1 Pembersihan Data
Data dunia nyata itu berantakan. Masalah umum termasuk format tidak konsisten, duplikat, tipe data salah, dan tipe data campuran dalam kolom.
import pandas as pd
df = pd.read_csv('data_kotor.csv')
# Periksa kekacauan
df.info()
df.head()
df.duplicated().sum() # Hitung duplikat
# Perbaiki tipe data
df['tanggal'] = pd.to_datetime(df['tanggal'])
df['harga'] = pd.to_numeric(df['harga'], errors='coerce')
df['kategori'] = df['kategori'].str.strip().str.lower()
# Hapus duplikat
df = df.drop_duplicates()
# Ganti nama kolom untuk konsistensi
df.rename(columns={'IDPelanggan': 'id_pelanggan'}, inplace=True)
4.2 Menangani Data Hilang
Data hilang bisa bersifat MCAR (sepenuhnya acak), MAR (acak bersyarat), atau MNAR (tidak acak). Mekanisme ini menentukan strategi terbaik.
# Diagnosa kehilangan data
df.isnull().sum().sort_values(ascending=False)
df.isnull().mean() * 100 # Persentase hilang
# Strategi 1: Hapus (jika < 5% hilang)
df.dropna(subset=['kolom_penting'])
# Strategi 2: Imputasi sederhana
df['usia'].fillna(df['usia'].median())
df['kategori'].fillna(df['kategori'].mode[0])
# Strategi 3: Imputasi berbasis grup
df['usia'] = df.groupby('departemen')['usia'].transform(
lambda x: x.fillna(x.median())
)
# Strategi 4: Imputasi berbasis ML
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
df[['usia', 'pendapatan']] = imputer.fit_transform(df[['usia', 'pendapatan']])
Peringatan: Jangan pernah imputasi sebelum membagi data ke train/test. Fit imputer hanya pada data training, lalu transform kedua set untuk mencegah kebocoran data.
4.3 Feature Engineering
Feature engineering adalah seni membuat variabel input baru yang membantu model belajar lebih baik. Sering kali ini lebih berpengaruh daripada pemilihan algoritma.
# Fitur tanggal
df['tahun'] = df['tanggal'].dt.year
df['bulan'] = df['tanggal'].dt.month
df['hari_dalam_minggu'] = df['tanggal'].dt.dayofweek
df['akhir_pekan'] = df['hari_dalam_minggu'] >= 5
# Binning variabel kontinu
df['kelompok_usia'] = pd.cut(df['usia'], bins=[0,18,35,50,100],
labels=['remaja','dewasa_muda','dewasa','lansia'])
# Fitur interaksi
df['harga_per_m2'] = df['harga'] / df['luas_m2']
df['kamar_per_ruang'] = df['kamar_mandi'] / df['kamar_tidur']
# Log transform untuk data miring
df['log_pendapatan'] = np.log1p(df['pendapatan'])
# One-hot encoding
df = pd.get_dummies(df, columns=['kota'], drop_first=True)
4.4 Analisis Data Eksploratori (EDA)
EDA adalah proses memahami data melalui statistik ringkasan dan visualisasi sebelum pemodelan.
# Profil cepat
df.describe()
df.describe(include='object')
# Matriks korelasi
korelasi = df.select_dtypes(include='number').corr()
# Hubungan berpasangan
import seaborn as sns
sns.pairplot(df[['usia', 'pendapatan', 'skor']], hue='segmen')
# Tabulasi silang
pd.crosstab(df['jenis_kelamin'], df['membeli'], normalize='index')
Checklist EDA: Bentuk & tipe data → Data hilang → Distribusi → Korelasi → Perbandingan grup → Pencilan → Pola tak terduga. Dokumentasikan semua yang Anda temukan.
4.5 Deteksi Pencilan
# Metode IQR
Q1 = df['nilai'].quantile(0.25)
Q3 = df['nilai'].quantile(0.75)
IQR = Q3 - Q1
pencilan = df[(df['nilai'] < Q1 - 1.5*IQR) | (df['nilai'] > Q3 + 1.5*IQR)]
# Metode z-score
from scipy import stats
z_skor = np.abs(stats.zscore(df['nilai']))
pencilan = df[z_skor > 3]
# Isolation Forest (berbasis ML)
from sklearn.ensemble import IsolationForest
iso = IsolationForest(contamination=0.05, random_state=42)
df['adalah_pencilan'] = iso.fit_predict(df[['nilai']]) == -1
Ingat: Tidak semua pencilan adalah kesalahan. Beberapa merepresentasikan kejadian langka yang sah. Selalu investigasi sebelum menghapus — pengetahuan domain sangat penting.