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.
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:
class A : categorical, size 8x1
categories : ewallet kartu tunai
countcats : 2 3 3Mari kita bedah baris-baris kode di atas:
- Baris 1-2 (cell-of-char 8×1): delapan transaksi berisi tiga metode pembayaran — nilai berulang adalah tanda kandidat kategori yang tepat.
categorical(bayar): tiga label unik menjadi tiga kode; ukuran array tetap 8×1.categories(A): daftar kategori terurut alfabetis (ewallet<kartu<tunai) — urutan kategori, bukan urutan elemen;countcatsmengembalikan[2 3 3]sejajar dengan daftar itu: duaewallet, tigakartu, tigatunai.
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.
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:
setelah merge : nontunai tunai
countcats : 5 3
setelah removecats ewallet: 2 elemen undefinedMari kita bedah hasil tersebut:
mergecats: kategorikartudanewallet(3+2 elemen) melebur menjadinontunaiberisi 5 elemen; daftar kategori kini dua.removecats(A, 'ewallet'): kategoriewallethilang dari daftar; dua elemen yang tadinyaewallettidak ikut terhapus — keduanya menjadi<undefined>, terhitung olehsum(isundefined(C)).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.
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:
bersih = C(~isundefined(C));
fprintf('elemen terpakai : %d\n', numel(bersih));Output yang Dihasilkan:
elemen terpakai : 6Mask ~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 ==.
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:
nilai(1) < nilai(3) : 1
di atas rendah : 1 0 1 1 0Mari kita bedah hasil tersebut:
- Argumen kedua
{'rendah','sedang','tinggi'}: urutan inilah yang menjadi urutan matematis —rendah(1) < sedang(2) < tinggi(3). nilai(1) < nilai(3):sedangmelawantinggi→2 < 3→1(benar). Pada categorical nominal, ekspresi ini galat.nilai > 'rendah': perbandingan disiarkan ke seluruh elemen — mask[1 0 1 1 0]menandai semua nilai di atasrendah, 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.
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:
skor 78 -> sedang, skor 92 -> tinggi
countcats level : 1 3 2Mari kita bedah hasil tersebut:
- Tepi
[0 60 80 100]: tiga bin —[0,60)rendah,[60,80)sedang,[80,100]tinggi (tepi kanan bin terikut dimasukkan). - Skor 78 jatuh di bin
[60,80)→sedang; skor 92 di bin[80,100]→tinggi. countcats(level): saturendah(55), tigasedang(78, 61, 70), duatinggi(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.