Sessi 4: Data Wrangling dan Preprocessing (II)
Fokus: Transformasi Fitur Numerik (Normalisasi & Standardisasi) dan Encoding Variabel Kategorikal.
A. Konsep Feature Scaling
Feature Scaling adalah teknik penting untuk mengubah skala variabel numerik dalam dataset agar berada dalam rentang yang serupa. Tanpa *scaling*, fitur dengan nilai besar (misalnya, gaji 108) akan mendominasi perhitungan jarak (seperti pada k-Nearest Neighbors) atau fungsi kerugian (*loss function*), meskipun fitur dengan nilai kecil (misalnya, jumlah anak) sebenarnya lebih penting.
Kapan Scaling Diperlukan?
- Algoritma Berbasis Jarak: k-NN, k-Means, Support Vector Machines (SVM).
- Algoritma Berbasis Gradien: Regresi Logistik dan Jaringan Saraf Tiruan (*Neural Networks*).
B. Normalisasi (Min-Max Scaling)
Normalisasi (sering disebut Min-Max Scaling) mengubah nilai fitur X agar berada dalam rentang [0, 1]. Ini menjaga bentuk distribusi asli data tetapi mengurangi dampak *outlier* pada perhitungan jarak relatif.
Formula Min-Max Scaling
Xnorm = (X - Xmin) / (Xmax - Xmin)
Di mana X adalah nilai asli, Xmin adalah nilai minimum, dan Xmax adalah nilai maksimum fitur tersebut.
Contoh 1: Penerapan Min-Max Scaling (Dataset Harga Rumah Kaggle)
Digunakan pada fitur yang memiliki batas alami, seperti "Jumlah Kamar Tidur" atau "Tingkat Energi" yang harus berada antara 0 dan 1.
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# Data fiktif harga rumah (dari Kaggle House Prices)
data_rumah = {
'Luas_Tanah': [1000, 3000, 500],
'Jarak_Kota': [5, 20, 1]
}
df_rumah = pd.DataFrame(data_rumah)
print("Data Awal:\n", df_rumah)
# Inisialisasi Scaler
scaler_minmax = MinMaxScaler()
# Latih dan Transformasi data (fit_transform)
df_rumah_norm = scaler_minmax.fit_transform(df_rumah)
# Konversi kembali ke DataFrame untuk dilihat
df_rumah_norm = pd.DataFrame(df_rumah_norm, columns=df_rumah.columns)
print("\nHasil Normalisasi (Min-Max):\n", df_rumah_norm)
# Luas Tanah 1000 (0.25) = (1000 - 500) / (3000 - 500)
C. Standardisasi (Z-Score Scaling)
Standardisasi (Z-Score Scaling) mentransformasi data sehingga memiliki rata-rata (μ) sama dengan 0 dan deviasi standar (σ) sama dengan 1. Ini sangat disukai ketika data memiliki distribusi yang mendekati Normal (Gaussian).
Formula Z-Score Scaling
Xstd = (X - μ) / σ
Di mana μ adalah rata-rata (mean) dan σ adalah deviasi standar (*standard deviation*).
Konteks Matematis:
Standardisasi memastikan bahwa setiap fitur berkontribusi sama terhadap fungsi kerugian (Loss Function) dan menjaga simetri distribusi, yang penting untuk konvergensi algoritma berbasis gradien.
Contoh 2: Penerapan Z-Score Scaling (Dataset Breast Cancer UCI)
Dataset medis sering kali menggunakan *Standardization* karena banyak parameter biologi diasumsikan berdistribusi Normal, seperti *Radius Mean* pada sel kanker.
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
# Data fiktif (merepresentasikan fitur tumor Breast Cancer)
data_kanker = {
'Radius_Mean': [17.99, 20.57, 19.69, 11.42], # Nilai besar
'Texture_Mean': [10.38, 17.77, 21.25, 20.38] # Nilai kecil
}
df_kanker = pd.DataFrame(data_kanker)
print("Data Awal:\n", df_kanker)
# Inisialisasi Scaler
scaler_std = StandardScaler()
# Latih dan Transformasi data
df_kanker_std = scaler_std.fit_transform(df_kanker)
# Konversi kembali ke DataFrame
df_kanker_std = pd.DataFrame(df_kanker_std, columns=df_kanker.columns)
print("\nHasil Standardisasi (Z-Score) [Mean ≈ 0, Std ≈ 1]:\n", df_kanker_std.round(2))
print("Nilai rata-rata kolom setelah standardisasi:\n", df_kanker_std.mean().round(2))
D. Encoding Variabel Kategorikal
Model Machine Learning hanya dapat bekerja dengan angka. Oleh karena itu, variabel non-numerik (kategorikal) harus diubah.
1. Label Encoding (Data Ordinal)
Mengubah kategori menjadi bilangan bulat (0, 1, 2, ...). Digunakan untuk data Ordinal, yaitu data yang memiliki urutan (misalnya, 'Rendah' < 'Sedang' < 'Tinggi').
2. One-Hot Encoding (Data Nominal)
Menciptakan kolom biner baru untuk setiap kategori. Digunakan untuk data Nominal (tidak berurutan), seperti warna atau nama negara, untuk menghindari model menginterpretasikan urutan (misalnya, 0 < 1 < 2) sebagai hubungan matematis.
Contoh 3: Penerapan Encoding pada Dataset Kualitas Anggur (UCI)
import pandas as pd
# Data fiktif yang menyertakan kategori
data_anggur = {
'Keasaman': [7.4, 7.8, 8.5],
'Warna_Anggur': ['Merah', 'Putih', 'Merah'], # Nominal
'Kualitas_Label': ['Rendah', 'Sedang', 'Tinggi'] # Ordinal (Urutan)
}
df_anggur = pd.DataFrame(data_anggur)
print("Data Awal:\n", df_anggur)
# 1. One-Hot Encoding untuk 'Warna_Anggur' (Nominal)
df_ohe = pd.get_dummies(df_anggur, columns=['Warna_Anggur'], prefix='Warna')
# 2. Label Encoding (Manual) untuk 'Kualitas_Label' (Ordinal)
kualitas_mapping = {'Rendah': 0, 'Sedang': 1, 'Tinggi': 2}
df_ohe['Kualitas_Encoded'] = df_ohe['Kualitas_Label'].map(kualitas_mapping)
print("\nHasil Setelah Encoding:")
print(df_ohe[['Keasaman', 'Warna_Merah', 'Warna_Putih', 'Kualitas_Encoded']])