Chapter sebelumnya menutup dengan satu janji: seaborn mengambil figure, axes, dan method matplotlib yang sama, lalu menambahkan bahan penyederhana berupa DataFrame. Seluruh pekerjaan yang selama ini kita lakukan manual — loop per kategori untuk memberi warna, value_counts() sebelum menggambar batang, pivot_table() sebelum imshow(), subplots() untuk panel — di seaborn cukup diselesaikan dengan menyebut nama kolomnya. Pada chapter ini kita pelajari library ini secara saksama: cara kerja API berbasis DataFrame, pengaturan tema, empat fungsi andalannya untuk relasi, distribusi, kategori, dan matriks, serta posisinya terhadap matplotlib murni.
seaborn: matplotlib yang Bercakap Bahasa DataFrame #
seaborn bukan pengganti matplotlib; ia adalah lapisan di atasnya. Fungsi-fungsi seaborn menerima data dalam bentuk DataFrame lalu menggambar lewat matplotlib di balik layar — hasil akhirnya tetap figure dan axes, sehingga seluruh peralatan dari chapter Visualisasi dengan Matplotlib (judul, label, savefig) tetap berlaku. Yang berubah adalah cara kita memesan gambar:
| Aspek | matplotlib murni | seaborn |
|---|---|---|
| Bahan data | list dan larik numerik | DataFrame utuh (data=transaksi) |
| Memetakan kolom | kita memisah dan mengurutkan sendiri | cukup sebut nama kolom (x="jam", y="nilai") |
| Warna per kategori | loop + dictionary warna manual | hue="menu" mengurus warna dan legend |
| Panel per kategori | subplots() + loop + zip | col="jenis_hari" membuat panel otomatis |
| Hitungan statistik | value_counts() / pivot_table() lebih dulu | countplot dan heatmap menghitung sendiri |
Perhatikan kolom kanan: seluruhnya berbicara nama kolom, bukan angka. Inilah yang dimaksud API dataframe-first — kita memberi tahu dari kolom mana tiap saluran visual diambil, dan seaborn yang mengurusi pemetaannya.
Data Latihan: 40 Transaksi dari Berkas CSV #
Bahan latihan kita adalah berkas transaksi.csv — 40 transaksi Toko Kopi Kita dengan empat kolom: menu, jenis hari, jam, dan nilai transaksi (ribu rupiah):
menu,jenis_hari,jam,nilai
es kopi susu,kerja,8,22
es kopi susu,kerja,9,44
es kopi susu,kerja,10,22
es kopi susu,kerja,11,22
es kopi susu,kerja,12,22
es kopi susu,kerja,15,44
es kopi susu,kerja,16,22
es kopi susu,kerja,17,22
es kopi susu,akhir pekan,10,44
es kopi susu,akhir pekan,11,66
es kopi susu,akhir pekan,14,44
es kopi susu,akhir pekan,15,66
es kopi susu,akhir pekan,16,44
es kopi susu,akhir pekan,17,44
kopi tubruk,kerja,8,12
kopi tubruk,kerja,9,12
kopi tubruk,kerja,10,24
kopi tubruk,kerja,13,12
kopi tubruk,akhir pekan,9,24
kopi tubruk,akhir pekan,15,24
kopi tubruk,akhir pekan,16,12
kopi tubruk,akhir pekan,17,24
matcha latte,kerja,9,24
matcha latte,kerja,10,48
matcha latte,kerja,11,24
matcha latte,kerja,14,24
matcha latte,kerja,15,48
matcha latte,akhir pekan,10,48
matcha latte,akhir pekan,11,48
matcha latte,akhir pekan,15,48
matcha latte,akhir pekan,16,72
matcha latte,akhir pekan,17,48
teh tawar,kerja,8,8
teh tawar,kerja,10,16
teh tawar,kerja,13,8
teh tawar,kerja,16,8
teh tawar,akhir pekan,9,16
teh tawar,akhir pekan,10,16
teh tawar,akhir pekan,14,16
teh tawar,akhir pekan,15,8Kita baca seperti biasa dengan pandas dan periksa isinya:
import pandas as pd
transaksi = pd.read_csv("transaksi.csv")
print(transaksi.head(6).to_string(index=False))
print()
print("Ukuran tabel :", transaksi.shape[0], "baris x",
transaksi.shape[1], "kolom")
print("Menu :", ", ".join(transaksi["menu"].unique()))
print("Jumlah per jenis hari:")
print(transaksi["jenis_hari"].value_counts().to_string())Output yang Dihasilkan:
menu jenis_hari jam nilai
es kopi susu kerja 8 22
es kopi susu kerja 9 44
es kopi susu kerja 10 22
es kopi susu kerja 11 22
es kopi susu kerja 12 22
es kopi susu kerja 15 44
Ukuran tabel : 40 baris x 4 kolom
Menu : es kopi susu, kopi tubruk, matcha latte, teh tawar
Jumlah per jenis hari:
jenis_hari
kerja 21
akhir pekan 19Mari kita telaah baris-barisnya:
- Baris 3 (
pd.read_csv("transaksi.csv")): berkas dibaca dari folder yang sama dengan skrip — pola yang sama dengan chapter Grafik Deret Waktu; empat kolomnya langsung bertipe benar karena nilainya bersih. - Baris 9 (
", ".join(...unique())): daftar menu unik dicetak sebagai satu baris — pemeriksaan cepat bahwa tidak ada salah ketik nama menu di berkas. - Baris 11 (
value_counts()): 21 transaksi hari kerja dan 19 transaksi akhir pekan — seimbang, sehingga perbandingan antar keduanya adil.
Mengatur Tampilan Global dengan set_theme #
Satu baris sns.set_theme() mengubah seluruh tampilan grafik sesudahnya: latar bidang, garis kisi, palet warna, dan bentuk penanda. Parameter style= menyediakan beberapa rasa — "whitegrid" menambahkan garis kisi terang yang membantu membaca posisi titik, "darkgrid" (bawaan seaborn) memakai kisi kelabu, "ticks" hanya menampilkan penanda sumbu. Karena set_theme() bekerja global, kita cukup memanggilnya sekali di bagian atas skrip; seluruh blok pada chapter ini memakai style="whitegrid".
relplot: Relasi Berpanel Otomatis #
relplot() adalah fungsi andalan untuk hubungan antar variabel. Dengan sekali panggil, ia menggambar scatter plot, mewarnai titik menurut kolom kategorikal, dan memecahnya menjadi panel per nilai kolom lain — tiga pekerjaan yang pada chapter Visualisasi Multivariabel kita rakit manual:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid")
transaksi = pd.read_csv("transaksi.csv")
sns.relplot(data=transaksi, x="jam", y="nilai", hue="menu",
col="jenis_hari", alpha=0.8, height=3.5, aspect=1.1)
plt.show()Gambar yang muncul memuat dua panel berdampingan — kiri “kerja” dan kanan “akhir pekan” — dengan sumbu yang sama: jam pada mendatar dan nilai transaksi pada tegak. Empat warna menandai empat menu dengan legend di atas. Polanya terbaca lintas panel: pada panel kiri, titik-titik menumpuk di nilai rendah (8-48), sedangkan titik bernilai besar justru mengumpul di panel kanan — es kopi susu setinggi 66 dan matcha latte setinggi 72 hanya muncul di akhir pekan. Pelanggan akhir pekan membeli dalam jumlah gelas lebih banyak, dan gambar ini menunjukkannya tanpa satu baris pengelompokan pun.
Perhatikan cara memesannya: x="jam" dan y="nilai" menyebut kolom, hue="menu" meminta warna per menu lengkap dengan legend, dan col="jenis_hari" meminta satu panel per jenis hari — termasuk judul panel bertuliskan nilainya. Tidak ada satu pun loop, dictionary warna, atau subplots() dalam kode itu.
boxplot dan countplot: Statistik Tanpa Hitung Manual #
boxplot() menerapkan anatomi dari chapter Histogram dan Boxplot ke seluruh kelompok sekaligus, dan argumen hue membelah tiap kelompok menjadi dua:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid")
transaksi = pd.read_csv("transaksi.csv")
sns.boxplot(data=transaksi, x="menu", y="nilai", hue="jenis_hari")
plt.title("Sebaran Nilai Transaksi per Menu")
plt.xlabel("Menu")
plt.ylabel("Nilai transaksi (ribu rupiah)")
plt.show()Gambar yang dihasilkan memuat delapan kotak — empat menu × dua jenis hari — dengan legend biru (kerja) dan oranye (akhir pekan). Kotak es kopi susu memperlihatkan cerita paling jelas: kotak biru hari kerja rendah dengan median 22, sedangkan kotak oranye akhir pekan naik satu tingkat dengan median 44; matcha latte mengulang pola yang sama dari median 24 ke 48. Dua menu lainnya (kopi tubruk, teh tawar) memiliki kotak-kotak kecil yang seluruhnya berada di bawah 25 ribu — nilainya memang sebatas satu-dua gelas. Perbandingan delapan kelompok ini selesai dibaca dalam satu pandangan.
countplot() mengambil alih pekerjaan yang paling sering kita lakukan berulang: menghitung frekuensi lalu menggambarnya. Ia menghitung sendiri, sehingga value_counts() tidak pernah muncul di kode:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid")
transaksi = pd.read_csv("transaksi.csv")
sns.countplot(data=transaksi, y="menu", hue="jenis_hari")
plt.title("Jumlah Transaksi per Menu")
plt.xlabel("Jumlah transaksi")
plt.ylabel("Menu")
plt.show()Gambar yang muncul memuat empat pasang batang mendatar: es kopi susu terpanjang dengan 8 batang biru (hari kerja) dan 6 batang oranye (akhir pekan), disusul matcha latte (5 dan 5), lalu kopi tubruk serta teh tawar yang masing-masing 4 dan 4. Orientasi mendatar didapat hanya dengan menukar x= menjadi y= — satu keuntungan lagi API berbasis kolom: sumbu mana pun bisa memuat kategori tanpa mengganti nama fungsi (bar menjadi barh di matplotlib).
heatmap: Matriks dari pivot_table #
Kembali ke matriks menu × jam dari chapter Visualisasi Multivariabel. Kali ini pd.pivot_table() tetap kita tulis sendiri — penghitungan tabel tetap pekerjaan pandas — lalu sns.heatmap() menggantikan imshow() beserta seluruh pelengkapnya:
import pandas as pd
transaksi = pd.read_csv("transaksi.csv")
matriks = pd.pivot_table(transaksi, index="menu", columns="jam",
values="nilai", aggfunc="count", fill_value=0)
print(matriks.to_string())
print()
print("Jam tersibuk:", matriks.sum().idxmax(), "dengan",
matriks.sum().max(), "transaksi")Output yang Dihasilkan:
jam 8 9 10 11 12 13 14 15 16 17
menu
es kopi susu 1 1 2 2 1 0 1 2 2 2
kopi tubruk 1 2 1 0 0 1 0 1 1 1
matcha latte 0 1 2 2 0 0 1 2 1 1
teh tawar 1 1 2 0 0 1 1 1 1 0
Jam tersibuk: 10 dengan 7 transaksiDua baris kuncinya: aggfunc="count" meminta pivot menghitung banyaknya transaksi per pasangan menu-jam (bukan menjumlahkan nilainya), dan fill_value=0 mengisi pasangan kosong dengan nol agar selnya tetap tergambar. Sekarang matriksnya digambar:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set_theme(style="whitegrid")
transaksi = pd.read_csv("transaksi.csv")
matriks = pd.pivot_table(transaksi, index="menu", columns="jam",
values="nilai", aggfunc="count", fill_value=0)
sns.heatmap(matriks, annot=True, fmt="d", cmap="Blues", cbar=True)
plt.title("Jumlah Transaksi per Menu dan Jam")
plt.xlabel("Jam")
plt.ylabel("Menu")
plt.show()Gambar yang dihasilkan berupa kisi 4×10 berwarna biru dengan angka di tiap sel. Kolom paling pekat adalah jam 10 (seluruh baris berisi 1-2 transaksi, total 7), disusul kolom 15 dengan 6 transaksi; dua kolom paling pucat adalah jam 12 dan 13 yang hanya menampung satu-dua transaksi. Bandingkan dengan versi imshow() pada chapter Visualisasi Multivariabel: annot=True menggantikan loop ganda ax.text(), fmt="d" mengatur format angkanya, cmap="Blues" memilih palet, dan cbar=True menambahkan batang skala — empat keputusan yang semula berupa kode tambahan kini menjadi empat argumen.
Rangkuman #
- seaborn adalah lapisan di atas matplotlib dengan API dataframe-first: kita menyebut nama kolom (
x=,y=,hue=,col=), seaborn mengurus pemetaan, warna, legend, dan panel. sns.set_theme(style="whitegrid")mengatur tampilan global untuk seluruh grafik setelahnya.relplot()menggambar relasi berpanel otomatis; sebagai fungsi figure-level, ukurannya diaturheightdanaspect.boxplot()dancountplot()menghitung dan mengelompokkan sendiri — anatomi boxplot dari chapter sebelumnya berlaku utuh,value_counts()tidak lagi diperlukan.- Matriks tetap lahir dari
pd.pivot_table();sns.heatmap(annot=True, fmt="d", cmap=...)menggantikanimshow()plus loop anotasi.
Seluruh grafik sepanjang Section ini — dari bar chart pertama sampai heatmap barusan — berbagi satu bentuk data: tabel baris-kolom. Padahal sebagian data justru hidup sebagai bentuk dan lokasi: batas kecamatan, posisi cabang, sebaran pelanggan di peta kota. Chapter berikutnya, Visualisasi Geospasial, membawa peralatan kita dari tabel ke peta.
Referensi #
- Seaborn — Tutorial — panduan resmi seaborn untuk relasi, distribusi, kategori, dan fungsi figure-level.
- Seaborn — scatterplot
— dokumentasi fungsi scatter plot yang menjadi dasar
relplot. - Pandas — DataFrame.pivot_table — dokumentasi pivot tabel sebagai bahan baku heatmap.