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?

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']])