Normalisasi pada chapter sebelumnya mengunci semua feature ke [0, 1] — tetapi tidak semua data cocok dikunci. Feature yang sebarannya mengikuti lonceng lebih tepat dipusatkan pada rata-rata nol dan diukur dalam satuan simpangan baku, tanpa batas bawah atau atas. Teknik ini bernama standardisasi, dan hasilnya punya makna yang sama di semua kolom: nilai 2,0 berarti “dua simpangan baku di atas rata-rata”, apa pun satuannya. Pada chapter ini kita turunkan z-score secara manual, bandingkan dengan StandardScaler, lalu letakkan normalisasi dan standardisasi berdampingan untuk memutuskan kapan memakai yang mana.
Rumus z-Score #
Standardisasi mengubah setiap nilai menjadi jaraknya dari rata-rata, diukur dalam satuan simpangan baku kolomnya:
z = (x - mean) / stdNilai rata-rata menjadi 0; nilai di atas rata-rata menjadi positif, di bawahnya negatif; dan sebaran keseluruhan berpusat simetris. Kita hitung dulu secara manual, lalu bandingkan dengan scikit-learn:
import pandas as pd
from sklearn.preprocessing import StandardScaler
hari = pd.DataFrame({
"suhu": [27, 30, 24, 29, 33, 28, 26, 31],
"pengunjung": [210, 260, 180, 240, 300, 225, 195, 255],
})
z_manual = (hari - hari.mean()) / hari.std(ddof=0)
print("z-score manual (x - mean) / std:")
print(z_manual.round(3))
print()
print("cek: rata-rata z =", z_manual.mean().round(9).tolist())
print("cek: std z (ddof=0) =", z_manual.std(ddof=0).round(9).tolist())
hasil = StandardScaler().fit_transform(hari)
print()
print("StandardScaler:")
print(pd.DataFrame(hasil, columns=hari.columns).round(3))Output yang Dihasilkan:
z-score manual (x - mean) / std:
suhu pengunjung
0 -0.557 -0.635
1 0.557 0.738
2 -1.671 -1.460
3 0.186 0.189
4 1.671 1.837
5 -0.186 -0.223
6 -0.928 -1.048
7 0.928 0.601
cek: rata-rata z = [0.0, 0.0]
cek: std z (ddof=0) = [1.0, 1.0]
StandardScaler:
suhu pengunjung
0 -0.557 -0.635
1 0.557 0.738
2 -1.671 -1.460
3 0.186 0.189
4 1.671 1.837
5 -0.186 -0.223
6 -0.928 -1.048
7 0.928 0.601Mari kita bedah hasilnya baris demi baris:
- Baris 10 (
z_manual = (hari - hari.mean()) / hari.std(ddof=0)): rumus z-score dijalankan pada kedua kolom sekaligus. Hari bersuhu 33 menjadi +1,671 — satu setengah simpangan baku di atas rata-rata; hari dengan 180 pengunjung menjadi -1,460. - Baris 13-14 (
mean(),std(ddof=0)): pemeriksaan kesehatan. Rata-rata kedua kolom z tepat 0 dan simpangan bakunya tepat 1 — tanda standardisasi berhasil. - Baris 16-19 (
StandardScaler().fit_transform(...)): hasilnya identik persis dengan hitungan manual. Sekarang kedua feature bicara dalam bahasa yang sama: perbandingan -1,671 pada suhu setara secara posisi dengan -1,460 pada pengunjung.
Normalisasi dan Standardisasi Berdampingan #
Kedua penskalaan itu sering dipakai bergantian, jadi mari kita lihat keduanya bekerja pada kolom yang sama — suhu — untuk merasakan bedanya:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler
hari = pd.DataFrame({
"suhu": [27, 30, 24, 29, 33, 28, 26, 31],
"pengunjung": [210, 260, 180, 240, 300, 225, 195, 255],
})
mm = MinMaxScaler().fit_transform(hari)
ss = StandardScaler().fit_transform(hari)
banding = pd.DataFrame({
"suhu_asli": hari["suhu"],
"suhu_minmax": mm[:, 0].round(3),
"suhu_zscore": ss[:, 0].round(3),
})
print(banding.to_string(index=False))Output yang Dihasilkan:
suhu_asli suhu_minmax suhu_zscore
27 0.333 -0.557
30 0.667 0.557
24 0.000 -1.671
29 0.556 0.186
33 1.000 1.671
28 0.444 -0.186
26 0.222 -0.928
31 0.778 0.928Tabel ini menampilkan dua karakter yang berbeda. Min-max memetakan 24 ke 0 dan 33 ke 1 — rentang terkunci, posisi proporsional, tidak ada satu pun nilai yang keluar [0, 1]. z-score memusatkan 28,5 (rata-rata) ke sekitar nol dan membiarkan ujung-ujungnya menjulang sampai ±1,671 — rentangnya bebas, tetapi maknanya seragam untuk semua kolom. Perbedaan praktisnya dirangkum di sini:
| Aspek | Normalisasi (MinMaxScaler) | Standardisasi (StandardScaler) |
|---|---|---|
| Rumus | (x - min) / (max - min) | (x - mean) / std |
| Hasil | terkunci di [0, 1] | rata-rata 0, std 1, tanpa batas |
| Makna nilai | posisi proporsional dalam rentang | jarak dari rata-rata dalam satuan std |
| Data baru ekstrem | keluar [0, 1] bila di luar min-max latih | tetap terpetakan, seberapa pun jauhnya |
| Pencilan | sangat peka | ikut terukur tapi tidak meruntuhkan skala |
| Kapan tepat | jaring saraf, citra, butuh rentang tetap | default umum, regresi berregularisasi, PCA |
Standardisasi menjadi pilihan default banyak praktisi karena satu alasan sederhana: standardisasi tidak meluruhkan informasi jarak antar nilai ekstrem dan tidak runtuh ketika data baru melampaui rentang data latih — data baru bersuhu 35 tetap dapat z-score wajar, padahal min-max-nya akan melewati 1. Kebalikannya, bila algoritma memang menuntut masukan rentang tetap — jaring saraf dengan aktivasi sigmoid, piksel citra — normalisasi lebih tepat.
Rangkuman #
- Standardisasi mengubah nilai menjadi z-score
(x - mean) / std: rata-rata 0, simpangan baku 1, tanpa batas rentang — danStandardScalermenghasilkan angka yang sama dengan hitungan manualddof=0. - z-score punya makna seragam lintas kolom: -1,671 berarti “1,671 simpangan baku di bawah rata-rata” pada kolom mana pun.
- Normalisasi mengunci rentang dan peka pencilan; standardisasi membiarkan rentang bebas dan lebih tahan terhadap nilai data baru yang melampaui data latih.
- Panduan praktis: rentang tetap dan citra memakai normalisasi; sebagai default umum — termasuk sebelum PCA — pakai standardisasi.
Skala kini rapi, tetapi ada satu bentuk masalah yang tidak diselesaikan penskalaan mana pun: sebaran yang miring sekuat itu tetap miring setelah di-standardisasi. Untuk itu kita perlu mengubah bentuk distribusinya sendiri — lewat log dan Box-Cox pada chapter berikutnya.