Sebagian besar algoritma machine learning menghitung dengan angka, bukan dengan teks. Kolom pembayaran yang berisi QRIS, Transfer, Kartu Kredit, dan COD harus diubah menjadi bentuk numerik sebelum masuk ke model. Teknik one-hot encoding menyelesaikannya dengan memecah satu kolom kategori menjadi beberapa kolom biner: satu kolom per nilai unik, dan setiap baris bernilai True pada tepat satu kolom. Pada Chapter ini kita memakai pd.get_dummies() , membaca perilaku bawaan pandas 3.0, lalu mengonversi hasilnya ke angka 0/1 bila dibutuhkan.

Memecah Kolom Menjadi Kolom Biner #

Skrip berikut mengambil dua kolom dataset pesanan agar hasilnya mudah dibaca, memecah kolom pembayaran menjadi empat kolom dummy, lalu menunjukkan versi angka. Jalankan dan amati dtype kedua versi.

python
import pandas as pd

pesanan = pd.DataFrame({
    "id_pesanan": ["PSN-001", "PSN-002", "PSN-003", "PSN-004",
                   "PSN-005", "PSN-006", "PSN-007", "PSN-008"],
    "nama_pelanggan": ["Budi", "Siti", "Dewi", "Andi",
                       "Rina", "Tono", "Lina", "Sari"],
    "kota": ["Jakarta", "Bandung", "Surabaya", "Jakarta",
             "Medan", "Bandung", "Jakarta", "Surabaya"],
    "pembayaran": ["QRIS", "Transfer", "QRIS", "Kartu Kredit",
                   "COD", "Transfer", "QRIS", "COD"],
    "nilai_transaksi": [250_000, 1_800_000, 750_000, 2_400_000,
                        480_000, 1_200_000, 320_000, 980_000],
    "berat_paket": [1.2, 4.5, 0.8, 7.0, 2.5, 3.0, 1.0, 5.5],
})

ringkas = pesanan[["nama_pelanggan", "pembayaran"]]
dummies = pd.get_dummies(ringkas, columns=["pembayaran"], prefix="bayar")
print(dummies)
print()
print(dummies.dtypes)
print()

dummies_angka = pd.get_dummies(
    ringkas, columns=["pembayaran"], prefix="bayar", dtype=int
)
print(dummies_angka.dtypes)

Output yang Dihasilkan:

text
  nama_pelanggan  bayar_COD  bayar_Kartu Kredit  bayar_QRIS  bayar_Transfer
0           Budi      False               False        True           False
1           Siti      False               False       False            True
2           Dewi      False               False        True           False
3           Andi      False                True       False           False
4           Rina       True               False       False           False
5           Tono      False               False       False            True
6           Lina      False               False        True           False
7           Sari       True               False       False           False

nama_pelanggan         str
bayar_COD             bool
bayar_Kartu Kredit    bool
bayar_QRIS            bool
bayar_Transfer        bool
dtype: object

nama_pelanggan          str
bayar_COD             int64
bayar_Kartu Kredit    int64
bayar_QRIS            int64
bayar_Transfer        int64
dtype: object

Mari kita telaah apa yang terjadi pada kode di atas:

  1. Baris 17 (ringkas = pesanan[["nama_pelanggan", "pembayaran"]]): get_dummies() membiarkan kolom lain apa adanya, jadi kita memilih dua kolom saja agar tabel hasil tetap muat di satu baris cetakan.
  2. Baris 18 (pd.get_dummies(ringkas, columns=["pembayaran"], prefix="bayar")): hanya kolom yang disebut pada columns yang dipecah. get_dummies() membuat satu kolom per nilai unik, menamainya prefix + _ + nilai asli, dan mengurutkannya secara alfabetis: bayar_COD, bayar_Kartu Kredit, bayar_QRIS, bayar_Transfer.
  3. Isi baris: setiap baris bernilai True pada tepat satu kolom dummy. Baris Andi bernilai True di bayar_Kartu Kredit dan False di tiga kolom lainnya, persis seperti pembayaran-nya.
  4. Baris 21 (print(dummies.dtypes)): keempat kolom dummy bertipe bool. Kolom nama_pelanggan tetap str karena tidak ikut dipecah.
  5. Baris 24-27 (dtype=int): argumen dtype=int meminta dummy dalam bentuk angka. Cetakannya menunjukkan keempat kolom dummy menjadi int64; nilai di dalamnya kini 0 dan 1, tanpa perlu konversi tambahan.

Kolom Bool versus Kolom 0/1 #

Perhatikan dtype pada output: pandas 3.0 menghasilkan kolom bool berisi True/False, bukan 0/1 seperti pada banyak tutorial era pandas 1.x dan 2.x. Secara teknis kedua bentuk setara karena True berperilaku seperti 1 saat dijumlahkan, dan bool lebih hemat memori. Meski begitu, sebagian pipeline tertentu, misalnya format data untuk library lain, memang meminta integer; gunakan dtype=int saat memanggil get_dummies() atau astype(int) pada hasilnya, sesuai kebutuhan.

Dua hal kecil perlu diingat saat membaca hasil get_dummies(). Nama kolom hasil menggabungkan prefix dengan nilai asli, sehingga bisa mengandung spasi seperti bayar_Kartu Kredit; bersihkan nilai kategori lebih dulu bila nama kolom harus rapi. Penjelasan lengkap dengan contoh lain ada di user guide Computing indicator/dummy variables . Kolom kategori kini sudah berbentuk biner yang siap masuk ke model; Sebelum menyamakan skala kolom numerik pada chapter penutup section ini, Chapter berikutnya menyajikan sisi lain encoding: factorize() yang memadatkan kategori menjadi satu kolom kode integer.