Penyiapan Proyek dan Pengambilan Data
Tentukan tujuan proyek, muat data dari CSV dan basis data SQLite, gabungkan sumber data, lalu lakukan audit menyeluruh terhadap dataset gabungan.
Penyiapan Proyek dan Pengambilan Data adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Tujuan Proyek Akhir
Dalam proyek akhir ini, Anda menggabungkan setiap keterampilan dari kursus — NumPy, Pandas, visualisasi, pengujian statistik, konektivitas basis data, dan desain pipeline — ke dalam satu alur kerja menyeluruh. Proyek ini menyimulasikan tugas analis nyata: memasukkan data mentah dari dua sumber (file CSV dan tabel basis data), menggabungkannya, mengaudit kualitas data, menghitung KPI tingkat lanjut, memvisualisasikan tren, dan mengekspor laporan yang rapi. Hal ini mencerminkan pekerjaan analis data profesional sehari-hari di industri.
Menentukan Tujuan Proyek dan KPI
Sebelum menulis satu baris kode pun, tentukan tujuan proyek dan Indikator Kinerja Utama (KPI) yang akan Anda hitung. Dokumentasikan: Pertanyaan bisnis apa yang Anda jawab? Sumber data apa yang Anda miliki? Format keluaran apa yang diperlukan? Untuk proyek akhir ini: Analisis tren pendapatan bulanan berdasarkan kategori produk, hitung retensi kohort, identifikasi wilayah teratas berdasarkan margin laba, dan ekspor laporan dengan visualisasi. Tujuan yang jelas mencegah perluasan cakupan dan menjaga pipeline tetap terfokus.
# Project configuration — define goals upfront
CONFIG = {
'csv_path': 'data/orders_2024.csv',
'db_url': 'sqlite:///customer_db.sqlite',
'db_table': 'customers',
'output_dir': 'output/',
'report_path': 'output/report.md',
'analysis_year': 2024,
'top_n_regions': 5,
'rolling_window_days': 30
}
print('Project config loaded.')
print('Target KPIs: monthly revenue, cohort retention, top regions by margin')Memuat Data dari CSV
Muat CSV dengan argumen dtype dan parse_dates yang ditentukan secara eksplisit untuk menghindari kesalahan inferensi. Dalam proyek nyata, CSV mungkin diekspor oleh sistem lain dengan konvensi berbeda — atur encoding, sep, dan thousands jika diperlukan. Segera periksa shape, dtypes, dan head() untuk memastikan pemuatan sudah benar sebelum transformasi apa pun. Pemeriksaan awal ini sering mengungkap masalah pengodean, baris header tambahan, atau nama kolom yang tidak terduga.
import pandas as pd
df_orders = pd.read_csv(
'data/orders_2024.csv',
dtype={
'order_id': 'int32',
'customer_id': 'int32',
'product_id': 'int32',
'quantity': 'int16',
'unit_price': 'float32',
'region': 'category',
'category': 'category'
},
parse_dates=['order_date'],
encoding='utf-8'
)
print(f'Orders loaded: {df_orders.shape}')
print(df_orders.dtypes)
print(df_orders.head(3))Memuat Data dari Basis Data
Sumber data kedua adalah tabel pelanggan dalam basis data SQLite. Muat hanya kolom yang diperlukan untuk analisis menggunakan SQL SELECT, bukan seluruh tabel. Gabungkan kedua sumber berdasarkan customer_id untuk melengkapi setiap pesanan dengan demografi pelanggan. Sebelum menggabungkan, pastikan kunci customer_id memiliki tipe yang sama pada kedua sumber — penyebab umum kegagalan penggabungan yang tidak terlihat adalah membandingkan kunci int32 dengan kunci string.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///customer_db.sqlite')
df_customers = pd.read_sql_query(
'''
SELECT customer_id, customer_name, country,
acquisition_channel, signup_date
FROM customers
''',
con=engine,
dtype={'customer_id': 'int32'},
parse_dates=['signup_date']
)
print(f'Customers loaded: {df_customers.shape}')
print(df_customers.dtypes)
print(df_customers.head(3))Menggabungkan Dua Sumber
Gabungkan pesanan dengan pelanggan berdasarkan customer_id menggunakan left join agar semua pesanan tetap ada meskipun catatan pelanggan tidak ditemukan. Setelah penggabungan, periksa berapa banyak pesanan yang tidak memiliki pelanggan yang cocok (customer_name.isna().sum()) — ini merupakan sinyal kualitas data yang layak diselidiki. Periksa bentuk DataFrame yang dihasilkan untuk memastikan penggabungan tidak menggandakan atau menghapus baris yang tidak diharapkan. Dokumentasikan logika penggabungan dalam komentar untuk pengelola di masa mendatang.
import pandas as pd
# Left join: keep all orders, enrich with customer data where available
df = pd.merge(
df_orders,
df_customers,
on='customer_id',
how='left'
)
print(f'Orders: {len(df_orders)}, Customers: {len(df_customers)}')
print(f'Merged: {df.shape}')
unmatched = df['customer_name'].isna().sum()
print(f'Orders with no matching customer: {unmatched} ({unmatched/len(df):.1%})')Daftar Periksa Audit Data Lengkap
Setelah memuat dan menggabungkan data, lakukan audit data sistematis sebelum analisis apa pun. Periksa: jumlah total baris dan kolom, nilai yang hilang per kolom (persentase), tipe data semua kolom, ID pesanan duplikat, cakupan rentang tanggal, nilai negatif dalam kolom numerik, serta kardinalitas kolom kategoris. Dokumentasikan temuan dalam ringkasan teks. Menemukan masalah kualitas data pada tahap ini mencegah kesalahan yang tidak terlihat dalam perhitungan KPI berikutnya.
import pandas as pd
def audit_dataframe(df, name='DataFrame'):
print(f'=== Audit: {name} ===')
print(f'Shape: {df.shape}')
print(f'Date range: {df["order_date"].min()} to {df["order_date"].max()}')
print(f'Duplicate order_ids: {df["order_id"].duplicated().sum()}')
print('Missing values:')
missing = df.isnull().sum()
print(missing[missing > 0].to_string())
print('Negative quantities:', (df['quantity'] < 0).sum())
print('Negative prices:', (df['unit_price'] < 0).sum())
print()
audit_dataframe(df, 'Merged Orders + Customers')Memperbaiki Anomali Penguraian Tanggal
Kolom tanggal dari ekspor CSV sering memiliki kasus khusus: tanggal mendatang yang seharusnya tidak ada, tanggal dari tahun yang salah (kesalahan entri data yang umum), atau tanggal yang hilang untuk pesanan yang dibatalkan. Setelah mengurai tanggal, validasikan rentang yang diharapkan dan ganti nilai di luar rentang dengan NaT. Periksa juga pesanan dengan order_date < customer signup_date — kejadian yang mustahil dan menunjukkan masalah kualitas data yang perlu ditandai dalam laporan audit.
import pandas as pd
from datetime import datetime
# Flag impossible dates
df['date_valid'] = (
(df['order_date'] >= '2024-01-01') &
(df['order_date'] <= datetime.now())
)
print('Invalid order dates:', (~df['date_valid']).sum())
# Flag orders before customer signup
df['signup_date'] = pd.to_datetime(df['signup_date'])
df['date_before_signup'] = df['order_date'] < df['signup_date']
print('Orders before customer signup:', df['date_before_signup'].sum())
# Set invalid dates to NaT
df.loc[~df['date_valid'], 'order_date'] = pd.NaTMenangani Kuantitas Negatif dan Pengembalian
Kuantitas negatif dalam tabel pesanan biasanya menunjukkan pengembalian atau pengembalian dana. Daripada langsung menghapusnya, pisahkan menjadi dua DataFrames: pesanan positif dan pengembalian. Dengan demikian, Anda dapat menghitung pendapatan kotor (hanya pesanan positif) dan pendapatan bersih (positif + negatif) secara terpisah, sehingga memperoleh gambaran bisnis yang lebih akurat. Tandai setiap baris dengan kolom boolean is_return dan simpan keduanya dalam DataFrame gabungan untuk keperluan audit.
import pandas as pd
# Tag returns
df['is_return'] = df['quantity'] < 0
returns = df[df['is_return']]
orders = df[~df['is_return']]
print(f'Normal orders: {len(orders)}')
print(f'Returns/refunds: {len(returns)} ({len(returns)/len(df):.1%})')
print(f'Return rate by category:')
print(
df.groupby('category')['is_return']
.mean()
.sort_values(ascending=False)
.round(3)
)Memeriksa Kelengkapan Join
Setelah left join, verifikasi bahwa join sudah lengkap sesuai harapan. Hitung berapa banyak nilai customer_id unik yang muncul dalam pesanan tetapi tidak ada dalam tabel pelanggan. Ini adalah catatan yatim — pelanggan yang melakukan pesanan tetapi tidak memiliki catatan pelanggan. Catatan tersebut mungkin mewakili akun yang dihapus, pembayaran sebagai tamu, atau celah pipeline data. Dokumentasikan jumlahnya dan tentukan apakah catatan tersebut perlu dikecualikan dari analisis retensi, tetapi tetap disertakan dalam total pendapatan.
import pandas as pd
order_customers = set(df_orders['customer_id'].unique())
customer_ids = set(df_customers['customer_id'].unique())
orphans = order_customers - customer_ids
print(f'Customer IDs in orders not in customer table: {len(orphans)}')
print(f'Coverage: {len(order_customers & customer_ids) / len(order_customers):.1%} of order customers have records')
# Revenue from unmatched customers
orphan_revenue = df[df['customer_id'].isin(orphans)]['unit_price'].sum()
print(f'Revenue from orphan customers: ${orphan_revenue:,.0f}')Menyimpan Dataset yang Telah Diaudit
Setelah audit, simpan dataset yang telah dibersihkan dan digabungkan ke dalam Parquet agar langkah pipeline berikutnya (rekayasa fitur, penghitungan KPI, visualisasi) dapat memuatnya kembali secara cepat tanpa mengulangi operasi penggabungan dan penguraian. Tulis file terpisah untuk pesanan bersih dan DataFrame pengembalian. Pola titik pemeriksaan ini membuat pipeline dapat dilanjutkan dan memungkinkan Anda men-debug tahap-tahap berikutnya tanpa menjalankan ulang proses pemasukan data.
import os
import pandas as pd
OS_DIR = 'output/'
os.makedirs(OS_DIR, exist_ok=True)
# Save clean orders (excluding returns and invalid dates)
clean_orders = df[
(~df['is_return']) &
df['order_date'].notna()
].copy()
clean_orders.to_parquet(OS_DIR + 'clean_orders.parquet', index=False)
df[df['is_return']].to_parquet(OS_DIR + 'returns.parquet', index=False)
print(f'Clean orders saved: {len(clean_orders):,} rows')
print(f'Returns saved: {len(df[df["is_return"]]):,} rows')
print(f'Files in {OS_DIR}: {os.listdir(OS_DIR)}')Laporan Ringkasan Audit
Langkah terakhir dalam penyerapan data adalah menulis ringkasan audit singkat yang mencatat temuan Anda. Ringkasan ini dapat berupa log yang dicetak atau file markdown. Sertakan: jumlah baris yang dimuat dari setiap sumber, tingkat kecocokan penggabungan, rentang tanggal, persentase nilai yang hilang, jumlah pengembalian yang ditemukan, dan anomali apa pun. Ringkasan audit menjadi bagian dari hasil akhir dan membantu pemangku kepentingan yakin bahwa data telah dibersihkan dengan benar sebelum dianalisis.
import pandas as pd
from datetime import datetime
def write_audit_summary(df, path):
lines = [
'# Data Ingestion Audit',
f'Generated: {datetime.now().strftime("%Y-%m-%d %H:%M")}',
'',
f'- Total records after merge: {len(df):,}',
f'- Clean orders: {(~df["is_return"]).sum():,}',
f'- Returns: {df["is_return"].sum():,}',
f'- Date range: {df["order_date"].min().date()} to {df["order_date"].max().date()}',
f'- Unique customers: {df["customer_id"].nunique():,}',
f'- Unique categories: {df["category"].nunique()}',
f'- Missing unit_price: {df["unit_price"].isna().sum()}'
]
with open(path, 'w') as f:
f.write('\n'.join(lines))
write_audit_summary(df, 'output/audit.md')
print('Audit summary written.')Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa pendefinisian tujuan dan konfigurasi sejak awal membuat alur kerja tetap terarah dan mudah dipelihara, argumen dtype dan parse_dates yang eksplisit dalam read_csv mencegah kesalahan tipe yang tidak terlihat, dan daftar periksa audit data yang sistematis (duplikat, nilai yang hilang, tanggal yang tidak mungkin, jumlah negatif) mendeteksi masalah kualitas sebelum merusak penghitungan KPI. Selanjutnya, kita akan membersihkan data dan merekayasa fitur untuk analisis.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penyiapan Proyek dan Pengambilan Data” gratis?
Ya — teks lengkap “Penyiapan Proyek dan Pengambilan Data” 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 “Penyiapan Proyek dan Pengambilan Data”?
Tentukan tujuan proyek, muat data dari CSV dan basis data SQLite, gabungkan sumber data, lalu lakukan audit menyeluruh terhadap dataset gabungan. 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 1 dari 4.
Berapa lama pelajaran “Penyiapan Proyek dan Pengambilan Data” 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