Data hasil entri manusia hampir tidak pernah datang rapi: ' Budi ' dan 'SITI' merujuk orang yang sama dalam tiga kapitalisasi berbeda, harga tercatat sebagai teks '12,5' dengan koma desimal, baris tercatat dua kali, dan sesekali muncul angka mustahil — harga negatif atau 300 untuk barang senilai 10. Analisis di atas data seperti itu menghasilkan kesimpulan yang salah, sebagus apa pun kodenya. Chapter penutup ini merangkai keahlian kita — mask, unique, quantile, normalisasi — menjadi satu pipeline dari data mentah sampai data siap analisis: normalisasi teks (strtrim, lower), standarisasi angka (strrep, str2double), validasi rentang fisik, deteksi outlier IQR dan duplikat, lalu normalisasi skala.

Peta Masalah Data Mentah #

Empat masalah klasik memenuhi sebagian besar pekerjaan pembersihan, dan masing-masing punya obatnya:

MasalahContohObatnya
Spasi dan kapital acak' Budi ', 'SITI', 'budi'strtrim + lower
Format angka campur'12,5' (koma desimal)strrep + str2double
Baris duplikattransaksi tercatat dua kaliunique(M, 'rows')
Nilai mustahilharga -5 atau 300mask rentang + outlier IQR

Normalisasi Teks: strtrim dan lower #

Aturannya: dua teks hanya bisa dibandingkan bila spasi dan kapitalnya seragam. Mekanismenya: strtrim memotong spasi di kedua ujung tiap elemen cell array, lalu lower menyeragamkan kapital — keduanya bekerja elemen-per-elemen tanpa loop:

matlab
nama = {'  Budi  '; 'SITI  '; '  budi'};
namaBersih = lower(strtrim(nama));
fprintf('%s | %s | %s\n', namaBersih{:});

Output yang Dihasilkan:

text
budi | siti | budi

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (nama): tiga entri yang tampak berbeda — padahal dua di antaranya merujuk orang yang sama.
  2. Baris 2 (lower(strtrim(nama))): strtrim menghapus spasi tepi (' Budi ' menjadi 'Budi'), lalu lower menyeragamkan kapital; hasilnya ketiga label kini adil untuk dibandingkan, dan dua budi saling mengenali.
  3. Baris 3 (fprintf): namaBersih{:} menyerahkan isi cell sebagai argumen terpisah kepada fprintf.

Gunakan upper bila konvensi data menyimpan label kapital; spasi di TENGAH kata tidak tersentuh — 'Bu di' tetap berbeda dari 'Budi'.

Standarkan Angka: strrep dan str2double #

Angka yang tersimpan sebagai teks tidak bisa dihitung, dan lokal Indonesia lazim memakai koma sebagai penanda desimal. Mekanismenya: strrep(hargaS, ',', '.') mengganti koma menjadi titik pada tiap elemen cell, lalu str2double mengonversi hasilnya menjadi array numerik:

matlab
hargaS = {'12,5'; '8,75'; '12,5'};
harga = str2double(strrep(hargaS, ',', '.'));
fprintf('%.2f %.2f %.2f\n', harga);

Output yang Dihasilkan:

text
12.50 8.75 12.50

Kedua fungsi bekerja berpasangan pada seluruh cell array sekaligus; hasilnya vektor double biasa — siap untuk mask, quantile, dan seluruh statistik chapter sebelumnya.

Validasi Rentang dan Outlier IQR #

Anomali angka datang dalam dua rupa. Pertama, pelanggaran rentang fisik — harga tidak mungkin negatif — dijawab mask sederhana dari Chapter Filtering Data:

matlab
harga = [12.5 8.75 9.25 300 7.5 10 11.25 9.75 -5];
maskHarga = harga >= 0 & harga <= 1000;   % rentang wajar fisik
fprintf('valid  : %d dari %d\n', sum(maskHarga), numel(harga));
fprintf('invalid: %.0f\n', harga(~maskHarga));

Output yang Dihasilkan:

text
valid  : 8 dari 9
invalid: -5

Kedua, outlier — nilai yang sah secara matematis tetapi jauh dari kerumunan datanya (harga 300 di antara barang belasan). Aturan praktisnya: nilai di luar Q1 - 1.5×IQR atau Q3 + 1.5×IQR dicurigai outlier. Mekanismenya: quantile memotret kuartil, IQR mengukur lebar kotak tengah data, dan 1.5×IQR menandai pagar luarnya:

matlab
d = [10; 12; 11; 13; 12; 11; 98];
q = quantile(d, [0.25 0.75]);
iqrV = q(2) - q(1);
batas = [q(1) - 1.5*iqrV, q(2) + 1.5*iqrV];
fprintf('Q1=%.2f Q3=%.2f, batas wajar [%.2f, %.2f]\n', q(1), q(2), batas(1), batas(2));
fprintf('outlier : %.0f\n', d(d < batas(1) | d > batas(2)));

Output yang Dihasilkan:

text
Q1=11.00 Q3=12.75, batas wajar [8.38, 15.38]
outlier : 98

Mari kita bedah baris-baris kode di atas:

  1. Baris 2-3 (quantile dan iqrV): Q1 = 11, Q3 = 12.75, IQR = 1.75 — lebar kotak tempat separuh data berkumpul.
  2. Baris 4 (batas): pagar bawah 8.38 dan atas 15.38; data normal (10-13) semuanya masuk.
  3. Baris 6 (d(mask)): nilai 98 duduk jauh di luar pagar atas — satu-satunya elemen yang terpental.

Outlier bukan otomatis dibuang: 98 bisa jadi transaksi resmi yang luar biasa. Perlakukan deteksi ini sebagai daftar baris untuk DIPERIKSA — buang bila terbukti salah ketik.

Deteksi Duplikat dengan unique ‘rows’ #

Baris duplikat lahir dari entri ganda: operator menekan simpan dua kali. Aturannya: unique(M, 'rows') memperlakukan tiap baris matriks sebagai satu kesatuan dan membuang yang persis sama — pola yang dikenalkan Chapter Unique Values dan Counting, kini dipakai untuk menghitung berapa banyak duplikat:

matlab
M = [12.5 2; 8.75 1; 12.5 2; 9.25 3];
[Munik, ~, ic] = unique(M, 'rows');
fprintf('Baris awal: %d, baris unik: %d, duplikat: %d\n', ...
        size(M,1), size(Munik,1), size(M,1) - size(Munik,1));

Output yang Dihasilkan:

text
Baris awal: 4, baris unik: 3, duplikat: 1

Selisih jumlah baris sebelum-sesudah adalah jumlah baris buangan, dan indeks keluaran kedua memungut satu wakil per kelompok duplikat. Pastikan duplikat dideteksi SETELAH normalisasi teks dan konversi angka; sebaliknya, ' Budi ' dan 'budi' lolos sebagai dua orang berbeda.

Normalisasi Skala: min-max dan z-score #

Data bersih belum tentu data yang nyaman dianalisis — kolom harga (7.5-12.5) dan kolom omzet (jutaan) punya skala yang jauh berbeda. Dua normalisasi menyetarakan mereka:

SkalaRumusBentuk hasilCocok untuk
min-max(x - min) / (max - min)terjepit di [0, 1]pembandingan visual, data merata
z-score(x - mean) / stdberpusat 0, sebaran satuandata menyerupai lonceng, deteksi anomali
matlab
x = [12.5 8.75 9.25 7.5 10 11.25 9.75];   % data bersih dari pipeline
xMinMax = (x - min(x)) / (max(x) - min(x));
xZ      = (x - mean(x)) / std(x);
fprintf('x min-max: ');
fprintf('%.3f ', xMinMax);
fprintf('\nx z-score: ');
fprintf('%.3f ', xZ);
fprintf('\n');

Output yang Dihasilkan:

text
x min-max: 1.000 0.250 0.350 0.000 0.500 0.750 0.450 
x z-score: 1.613 -0.676 -1.439 0.087 0.850 -0.065 

Mekanismenya: min-max menarik nilai terkecil ke 0 dan terbesar ke 1 (7.5 → 0.000, 12.5 → 1.000), sedangkan z-score menyatakan setiap nilai sebagai simpangan baku dari rata-rata. Normalisasi diterapkan PALING AKHIR, setelah outlier dibuang — satu nilai 300 akan merusak kedua rumus karena menarik max dan std.

Pipeline Utuh #

Berkas contoh.m merangkai seluruh tahap pada 10 baris data pelanggan (nama, harga teks berkoma, jumlah) dengan lima masalah yang ditanam sengaja:

Diagram tersebut membaca urutan tahap dari atas ke bawah, dan urutan itu penting: teks dinormalisasi dulu agar duplikat saling mengenali, rentang fisik diperiksa sebelum IQR agar sentinel seperti -5 tidak menggelembungkan kuartil, dan skala dinormalisasi terakhir setelah anomali hilang. Output lengkap contoh.m:

text
Baris mentah     : 10
Contoh hasil     : budi, siti, gita
Harga terkonversi: 12.50 8.75 12.50 9.25 300.00 7.50 10.00 11.25 9.75 -5.00 
Di luar rentang  : gita (harga -5)
Duplikat         : 1 baris dibuang
IQR              : Q1=9.00 Q3=11.88, batas [4.69, 16.19]
Outlier          : ani (harga 300.00)
Baris bersih     : 7

Nama      Harga   MinMax        Z
budi      12.50    1.000    1.613
siti       8.75    0.250   -0.676
ani        9.25    0.350   -0.371
citra      7.50    0.000   -1.439
dewi      10.00    0.500    0.087
eka       11.25    0.750    0.850
fajar      9.75    0.450   -0.065

Sepuluh baris mentah menyusut menjadi tujuh baris bersih: satu harga negatif tertangkap rentang fisik, satu duplikat dibuang, satu salah ketik terdeteksi IQR — masing-masing oleh tahap yang dirancang untuknya.

Ringkasan #

Pembersihan data adalah pipeline, bukan satu trik: strtrim + lower menyeragamkan teks, strrep + str2double menstandardkan angka, mask rentang dan pagar IQR menangkap nilai mustahil dan outlier, unique(..., 'rows') membuang duplikat, serta min-max dan z-score menyetarakan skala — semuanya ke variabel baru agar data mentah tetap utuh. Urutan tahap menentukan hasil, dan di MATLAB seluruh rangkaian naik kelas ke table yang jauh lebih ringkas. Section Pengolahan Data tuntas — perjalanan berlanjut ke visualisasi data.