Bab 24: Visualisasi dengan Matplotlib/Seaborn
- Peran Matplotlib (kontrol detail tingkat rendah) vs Seaborn (High-level & terintegrasi Pandas).
- Pembuatan plot standar: `sns.barplot()`, `sns.lineplot()`, `sns.scatterplot()`, dan `sns.histplot()`.
- Kustomisasi tampilan visual: Judul Actionable, Label Sumbu, Ukuran Kanvas, dan Penyimpanan `.savefig()`.
- Penggabungan pipeline Pandas DataFrame ke visualisasi Matplotlib/Seaborn.
Matplotlib vs Seaborn: Dua Library yang Saling Melengkapi
Matplotlib adalah library visualisasi paling dasar dan paling fundamental dalam ekosistem Python, menyediakan kontrol yang sangat detail dan fleksibel atas hampir setiap elemen visual sebuah chart, mulai dari warna, ukuran, posisi label, hingga elemen dekoratif lainnya. Fleksibilitas ini menjadi kekuatan utama Matplotlib, namun juga berarti kamu perlu menuliskan lebih banyak kode untuk menghasilkan chart yang terlihat rapi dan profesional.
Seaborn adalah library visualisasi yang dibangun di atas Matplotlib (artinya Seaborn sebenarnya memakai Matplotlib di baliknya), namun dirancang khusus untuk menghasilkan chart yang secara statistik lebih informatif dan secara visual lebih menarik, dengan kode yang jauh lebih ringkas dibanding menulis langsung menggunakan Matplotlib. Seaborn sangat terintegrasi dengan Pandas DataFrame, sehingga kamu bisa langsung merujuk nama kolom pada saat membuat chart, tanpa perlu memisahkan data terlebih dahulu seperti yang sering dibutuhkan pada Matplotlib murni.
Dalam praktik nyata, kedua library ini sering dipakai bersama-sama, bukan saling menggantikan. Pendekatan yang umum dilakukan adalah menggunakan Seaborn untuk membuat chart dasar dengan cepat dan hasil yang sudah cukup rapi, kemudian memanfaatkan fungsi-fungsi Matplotlib untuk kustomisasi tambahan seperti judul, label sumbu, atau ukuran chart, sesuai kebutuhan spesifik. Kedua library ini perlu diimpor terlebih dahulu sebelum dipakai, dengan konvensi penulisan yang umum dipakai adalah import matplotlib.pyplot as plt dan import seaborn as sns.
sns.barplot()
Perbandingan antar kategori.
sns.lineplot()
Tren dari waktu ke waktu.
sns.scatterplot()
Hubungan dua variabel numerik.
sns.histplot()
Distribusi satu variabel numerik.
Membuat Bar Chart
Sesuai prinsip pemilihan chart yang sudah dipelajari pada Bab 14, Bar chart paling cocok dipakai untuk membandingkan nilai antar kategori. Sebagai ilustrasi membuat Bar chart total penjualan per kategori produk Belanjain menggunakan Seaborn, dengan asumsi kamu sudah memiliki DataFrame ringkasan_kategori hasil dari proses groupby yang sudah dipelajari pada Bab 23:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.barplot(data=ringkasan_kategori, x="kategori", y="total_penjualan")
plt.title("Total Penjualan per Kategori Produk")
plt.xlabel("Kategori Produk")
plt.ylabel("Total Penjualan (Rupiah)")
plt.show()
Perhatikan struktur kode ini, plt.figure(figsize=(10, 6)) menentukan ukuran chart dalam satuan inci sebelum chart dibuat, sns.barplot() adalah fungsi Seaborn yang membuat chart Bar itu sendiri, dengan parameter data merujuk pada DataFrame sumber, dan parameter x serta y menentukan kolom mana yang dipakai untuk masing-masing sumbu. Baris-baris setelahnya, plt.title(), plt.xlabel(), dan plt.ylabel() adalah fungsi Matplotlib yang dipakai untuk kustomisasi judul dan label sumbu, sesuai kebiasaan menggabungkan kedua library yang sudah dijelaskan sebelumnya. Terakhir, plt.show() menampilkan chart yang sudah selesai dibuat.
Membuat Line Chart
Sesuai prinsip yang sudah dipelajari pada Bab 14, Line chart paling cocok dipakai untuk menunjukkan tren dari waktu ke waktu. Sebagai ilustrasi membuat Line chart tren penjualan bulanan Belanjain:
plt.figure(figsize=(10, 6))
sns.lineplot(data=tren_bulanan, x="bulan", y="total_penjualan")
plt.title("Tren Penjualan Bulanan Belanjain")
plt.xlabel("Bulan")
plt.ylabel("Total Penjualan (Rupiah)")
plt.show()
Struktur kode ini hampir identik dengan Bar chart sebelumnya, hanya berbeda pada fungsi yang dipakai, yaitu sns.lineplot() menggantikan sns.barplot(). Konsistensi pola penulisan seperti ini adalah salah satu keunggulan utama Seaborn, di mana kamu bisa dengan mudah berpindah antar jenis chart hanya dengan mengganti nama fungsinya, tanpa perlu mempelajari struktur kode yang benar-benar berbeda untuk setiap jenis chart.
Membuat Scatter Plot
Sesuai prinsip yang sudah dipelajari pada Bab 14 dan diaplikasikan pada pembahasan korelasi di Bab 19, Scatter plot paling cocok dipakai untuk menunjukkan hubungan antara dua variabel numerik. Sebagai ilustrasi membuat Scatter plot hubungan antara jumlah kunjungan harian dengan nilai transaksi harian Belanjain:
plt.figure(figsize=(10, 6))
sns.scatterplot(data=data_harian, x="jumlah_kunjungan", y="nilai_transaksi")
plt.title("Hubungan Jumlah Kunjungan dengan Nilai Transaksi Harian")
plt.xlabel("Jumlah Kunjungan")
plt.ylabel("Nilai Transaksi (Rupiah)")
plt.show()
Sekali lagi, perhatikan konsistensi struktur kode ini dengan dua contoh sebelumnya, hanya fungsi sns.scatterplot() yang berbeda, sementara pola penulisan plt.figure(), plt.title(), plt.xlabel(), plt.ylabel(), dan plt.show() tetap sama persis. Pola konsisten ini akan sangat memudahkan kamu untuk mengingat cara membuat berbagai jenis chart, karena pada dasarnya kamu hanya perlu mengganti satu fungsi inti sesuai jenis chart yang dibutuhkan.
Membuat Histogram
Sesuai prinsip yang sudah dipelajari pada Bab 14 dan diaplikasikan pada pembahasan distribusi data di Bab 18, Histogram paling cocok dipakai untuk menunjukkan distribusi atau sebaran satu variabel numerik. Sebagai ilustrasi membuat Histogram distribusi nilai transaksi Belanjain:
plt.figure(figsize=(10, 6))
sns.histplot(data=df, x="nilai_transaksi", bins=30)
plt.title("Distribusi Nilai Transaksi Pelanggan Belanjain")
plt.xlabel("Nilai Transaksi (Rupiah)")
plt.ylabel("Frekuensi")
plt.show()
Perhatikan parameter tambahan bins=30 pada fungsi sns.histplot(), yang menentukan berapa banyak rentang (bin) yang dipakai untuk membagi sumbu X, sesuai konsep bin yang sudah disinggung sekilas pada Bab 14. Semakin banyak jumlah bin yang dipakai, semakin detail (namun juga semakin "berisik") histogram yang dihasilkan, sementara semakin sedikit jumlah bin, semakin sederhana namun berpotensi menyembunyikan detail penting dari sebaran data tersebut. Menentukan jumlah bin yang tepat sering memerlukan eksperimen mencoba beberapa nilai berbeda, sesuai karakteristik data yang sedang dianalisis.
Kustomisasi Dasar: Judul, Label, dan Ukuran
Sepanjang contoh-contoh di atas, kamu sudah melihat beberapa fungsi kustomisasi dasar yang konsisten dipakai, dan penting untuk memahami kenapa kustomisasi ini bukan sekadar mempercantik tampilan, melainkan penerapan langsung dari prinsip-prinsip visualisasi yang sudah dipelajari mendalam pada Bab 14.
plt.figure(figsize=(lebar, tinggi)) menentukan ukuran keseluruhan chart dalam satuan inci, dan penting disesuaikan dengan konteks penggunaan chart tersebut, misalnya ukuran yang lebih besar untuk chart yang akan ditampilkan pada presentasi layar besar, atau ukuran yang lebih kecil dan proporsional untuk chart yang akan disisipkan dalam laporan dokumen.
plt.title() menentukan judul chart, dan sesuai prinsip judul actionable yang sudah dipelajari pada Bab 17, judul ini sebaiknya tidak sekadar deskriptif, melainkan jika memungkinkan langsung menyampaikan insight utamanya. Sebagai ilustrasi, dibanding menuliskan judul generik seperti "Distribusi Nilai Transaksi", kamu bisa menuliskan judul yang lebih actionable seperti "Mayoritas Transaksi Bernilai di Bawah 300 Ribu Rupiah", jika memang itu adalah temuan utama dari histogram yang dibuat.
plt.xlabel() dan plt.ylabel() menentukan label sumbu X dan Y, dan sesuai prinsip anatomi chart yang baik pada Bab 14, label ini harus jelas menyebutkan satuan yang dipakai, sehingga pembaca tidak perlu menduga-duga satuan apa yang sedang ditampilkan pada chart tersebut.
Menyimpan Chart sebagai File Gambar
Selain menampilkan chart langsung menggunakan plt.show(), kamu juga sering perlu menyimpan chart tersebut sebagai file gambar, misalnya untuk disisipkan ke dalam laporan atau presentasi. Fungsi plt.savefig() memungkinkan hal ini, dan sebaiknya dipanggil sebelum plt.show(), karena beberapa pengaturan tampilan bisa saja ter-reset setelah chart ditampilkan:
plt.figure(figsize=(10, 6))
sns.barplot(data=ringkasan_kategori, x="kategori", y="total_penjualan")
plt.title("Total Penjualan per Kategori Produk")
plt.xlabel("Kategori Produk")
plt.ylabel("Total Penjualan (Rupiah)")
plt.savefig("penjualan_per_kategori.png", dpi=300, bbox_inches="tight")
plt.show()
Parameter dpi=300 menentukan resolusi gambar yang dihasilkan (dots per inch), dengan angka yang lebih tinggi menghasilkan gambar yang lebih tajam namun juga ukuran file yang lebih besar, sementara bbox_inches="tight" memastikan seluruh elemen chart, termasuk judul dan label yang mungkin berada di tepi area gambar, ikut tersimpan dengan rapi tanpa terpotong.
Menyusun Visualisasi Lengkap dari Hasil Groupby Pandas
Untuk mengaplikasikan seluruh konsep yang sudah dibahas sepanjang bab ini, sekaligus menghubungkannya kembali dengan kemampuan Pandas yang sudah dipelajari pada Bab 23, mari bayangkan alur kerja lengkap dari data mentah hingga visualisasi siap pakai, melanjutkan skenario ringkasan total belanja per kota yang sudah dibahas di akhir Bab 23:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Tahap Pandas: membaca dan mengolah data (sesuai Bab 23)
pesanan = pd.read_csv("pesanan.csv")
pelanggan = pd.read_csv("pelanggan.csv")
pelanggan = pelanggan.dropna(subset=["kota"])
data_gabungan = pd.merge(pesanan, pelanggan, on="id_pelanggan", how="inner")
ringkasan_kota = data_gabungan.groupby("kota")["nilai_transaksi"].sum().reset_index()
ringkasan_kota = ringkasan_kota.sort_values("nilai_transaksi", ascending=False).head(10)
# Tahap Visualisasi: menampilkan hasil (sesuai Bab 24)
plt.figure(figsize=(10, 6))
sns.barplot(data=ringkasan_kota, x="nilai_transaksi", y="kota")
plt.title("Sepuluh Kota dengan Total Belanja Tertinggi")
plt.xlabel("Total Belanja (Rupiah)")
plt.ylabel("Kota")
plt.savefig("top10_kota.png", dpi=300, bbox_inches="tight")
plt.show()
Perhatikan penambahan .reset_index() setelah groupby(), sebuah langkah teknis yang diperlukan karena hasil groupby pada Pandas secara default menghasilkan struktur yang sedikit berbeda dari DataFrame biasa, dan reset_index() mengembalikannya menjadi DataFrame standar yang lebih mudah dipakai oleh Seaborn. Perhatikan juga bagaimana Bar chart pada contoh ini dibuat secara horizontal (kota pada sumbu Y, nilai pada sumbu X), sebuah pendekatan yang sering dipakai ketika label kategori pada sumbu (dalam hal ini nama kota) cukup panjang, sehingga lebih mudah dibaca dibanding dipaksakan pada sumbu X yang lebih sempit.
Alur kerja yang menggabungkan Pandas untuk pengolahan data dan Matplotlib/Seaborn untuk visualisasi seperti inilah yang menjadi pola paling umum dalam pekerjaan nyata seorang Data Analyst yang menggunakan Python, dan menyatukan seluruh kemampuan yang sudah dipelajari sepanjang Bagian VI Handbook ini, mulai dari fondasi Python di Bab 22, manipulasi data dengan Pandas di Bab 23, hingga visualisasi pada bab ini.
- Kolaborasi Library: Seaborn digunakan untuk sintaks cepat berbasis DataFrame; Matplotlib untuk kustomisasi judul/label.
- Sintaks Konsisten: Menggunakan struktur `plt.figure()`, `sns.plot_type()`, `plt.title()`, dan `plt.show()` secara seragam.
- Ekspor Gambar: Memanfaatkan `plt.savefig("file.png", dpi=300, bbox_inches="tight")` agar hasil gambar tidak terpotong.
- Integrasi Pandas: Menggunakan `.reset_index()` untuk mengonversi hasil agregasi `.groupby()` menjadi DataFrame visualisasi.