TL;DR
Data cleaning adalah proses ngecek dan benerin data mentah biar siap dianalisa: hapus duplikat, samain format, tangani nilai kosong, dan buang baris yang gak masuk akal. Checklist 12 langkah di artikel ini urut dari yang paling murah (cek struktur) sampai yang paling mahal (cek logika bisnis). Kalau dilewatin, angka di dashboard kamu bisa salah tanpa ada yang sadar.
Data cleaning adalah proses ngecek dan benerin data mentah biar siap dianalisa. Hapus duplikat, samain format, tangani nilai kosong, buang baris yang gak masuk akal.
Kedengerannya membosankan. Tapi ini bagian yang paling nentuin apakah angka di laporan kamu bener atau ngaco.
Aku pernah lihat laporan penjualan yang total omzetnya kelebihan Rp 47 juta gara-gara satu file di-import dua kali. Gak ada yang sadar selama tiga bulan.
Di bawah ini 12 langkah yang aku jalanin tiap kali dapat file baru. Urut dari yang paling murah sampai yang paling makan otak.
Soalnya kesalahan data cleaning itu diem-diem. Query kamu tetap jalan. Dashboard tetap muncul. Angkanya aja yang salah.
Beda sama error syntax yang langsung ngamuk di layar. Data kotor gak protes, dia cuma diam dan bikin kamu ngambil keputusan berdasarkan angka palsu.
Checklist bikin kamu gak lupa langkah yang biasanya kelewat waktu lagi buru-buru. Dan langkah yang kelewat itu biasanya yang paling penting.
Sebelum ngapa-ngapain, hitung dulu. Berapa baris? Berapa kolom?
Bandingkan sama yang kamu harapkan. File penjualan sebulan dari toko yang rata-rata 80 transaksi per hari harusnya sekitar 2.400 baris. Kalau cuma 400, ada yang kepotong waktu export.
Jangan langsung query. Buka filenya, scroll, baca.
Sepuluh menit ngeliatin data mentah sering nemuin masalah yang gak bakal ketemu lewat statistik ringkasan. Header yang kegeser, baris kosong di tengah, kolom yang isinya gabungan dua hal.
Ini penyebab bug nomor satu. Kolom total_harga kebaca sebagai teks gara-gara ada satu sel yang isinya "Rp 15.000".
Akibatnya SUM gak jalan, sorting jadi alfabetis, dan angka 9.000 kelihatan lebih besar dari 15.000.
Data Indonesia sering campur: 10/06/2026, 2026-06-10, 10 Juni 2026. Pilih satu format, ubah semuanya.
Hati-hati sama ambiguitas hari dan bulan. 03/04/2026 itu 3 April atau 4 Maret? Kalau gak yakin, balik ke sumbernya dan tanya.
Bukan berdasarkan kemiripan isi baris. Dua orang beli gula 1 kg di menit yang sama itu bukan duplikat.
SELECT id_transaksi, COUNT(*) AS jumlah
FROM transaksi
GROUP BY id_transaksi
HAVING COUNT(*) > 1;
Kalau query ini balikin baris, kamu punya duplikat beneran.
"Beras Premium", "beras premium", dan "Beras Premium " (ada spasi di belakang) dianggap tiga produk berbeda sama GROUP BY. Padahal barangnya sama.
Pakai TRIM buat buang spasi dan LOWER buat samain huruf. Detail penggunaannya ada di halaman fungsi TRIM.
Kota di data Indonesia itu neraka kecil. "Jakarta", "DKI Jakarta", "Jkt", "JAKARTA PUSAT": semua nunjuk ke tempat yang sama tapi kehitung terpisah.
Bikin tabel mapping. Satu kolom nilai mentah, satu kolom nilai standar. Join, selesai.
Hitung persentasenya dulu per kolom. Kolom yang 60 persen kosong biasanya lebih baik dibuang daripada dipaksa diisi.
Pilihan penanganannya ada beberapa dan masing-masing punya risiko. Aku bahas lengkap di artikel Missing Value: 6 Cara Menangani Data Kosong.
Umur 200 tahun. Harga negatif. Tanggal transaksi tahun 1900. Diskon 150 persen.
Cek nilai minimum dan maksimum tiap kolom angka. Yang aneh langsung kelihatan.
SELECT
MIN(total_harga) AS harga_terendah,
MAX(total_harga) AS harga_tertinggi,
MIN(qty) AS qty_terendah,
MAX(qty) AS qty_tertinggi
FROM transaksi;
Transaksi Rp 8 juta di warung yang rata-rata Rp 35 ribu itu mencurigakan. Bisa jadi salah input. Bisa juga borongan buat hajatan.
Cek dulu sebelum dihapus. Baca konsep outlier biar tau kapan boleh dibuang dan kapan justru itu datanya yang menarik.
Kolom total harusnya sama dengan qty dikali harga_satuan. Cek beneran, jangan cuma percaya.
Di satu dataset toko yang aku pegang, 3,1 persen barisnya gak nyambung. Ternyata ada diskon manual yang gak kecatat di kolom manapun.
Ini langkah terakhir dan gak bisa diotomatisasi. Duduk, lihat hasilnya, tanya: ini masuk akal gak?
Penjualan naik 400 persen di bulan puasa buat toko sembako, mungkin. Buat toko baju renang, kayaknya ada yang salah.
Dataset toko_berkah yang dipakai di NgulikSQL punya 4.812 baris transaksi selama enam bulan. Waktu pertama kali aku terima file mentahnya, hasil pengecekan checklist ini kayak gini:
| Masalah | Jumlah baris kena | Persen |
|---|---|---|
| Duplikat ID transaksi | 63 | 1,3% |
| Nama produk beda kapitalisasi | 417 | 8,7% |
Kolom total gak sama qty x harga | 149 | 3,1% |
| Tanggal kosong | 28 | 0,6% |
| Harga satuan 0 rupiah | 11 | 0,2% |
Yang paling ngeselin bukan duplikatnya. Yang 417 baris itu.
Gara-gara kapitalisasi beda, laporan produk terlaris nunjukin "Minyak Goreng" di posisi 4. Setelah dirapikan dan digabung sama "minyak goreng" dan "MINYAK GORENG", produk itu naik jadi nomor 1 dengan selisih 340 unit dari juara sebelumnya.
Satu langkah cleaning, kesimpulan bisnisnya berubah total.
Nimpa file asli. Selalu simpan data mentah apa adanya. Cleaning dikerjain di salinan. Kalau ada yang salah, kamu masih bisa balik.
Hapus duluan, tanya belakangan. Baris aneh itu kadang justru temuan paling menarik. Fraud, bug sistem, atau perilaku pelanggan yang gak terduga.
Cleaning manual di Excel tanpa jejak. Bulan depan datanya masuk lagi dan kamu lupa udah ngapain aja. Tulis langkahnya jadi query atau script.
Percaya sama data yang katanya udah bersih. Cek sendiri. Selalu. Definisi "bersih" tiap orang beda.
Isi nilai kosong pakai nol. Nol itu angka, artinya "gak ada penjualan". Kosong artinya "gak tau". Dua hal berbeda, dan nyampur keduanya bakal narik rata-rata kamu turun.
Data cleaning adalah proses ngecek dan benerin data mentah sebelum dipakai analisa. Yang dibenerin: baris duplikat, format tanggal yang beda-beda, nilai kosong, angka yang gak masuk akal, dan penulisan kategori yang gak konsisten. Tujuannya satu, biar angka yang keluar dari analisa kamu bisa dipercaya.
Dari pengalamanku, 40 sampai 60 persen waktu proyek analisa habis di cleaning. Ini normal. File export dari kasir, form Google, atau sistem lama hampir gak pernah rapi. Kalau langkah cleaning-nya kamu simpan jadi script, batch berikutnya bisa dibersihin dalam hitungan menit.
Nggak. Cek dulu apakah itu duplikat beneran atau transaksi sah yang kebetulan mirip. Yang duplikat beneran biasanya punya ID transaksi sama persis. Jadi patokan hapusnya pakai kolom ID unik, bukan pakai kemiripan isi baris.
Tergantung berapa banyak dan kenapa kosong. Kalau yang kosong cuma 1 sampai 2 persen dan acak, hapus barisnya aman. Kalau lebih dari 10 persen, hapus artinya kamu buang informasi. Isi pakai median lebih aman dari rata-rata soalnya median gak gampang ketarik outlier.
Bisa. Kalau sumber datanya sama tiap bulan, tulis query SQL atau script yang jalanin semua langkah secara urut. Sekali nulis, tiap bulan tinggal jalanin. Yang gak bisa diotomatisasi cuma langkah terakhir: cek logika bisnis. Itu tetap butuh mata orang yang paham konteksnya.
Cek jumlah baris di awal, simpan data mentah apa adanya, dan validasi kolom hitungan sebelum bikin laporan. Tiga kebiasaan itu yang paling sering nyelametin aku dari laporan yang angkanya salah.
Kalau kamu mau bersihin data teks yang berantakan (nomor HP campur aduk, email typo, alamat gak konsisten), pola teks bisa nolong banyak. Lanjut baca Regex di SQL.
Buat referensi fungsi pembersih teks yang lain, ada di halaman fungsi COALESCE. Dokumentasi resmi pandas juga punya panduan bagus soal penanganan data hilang kalau kamu kerjanya di Python.
Simpan checklist ini. Buka tiap kali dapat file baru.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Cara pakai pandas rolling buat hitung moving average dan haluskan data time series yang naik-turun. Lengkap dengan contoh penjualan harian UMKM.
Data transaksi harian sering terlalu ramai buat dilihat. Pandas resample ngeringkasnya jadi total per minggu atau per bulan cuma dengan satu baris, asal indeksnya tanggal.
Kolom tanggal yang kebaca sebagai teks bikin sortir dan hitung selisih hari jadi kacau. Ini cara pd.to_datetime ubah teks jadi tanggal asli, plus tangani format berantakan.