Membersihkan Data dengan Python dan pandas
Panduan praktis membersihkan dataset kasar menggunakan Python dan library pandas: menangani nilai hilang, duplikat, tipe data, dan format teks.
Mengapa membersihkan data memakan waktu paling banyak
Dalam proyek analisis data, menurut pengalaman saya, sekitar 60 hingga 80 persen waktu dihabiskan hanya untuk membersihkan dan menyiapkan data. Data yang diterima dari sistem bisnis jarang siap analisis: sering ada nilai kosong, duplikat, format teks yang tidak konsisten, dan tipe data yang salah.
Tulisan ini adalah catatan praktis saya menggunakan Python dengan library pandas untuk membersihkan dataset sintetis penjualan retail.
Setup dan memuat data
Pertama, instal pandas jika belum tersedia:
pip install pandas
Lalu muat dataset dari file CSV:
import pandas as pd
df = pd.read_csv('penjualan_retail.csv')
print(df.head())
print(df.info())
df.info() sangat berguna untuk melihat tipe data setiap kolom dan apakah ada nilai yang hilang.
1. Mengecek dan menangani nilai hilang
Nilai hilang (NaN) dapat mengacaukan perhitungan agregasi. Pertama, cek berapa banyak nilai hilang per kolom:
print(df.isnull().sum())
Pilihan penanganan tergantung konteks:
- Buang baris dengan nilai kritis yang hilang:
df = df.dropna(subset=['customer_id', 'order_date'])
- Isi nilai hilang dengan rata-rata (untuk kolom numerik):
df['total_amount'] = df['total_amount'].fillna(df['total_amount'].mean())
- Atau isi dengan nilai konstan:
df['region'] = df['region'].fillna('Tidak diketahui')
2. Menghapus data duplikat
Data duplikat sering muncul saat data digabung dari beberapa sumber:
print(f'Duplikat: {df.duplicated().sum()} baris')
df = df.drop_duplicates()
Jika ingin mengecek duplikat hanya pada kolom tertentu, misalnya order_id:
df = df.drop_duplicates(subset=['order_id'], keep='first')
3. Mengubah dan menormalisasi tipe data
Tanggal sering dibaca sebagai teks. Ubah ke tipe datetime:
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
Parameter errors='coerce' akan mengubah nilai yang tidak valid menjadi NaT (Not a Time) sehingga tidak menghentikan eksekusi.
Kolom numerik yang terbaca sebagai teks karena ada karakter simbol:
df['price'] = df['price'].replace('[^\d.]', '', regex=True).astype(float)
4. Membersihkan dan menstandarkan teks
Nama pelanggan atau wilayah sering memiliki kapitalisasi yang bervariasi:
df['customer_name'] = df['customer_name'].str.strip().str.title()
df['city'] = df['city'].str.strip().str.lower()
5. Contoh proses pembersihan lengkap
Berikut adalah fungsi sederhana yang menggabungkan langkah-langkah di atas:
def clean_sales_data(df: pd.DataFrame) -> pd.DataFrame:
df = df.copy()
df = df.drop_duplicates(subset=['order_id'], keep='first')
df = df.dropna(subset=['customer_id', 'order_date'])
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
df['total_amount'] = pd.to_numeric(df['total_amount'], errors='coerce')
df['total_amount'] = df['total_amount'].fillna(df['total_amount'].median())
df['customer_name'] = df['customer_name'].str.strip().str.title()
return df
df_clean = clean_sales_data(df)
print(df_clean.info())
Pelajaran
Membersihkan data tidak boleh dilakukan secara sembarangan. Setiap keputusan — buang baris, isi nilai, atau ubah tipe — harus didokumentasikan karena akan mempengaruhi hasil analisis akhir. Saya selalu menyimpan salinan data asli sebelum pemrosesan dan mencatat perubahan yang dilakukan.
Dataset yang digunakan dalam tulisan ini adalah data sintetis untuk demonstrasi pembelajaran.