0Pricing
Pandas & NumPy Academy · Pelajaran

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    1

Penghematan 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    False

Mengurutkan 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      3

Kecepatan 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      0

Categorical 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           1

Pemeriksaan 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

  1. Memeriksa Tipe Data Kolom
  2. Konversi Tipe dengan astype()
  3. Tipe Data Kategorikal
  4. Mengurai Tanggal dengan Benar
← Kembali ke Pandas & NumPy Academy