“Harga berapa saja yang dipakai toko bulan ini? Berapa hari tiap harga dipakai? Kode produk mana yang paling sering terjual?” — semua laporan semacam itu berpangkal dari dua pertanyaan: daftar nilai unik, dan hitungan kemunculannya. Fungsi unique menjawab yang pertama; penghitungan frekuensinya kita bangun dengan accumarray — pasangan yang bekerja pada data numerik dan tetap kompatibel lintas versi. Cakupan chapter ini:

  • unique untuk daftar nilai unik, terurut maupun 'stable'
  • Tiga keluaran [C, ia, ic] beserta perannya
  • Frekuensi kemunculan dengan accumarray dan sum(mask)
  • unique(..., 'rows') untuk baris matriks
  • mode sebagai nilai terbanyak

Dataset yang dipakai di chapter ini:

matlab
penjualan = [1 12 15000; 2 15 15000; 3 9 16000; 4 22 16000; 5 18 15000;
             6 7 17000; 7 25 15000; 8 11 16000; 9 14 17000; 10 20 16000;
             11 16 17000; 12 19 15000];   % kolom: hari, unit, harga
suhu = [30 32 31 29 33 34 31 30 35 32];  % suhu harian (derajat)

unique: Daftar Nilai Unik #

Aturannya: unique(v) mengembalikan tiap nilai berbeda TEPAT SATU kali, terurut menaik secara default ('sorted'). Mekanismenya: unique menyortir data terlebih dulu, lalu memungut nilai pada posisi yang berbeda dari pendahulunya — duplikat persis diabaikan, dan orientasi mengikuti masukan (kolom masuk, kolom keluar):

matlab
harga = penjualan(:, 3);
C = unique(harga);
fprintf('harga unik : '); fprintf('%d ', C'); fprintf('\n');

Output yang Dihasilkan:

text
harga unik : 15000 16000 17000

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (harga = penjualan(:, 3)): kolom harga 12×1 memuat tiga nilai berulang — bahan mentah pencarian unik.
  2. Baris 2-3 (unique(harga)): dua belas nilai menyusut menjadi tiga harga berbeda, terurut dari 15000; C' ditampilkan baris demi baris oleh fprintf.

Opsi 'stable' (diperkenalkan MATLAB R2012a) menjaga urutan KEMUNCULAN PERTAMA alih-alih mengurutkan:

matlab
kode = [4 1 4 3 1];
fprintf('\nsorted : '); fprintf('%d ', unique(kode)); fprintf('\n');
fprintf('stable : '); fprintf('%d ', unique(kode, 'stable')); fprintf('\n');

Output yang Dihasilkan:

text

sorted : 1 3 4
stable : 4 1 3

Penjelasan singkat: 'sorted' menghasilkan 1, 3, 4; 'stable' mempertahankan urutan temuan pertama — 4 muncul lebih dulu di data, lalu 1, lalu 3. Gunakan 'stable' saat urutan kemunculan bermakna, misalnya urutan produk masuk ke rak.

Tiga Keluaran: C, ia, dan ic #

Kekuatan unique baru terbuka pada bentuk tiga keluaran [C, ia, ic] = unique(v). Mekanismenya: ketiga keluaran saling terkait — C daftar nilai unik terurut; ia mencatat posisi kemunculan PERTAMA tiap nilai unik di data asal; ic memetakan setiap elemen data asal ke nomor kelasnya di C (elemen ke-k bernilai C(ic(k))):

matlab
[C, ia, ic] = unique(harga);
fprintf('ia (kemunculan pertama): '); fprintf('%d ', ia'); fprintf('\n');
fprintf('ic (kelas tiap baris)  : '); fprintf('%d ', ic'); fprintf('\n');
fprintf('rekonstruksi harga == C(ic)? %d\n', all(harga == C(ic)));

Output yang Dihasilkan:

text
ia (kemunculan pertama): 1 3 6
ic (kelas tiap baris)  : 1 1 2 2 1 3 1 2 3 2 3 1
rekonstruksi harga == C(ic)? 1

Mari kita bedah keluaran-keluaran tersebut:

KeluaranUkuranIsi
C3×1nilai unik terurut: 15000, 16000, 17000
ia3×1baris asal tiap nilai unik: 1, 3, 6
ic12×1kelas tiap baris data: 1, 1, 2, 2, 1, 3, …
  1. ia: harga 15000 pertama kali muncul di baris 1, harga 16000 di baris 3, harga 17000 di baris 6 — pola v(ia) mengambil satu contoh observasi per kelas.
  2. ic: dua belas baris data diberi label kelas 1, 2, atau 3 — baris 3 dan 4 berlabel 2 karena sama-sama harga 16000. Verifikasi harga == C(ic) mengembalikan true penuh: memetakan ic ke C benar-benar merekonstruksi data asal.

Counting dengan accumarray #

Pertanyaan “berapa kali tiap nilai muncul?” dijawab satu baris: accumarray(ic, 1). Mekanismenya: accumarray memandang ic sebagai nomor keranjang; setiap elemen data melempar nilai 1 ke keranjang kelasnya, lalu seluruh keranjang dijumlahkan — hasilnya jumlah kemunculan tiap kelas, sejajar dengan C:

matlab
jumlah = accumarray(ic, 1);
persen = 100 * jumlah / numel(harga);
fprintf('\n    harga   jumlah   persen\n');
fprintf('%8d %8d %8.1f\n', [C jumlah persen].');

fprintf('hari dengan harga 15000: %d\n', sum(harga == 15000));

Output yang Dihasilkan:

text

    harga   jumlah   persen
   15000        5     41.7
   16000        4     33.3
   17000        3     25.0
hari dengan harga 15000: 5

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (accumarray(ic, 1)): dua belas angka 1 disebar ke tiga keranjang — lima ke kelas 1 (harga 15000), empat ke kelas 2, tiga ke kelas 3. Frekuensi lahir tanpa satu loop pun.
  2. Baris 2-4 (tabel laporan): [C jumlah persen] merangkai kolom-kolom menjadi matriks laporan; 100 * jumlah / numel(harga) mengubah hitungan menjadi persentase (41,7% hari memakai harga 15000).
  3. Baris 6 (sum(mask)): untuk SATU nilai tertentu, sum(harga == 15000) lebih ringkas daripada memanggil unique — mask dijumlahkan langsung menjadi hitungan.

unique ‘rows’ untuk Matriks #

Transaksi nyata direkam per BARIS — pasangan pelanggan dan produk boleh berulang sebagai duplikat input. Aturannya: unique(M, 'rows') memperlakukan tiap baris sebagai satu kesatuan dan membuang baris yang persis sama; opsi 'stable' tetap berlaku:

matlab
transaksi = [2 102; 1 101; 2 102; 3 103; 1 101];   % [pelanggan, produk]
fprintf('\nbaris unik (sorted):\n');
fprintf('%d %d\n', unique(transaksi, 'rows').');
fprintf('baris unik (stable):\n');
fprintf('%d %d\n', unique(transaksi, 'rows', 'stable').');

Output yang Dihasilkan:

text

baris unik (sorted):
1 101
2 102
3 103
baris unik (stable):
2 102
1 101
3 103

Mari kita bedah hasil tersebut:

  1. Blok pertama ('rows'): lima transaksi menyusut menjadi tiga pasangan unik, terurut menurut kolom pertama — pasangan [2 102] yang tercatat dua kali dihitung satu.
  2. Blok kedua ('rows', 'stable'): urutan mengikuti kemunculan pertama — [2 102] memimpin karena memang paling awal di data.

mode: Nilai Terbanyak #

Untuk pertanyaan tunggal “nilai apa yang paling sering muncul?”, fungsi mode() memotong seluruh ritual di atas menjadi satu panggilan. Mekanismenya: mode menghitung frekuensi secara internal dan mengembalikan nilainya langsung; bila beberapa nilai seri di puncak, mode melaporkan nilai TERKECIL dari yang seri:

matlab
fprintf('\nmode harga : %d\n', mode(harga));
fprintf('mode suhu  : %d\n', mode(suhu));

Output yang Dihasilkan:

text

mode harga : 15000
mode suhu  : 30

Mari kita bedah hasil tersebut:

  1. mode(harga): harga 15000 menang mutlak dengan lima kemunculan — cocok dengan tabel accumarray.
  2. mode(suhu): nilai 30, 31, dan 32 masing-masing muncul dua kali; mode memilih 30, yang terkecil di antara yang seri — perilaku yang perlu diketahui agar hasil deret seri tidak mengejutkan.

Berkas contoh.m pada bagian bawah halaman merangkai seluruh pola — dari unique tiga keluaran, tabel frekuensi accumarray, 'rows', hingga mode — dalam satu script utuh.

Ringkasan #

unique merangkum data menjadi daftar nilai berbeda — terurut secara default, 'stable' untuk urutan kemunculan — dan bentuk [C, ia, ic] membawa peta kelas yang menjadikan ic bahan bakar accumarray penghitung frekuensi. unique(M, 'rows') melakukan hal yang sama untuk baris matriks utuh, sementara mode() menyajikan jawaban instan untuk nilai terbanyak. Statistik lengkap nilai-nilai tersebut — rata-rata, sebaran, hingga korelasi — menjadi menu chapter Statistical Summary berikutnya.