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.