06 — End-to-End EDA Project
Estimasi: 5 jam Tujuan: Lakukan Exploratory Data Analysis lengkap dari nol pada dataset nyata. Output: notebook publishable di GitHub yang akan jadi portfolio piece.
Kenapa Materi Ini Penting?
EDA adalah filter pertama sebelum modeling. Banyak project ML gagal bukan karena modelnya jelek, tapi karena dari awal data-nya tidak dipahami. Kalau kamu loncat langsung ke model.fit() tanpa EDA, kamu seperti masak tanpa cek isi kulkas — bisa-bisa garam jadi gula.
Analogi: EDA = detektif yang kenal TKP sebelum interogasi. Kamu masuk ke data baru dan tanya: "Berapa banyak missing? Distribusinya seperti apa? Ada outlier? Korelasi apa yang menarik?" Tanpa fase ini, modelmu mungkin akurat di metrik tapi gagal saat di-deploy karena ada asumsi data yang salah dari awal.
Project EDA lengkap juga jadi portfolio piece pertama yang serius. Saat interview Dicoding atau perusahaan ML, mereka akan tanya "tunjukkan project data analisis kamu". Notebook EDA yang well-articulated dengan insight tajam lebih impressive dibanding 10 implementasi tutorial yang sama.
Pipeline EDA: Visualisasi End-to-End
Cara Membaca Diagram:
- Node kiri-atas = data mentah, lalu mengalir ke load → inspect → quality check → clean.
- Baris kedua = analisis bertingkat: univariate → bivariate → multivariate → insights.
- Baris ketiga = output akhir: hypotheses untuk modeling dan save dataset bersih.
Walkthrough Step-by-Step:
- Load data, inspect struktur, dan jalankan quality check (missing/dup/outlier).
- Bersihkan data (drop, fillna, dedup).
- Eksplorasi: distribusi tiap kolom (univariate), hubungan antar dua kolom (bivariate), pola multi-kolom (multivariate).
- Catat insights dan rumuskan hipotesis untuk fase modeling.
- Simpan dataset bersih + README, lalu push ke repo.
Analogi Sehari-hari: detektif yang masuk TKP — observasi luar (load/inspect), filter petunjuk palsu (clean), wawancara satu saksi (univariate), bandingkan saksi (bivariate), rekonstruksi kasus (multivariate), tulis laporan + bukti (save).
Diagram statis Mermaid sebagai fallback:
flowchart TD
A["Raw Data<br/>CSV/Excel/JSON"] --> B["Load<br/>pd.read_csv"]
B --> C["Inspect<br/>shape, dtypes, head"]
C --> D["Quality Check<br/>missing, dup, outlier"]
D --> E["Clean<br/>drop, fillna, dedup"]
E --> F["Univariate<br/>distribusi tiap kolom"]
F --> G["Bivariate<br/>korelasi, target vs feature"]
G --> H["Multivariate<br/>pairplot, heatmap"]
H --> I["Insights<br/>5+ pattern menarik"]
I --> J["Hypotheses<br/>untuk modeling"]
J --> K["Save Cleaned<br/>+ README + push"]
Apa Itu EDA?
Exploratory Data Analysis = proses memahami data sebelum modeling.
Tahap:
- Loading — read data
- Inspecting — shape, dtypes, missing
- Cleaning — handle missing, outlier, duplicate
- Describing — statistik
- Visualizing — plot
- Insighting — apa yang menarik?
- Hypothesizing — pertanyaan untuk modeling
Pilih Dataset
Cari di Kaggle. Rekomendasi pemula:
- Titanic — klasik, supervised binary classification
- House Prices — regression
- Iris — multi-class classification (kecil)
- Wine Quality — regression / classification
- Heart Disease — kesehatan, binary
- Spotify Tracks — fun, banyak fitur
Atau dataset Indonesia:
- Kompas/Detik news scraping
- Data BPS (statistics.go.id)
- Tokopedia/Shopee dataset (kalau ada)
Pilih yang menarik buatmu. EDA pada dataset boring = hasil mediocre.
Template Notebook EDA
Berikut struktur template. Push ke GitHub notebooks/eda-[dataset].ipynb.
Cell 1: Title & Description
# EDA: [Dataset Name]
**Author:** Yazid
**Date:** 2026-XX-XX
**Source:** [Kaggle link]
**Goal:** Memahami struktur dataset dan menemukan insight untuk modeling.
Cell 2: Import
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pathlib import Path
sns.set_theme(style="whitegrid")
plt.rcParams["figure.figsize"] = (10, 6)
# Reproducibility
np.random.seed(42)
Cell 3: Load Data
df = pd.read_csv("data/dataset.csv")
print(f"Shape: {df.shape}")
df.head()
Cell 4: Basic Info
df.info()
df.describe(include="all")
Cell 5: Missing Data Analysis
missing = df.isnull().sum().sort_values(ascending=False)
missing_pct = (missing / len(df) * 100).round(2)
missing_df = pd.DataFrame({
"missing_count": missing,
"missing_pct": missing_pct
})
missing_df[missing_df["missing_count"] > 0]
# Visual
fig, ax = plt.subplots(figsize=(12, 6))
sns.barplot(x=missing_df.index, y=missing_df["missing_pct"], ax=ax)
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
ax.set_title("Missing Data per Column")
plt.tight_layout()
Cell 6: Distribusi Tiap Kolom
# Numeric columns
numeric = df.select_dtypes(include=[np.number]).columns
fig, axes = plt.subplots(nrows=(len(numeric) + 2) // 3, ncols=3, figsize=(15, 4 * (len(numeric) + 2) // 3))
axes = axes.flatten()
for i, col in enumerate(numeric):
sns.histplot(data=df, x=col, kde=True, ax=axes[i])
axes[i].set_title(col)
plt.tight_layout()
# Categorical columns
categorical = df.select_dtypes(include=["object", "category"]).columns
for col in categorical:
fig, ax = plt.subplots(figsize=(10, 4))
df[col].value_counts().head(10).plot(kind="bar", ax=ax)
ax.set_title(f"Top categories in {col}")
plt.tight_layout()
plt.show()
Cell 7: Correlation Analysis
fig, ax = plt.subplots(figsize=(12, 10))
corr = df.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="coolwarm", center=0, fmt=".2f", ax=ax)
ax.set_title("Correlation Matrix")
plt.tight_layout()
# Top correlation pairs
def top_corr_pairs(df, n=5):
corr = df.corr(numeric_only=True).abs()
upper = corr.where(np.triu(np.ones(corr.shape), k=1).astype(bool))
return upper.unstack().sort_values(ascending=False).dropna().head(n)
top_corr_pairs(df, n=10)
Cell 8: Target Analysis (kalau ada target)
target = "survived" # contoh
# Distribution
df[target].value_counts(normalize=True)
# Per fitur penting
for feature in ["pclass", "sex", "age"]:
fig, ax = plt.subplots(figsize=(8, 4))
if df[feature].dtype in ["object", "category"]:
sns.countplot(data=df, x=feature, hue=target, ax=ax)
else:
sns.boxplot(data=df, x=target, y=feature, ax=ax)
ax.set_title(f"{feature} vs {target}")
plt.tight_layout()
plt.show()
Cell 9: Outlier Detection
def find_outliers_iqr(s):
q1 = s.quantile(0.25)
q3 = s.quantile(0.75)
iqr = q3 - q1
return (s < q1 - 1.5 * iqr) | (s > q3 + 1.5 * iqr)
for col in numeric:
outliers = find_outliers_iqr(df[col].dropna())
print(f"{col}: {outliers.sum()} outliers ({outliers.mean()*100:.1f}%)")
Cell 10: Insights & Hypotheses
## Key Insights
1. **[Insight 1]** — penjelasan
2. **[Insight 2]** — penjelasan
...
## Hypotheses untuk Modeling
1. Fitur X kemungkinan strong predictor karena ...
2. Perlu feature engineering: combine X dan Y ...
3. Class imbalance — pertimbangkan SMOTE atau class weight ...
## Next Steps
- [ ] Feature engineering
- [ ] Train baseline model
- [ ] Evaluate dan iterate
Best Practices EDA
1. Catat Setiap Anomali
Outlier? Missing pattern aneh? Catat di markdown cell. Saat modeling nanti, kamu butuh konteks ini.
2. Visualisasi > Tabel
Mata manusia 10x lebih cepat tangkap pattern dari plot dibanding angka.
3. Tanya "Kenapa?" untuk Tiap Pattern
- Kenapa kolom X banyak missing?
- Kenapa distribusi Y skewed?
- Kenapa ada bimodal di Z?
Jawaban kadang non-obvious tapi insightful.
4. Domain Knowledge Penting
Kalau dataset medis, riset sedikit tentang penyakitnya. Pattern yang aneh secara statistik mungkin masuk akal secara klinis.
5. Save Cleaned Data
Setelah EDA, save cleaned version ke CSV/parquet. Modeling notebook nanti pakai ini, tidak perlu re-EDA.
Common Mistakes / FAQ
1. Loncat ke Modeling Sebelum EDA Selesai
Symptom: model jalan, tapi accuracy aneh atau hasil tidak masuk akal. Fix: mundur dulu, lakukan EDA. Cari distribusi target, class imbalance, missing pattern.
2. Drop Semua Missing Tanpa Pikir
df.dropna() # bisa-bisa kehilangan 80% data!
Cek dulu: berapa persen missing? Apakah missing secara random (MCAR) atau ada pattern? Kadang missing itu sendiri = sinyal (misal "tidak isi survey" = bias tertentu).
3. Outlier Selalu Dibuang
Outlier bisa jadi insight paling penting (transaksi fraud, sensor rusak, customer VIP). Selalu tanya: "kenapa outlier ini muncul?" sebelum buang.
4. Plot Tanpa Title / Label
Notebook tanpa title plot = pembaca bingung. Pastikan tiap plot punya:
- Judul yang descriptive
- xlabel, ylabel
- Legend kalau ada hue/multiple series
5. Insight = Kesimpulan, Bukan Observasi
JELEK: "Kolom A punya mean 50 dan std 10."
BAIK: "Kolom A right-skewed (skewness 1.5), perlu log-transform sebelum
masuk model linear."
Insight = "so what?" dari observasi.
6. Lupa Reproducibility
np.random.seed(42) # set seed di awal notebook
Tanpa seed, hasil random sampling/split berbeda tiap run.
7. Notebook Cells Berantakan
Urutan cell harus linear: setiap cell bisa di-run dari atas tanpa error. Restart kernel + Run All sebelum push, untuk verifikasi.
8. Gaya Visualisasi Tidak Konsisten
Pilih satu theme (sns.set_theme(style="whitegrid")) di awal dan pakai untuk semua plot.
Project Submission
Push ke GitHub:
projects/eda-titanic/
├── README.md ← summary 1 paragraf + key findings
├── data/
│ ├── raw/titanic.csv
│ └── processed/titanic_clean.csv
├── notebooks/
│ └── eda.ipynb
└── reports/
└── insights.md ← detailed findings
README Template
# EDA: Titanic Dataset
End-to-end exploratory data analysis pada dataset Titanic dari Kaggle.
## Key Findings
- 38% penumpang selamat
- Kelas 1 punya rate selamat 63%, kelas 3 hanya 24%
- Wanita 4x lebih mungkin selamat dari pria
- ...
## Setup
\`\`\`bash
pip install -r requirements.txt
jupyter notebook notebooks/eda.ipynb
\`\`\`
## Stack
- pandas, numpy, matplotlib, seaborn
- Python 3.11
## Visuals

Challenge 4.6
Challenge — End-to-End EDA
Pilih 1 dataset Kaggle. Lakukan EDA lengkap dengan template di atas.
Submission requirements:
- Notebook minimal 15 cells
- Minimal 8 visualizations
- Minimal 5 insights yang well-articulated
- README dengan 1 paragraf summary
- Push ke GitHub
Bonus:
- Bikin dashboard interactive dengan Streamlit
- Posting di LinkedIn dengan key insights
Tujuan: ini adalah portfolio piece pertama yang serius. Saat sesi review expert nanti, kamu bisa pamerkan ini.
Selanjutnya: challenges.md