Tipe Data Kategorikal
Konversikan kolom string dengan kardinalitas rendah menjadi Categorical pandas untuk mengurangi penggunaan memori dan mempercepat operasi groupby.
Tipe Data Kategorikal adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa Itu Tipe Data Categorical?
Tipe data Categorical dalam Pandas dirancang untuk kolom yang berisi sekumpulan nilai diskret terbatas (kardinalitas rendah), seperti jenis kelamin, status, wilayah, atau kategori produk. Alih-alih menyimpan string lengkap untuk setiap baris, Pandas menyimpan nilai unik (disebut kategori) satu kali dan menggunakan kode bilangan bulat pada setiap baris untuk merujuk kepadanya. Cara ini mirip dengan penggunaan tabel pencarian atau tipe enum dalam basis data.
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'East', 'North', 'East', 'South'] * 1000
})
# Without Categorical: object dtype stores every string
print('object dtype memory:', df['region'].memory_usage(deep=True))
# With Categorical: only stores 3 unique values + integer codes
df['region_cat'] = df['region'].astype('category')
print('category dtype memory:', df['region_cat'].memory_usage(deep=True))Membuat Series Categorical
Konversikan kolom menjadi Categorical dengan memanggil .astype('category') pada Series apa pun. Series Categorical yang dihasilkan menyimpan nilai unik sebagai .cat.categories dan kode posisi bilangan bulat sebagai .cat.codes. Anda juga dapat membuat Categorical secara langsung dengan pd.Categorical() untuk menentukan kategori dan urutannya sejak awal.
import pandas as pd
s = pd.Series(['low', 'high', 'med', 'high', 'low'])
s_cat = s.astype('category')
print(s_cat.cat.categories) # Index(['high', 'low', 'med'], dtype='object')
print(s_cat.cat.codes) # integer codes per row
# 0 1
# 1 0
# 2 2
# 3 0
# 4 1Penghematan Memori dengan Categorical
Penghematan memori dari tipe data Categorical bergantung pada rasio kardinalitas (nilai unik ÷ total baris). Dengan 5 string unik dalam kolom berisi 1.000.000 baris, tipe data object menyimpan 1 juta penunjuk string (sekitar 50+ byte masing-masing), sedangkan Categorical hanya menyimpan 5 string dan 1 juta bilangan bulat 8-bit. Penghematannya dapat mencapai 5–20 kali, sehingga kolom berukuran 50 MB dapat menjadi 2–5 MB.
import pandas as pd
import numpy as np
n = 1_000_000
statuses = np.random.choice(['active', 'inactive', 'pending'], size=n)
df = pd.DataFrame({'status': statuses})
object_mem = df['status'].memory_usage(deep=True) / 1e6
df['status'] = df['status'].astype('category')
cat_mem = df['status'].memory_usage(deep=True) / 1e6
print(f'Object dtype: {object_mem:.1f} MB')
print(f'Category dtype: {cat_mem:.1f} MB')
print(f'Reduction: {object_mem/cat_mem:.1f}x')Categorical Berurutan untuk Pemeringkatan
Terkadang kategori memiliki urutan alami — misalnya, 'low' < 'medium' < 'high', atau ukuran kaus XS < S < M < L < XL. Categorical berurutan merepresentasikan pemeringkatan ini, sehingga memungkinkan operator perbandingan yang bermakna (<, >=, dan sebagainya) serta memastikan hasil groupby diurutkan berdasarkan urutan semantik yang benar, bukan berdasarkan abjad.
import pandas as pd
df = pd.DataFrame({
'priority': ['high', 'low', 'medium', 'high', 'low']
})
priority_type = pd.CategoricalDtype(
categories=['low', 'medium', 'high'],
ordered=True
)
df['priority'] = df['priority'].astype(priority_type)
# Comparison now works correctly
print(df['priority'] >= 'medium')
# 0 True
# 1 False
# 2 True
# 3 True
# 4 FalseMengurutkan Categorical Berurutan
Saat Anda mengurutkan kolom Categorical yang berurutan, Pandas menggunakan urutan kategori yang telah ditentukan, bukan urutan alfabetis. Artinya, 'low' muncul sebelum 'medium', lalu 'high', terlepas dari urutannya jika diperlakukan sebagai string. Hal ini penting untuk menghasilkan tabel ringkasan dan diagram dengan urutan yang benar.
import pandas as pd
df = pd.DataFrame({
'severity': pd.Categorical(
['high', 'low', 'medium', 'low', 'high'],
categories=['low', 'medium', 'high'],
ordered=True
),
'count': [5, 20, 8, 15, 3]
})
# sort_values respects the categorical order
print(df.sort_values('severity')[['severity', 'count']])
# severity count
# 1 low 20
# 3 low 15
# 2 medium 8
# 0 high 5
# 4 high 3Kecepatan GroupBy dengan Categorical
Pandas dapat mengoptimalkan operasi groupby() pada kolom Categorical karena semua grup yang mungkin sudah diketahui sebelumnya. Hal ini dapat membuat groupby 2–5 kali lebih cepat pada DataFrames berukuran besar. Selain itu, groupby pada Categorical mengembalikan semua kategori—termasuk kategori yang kosong—sehingga tabel ringkasan Anda selalu memiliki satu baris untuk setiap grup yang diharapkan, meskipun beberapa grup tidak memiliki observasi.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'region': pd.Categorical(
np.random.choice(['North', 'South', 'East', 'West'], 10),
categories=['North', 'South', 'East', 'West']
),
'sales': np.random.randint(100, 1000, 10)
})
# observed=False shows ALL categories even empty ones
print(df.groupby('region', observed=False)['sales'].sum())Menambahkan dan Menghapus Kategori
Gunakan pengakses .cat untuk mengelola daftar kategori. .cat.add_categories() menambahkan nilai baru yang diizinkan (berguna sebelum memasukkan data baru), sedangkan .cat.remove_unused_categories() menghapus label kategori yang tidak memiliki baris terkait—praktis setelah pemfilteran. Anda tidak dapat menetapkan nilai yang tidak ada dalam kategori sebelum menambahkannya.
import pandas as pd
s = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c'])
s = pd.Series(s)
print(s.cat.categories) # Index(['a', 'b', 'c'], dtype='object')
print(s.value_counts()) # a:2, b:1, c:0
# Remove unused category 'c'
s = s.cat.remove_unused_categories()
print(s.cat.categories) # Index(['a', 'b'], dtype='object')Mengganti Nama Label Kategori
.cat.rename_categories() memungkinkan Anda mengganti label kategori tanpa mengubah kode yang mendasarinya. Ini berguna saat Anda ingin menampilkan nama yang lebih mudah dipahami (misalnya, 'M' → 'Male') atau memperbaiki kapitalisasi label yang tidak konsisten tanpa mengonversinya kembali menjadi object dan memetakan ulang. Metode ini menerima daftar (berdasarkan posisi) atau kamus (berdasarkan target tertentu).
import pandas as pd
s = pd.Series(pd.Categorical(['M', 'F', 'M', 'F'], categories=['M', 'F']))
# Rename using a dict
s = s.cat.rename_categories({'M': 'Male', 'F': 'Female'})
print(s)
# 0 Male
# 1 Female
# 2 Male
# 3 Female
print(s.cat.categories) # Index(['Male', 'Female'], dtype='object')Kapan Tidak Menggunakan Categorical
Dtype Categorical bukan pilihan yang baik ketika kardinalitasnya tinggi—jika hampir setiap baris memiliki nilai unik (seperti ID pengguna, komentar teks bebas, atau UUID), indeks kategori hampir sebesar data asli sehingga tidak menghemat memori. Sebagai aturan praktis, gunakan Categorical hanya jika jumlah nilai unik kurang dari kira-kira 50% dari total baris, terutama jika jumlah nilai unik berada pada kisaran puluhan atau ratusan.
import pandas as pd
import numpy as np
df = pd.DataFrame({'user_id': range(1_000_000)})
# High-cardinality: every value is unique — don't use Categorical
object_mem = df['user_id'].astype(str).memory_usage(deep=True) / 1e6
cat_mem = df['user_id'].astype(str).astype('category').memory_usage(deep=True) / 1e6
print(f'String: {object_mem:.1f} MB')
print(f'Category: {cat_mem:.1f} MB')
# Category is WORSE for high-cardinality data!Categorical dalam Tabel Pivot dan Groupby
Menggunakan Categorical memastikan bentuk output yang konsisten pada hasil groupby dan tabel pivot. Tanpa Categorical, grup yang kebetulan tidak memiliki observasi akan dihilangkan secara diam-diam dari hasilnya—yang dapat menyebabkan output tidak selaras saat membandingkan irisan data yang berbeda. Dengan Categorical dan observed=False, semua grup selalu muncul dalam output.
import pandas as pd
df = pd.DataFrame({
'quarter': pd.Categorical(
['Q1', 'Q1', 'Q3'],
categories=['Q1', 'Q2', 'Q3', 'Q4']
),
'revenue': [100, 200, 300]
})
# observed=False includes Q2 and Q4 even though they have no rows
result = df.groupby('quarter', observed=False)['revenue'].sum()
print(result)
# quarter
# Q1 300
# Q2 0
# Q3 300
# Q4 0Categorical dan Pembelajaran Mesin
Banyak estimator scikit-learn mengharapkan input numerik. Untuk mengonversi kolom Categorical menjadi angka bagi suatu model, gunakan .cat.codes (pengodean label) atau pd.get_dummies() (pengodean one-hot). Pengodean one-hot menghindari kesan bahwa terdapat hubungan ordinal antarkategori. Untuk Categorical berurutan seperti tingkat prioritas, pengodean label (kode secara langsung) sesuai digunakan dan mempertahankan informasi urutannya.
import pandas as pd
df = pd.DataFrame({
'colour': pd.Categorical(['red', 'blue', 'green', 'red'])
})
# One-hot encode for unordered categories
one_hot = pd.get_dummies(df['colour'], prefix='colour')
print(one_hot)
# colour_blue colour_green colour_red
# 0 0 0 1
# 1 1 0 0
# 2 0 1 0
# 3 0 0 1Pemeriksaan Singkat
Uji pemahaman Anda tentang dtype Categorical.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa: dtype Categorical menyimpan nilai unik satu kali dan menggunakan kode bilangan bulat untuk setiap baris, sehingga menghemat banyak memori pada kolom dengan kardinalitas rendah; Categorical berurutan mendukung perbandingan yang bermakna dan pengurutan yang benar; serta groupby dengan observed=False menyertakan semua kategori, termasuk yang kosong. Hindari Categorical untuk kolom dengan kardinalitas tinggi. Berikutnya, kita akan mengurai string tanggal dengan benar menggunakan pd.to_datetime().
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Tipe Data Kategorikal” gratis?
Ya — teks lengkap “Tipe Data Kategorikal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Tipe Data Kategorikal”?
Konversikan kolom string dengan kardinalitas rendah menjadi Categorical pandas untuk mengurangi penggunaan memori dan mempercepat operasi groupby. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Tipe Data Kategorikal” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Memeriksa Tipe Data Kolom
- Konversi Tipe dengan astype()
- Tipe Data Kategorikal
- Mengurai Tanggal dengan Benar