Seaborn

3 jam5 min baca
Tujuan

Statistical visualization yang lebih cantik dan high-level dari matplotlib.

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")
  1. Pairplot semua fitur dengan hue species
  2. Heatmap correlation
  3. Boxplot tiap fitur per species (subplots 2×2)
  4. Tulis 5 insight yang kamu lihat

Challenge 2 — Titanic Survival

titanic = sns.load_dataset("titanic")
  1. Count plot survived per pclass
  2. Heatmap correlation
  3. Box plot age per pclass per sex
  4. 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