Chapter Visualisasi dengan Matplotlib menutup dengan satu keluhan yang sah: grafik statistik yang rapi butuh banyak baris boilerplate. seaborn lahir persis untuk menghapus boilerplate itu — library yang berdiri di atas matplotlib dan tahu hal-hal statistik: distribusi, kuantil, kepadatan, dan hubungan antar kolom. Satu panggilan function seaborn menghasilkan grafik yang di matplotlib membutuhkan agregasi manual, pewarnaan manual, dan legend manual. Seluruh contoh berikut diuji pada seaborn 0.13.2 dengan dataset penjualan.csv dari chapter Dasar Pandas.
set_theme dan Grafik Sebar #
Satu panggilan sns.set_theme() di awal skrip mengubah tampilan seluruh grafik matplotlib — seaborn dan pandas sekaligus — menjadi lebih modern:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid")
df = pd.read_csv("penjualan.csv")
df["total"] = df["harga"] * df["jumlah"]
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(11, 4))
sns.scatterplot(data=df, x="harga", y="jumlah", hue="kategori", ax=axes[0])
axes[0].set_title("Harga vs Jumlah per Kategori")
bulanan = df.groupby(df["tanggal"].str[:7])["total"].sum().reset_index()
bulanan = bulanan.rename(columns={"tanggal": "bulan"})
sns.lineplot(data=bulanan, x="bulan", y="total", marker="o", ax=axes[1])
axes[1].set_title("Total Penjualan per Bulan")
axes[1].set_ylabel("Total (Rp)")
fig.tight_layout()
fig.savefig("seaborn_scatter_line.png", dpi=150)
print("Grafik tersimpan: seaborn_scatter_line.png")Output yang Dihasilkan:
Grafik tersimpan: seaborn_scatter_line.pngPerhatikan pola pemanggilannya: data=df membawa seluruh DataFrame, lalu x dan y menyebut nama kolom sebagai string — tidak perlu mengirim df["harga"] secara eksplisit. Parameter hue="kategori" otomatis mewarnai titik per kategori sekaligus membuat legendnya; pekerjaan yang di matplotlib meminta tiga pemanggilan berbeda. Panel kiri menampilkan sebaran titik tiga warna yang menurun ke kanan, panel kanan menampilkan garis tiga bulan yang turun tajam di Maret.
relplot: Facet Otomatis #
Kekuatan khas seaborn adalah relplot() — membuat grid grafik terpisah per nilai satu kolom, disebut facet:
grafik = sns.relplot(data=df, x="harga", y="jumlah", col="kota", hue="kategori")
grafik.set_titles("Kota: {col_name}")
grafik.figure.tight_layout()
grafik.figure.savefig("seaborn_relplot.png", dpi=150)
print("Grafik tersimpan: seaborn_relplot.png")Output yang Dihasilkan:
Grafik tersimpan: seaborn_relplot.pngParameter col="kota" memecah satu grafik sebar menjadi tiga panel berdampingan — Bandung, Jakarta, Surabaya — masing-masing dengan skala dan legend yang konsisten. Method set_titles("Kota: {col_name}") mengisi judul tiap panel dengan nama kotanya, dan objek grafik.figure adalah Figure matplotlib biasa sehingga tight_layout() dan savefig() tetap bekerja persis seperti chapter sebelumnya.
Empat Grafik Statistik Andalan #
Empat jenis grafik seaborn menutup hampir semua kebutuhan analisis eksploratif. Keempatnya digambar dalam satu grid 2×2:
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(11, 8))
sns.histplot(data=df, x="total", bins=8, kde=True, ax=axes[0, 0])
axes[0, 0].set_title("Distribusi Nilai Transaksi")
axes[0, 0].set_xlabel("Total (Rp)")
sns.boxplot(data=df, x="kategori", y="total", ax=axes[0, 1])
axes[0, 1].set_title("Total Transaksi per Kategori")
axes[0, 1].set_xlabel("Kategori")
sns.violinplot(data=df, x="kota", y="jumlah", ax=axes[1, 0])
axes[1, 0].set_title("Jumlah Unit per Kota")
axes[1, 0].set_xlabel("Kota")
sns.countplot(data=df, x="kategori", ax=axes[1, 1])
axes[1, 1].set_title("Jumlah Transaksi per Kategori")
axes[1, 1].set_xlabel("Kategori")
fig.tight_layout()
fig.savefig("seaborn_statistik.png", dpi=150)
print("Grafik tersimpan: seaborn_statistik.png")Output yang Dihasilkan:
Grafik tersimpan: seaborn_statistik.pngCara membaca keempat panel hasilnya:
- histplot: histogram sebaran
totaldengan kurva kepadatan (KDE, darikde=True) menempel di atasnya — ekor panjang ke kanan sesuai kemiringan yang ditemukan di chapter EDA. - boxplot: kotak per kategori menampilkan median, kuartil, dan kumis rentang data; Elektronik tampak memiliki kotak paling tinggi.
- violinplot: bentuk biola per kota menampilkan kepadatan jumlah unit — makin lebar di suatu nilai, makin banyak transaksi di nilai tersebut.
- countplot: batang jumlah transaksi per kategori, padanan visual
value_counts().
Perbedaan boxplot dan violinplot ada pada informasinya: boxplot ringkas dan tahan outlier, violinplot memperlihatkan bentuk distribusi yang bisa multimodal. Keduanya dihasilkan satu baris berbeda.
heatmap dan pairplot #
Dua grafik penutup bekerja langsung dengan matriks. heatmap() memvisualkan tabel korelasi dari chapter EDA, pairplot() memetakan seluruh pasangan kolom numerik sekaligus:
korelasi = df[["harga", "jumlah", "total"]].corr()
fig, ax = plt.subplots(figsize=(6, 5))
sns.heatmap(korelasi, annot=True, cmap="coolwarm", vmin=-1, vmax=1, fmt=".2f", ax=ax)
ax.set_title("Korelasi Antar Kolom Numerik")
fig.tight_layout()
fig.savefig("seaborn_heatmap.png", dpi=150)
print("Grafik tersimpan: seaborn_heatmap.png")
pasangan = sns.pairplot(df[["harga", "jumlah", "total"]], diag_kind="kde")
pasangan.figure.tight_layout()
pasangan.figure.savefig("seaborn_pairplot.png", dpi=150)
print("Grafik tersimpan: seaborn_pairplot.png")Output yang Dihasilkan:
Grafik tersimpan: seaborn_heatmap.png
Grafik tersimpan: seaborn_pairplot.pngHeatmap yang dihasilkan menampilkan matriks 3×3 berwarna: sel harga-jumlah bernada biru dengan angka -0.63 (korelasi negatif), diagonal merah penuh 1.00, dan skala warna dari -1 hingga +1 di sisi kanan. Parameter annot=True mengisi angka korelasi di setiap sel, cmap="coolwarm" memetakan negatif ke biru dan positif ke merah, serta fmt=".2f" membatasi dua desimal. Sementara pairplot menghasilkan grid 3×3: baris dan kolom mewakili harga, jumlah, total; sel diagonal berisi kurva KDE per kolom, sel lainnya diagram pencar pasangan kolomnya — satu gambar yang merangkum seluruh hubungan numerik dataset.
Kapan Seaborn Menang #
| Situasi | Pilihan |
|---|---|
| Butuh warna per kategori + legend otomatis | seaborn (hue) |
| Analisis distribusi: KDE, box, violin | seaborn |
| Grid per kelompok data (facet) | seaborn (relplot, pairplot) |
| Kontrol piksel-level: anotasi khusus, sumbu ganda | matplotlib |
| Grafik untuk laporan berlabel gaya sendiri | matplotlib |
Kuncinya: seaborn bukan pengganti matplotlib melainkan lapisan di atasnya — setiap grafik seaborn menerima parameter ax dan mengembalikan objek matplotlib, sehingga kombinasi keduanya (seaborn menggambar, matplotlib memoles) adalah pola paling produktif. Tinggal satu langkah lagi di section ini: mengemas seluruh hasil — tabel, metrik, dan grafik — menjadi berkas yang siap dibagikan, materi chapter Mengekspor Hasil Analisis.