one-hot-encoding pada chapter sebelumnya membuat satu kolom baru per kategori, dan lebar kolom itu memang diperlukan oleh sebagian besar model linear dan neural network. Ada porsi algoritme lain — pohon keputusan, lightGBM, hingga sekadar pencocokan id database — yang justru menginginkan kebalikannya: satu kolom integer berisi kode kategori. pd.factorize() menghasilkan kode itu dalam satu panggilan, sekaligus mengembalikan daftar label agar kode bisa dipetakan kembali. Chapter ini membahas aturan pengurutan kode pada factorize(), perbedaannya dengan cat.codes, serta kapan encoding ini cukup.

Kode Mengikuti Urutan Kemunculan #

pd.factorize(series) mengembalikan dua nilai: array kode integer dan Index berisi label unik sesuai urutan kemunculan. Pada contoh, reguler muncul lebih dulu sehingga mendapat kode 0, dan premium menyusul sebagai 1; urutan ini tidak tergantung alfabet. Pasangan kode dan Index memungkinkan pemetaan dua arah: unik[kode] mengembalikan label asli, pola yang berguna saat hasil prediksi berupa kode dan harus dibaca kembali sebagai nama kategori.

python
import pandas as pd

pelanggan = pd.DataFrame(
    {
        "nama": ["Budi", "Siti", "Dewi", "Budi", "Dewi", "Siti"],
        "paket": ["reguler", "premium", "reguler", "premium", "reguler", "reguler"],
    }
)

# factorize mengembalikan kode integer dan daftar label unik
kode, unik = pd.factorize(pelanggan["paket"])
print(kode)
print(unik)

pelanggan["paket_kode"] = kode
print("\nDataFrame dengan kolom kode:")
print(pelanggan)

# pembanding: categorical menyimpan kode yang sama
kategori = pelanggan["paket"].astype("category")
print("\ncat.codes:", kategori.cat.codes.tolist())
print("categories:", kategori.cat.categories.tolist())

Output yang Dihasilkan:

text
[0 1 0 1 0 0]
Index(['reguler', 'premium'], dtype='str')

DataFrame dengan kolom kode:
   nama    paket  paket_kode
0  Budi  reguler           0
1  Siti  premium           1
2  Dewi  reguler           0
3  Budi  premium           1
4  Dewi  reguler           0
5  Siti  reguler           0

cat.codes: [1, 0, 1, 0, 1, 1]
categories: ['premium', 'reguler']

Mari kita telaah baris-baris kuncinya:

  1. Baris 11-12: factorize menghasilkan kode [0 1 0 1 0 0] dan Index ['reguler', 'premium'] — urutan kemunculan, bukan alfabet.
  2. Baris 14-16: kolom paket_kode ditambahkan dari hasil factorize, dan DataFrame kini punya representasi numerik kategori.
  3. Baris 19-21: astype("category") lalu cat.codes menghasilkan kode [1, 0, 1, 0, 1, 1] karena kategorinya diurutkan alfabet: premium menjadi 0 dan reguler menjadi 1.

factorize() vs cat.codes #

Keduanya menghasilkan kode integer, tetapi mengurutkan berbeda: factorize() mengikuti urutan kemunculan, sedangkan dtype categorical menyusun kategori terurut secara alfabet secara bawaan. Perbedaan itu penting saat kode dipakai lintas tabel — kode 0 di satu tabel bisa berarti reguler, sementara tabel lain menyimpan premium. Aturan amannya: simpan Index hasil factorize() atau daftar cat.categories bersama datanya, dan jangan membandingkan kode antar tabel tanpa memastikan kedua daftar kategorinya identik. Bila memang butuh urutan tertentu, factorize(sort=True) mengurutkan label lebih dulu sehingga hasilnya menyatu dengan kebiasaan categorical.

Kapan Label Encoding Cukup #

Pilihan antara one-hot dan label encoding kembali ke makna angka. Label encoding menyiratkan urutan — model linear akan membaca premium=1 lebih besar dari reguler=0; untuk kategori nominal seperti warna atau kota, asumsi itu keliru dan one-hot lebih aman. Label encoding pas ketika model berbasis pohon yang tidak menafsirkan jarak, atau ketika kolom hanya butuh id ringkas untuk penggabungan dan penyimpanan. Parameter use_na_sentinel mengatur nasib NaN: secara bawaan nilai kosong dikode -1, angka yang tidak dipakai kategori mana pun sehingga mudah difilter keluar.

Encoding ini menutup rangkaian penanganan kategori di section ini. Chapter berikutnya berpindah ke normalisasi dan standardisasi: menyetel skala kolom numerik dengan min-max dan z-score agar fitur berbeda satuan bisa dibandingkan.

Dokumentasi resmi yang relevan: pandas.factorize untuk parameter sort dan use_na_sentinel, serta User Guide: Categorical data untuk perbandingan dengan dtype categorical.