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:

text
z = (x - mean) / std

Nilai 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:

python
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:

text
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.601

Mari kita bedah hasilnya baris demi baris:

  1. 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.
  2. Baris 13-14 (mean(), std(ddof=0)): pemeriksaan kesehatan. Rata-rata kedua kolom z tepat 0 dan simpangan bakunya tepat 1 — tanda standardisasi berhasil.
  3. 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:

python
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:

text
 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.928

Tabel 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:

AspekNormalisasi (MinMaxScaler)Standardisasi (StandardScaler)
Rumus(x - min) / (max - min)(x - mean) / std
Hasilterkunci di [0, 1]rata-rata 0, std 1, tanpa batas
Makna nilaiposisi proporsional dalam rentangjarak dari rata-rata dalam satuan std
Data baru ekstremkeluar [0, 1] bila di luar min-max latihtetap terpetakan, seberapa pun jauhnya
Pencilansangat pekaikut terukur tapi tidak meruntuhkan skala
Kapan tepatjaring saraf, citra, butuh rentang tetapdefault 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 — dan StandardScaler menghasilkan angka yang sama dengan hitungan manual ddof=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.

Referensi #

  1. scikit-learn — Preprocessing Data
  2. NumPy — numpy.mean
  3. pandas — User Guide