Pertemuan 3: Data Preprocessing

🎯 Tujuan Pembelajaran

Setelah mengikuti pertemuan ini, mahasiswa mampu:

  1. Memahami pentingnya preprocessing dalam pipeline machine learning
  2. Menangani missing value secara tepat
  3. Melakukan encoding data kategorikal
  4. Melakukan feature scaling
  5. Melakukan train-test split dengan benar
  6. Memahami potensi data leakage

🧠 1. Mengapa Data Preprocessing Penting?

Dalam praktik nyata, data hampir tidak pernah bersih.
Masalah umum:

  • Missing value
  • Outlier
  • Data kategorikal
  • Skala fitur berbeda
  • Data tidak seimbang

Jika preprocessing salah β†’ model:

  • Overfitting
  • Underfitting
  • Bias
  • Tidak stabil

Pipeline umum ML:

1
EDA β†’ Preprocessing β†’ Feature Engineering β†’ Modeling β†’ Evaluation

Preprocessing adalah fondasi sebelum modeling.


πŸ“Š 2. Menangani Missing Value

πŸ”Ž Mengecek Missing Value

1
2
3
4
5
6
import pandas as pd
import seaborn as sns

df = sns.load_dataset("titanic")

df.isnull().sum()

πŸ›  Strategi Penanganan Missing Value

1️⃣ Menghapus Data

1
df.dropna(inplace=True)

Digunakan jika:

  • Missing sangat sedikit
  • Tidak memengaruhi distribusi data

2️⃣ Imputasi Mean / Median

1
df["age"].fillna(df["age"].median(), inplace=True)

Digunakan untuk data numerik.

  • Mean β†’ jika distribusi normal
  • Median β†’ jika ada outlier

3️⃣ Imputasi Modus (Kategorikal)

1
df["embarked"].fillna(df["embarked"].mode()[0], inplace=True)

πŸ”€ 3. Encoding Data Kategorikal

Machine learning hanya menerima angka.

🎯 Label Encoding

Digunakan untuk kategori biner.

1
2
3
4
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df["sex"] = le.fit_transform(df["sex"])

Output:

  • male β†’ 1
  • female β†’ 0

🎯 One Hot Encoding

Digunakan untuk kategori > 2.

1
df = pd.get_dummies(df, columns=["embarked"], drop_first=True)

Kenapa drop_first=True? β†’ Menghindari dummy variable trap (multicollinearity).


πŸ“ 4. Feature Scaling

Beberapa algoritma sensitif terhadap skala fitur:

  • KNN
  • SVM
  • Logistic Regression
  • Neural Network

Tidak sensitif:

  • Decision Tree
  • Random Forest

πŸ“Œ Standardization (Z-score)

1
2
3
4
5
6
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

numerical_cols = ["age", "fare"]
df[numerical_cols] = scaler.fit_transform(df[numerical_cols])

Formula:
z = \frac{x - \mu}{\sigma}


πŸ“Œ Normalization (MinMaxScaler)

1
2
3
4
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df[numerical_cols] = scaler.fit_transform(df[numerical_cols])

Range: 0 – 1


βœ‚οΈ 5. Train-Test Split

Tujuan:

  • Menghindari overfitting
  • Mengukur performa model pada data baru
1
2
3
4
5
6
7
8
9
10
from sklearn.model_selection import train_test_split

X = df.drop("survived", axis=1)
y = df["survived"]

X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42
)

Artinya:

  • 80% training
  • 20% testing

⚠️ 6. Data Leakage (Konsep Penting!)

Kesalahan umum:
❌ Scaling sebelum train-test split
❌ Menggunakan seluruh data untuk imputasi

Yang benar:
Split dulu β†’ Fit hanya di data training β†’ Transform training & test

Contoh benar:

1
2
3
4
scaler = StandardScaler()

X_train[numerical_cols] = scaler.fit_transform(X_train[numerical_cols])
X_test[numerical_cols] = scaler.transform(X_test[numerical_cols])

πŸ§ͺ Praktikum Lengkap (Ringkas)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder

df = sns.load_dataset("titanic")

# Handle missing
df["age"].fillna(df["age"].median(), inplace=True)
df["embarked"].fillna(df["embarked"].mode()[0], inplace=True)

# Encoding
le = LabelEncoder()
df["sex"] = le.fit_transform(df["sex"])
df = pd.get_dummies(df, columns=["embarked"], drop_first=True)

# Split
X = df.drop("survived", axis=1)
y = df["survived"]

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)

# Scaling
scaler = StandardScaler()
numerical_cols = ["age", "fare"]

X_train[numerical_cols] = scaler.fit_transform(X_train[numerical_cols])
X_test[numerical_cols] = scaler.transform(X_test[numerical_cols])

πŸ“ Tugas Mandiri

  1. Lakukan preprocessing lengkap pada dataset apapun di Kaggle.
  2. Jelaskan:
    • Mengapa encoding diperlukan?
    • Mengapa scaling diperlukan?
    • Apa itu data leakage?
  3. Dokumentasikan dalam template: https://github.com/AzharRizkiZ/Template-DS-ML
  4. Upload ke GitHub.

πŸŽ“ Target Kompetensi Setelah Pertemuan 3

Siswa mampu:

  • Menyiapkan dataset real untuk modeling
  • Menghindari kesalahan preprocessing
  • Memahami pipeline machine learning dasar