TL;DR
Pandas crosstab bikin tabel silang yang menghitung berapa kali dua kategori muncul bersamaan, dengan baris untuk satu kategori dan kolom untuk kategori lain. Sintaks dasarnya pd.crosstab(baris, kolom), dan bisa diubah jadi persen pakai argumen normalize. Tambahin values dan aggfunc kalau mau menghitung agregat, bukan sekadar frekuensi.
Pandas crosstab bikin tabel silang, yaitu tabel yang menghitung berapa kali dua kategori muncul bersamaan. Baris buat satu kategori, kolom buat kategori lain, dan tiap sel isinya jumlah data yang cocok. Cara cepat lihat hubungan antar dua kolom kategori.
Contoh gampang: kamu mau tau berapa banyak transaksi tiap kategori produk di tiap kota. Satu tabel crosstab langsung jawab itu.
Di sini aku bahas cara pakainya, dari hitung frekuensi sampai persentase. Contohnya data penjualan toko.
crosstab adalah fungsi pandas yang meringkas dua kolom kategori jadi satu tabel frekuensi. Nilai unik dari kolom pertama jadi baris, nilai unik kolom kedua jadi kolom, dan tiap sel ngitung berapa baris yang punya kombinasi itu. Hasilnya mirip pivot table, tapi khusus buat hitung-hitungan cepat.
Fungsi ini pas buat pertanyaan kayak berapa pelanggan pria vs wanita di tiap kategori, atau berapa order per metode pembayaran per kota.
Sintaks dasarnya: pd.crosstab(baris, kolom). Argumen pertama kolom yang jadi baris, argumen kedua kolom yang jadi kolom. Pandas otomatis ngitung frekuensinya.
import pandas as pd
df = pd.read_csv('transaksi.csv')
# jumlah transaksi tiap kategori per kota
tabel = pd.crosstab(df['kota'], df['kategori'])
print(tabel)
Hasilnya matriks: tiap baris satu kota, tiap kolom satu kategori produk, dan angkanya jumlah transaksi. Sekali jalan, kamu langsung lihat sebaran datanya.
Kalau mau baris dan kolom punya total, tambahin margins=True. Pandas bakal nambahin baris dan kolom 'All' berisi subtotal.
tabel = pd.crosstab(df['kota'], df['kategori'], margins=True)
Tambahin argumen normalize buat ngubah angka jadi proporsi. normalize='index' bikin tiap baris berjumlah 1, normalize='columns' bikin tiap kolom berjumlah 1, dan normalize=True bikin total keseluruhan jadi 1.
# proporsi kategori di dalam tiap kota
pd.crosstab(df['kota'], df['kategori'], normalize='index')
| normalize | Yang dijadikan 100% | Jawab pertanyaan |
|---|---|---|
| 'index' | Tiap baris | Komposisi kategori per kota |
| 'columns' | Tiap kolom | Sebaran kota per kategori |
| True | Seluruh tabel | Porsi tiap sel dari total |
Persentase sering lebih berguna dari angka mentah. Kota besar pasti punya transaksi lebih banyak, tapi proporsinya yang nunjukin pola beli.
Bisa. Tambahin argumen values dan aggfunc biar crosstab ngitung agregat, bukan sekadar jumlah baris. Misalnya rata-rata nominal belanja tiap kombinasi.
# rata-rata omzet tiap kategori per kota
pd.crosstab(
df['kota'], df['kategori'],
values=df['omzet'], aggfunc='mean'
)
Di titik ini crosstab jalan mirip pivot_table. Bedanya crosstab lebih ringkas buat kasus hitung frekuensi, sementara pivot_table lebih fleksibel buat agregasi rumit.
toko_berkah jualan online ke 5 kota dan punya 4 kategori produk. Mereka mau tau kota mana yang belanjanya condong ke kategori mana, biar stok dan promo lebih tepat sasaran.
tabel = pd.crosstab(
df['kota'], df['kategori'],
normalize='index'
).round(2)
print(tabel)
Dari dataset ngulikdata, hasilnya nunjukin satu pola menarik: di Surabaya, kategori sembako nyumbang 61% dari transaksi, jauh di atas rata-rata kota lain yang cuma 38%. Sementara di Jakarta, kategori peralatan rumah justru mendominasi dengan 44%. Insight ini bikin tim bisa geser alokasi stok tanpa nebak-nebak.
Tanpa crosstab, pola kayak gini kependam di ribuan baris transaksi. Satu tabel silang bikin perbedaan antar kota langsung kelihatan.
Kalau kategorimu banyak banget, tabelnya jadi lebar dan susah dibaca. Pertimbangin gabungin kategori kecil jadi 'lainnya' dulu sebelum bikin crosstab.
crosstab dirancang khusus buat hitung frekuensi antar kategori dan sintaksnya lebih ringkas buat kasus itu. pivot_table lebih umum dan fleksibel, cocok buat agregasi rumit dengan banyak kolom nilai. Buat sekadar hitung berapa kali dua kategori muncul bareng, pakai crosstab. Buat ringkasan angka yang lebih kompleks, pivot_table lebih pas.
Tambahin argumen normalize. Pakai normalize='index' kalau mau tiap baris berjumlah 100%, normalize='columns' kalau mau tiap kolom 100%, atau normalize=True buat proporsi dari total keseluruhan. Kalikan hasilnya dengan 100 dan bulatkan pakai .round(1) biar lebih gampang dibaca. Persentase bikin perbandingan antar kelompok jadi adil.
Bisa. Kamu bisa kasih daftar kolom di argumen baris atau kolom, misalnya pd.crosstab([df['kota'], df['gender']], df['kategori']). Hasilnya tabel dengan index bertingkat. Tapi hati-hati, makin banyak kolom, tabelnya makin lebar dan susah dibaca. Buat kombinasi tiga dimensi atau lebih, kadang pivot_table lebih rapi.
Biasanya karena nilai di kolom itu NaN, jadi pandas gak masukin ke hitungan. Cek dulu pakai df.isna().sum() buat lihat kolom mana yang punya nilai kosong. Isi NaN pakai fillna dengan label kayak 'tidak diketahui', atau buang barisnya kalau memang gak relevan. Setelah bersih, semua kategori bakal muncul di tabel.
Isi argumen values dengan kolom angka dan aggfunc dengan fungsi agregat. Misalnya pd.crosstab(df['kota'], df['kategori'], values=df['omzet'], aggfunc='mean') ngitung rata-rata omzet tiap kombinasi. Kamu bisa ganti 'mean' jadi 'sum', 'max', atau fungsi lain sesuai kebutuhan. Di mode ini crosstab jalan mirip pivot_table.
Rangkuman: crosstab bikin tabel silang buat hitung frekuensi antar dua kategori. Tambahin normalize buat persen, dan values plus aggfunc buat agregat selain jumlah.
Coba ambil dua kolom kategori di datamu, bikin crosstab-nya, dan lihat pola yang selama ini gak keliatan.
Mau lanjut olah data pandas? Baca cara bikin pivot di Python pakai pivot_table dan cara hitung frekuensi nilai pakai value_counts. Buat konsep dasarnya, cek glosarium tabel silang dan glosarium pivot table. Dokumentasi resmi ada di halaman pandas.crosstab.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.
Cara pakai pandas cut dan qcut buat binning data numerik jadi kelompok. Bedanya, kapan pakai yang mana, plus contoh segmentasi pelanggan UMKM.