Pembersihan Data dan Rekayasa Fitur
Terapkan daftar periksa pembersihan tingkat lanjut, buat fitur tanggal dan kolom rasio, lalu validasi dataset yang bersih dengan pernyataan penegasan.
Pembersihan Data dan Rekayasa Fitur adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Memuat Dataset yang Diaudit
Melanjutkan proyek akhir, muat titik pemeriksaan Parquet bersih yang disimpan pada langkah sebelumnya. Dengan demikian, tahap pembersihan terpisah dari penyerapan—Anda dapat mengulangi logika pembersihan tanpa menjalankan ulang operasi penggabungan dan penguraian yang lambat. Baca Parquet clean_orders dan verifikasi bahwa jumlah baris serta dtype sesuai dengan yang diharapkan dari ringkasan audit. File Parquet mempertahankan semua dtype, termasuk kolom kategoris, sehingga tidak diperlukan pengubahan tipe ulang.
import pandas as pd
# Load from checkpoint
df = pd.read_parquet('output/clean_orders.parquet')
print(f'Loaded: {df.shape}')
print(df.dtypes)
print(f'Date range: {df["order_date"].min().date()} to {df["order_date"].max().date()}')Menerapkan Daftar Periksa Pembersihan Lanjutan
Setelah dataset gabungan dimuat, terapkan daftar periksa pembersihan lanjutan: hapus duplikat persis dan sebagian pada order_id, batasi pencilan dalam unit_price menggunakan pagar IQR, standarkan nilai category yang tidak konsisten (misalnya, 'Electronics' vs 'electronics' vs 'ELECTRONIC'), dan validasikan bahwa quantity × unit_price selalu positif untuk pesanan normal. Setiap langkah berupa fungsi yang menerima dan mengembalikan DataFrame, sehingga alur kerja dapat diuji dan dibalik.
import pandas as pd
import numpy as np
def remove_duplicates(df):
n_before = len(df)
df = df.drop_duplicates(subset=['order_id'], keep='first')
print(f'Duplicates removed: {n_before - len(df)}')
return df
def standardise_categories(df):
df['category'] = (df['category']
.astype(str)
.str.strip()
.str.title())
return df
def cap_price_outliers(df):
q1, q3 = df['unit_price'].quantile([0.25, 0.75])
iqr = q3 - q1
upper = q3 + 3 * iqr
df['unit_price'] = df['unit_price'].clip(upper=upper)
return df
df = remove_duplicates(df)
df = standardise_categories(df)
df = cap_price_outliers(df)
print('Cleaning complete.')Merekayasa Fitur Tanggal
Ekstrak fitur temporal dari tanggal pesanan menggunakan pengakses .dt. Buat kolom year, month, quarter, day_of_week, dan week_of_year. Fitur-fitur ini mendukung analisis groupby (pendapatan bulanan), filter berbasis waktu (hanya Q3), dan visualisasi. Buat juga kolom string year_month (misalnya, '2024-06') sebagai label periode yang mudah dibaca untuk sumbu grafik.
import pandas as pd
df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['quarter'] = df['order_date'].dt.quarter
df['day_of_week'] = df['order_date'].dt.dayofweek # 0=Monday
df['week'] = df['order_date'].dt.isocalendar().week.astype('int32')
df['year_month'] = df['order_date'].dt.to_period('M').astype(str)
print('Date features created:')
print(df[['order_date', 'year', 'month', 'quarter', 'year_month']].head())Menghitung Pendapatan per Item Baris
Fitur paling mendasar dalam dataset penjualan adalah pendapatan per item baris: revenue = quantity × unit_price. Buat fitur ini sebagai kolom baru. Buat juga kolom gross_margin jika data biaya tersedia: margin = (price - cost) / price. Kolom turunan ini menjadi dasar semua KPI pendapatan. Selalu gunakan operasi kolom tervectorisasi, bukan perulangan—satu penetapan pada seluruh kolom jauh lebih cepat daripada iterasi baris demi baris.
import pandas as pd
# Line-item revenue
df['revenue'] = (df['quantity'] * df['unit_price']).astype('float32')
# Gross margin (if unit_cost column exists)
if 'unit_cost' in df.columns:
df['gross_margin'] = (df['unit_price'] - df['unit_cost']) / df['unit_price']
# Discount flag: orders with more than 20% off list price
if 'list_price' in df.columns:
df['is_discounted'] = df['unit_price'] < df['list_price'] * 0.8
print('Revenue stats:')
print(df['revenue'].describe().round(2))Menetapkan Kelompok Pelanggan
Kelompok adalah sekumpulan pelanggan yang memiliki karakteristik yang sama—biasanya periode saat mereka pertama kali melakukan pembelian. Tetapkan setiap pelanggan ke kelompok akuisisinya dengan mencari tanggal pesanan pertama mereka. Gunakan groupby('customer_id')['order_date'].min() untuk menghitung tanggal pesanan pertama per pelanggan, lalu buat kolom cohort_month dengan mengubahnya menjadi periode tahun-bulan. Label kelompok ini menjadi dasar matriks retensi pada pelajaran berikutnya.
import pandas as pd
# First purchase date per customer
first_purchase = (
df.groupby('customer_id')['order_date']
.min()
.dt.to_period('M')
.astype(str)
.rename('cohort_month')
)
# Merge back onto orders
df = df.merge(first_purchase, on='customer_id', how='left')
print('Cohort distribution (top 5):')
print(df['cohort_month'].value_counts().head())
print(f'Distinct cohorts: {df["cohort_month"].nunique()}')Fitur Nilai Seumur Hidup Pelanggan
Hitung fitur ringkasan tingkat pelanggan: total pesanan, total pendapatan, nilai pesanan rata-rata, jumlah hari sejak pembelian pertama/terakhir, dan jumlah kategori berbeda yang dibeli. Gabungkan kembali fitur-fitur ini ke DataFrame utama sebagai kolom pengayaan tingkat pelanggan. Fitur-fitur ini digunakan untuk segmentasi (misalnya, pelanggan bernilai tinggi vs. rendah) dan sebagai input bagi model pembelajaran mesin yang memprediksi kemungkinan pelanggan berhenti atau melakukan pembelian tambahan.
import pandas as pd
customer_stats = df.groupby('customer_id').agg(
total_orders=('order_id', 'nunique'),
total_revenue=('revenue', 'sum'),
avg_order_value=('revenue', 'mean'),
categories_purchased=('category', 'nunique'),
first_order=('order_date', 'min'),
last_order=('order_date', 'max')
).reset_index()
customer_stats['days_as_customer'] = (
(customer_stats['last_order'] - customer_stats['first_order'])
.dt.days
)
print(customer_stats.describe().round(2))Validasi Skema dengan Pernyataan Penegasan
Setelah merekayasa fitur, jalankan pernyataan penegasan validasi skema untuk memastikan data memenuhi harapan sebelum meneruskannya ke tahap analisis. Periksa bahwa semua kolom yang diharapkan tersedia, pendapatan tidak negatif untuk pesanan normal, cohort_month tidak bernilai null, dan year_month sesuai dengan tahun analisis. Pernyataan ini bertindak sebagai kontrak: jika salah satunya gagal, alur kerja segera berhenti dengan pesan kesalahan yang jelas, alih-alih diam-diam menghasilkan hasil yang salah.
import pandas as pd
def validate_clean_df(df):
required_cols = ['order_id', 'customer_id', 'revenue', 'year_month',
'cohort_month', 'category', 'region', 'order_date']
missing = [c for c in required_cols if c not in df.columns]
assert not missing, f'Missing columns: {missing}'
assert (df['revenue'] >= 0).all(), 'Negative revenue found'
assert df['cohort_month'].notna().all(), 'Null cohort_month values'
assert df['order_date'].notna().all(), 'Null order dates'
print(f'Validation passed: {len(df):,} rows, {len(df.columns)} columns')
validate_clean_df(df)Menangani Kategori dengan Frekuensi Rendah
Dalam dataset nyata, beberapa kategori atau wilayah hanya muncul beberapa kali—terlalu sedikit untuk analisis yang bermakna. Ganti nilai dengan frekuensi rendah menjadi 'Other' agar grafik tidak dipenuhi puluhan kategori dengan satu pesanan. Ambang praktisnya: nilai yang muncul dalam kurang dari 0,5% baris digabungkan. Hal ini juga penting untuk pembelajaran mesin: pengodean one-hot terhadap 200 kategori langka memboroskan memori dan menambah derau.
import pandas as pd
def collapse_rare_values(df, col, min_pct=0.005):
threshold = len(df) * min_pct
counts = df[col].value_counts()
rare = counts[counts < threshold].index
n_rare = len(rare)
df[col] = df[col].apply(lambda x: 'Other' if x in rare else x)
print(f'{col}: collapsed {n_rare} rare values into "Other"')
return df
df = collapse_rare_values(df, 'category', min_pct=0.005)
df = collapse_rare_values(df, 'region', min_pct=0.005)
print('Category distribution after collapsing:')
print(df['category'].value_counts())Menyimpan Dataset yang Telah Direkayasa Fiturnya
Simpan DataFrame yang telah sepenuhnya dibersihkan dan direkayasa fiturnya sebagai titik pemeriksaan Parquet. Inilah dataset siap analisis—hasil dari semua langkah penyerapan, pembersihan, dan rekayasa fitur. Tahap alur kerja berikutnya (penghitungan KPI, visualisasi, pelaporan) membaca dari titik pemeriksaan ini. Titik pemeriksaan ini juga berfungsi sebagai hasil yang dapat diserahkan: titik ini dapat dibagikan kepada anggota tim atau diunggah ke danau data agar dapat dikueri oleh orang lain menggunakan SQL atau Pandas.
import pandas as pd
# Convert category columns back to Categorical for memory efficiency
for col in ['category', 'region', 'acquisition_channel']:
if col in df.columns:
df[col] = df[col].astype('category')
# Save analysis-ready dataset
df.to_parquet('output/analysis_ready.parquet', index=False)
# Also save customer stats for segmentation
customer_stats.to_parquet('output/customer_stats.parquet', index=False)
print(f'Analysis-ready dataset: {df.shape}')
print(f'Memory usage: {df.memory_usage(deep=True).sum()/1e6:.1f} MB')Ringkasan Rekayasa Fitur
Rekayasa fitur yang baik menyeimbangkan penambahan sinyal prediktif dengan menjaga alur kerja tetap mudah dipahami dan diuji. Fitur yang dibuat pada tahap ini—pendapatan, bagian-bagian tanggal, cohort_month, statistik pelanggan, dan kategori yang digabungkan—semuanya didorong oleh tujuan analisis yang ditetapkan dalam penyiapan proyek. Jangan tergoda membuat puluhan fitur secara spekulatif. Untuk setiap fitur, tanyakan: apakah fitur ini akan digunakan dalam setidaknya satu KPI atau visualisasi? Jika tidak, tunda pembuatannya. Jaga agar dataset siap analisis tetap ringkas dan memiliki tujuan yang jelas.
import pandas as pd
# Summary of engineered features
df = pd.read_parquet('output/analysis_ready.parquet')
original_cols = ['order_id', 'customer_id', 'order_date', 'quantity', 'unit_price']
engineered_cols = [c for c in df.columns if c not in original_cols]
print('Original columns:', original_cols)
print('Engineered features:', engineered_cols)
print(f'Total columns: {len(df.columns)}')
print(f'Total rows: {len(df):,}')Mendokumentasikan Keputusan dalam Kode
Untuk setiap keputusan pembersihan atau rekayasa yang tidak jelas, tambahkan komentar yang menjelaskan alasannya. Anda di masa mendatang (atau anggota tim) mungkin tidak mengingat mengapa Anda menetapkan pengali IQR menjadi 3, bukan 1,5, atau mengapa menggunakan 0,5% sebagai ambang kategori langka. Komentar sebaris dan log keputusan (daftar sederhana dalam README proyek atau file markdown) membuat alur kerja mudah dipelihara dan diaudit. Kode yang bersih dan terdokumentasi adalah hasil yang sesungguhnya—file keluaran hanyalah konsekuensinya.
# Engineering decisions log
DECISIONS = '''
# Data Cleaning & Feature Engineering Decisions
## Duplicate handling
Kept first occurrence of duplicate order_id (most likely the original order).
## Outlier capping
Unit price capped at Q3 + 3*IQR (not 1.5*IQR) because price distribution
has legitimate high-value enterprise orders that should not be removed.
## Rare category threshold: 0.5%
Values below 0.5% of total orders collapsed to "Other" to keep charts readable
and avoid spurious significance in category-level tests.
## Cohort assignment
Cohort = first purchase calendar month (not signup month), because many users
sign up but do not purchase until months later.
'''
print(DECISIONS)Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa fungsi pembersihan modular (menghapus duplikat, membatasi pencilan, menstandarkan kategori) masing-masing menerima dan mengembalikan DataFrame agar mudah diuji, rekayasa fitur menghasilkan bagian-bagian tanggal, pendapatan per item baris, kelompok pelanggan, dan statistik ringkasan, serta pernyataan penegasan validasi skema mengamankan perpindahan dari pembersihan ke analisis. Selanjutnya, kita akan menghitung KPI inti proyek: retensi kelompok bulanan, pendapatan produk, dan pengguna aktif bergulir.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pembersihan Data dan Rekayasa Fitur” gratis?
Ya — teks lengkap “Pembersihan Data dan Rekayasa Fitur” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pembersihan Data dan Rekayasa Fitur”?
Terapkan daftar periksa pembersihan tingkat lanjut, buat fitur tanggal dan kolom rasio, lalu validasi dataset yang bersih dengan pernyataan penegasan. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Pembersihan Data dan Rekayasa Fitur” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Penyiapan Proyek dan Pengambilan Data
- Pembersihan Data dan Rekayasa Fitur
- Analisis dan Penghitungan KPI
- Visualisasi Akhir dan Ekspor Laporan