05 — Seaborn
Estimasi: 3 jam Tujuan: Statistical visualization yang lebih cantik dan high-level dari matplotlib.
Kenapa Materi Ini Penting?
Saat EDA, kamu butuh visualisasi cepat tapi tetap cantik — di sinilah Seaborn jadi sahabat. Dengan satu baris, kamu bisa bikin scatter plot dengan regression line, atau pairplot 5 fitur sekaligus dengan hue per kategori. Matplotlib akan butuh 30 baris untuk hasil yang sama.
Analogi: seaborn = matplotlib yang sudah di-styling + paham statistik. Bayangkan matplotlib itu kayu mentah dan cat, sementara seaborn itu IKEA — sudah pre-cut, instruksi jelas, hasil rapi. Tapi kalau kamu butuh custom desain unik, kamu tetap perlu turun ke matplotlib di bawahnya.
Untuk EDA project dan paper Dicoding nanti, 80% plot kamu akan pakai seaborn: distribusi (histplot, kdeplot, boxplot), hubungan (scatterplot, regplot, pairplot), dan kategori (countplot, barplot). Kuasai ini dan portofolio EDA kamu langsung naik level.
Matplotlib vs Seaborn: Kapan Pakai Apa?
flowchart TD
A["Mau bikin plot"] --> B{"Tipe plot?"}
B -->|"Statistical<br/>(distribusi, regresi, kategori)"| C["Seaborn<br/>1 baris cantik"]
B -->|"Custom / non-statistical<br/>(figure paper, dashboard kompleks)"| D["Matplotlib<br/>kontrol penuh"]
C --> E["Butuh customisasi?"]
E -->|"YES"| F["Kombinasi:<br/>sns.xxx + ax.set_xxx"]
E -->|"NO"| G["Done"]
D --> G
Tabel Cepat: Use Cases
| Kebutuhan | Seaborn | Matplotlib |
|---|---|---|
| Histogram + KDE | sns.histplot(kde=True) |
ax.hist() + manual KDE |
| Scatter + regresi | sns.regplot() |
manual fit + plot |
| Correlation heatmap | sns.heatmap(corr) |
ax.imshow() + ticks manual |
| Pairplot multi-fitur | sns.pairplot() |
loop subplots manual |
| Custom shape/color tiap titik | susah | mudah |
| Plot 3D | tidak ada | ada (mpl_toolkits) |
| Loss curve training | OK pakai seaborn | sama OK |
Bagian 1 — Setup
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
sns.set_theme(style="whitegrid") # atau "darkgrid", "white", "ticks"
# Load built-in dataset
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")
titanic = sns.load_dataset("titanic")
Bagian 2 — Distribusi
Histogram + KDE
sns.histplot(data=tips, x="total_bill", kde=True)
sns.histplot(data=tips, x="total_bill", hue="sex", multiple="stack")
KDE (Kernel Density Estimation)
sns.kdeplot(data=tips, x="total_bill", hue="time")
Box Plot
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
Violin Plot
sns.violinplot(data=tips, x="day", y="total_bill", hue="sex", split=True)
Strip & Swarm Plot
sns.stripplot(data=tips, x="day", y="total_bill")
sns.swarmplot(data=tips, x="day", y="total_bill") # tidak overlap
Bagian 3 — Relationship
Scatter Plot
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex", size="size")
Linear Regression Plot
sns.regplot(data=tips, x="total_bill", y="tip")
sns.lmplot(data=tips, x="total_bill", y="tip", hue="sex", col="day")
Pair Plot (Sangat Berguna untuk EDA!)
sns.pairplot(iris, hue="species")
# Auto generate scatter matrix untuk semua kolom numerik
Heatmap (Correlation Matrix)
corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="coolwarm", center=0)
Bagian 4 — Categorical
Count Plot
sns.countplot(data=titanic, x="class", hue="survived")
Bar Plot (dengan CI)
sns.barplot(data=tips, x="day", y="total_bill", hue="sex")
# Auto compute mean + 95% CI
Cat Plot (Master Function)
sns.catplot(data=tips, x="day", y="total_bill", kind="box", col="time")
kind: strip, swarm, box, violin, bar, count, point
Bagian 5 — Multi-Plot
FacetGrid
g = sns.FacetGrid(tips, col="day", row="sex", height=3)
g.map(sns.histplot, "total_bill")
Pair Grid (Custom)
g = sns.PairGrid(iris, hue="species")
g.map_upper(sns.scatterplot)
g.map_lower(sns.kdeplot)
g.map_diag(sns.histplot)
Bagian 6 — Customization
Color Palette
sns.set_palette("muted") # set globally
sns.color_palette("Blues", as_cmap=True)
# Per plot
sns.histplot(..., palette="viridis")
Figure Style
sns.set_theme(style="whitegrid", font_scale=1.2)
Combine dengan matplotlib
fig, ax = plt.subplots(figsize=(10, 6))
sns.scatterplot(data=tips, x="total_bill", y="tip", ax=ax)
ax.set_title("Custom Title")
ax.set_xlim(0, 60)
plt.show()
Common Mistakes / FAQ
1. sns.xxx() Tanpa data= → Bingung
# JELEK — pass column langsung
sns.scatterplot(x=tips["total_bill"], y=tips["tip"])
# BAIK — pakai data + nama kolom (string)
sns.scatterplot(data=tips, x="total_bill", y="tip")
Cara kedua lebih clean dan support fitur seperti hue, style, size.
2. Long vs Wide Format
Seaborn cinta long format. Kalau data kamu wide (banyak kolom value), pakai melt dulu.
df_wide = pd.DataFrame({"month": [...], "A": [...], "B": [...]})
df_long = df_wide.melt(id_vars="month", var_name="produk", value_name="sales")
sns.lineplot(data=df_long, x="month", y="sales", hue="produk")
3. pairplot Lambat di Dataset Besar
Sample dulu kalau >10 ribu baris:
sns.pairplot(df.sample(2000), hue="target")
4. Heatmap Tanpa annot Susah Dibaca
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", center=0)
Tanpa annot=True cuma warna; tambahkan angkanya supaya bisa dibaca.
5. hue di Plot Numerik vs Kategorik
- Kategorik di
hue→ tiap kategori beda warna (default) - Numerik di
hue→ gradient (jarang yang kamu mau)
Ubah ke kategorik dulu kalau perlu: df["hue_col"] = df["hue_col"].astype("category").
6. FacetGrid Lupa g.add_legend()
g = sns.FacetGrid(tips, col="day", hue="sex")
g.map(sns.scatterplot, "total_bill", "tip")
g.add_legend() # tanpa ini, legend hilang
7. Update Theme Tidak Berlaku
sns.set_theme(style="whitegrid") # SET DULU sebelum plot
fig, ax = plt.subplots()
# ... plot ...
Theme harus di-set sebelum plot dibuat.
Cek Pemahaman
- Bisa pairplot untuk EDA cepat?
- Bisa correlation heatmap?
- Tahu kapan pakai box vs violin?
- Bisa kombinasi seaborn + matplotlib customization?
Challenge 4.5
Challenge 1 — Iris Pairplot
iris = sns.load_dataset("iris")
- Pairplot semua fitur dengan hue species
- Heatmap correlation
- Boxplot tiap fitur per species (subplots 2×2)
- Tulis 5 insight yang kamu lihat
Challenge 2 — Titanic Survival
titanic = sns.load_dataset("titanic")
- Count plot survived per pclass
- Heatmap correlation
- Box plot age per pclass per sex
- Faceted histogram fare per class
Challenge 3 — Build Your Own Dashboard
Pilih dataset Kaggle. Bikin notebook dengan:
- 5+ visualisasi berbeda
- Tiap plot punya insight
- Akhiri dengan summary 1 paragraf
Push ke GitHub.
Selanjutnya: 06-eda-project.md