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:
| Masalah | Contoh | Obatnya |
|---|---|---|
| Spasi dan kapital acak | ' Budi ', 'SITI', 'budi' | strtrim + lower |
| Format angka campur | '12,5' (koma desimal) | strrep + str2double |
| Baris duplikat | transaksi tercatat dua kali | unique(M, 'rows') |
| Nilai mustahil | harga -5 atau 300 | mask 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:
nama = {' Budi '; 'SITI '; ' budi'};
namaBersih = lower(strtrim(nama));
fprintf('%s | %s | %s\n', namaBersih{:});Output yang Dihasilkan:
budi | siti | budiMari kita bedah baris-baris kode di atas:
- Baris 1 (
nama): tiga entri yang tampak berbeda — padahal dua di antaranya merujuk orang yang sama. - Baris 2 (
lower(strtrim(nama))):strtrimmenghapus spasi tepi (' Budi 'menjadi'Budi'), lalulowermenyeragamkan kapital; hasilnya ketiga label kini adil untuk dibandingkan, dan duabudisaling mengenali. - Baris 3 (
fprintf):namaBersih{:}menyerahkan isi cell sebagai argumen terpisah kepadafprintf.
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:
hargaS = {'12,5'; '8,75'; '12,5'};
harga = str2double(strrep(hargaS, ',', '.'));
fprintf('%.2f %.2f %.2f\n', harga);Output yang Dihasilkan:
12.50 8.75 12.50Kedua 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:
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:
valid : 8 dari 9
invalid: -5Kedua, 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:
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:
Q1=11.00 Q3=12.75, batas wajar [8.38, 15.38]
outlier : 98Mari kita bedah baris-baris kode di atas:
- Baris 2-3 (
quantiledaniqrV): Q1 = 11, Q3 = 12.75, IQR = 1.75 — lebar kotak tempat separuh data berkumpul. - Baris 4 (
batas): pagar bawah 8.38 dan atas 15.38; data normal (10-13) semuanya masuk. - 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:
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:
Baris awal: 4, baris unik: 3, duplikat: 1Selisih 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:
| Skala | Rumus | Bentuk hasil | Cocok untuk |
|---|---|---|---|
| min-max | (x - min) / (max - min) | terjepit di [0, 1] | pembandingan visual, data merata |
| z-score | (x - mean) / std | berpusat 0, sebaran satuan | data menyerupai lonceng, deteksi anomali |
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:
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:
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.065Sepuluh 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.