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.
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:
[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:
- Baris 11-12:
factorizemenghasilkan kode[0 1 0 1 0 0]dan Index['reguler', 'premium']— urutan kemunculan, bukan alfabet. - Baris 14-16: kolom
paket_kodeditambahkan dari hasil factorize, dan DataFrame kini punya representasi numerik kategori. - Baris 19-21:
astype("category")lalucat.codesmenghasilkan kode[1, 0, 1, 0, 1, 1]karena kategorinya diurutkan alfabet:premiummenjadi0danregulermenjadi1.
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.