Data Tabel · Pelajaran 3 dari 9
Membersihkan data
9 menit baca · BelajarCode
Data dari dunia nyata hampir selalu kotor. Membersihkan data sering memakan waktu lebih banyak daripada menganalisisnya, dan hasil analisis hanya sebaik data yang dipakai.
Masalah yang sering ditemui
| Masalah | Contoh | Penanganan |
|---|---|---|
| Data kosong | Umur tidak diisi | Lewati, atau isi dengan nilai yang masuk akal dan catat |
| Penulisan tidak seragam | "laki-laki", "L", "Laki" | Petakan ke satu bentuk baku |
| Angka berformat | "Rp15.000", "15,5" | Buang simbol, sesuaikan tanda desimal |
| Spasi berlebih | " Bandung " | strip() |
| Data ganda | Satu orang mengisi survei dua kali | Buang salah satu berdasarkan kunci unik |
| Nilai mustahil | Umur 250 tahun, nilai 120 | Tandai sebagai tidak valid |
Contoh: data survei uang saku
1import csv2import io34teks = """id,nama,jenis_kelamin,uang_saku51,Andi,L,Rp15.00062,bela ,perempuan,2000073,Citra,P,84,Dimas,laki-laki,Rp12.50092,bela ,perempuan,20000105,Eka,P,250000000"""1112def jenis_baku(teks):13 teks = teks.strip().lower()14 if teks in ("l", "laki", "laki-laki"):15 return "L"16 if teks in ("p", "perempuan"):17 return "P"18 return None1920def uang(teks):21 teks = teks.strip().replace("Rp", "").replace(".", "")22 return int(teks) if teks else None2324bersih = []25sudah = set()26catatan = []27for baris in csv.DictReader(io.StringIO(teks)):28 if baris["id"] in sudah:29 catatan.append(f"id {baris['id']} ganda, dilewati")30 continue31 sudah.add(baris["id"])32 nilai = uang(baris["uang_saku"])33 if nilai is None:34 catatan.append(f"id {baris['id']} uang saku kosong")35 elif nilai > 1_000_000:36 catatan.append(f"id {baris['id']} uang saku {nilai} tidak masuk akal")37 nilai = None38 bersih.append({39 "nama": baris["nama"].strip().title(),40 "jk": jenis_baku(baris["jenis_kelamin"]),41 "uang_saku": nilai,42 })4344for b in bersih:45 print(b)46print("Catatan:")47for c in catatan:48 print("-", c){'nama': 'Andi', 'jk': 'L', 'uang_saku': 15000}
{'nama': 'Bela', 'jk': 'P', 'uang_saku': 20000}
{'nama': 'Citra', 'jk': 'P', 'uang_saku': None}
{'nama': 'Dimas', 'jk': 'L', 'uang_saku': 12500}
{'nama': 'Eka', 'jk': 'P', 'uang_saku': None}
Catatan:
- id 3 uang saku kosong
- id 2 ganda, dilewati
- id 5 uang saku 250000000 tidak masuk akalPerhatikan bahwa data yang tidak valid ditandai dengan None dan dicatat, bukan dihapus diam-diam atau ditebak nilainya.
Simpan data mentah
Jangan pernah menimpa file data asli. Simpan data mentah apa adanya, lalu tulis hasil pembersihan ke file baru. Dengan begitu, jika ada kesalahan dalam proses pembersihan, kamu bisa mengulanginya dari awal.
Cek pemahaman
Dalam sebuah survei, ada responden yang menulis umur 7 tahun untuk survei khusus siswa SMA. Apa penanganan terbaik?
Latihan
Bersihkan data nilai
Bersihkan daftar nilai berikut: buang spasi, ubah koma desimal menjadi titik, abaikan yang kosong, dan tandai nilai di luar 0 sampai 100. Tampilkan rata-rata dari nilai yang valid saja.
["85", " 90,5", "", "77", "105", "abc", "68,5"]
Pembahasan
1mentah = ["85", " 90,5", "", "77", "105", "abc", "68,5"]2valid = []3for teks in mentah:4 teks = teks.strip().replace(",", ".")5 if not teks:6 print("Kosong, dilewati")7 continue8 try:9 nilai = float(teks)10 except ValueError:11 print(f"'{teks}' bukan angka")12 continue13 if not 0 <= nilai <= 100:14 print(f"{nilai} di luar rentang")15 continue16 valid.append(nilai)1718print("Nilai valid:", valid)19print("Rata-rata:", round(sum(valid) / len(valid), 2))Kosong, dilewati 105.0 di luar rentang 'abc' bukan angka Nilai valid: [85.0, 90.5, 77.0, 68.5] Rata-rata: 80.25
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.