Matplotlib menggambar apa pun yang kita tentukan, tetapi semua agregasi masih menjadi tugas kita: ingin rata-rata per kelompok? hitung dulu dengan groupby. Seaborn mengambil pekerjaan itu dari bahu kita — library ini menerima DataFrame secara langsung, mengenali kolom lewat nama, dan menghitung statistik yang digambarkan secara otomatis. Pada Chapter ini kita memakai pola data=, x=, y=, dan hue= untuk barplot agregasi, lalu memvisualisasikan matriks korelasi hasil DataFrame.corr() sebagai heatmap.

API Seaborn yang Berorientasi DataFrame #

Seaborn dibangun di atas Matplotlib dengan dua keputusan desain yang cocok untuk pandas. Pertama, fungsi-fungsinya berorientasi dataset: kita menyerahkan DataFrame utuh, lalu memetakan kolom ke peran visual seperti sumbu x, sumbu y, dan pembeda warna. Kedua, fungsi statistiknya mengagregasi sendiri — barplot menghitung mean per kelompok, boxplot menghitung kuartil — tanpa groupby manual.

Fungsi seaborn terbagi dua keluarga yang perlu kita bedakan:

KeluargaNilai kembalianContoh
Axes-levelsatu objek Axes Matplotlibbarplot, heatmap, boxplot, regplot
Figure-levelobjek FacetGrid yang mengelola beberapa panelcatplot, relplot, lmplot

Karena axes-level mengembalikan Axes, semua method dari Chapter Pandas dan Matplotlib — set_title(), set_xlabel(), get_figure() — langsung berlaku pada hasilnya.

Barplot Agregasi Otomatis dari DataFrame #

Contoh berikut memakai kembali tabel penjualan sembako 12 baris tiga kota. Kita minta rata-rata total penjualan per produk, dibedakan warna menurut kota, tanpa satu baris groupby pun.

python
import os

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

penjualan = pd.DataFrame({
    "kota": ["Jakarta", "Jakarta", "Jakarta", "Jakarta",
             "Bandung", "Bandung", "Bandung", "Bandung",
             "Surabaya", "Surabaya", "Surabaya", "Surabaya"],
    "produk": ["Beras", "Minyak", "Gula", "Kopi",
               "Beras", "Minyak", "Gula", "Kopi",
               "Beras", "Minyak", "Gula", "Kopi"],
    "jumlah": [40, 25, 30, 20, 32, 22, 27, 18, 36, 19, 25, 21],
    "harga": [68000, 35000, 18000, 26000, 67500, 34500, 17500, 25500, 67000, 34000, 17200, 25000],
})
penjualan["total"] = penjualan["jumlah"] * penjualan["harga"]

sns.set_theme()

# 1. Barplot agregasi otomatis: mean total per produk, dibedakan kota
ax = sns.barplot(data=penjualan, x="produk", y="total", hue="kota", errorbar=None)
ax.set_title("Rata-rata Total Penjualan per Produk dan Kota")
ax.set_ylabel("Total (Rupiah)")
ax.get_figure().savefig("bar_produk.png", dpi=110, bbox_inches="tight")
print("barplot ->", type(ax).__name__)
print("legenda :", [t.get_text() for t in ax.get_legend().get_texts()])
print("sumbu x :", [t.get_text() for t in ax.get_xticklabels()])
plt.close(ax.get_figure())

# 2. Heatmap korelasi kolom numerik
korelasi = penjualan[["jumlah", "harga", "total"]].corr(numeric_only=True)
print(korelasi.round(2))
ax2 = sns.heatmap(korelasi, annot=True, fmt=".2f", cmap="Blues")
ax2.set_title("Korelasi Antar Kolom Numerik")
ax2.get_figure().savefig("heatmap_korelasi.png", dpi=110, bbox_inches="tight")
print("heatmap ->", type(ax2).__name__)
plt.close(ax2.get_figure())

os.remove("bar_produk.png")
os.remove("heatmap_korelasi.png")
print("2 PNG sementara selesai dibuat lalu dihapus")

Output yang Dihasilkan:

text
barplot -> Axes
legenda : ['Jakarta', 'Bandung', 'Surabaya']
sumbu x : ['Beras', 'Minyak', 'Gula', 'Kopi']
        jumlah  harga  total
jumlah    1.00   0.72   0.86
harga     0.72   1.00   0.97
total     0.86   0.97   1.00
heatmap -> Axes
2 PNG sementara selesai dibuat lalu dihapus

Mari kita telaah baris-baris pentingnya:

  1. Baris 19 (penjualan["total"] = ...): kolom numerik baru disiapkan terlebih dahulu; seaborn tidak menghitung kolom hasil, ia hanya membaca kolom yang ada.
  2. Baris 21 (sns.set_theme()): tema bawaan seaborn diterapkan sekali di awal sehingga palet warna, kisi, dan huruf plot selanjutnya tampil seragam.
  3. Baris 24 (sns.barplot(data=penjualan, ...)): argumen data menerima DataFrame; x="produk" dan y="total" adalah nama kolom, bukan data; hue="kota" memecah tiap produk menjadi tiga batang warna berbeda; errorbar=None mematikan error bar agar batang menampilkan mean saja.
  4. Baris 28-30: nilai kembalian berupa Axes (keluarga axes-level), dan kita membaca kembali label legend Jakarta, Bandung, Surabaya serta urutan produk pada sumbu x — keduanya disusun seaborn dari isi kolom.
  5. Baris 34 (corr(...)): method DataFrame.corr(numeric_only=True) menghitung korelasi Pearson antar kolom numerik dan mengembalikan DataFrame kecil berisi matriks korelasi.
  6. Baris 36 (sns.heatmap(...)): heatmap mewarnai tiap sel matriks sesuai nilainya; annot=True menuliskan angka pada sel dan fmt=".2f" memformatnya dua desimal.

Perhatikan matriks korelasinya: harga berkorelasi kuat dengan total (0,97) karena total adalah hasil kali jumlah dan harga, sedangkan jumlah berkorelasi lebih lemah dengan keduanya. Membaca angka seperti inilah gunanya heatmap — pola terlihat sekilas tanpa menelusuri tabel.

Seaborn menghitung dan menggambar, tetapi angka di baliknya — seberapa berbeda dua kelompok, seberapa kuat garis tren — tetap perlu diuji secara formal. Chapter berikutnya memakai scipy untuk mengambil angka-angka statistik tersebut langsung dari Series pandas.

Referensi resmi untuk pendalaman: dokumentasi seaborn , panduan visualisasi pandas , dan pandas.DataFrame.corr .