Chapter Categorical Data di Section Pengolahan Data telah memperkenalkan tipe categorical: label teks disimpan sebagai kode angka ringkas, kategori uniknya tercatat sekali. Pendalaman ini mengoperasikannya sebagai alat analisis: menghitung distribusi dengan countcats, menggabungkan dan membuang kategori saat data tumbuh, menandai nilai hilang dengan isundefined, memanfaatkan ordinal untuk perbandingan <, dan — pintu masuk paling praktis — mengubah kolom numerik menjadi kategori lewat discretize.

Membuat categorical dan Membaca Daftar Kategori #

Aturannya: categorical(A) mengonversi cell-of-char menjadi categorical; categories(A) melaporkan daftar kategori (terurut menaik untuk teks), dan countcats(A) menghitung elemen tiap kategori dalam urutan yang sama. Mekanismenya: data asli menyimpan kode integer, daftar kategori menyimpan label — menghitung distribusi cukup menjumlahkan kode, tanpa membandingkan teks.

matlab
bayar = {'kartu'; 'tunai'; 'kartu'; 'ewallet'; 'tunai'; 'kartu'; ...
         'ewallet'; 'tunai'};
A = categorical(bayar);

daftar = categories(A);
jumlah = countcats(A);
fprintf('class A    : %s, size %dx%d\n', class(A), size(A,1), size(A,2));
fprintf('categories : %s %s %s\n', daftar{:});
fprintf('countcats  : %d %d %d\n', jumlah);

Output yang Dihasilkan:

text
class A    : categorical, size 8x1
categories : ewallet kartu tunai
countcats  : 2 3 3

Mari kita bedah baris-baris kode di atas:

  1. Baris 1-2 (cell-of-char 8×1): delapan transaksi berisi tiga metode pembayaran — nilai berulang adalah tanda kandidat kategori yang tepat.
  2. categorical(bayar): tiga label unik menjadi tiga kode; ukuran array tetap 8×1.
  3. categories(A): daftar kategori terurut alfabetis (ewallet < kartu < tunai) — urutan kategori, bukan urutan elemen; countcats mengembalikan [2 3 3] sejajar dengan daftar itu: dua ewallet, tiga kartu, tiga tunai.

Menimbang Kategori: mergecats dan removecats #

Data hidup: label lama perlu digabung, kategori kosong perlu dibuang. Aturannya: mergecats(A, lama, baru) melebur beberapa kategori menjadi satu; removecats(A, kategori) menghapus kategori dari daftar — elemen yang memakainya menjadi <undefined>. Mekanismenya: kedua fungsi membuat categorical array baru dengan daftar kategori yang direvisi; kode elemen dipetakan ulang mengikuti daftar baru.

matlab
B = mergecats(A, {'kartu', 'ewallet'}, 'nontunai');
daftarB = categories(B);
jumlahB = countcats(B);
fprintf('setelah merge : %s %s\n', daftarB{:});
fprintf('countcats     : %d %d\n', jumlahB);

C = removecats(A, 'ewallet');
fprintf('setelah removecats ewallet: %d elemen undefined\n', sum(isundefined(C)));

Output yang Dihasilkan:

text
setelah merge : nontunai tunai
countcats     : 5 3
setelah removecats ewallet: 2 elemen undefined

Mari kita bedah hasil tersebut:

  1. mergecats: kategori kartu dan ewallet (3+2 elemen) melebur menjadi nontunai berisi 5 elemen; daftar kategori kini dua.
  2. removecats(A, 'ewallet'): kategori ewallet hilang dari daftar; dua elemen yang tadinya ewallet tidak ikut terhapus — keduanya menjadi <undefined>, terhitung oleh sum(isundefined(C)).
  3. removecats(A) tanpa daftar membuang seluruh kategori yang tak terpakai oleh elemen mana pun — pembersih daftar kategori bawaan.

Kategori Tak Terdefinisi: isundefined #

Aturannya: isundefined(A) menghasilkan mask logical yang menandai elemen tanpa kategori — padanan isnan untuk numerik. Mekanismenya: elemen <undefined> adalah missing value kelas categorical; elemen tersebut tetap menempati posisinya sehingga ukuran array tidak berubah.

text
C =
  8×1 categorical

     kartu  
     tunai  
     kartu  
     <undefined> 
     tunai  
     kartu  
     <undefined> 
     tunai  

Tampilan C di atas memperlihatkan dua slot <undefined> — persis di posisi elemen ewallet yang kategorinya dibuang. Pola pembersihannya mengikuti alur Missing Data dari Section Pengolahan Data:

matlab
bersih = C(~isundefined(C));
fprintf('elemen terpakai : %d\n', numel(bersih));

Output yang Dihasilkan:

text
elemen terpakai : 6

Mask ~isundefined(C) menjaga enam elemen bervalid; keenam elemen tersebut siap dianalisis lebih lanjut. Alternatifnya, elemen kosong bisa diisi kategori pengganti dengan standardizeMissing atau assignment C(isundefined(C)) = 'lainnya'.

Ordinal: Kategori yang Bisa Dibandingkan #

Aturannya: categorical(nilai, urutan, 'Ordinal', true) membuat ordinal categorical — kategori pertama terkecil, terakhir terbesar — sehingga operator <, <=, >, >= sah. Mekanismenya: perbandingan memakai posisi kategori dalam daftar, bukan abjad; inilah bedanya dengan categorical nominal yang hanya mengizinkan ==.

matlab
nilai = categorical({'sedang'; 'rendah'; 'tinggi'; 'sedang'; 'rendah'}, ...
                    {'rendah', 'sedang', 'tinggi'}, ...
                    'Ordinal', true);
fprintf('nilai(1) < nilai(3) : %d\n', nilai(1) < nilai(3));
diatas = nilai > 'rendah';
fprintf('di atas rendah      : %d %d %d %d %d\n', diatas);

Output yang Dihasilkan:

text
nilai(1) < nilai(3) : 1
di atas rendah      : 1 0 1 1 0

Mari kita bedah hasil tersebut:

  1. Argumen kedua {'rendah','sedang','tinggi'}: urutan inilah yang menjadi urutan matematis — rendah(1) < sedang(2) < tinggi(3).
  2. nilai(1) < nilai(3): sedang melawan tinggi → 2 < 3 → 1 (benar). Pada categorical nominal, ekspresi ini galat.
  3. nilai > 'rendah': perbandingan disiarkan ke seluruh elemen — mask [1 0 1 1 0] menandai semua nilai di atas rendah, siap memfilter baris tabel.

discretize: dari Angka ke Kategori #

Kolom numerik sering lebih informatif sebagai kategori: skor ujian menjadi rendah/sedang/tinggi, umur menjadi kelompok. Aturannya: discretize(X, tepi, 'categorical', namaKategori) membagi rentang angka menjadi bin [tepi(j), tepi(j+1)) — bin terakhir mencakup kedua tepinya. Mekanismenya: setiap angka dicari bin-nya lalu diganti kategori bernama; hasilnya categorical ordinal dengan urutan bin.

matlab
skor = [78; 92; 55; 84; 61; 70];
level = discretize(skor, [0 60 80 100], 'categorical', ...
                   {'rendah', 'sedang', 'tinggi'});
fprintf('skor 78 -> %s, skor 92 -> %s\n', char(level(1)), char(level(2)));
jumlahLevel = countcats(level);
fprintf('countcats level : %d %d %d\n', jumlahLevel);

Output yang Dihasilkan:

text
skor 78 -> sedang, skor 92 -> tinggi
countcats level : 1 3 2

Mari kita bedah hasil tersebut:

  1. Tepi [0 60 80 100]: tiga bin — [0,60) rendah, [60,80) sedang, [80,100] tinggi (tepi kanan bin terikut dimasukkan).
  2. Skor 78 jatuh di bin [60,80) → sedang; skor 92 di bin [80,100] → tinggi.
  3. countcats(level): satu rendah (55), tiga sedang (78, 61, 70), dua tinggi (92, 84) — distribusi kelompok siap dipakai.

Ringkasan #

categorical menyimpan label sebagai kode; categories dan countcats membaca daftar serta distribusinya. mergecats melebur kategori, removecats membuangnya dan meninggalkan <undefined> yang terdeteksi oleh isundefined. Opsi 'Ordinal', true mengaktifkan perbandingan </> berdasar urutan kategori, dan discretize(X, tepi, 'categorical', nama) mengubah kolom numerik menjadi kategori binner. Berkas contoh.m mendemonstrasikan seluruh operasi pada data transaksi dan nilai ujian.