End-to-End EDA Project

5 jam8 min baca
Tujuan

Lakukan **Exploratory Data Analysis** lengkap dari nol pada dataset nyata. Output: notebook publishable di GitHub yang akan jadi portfolio piece.

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:

  1. Load data, inspect struktur, dan jalankan quality check (missing/dup/outlier).
  2. Bersihkan data (drop, fillna, dedup).
  3. Eksplorasi: distribusi tiap kolom (univariate), hubungan antar dua kolom (bivariate), pola multi-kolom (multivariate).
  4. Catat insights dan rumuskan hipotesis untuk fase modeling.
  5. 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:

  1. Loading — read data
  2. Inspecting — shape, dtypes, missing
  3. Cleaning — handle missing, outlier, duplicate
  4. Describing — statistik
  5. Visualizing — plot
  6. Insighting — apa yang menarik?
  7. 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

![corr](reports/correlation.png)

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