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.