Latar Belakang Masalah
Sebuah e-commerce ingin menganalisis data penjualan 6 bulan terakhir, tetapi datanya memiliki masalah :
- Ada missing values (produk tanpa kategori, harga kosong).
- Format tidak konsisten (tanggal campuran, nama produk duplikat).
- Outlier pada harga (kesalahan input).
Dataset Contoh (sales_raw.csv
) :
order_id,customer_name,product,price,quantity,order_date,category 1,Andi,Laptop Gaming,15000000,1,2023-01-15,Elektronik 2,Budi,,12000000,1,15-02-2023,Elektronik 3,Cici,Smartphone,5000000,2,2023/03/10, 4,Deni,Smartphone,5000000,2,2023-04-05,Gadget 5,Eva,Laptop Gaming,15000000,1,2023-05-20,Elektronik 6,Fani,Smartphone,500000000,1,2023-06-15,Gadget 7,Gina,Headphone,1500000,3,2023-06-30,Aksesoris
Langkah-Langkah Cleanup dengan Pandas
Langkah 1 : Load Data
import pandas as pd df = pd.read_csv('sales_raw.csv') print("Data Awal:") print(df)
Output :
order_id customer_name product price quantity order_date category 0 1 Andi Laptop Gaming 15000000.0 1 2023-01-15 Elektronik 1 2 Budi NaN 12000000.0 1 15-02-2023 Elektronik 2 3 Cici Smartphone 5000000.0 2 2023/03/10 NaN 3 4 Deni Smartphone 5000000.0 2 2023-04-05 Gadget 4 5 Eva Laptop Gaming 15000000.0 1 2023-05-20 Elektronik 5 6 Fani Smartphone 500000000.0 1 2023-06-15 Gadget 6 7 Gina Headphone 1500000.0 3 2023-06-30 Aksesoris
Langkah 2 : Handle Missing Values
a. Isi missing product dengan “Unknown” :
df['product'].fillna('Unknown', inplace=True)
b. Isi missing category dengan modus :
df['category'].fillna(df['category'].mode()[0], inplace=True)
Hasil :
2 Cici Smartphone 5000000.0 2 2023/03/10 Elektronik # Kategori terisi 1 Budi Unknown 12000000.0 1 15-02-2023 Elektronik
Langkah 3 : Standarisasi Format Tanggal
df['order_date'] = pd.to_datetime( df['order_date'], errors='coerce', # Ubah format tidak valid jadi NaT dayfirst=True # Handle format DD-MM-YYYY ) print("Tanggal setelah standarisasi:") print(df[['order_date']])
Output :
order_date 0 2023-01-15 1 2023-02-15 # Format awal 15-02-2023 diperbaiki 2 2023-03-10 # Format awal 2023/03/10 diperbaiki 3 2023-04-05 4 2023-05-20 5 2023-06-15 6 2023-06-30
Langkah 4 : Temukan dan Perbaiki Outlier
a. Deteksi outlier harga dengan IQR:
Q1 = df['price'].quantile(0.25) Q3 = df['price'].quantile(0.75) IQR = Q3 - Q1 batas_atas = Q3 + 1.5 * IQR outlier = df[df['price'] > batas_atas] print("Outlier Harga:") print(outlier)
Output :
order_id customer_name product price quantity order_date category 5 6 Fani Smartphone 500000000.0 1 2023-06-15 Gadget
b. Perbaiki outlier (misal: harga seharusnya 5.000.000) :
df.loc[df['price'] > batas_atas, 'price'] = 5000000
Langkah 5 : Hapus Duplikat
# Cek duplikat berdasarkan kolom tertentu duplikat = df.duplicated(subset=['customer_name', 'product', 'order_date']) print("Jumlah Duplikat:", duplikat.sum()) # Hapus duplikat df = df.drop_duplicates()
Langkah 6 : Standarisasi Teks
# Ubah nama produk ke lowercase df['product'] = df['product'].str.lower() # Standarisasi kategori df['category'] = df['category'].str.replace('Gadget', 'Elektronik')
Hasil :
product category 0 laptop gaming Elektronik 3 smartphone Elektronik # Awalnya "Gadget"
Langkah 7 : Hitung Total Sales
df['total_sales'] = df['price'] * df['quantity'] print("Data Final:") print(df[['product', 'price', 'quantity', 'total_sales']])
Output :
product price quantity total_sales 0 laptop gaming 15000000 1 15000000 1 unknown 12000000 1 12000000 2 smartphone 5000000 2 10000000 3 smartphone 5000000 2 10000000 4 laptop gaming 15000000 1 15000000 5 smartphone 5000000 1 5000000 6 headphone 1500000 3 4500000
Hasil Akhir Cleanup
Data yang Sudah Dibersihkan:
order_id | customer_name | product | price | quantity | order_date | category | total_sales |
---|---|---|---|---|---|---|---|
1 | Andi | laptop gaming | 15000000 | 1 | 2023-01-15 | Elektronik | 15000000 |
2 | Budi | unknown | 12000000 | 1 | 2023-02-15 | Elektronik | 12000000 |
3 | Cici | smartphone | 5000000 | 2 | 2023-03-10 | Elektronik | 10000000 |
Visualisasi :
import matplotlib.pyplot as plt # Plot total sales per kategori df.groupby('category')['total_sales'].sum().plot( kind='bar', title='Total Sales per Kategori' ) plt.show()
Kesimpulan
- Pandas menyederhanakan proses cleanup dengan fungsi siap pakai seperti :
fillna()
untuk missing values.to_datetime()
untuk standarisasi tanggal.str.lower()
untuk konsistensi teks.
- Langkah kritis dalam cleanup :
- Validasi outlier (jangan asal hapus!).
- Backup data sebelum modifikasi.