Episode ini mengajarkan visualisasi data yang jujur dan informatif dengan matplotlib & seaborn: line, bar, scatter, histogram, dan heatmap, plus prinsip pemilihan chart dan cara mengenali visualisasi yang menyesatkan (misleading visualization)

Setelah EDA di episode 8 menemukan pola, sekarang saatnya menunjukkan pola itu. Sebuah grafik yang baik menyampaikan insight dalam satu detik — jauh lebih cepat daripada seribu kata. Tapi visualisasi adalah pedang bermata dua: grafik yang buruk atau menyesatkan bisa membuat orang mengambil keputusan yang salah berdasarkan data yang sama.
Episode ini membangun dua hal: tooling (matplotlib & seaborn) dan judgment (kapan memakai chart apa, dan bagaimana menjaga grafik tetap jujur). Kita tutup dengan latihan membuat grafik yang menjawab pertanyaan bisnis nyata — bukan sekadar hiasan.
Aturan pertama visualisasi: chart mengikuti pertanyaan, bukan sebaliknya. Panduan praktisnya:
| Pertanyaan | Chart yang tepat |
|---|---|
| Bagaimana tren sepanjang waktu? | Line chart |
| Membandingkan nilai antar kategori? | Bar chart |
| Hubungan dua variabel numerik? | Scatter plot |
| Seperti apa distribusi satu variabel? | Histogram |
| Hubungan antar banyak variabel numerik? | Heatmap korelasi |
| Proporsi bagian dari keseluruhan? | Bar (bukan pie bila banyak kategori) |
Gunakan tabel ini sebagai checklist: jika pertanyaan bisnisnya "trend atau comparison?" maka line atau bar sudah menjawab 90% kasus.
matplotlib adalah fondasi semua plotting Python. Contoh line chart untuk tren penjualan bulanan:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("orders.csv")
bulanan = df.groupby(df["tanggal"].dt.to_period("M"))["harga"].sum()
plt.figure(figsize=(10, 4))
bulanan.plot(marker="o")
plt.title("Total Penjualan per Bulan")
plt.ylabel("Revenue")
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()Bar chart untuk perbandingan antar kategori:
revenue_per_produk = df.groupby("product")["harga"].sum().sort_values()
revenue_per_produk.plot(kind="barh", figsize=(8, 4))
plt.xlabel("Revenue")
plt.title("Revenue per Produk")
plt.tight_layout()
plt.show()Catatan kecil: bar horizontal (barh) lebih nyaman dibaca untuk banyak kategori — nama kategori tidak perlu diputar 90 derajat.
Scatter untuk melihat hubungan dua variabel numerik:
df.plot.scatter(x="harga", y="quantity", alpha=0.5, figsize=(8, 5))
plt.title("Hubungan Harga dan Quantity")
plt.show()Histogram untuk distribusi:
df["harga"].hist(bins=30, figsize=(8, 4))
plt.xlabel("Harga")
plt.ylabel("Frekuensi")
plt.title("Distribusi Harga Order")
plt.show()Histogram adalah alat pemburu insight yang paling jujur: ia langsung menunjukkan skewed, bimodal, atau outlier — jauh lebih jelas daripada angka skew().
Seaborn dibangun di atas matplotlib dengan fokus visualisasi statistik. Tiga fungsi yang paling sering dipakai analis:
import seaborn as sns
sns.heatmap(df[["harga", "quantity", "total"]].corr(), annot=True, cmap="coolwarm")
plt.title("Matriks Korelasi")
plt.show()sns.boxplot(data=df, x="product", y="harga")
plt.xticks(rotation=45)
plt.title("Sebaran Harga per Produk")
plt.show()sns.histplot(data=df, x="harga", hue="product", multiple="stack")
plt.show()Boxplot menampilkan median, kuartil, dan outlier dalam satu gambar — cara tercepat membandingkan distribusi antar kategori.
Tip
Aturan praktis untuk dashboard dan laporan: bar/line untuk komunikasi eksekutif, scatter/histogram/boxplot untuk eksplorasi internal, heatmap untuk diagnostik. Menyimpan grafik eksplorasi di presentasi eksekutif adalah salah satu kesalahan komunikasi data paling umum.
Visualisasi yang menyesatkan bukan hanya soal niat jahat — banyak yang lahir dari kecerobohan. Tiga pola paling umum:
| Trik menyesatkan | Cara menangkal |
|---|---|
| Memotong sumbu Y tidak dari nol | Mulai sumbu dari 0 untuk bar chart; beri label jelas |
| Skala sumbu berbeda antar panel | Gunakan skala yang sama untuk perbandingan |
| Chart yang salah jenis (pie dengan 15 slice) | Gunakan bar; batasi pie maksimal 4-5 kategori |
| Menggabungkan data yang tidak sebanding | Pisahkan, jangan rata-rata "apel + jeruk" |
Uji kejujuran grafik kalian: apakah pembaca bisa menarik kesimpulan yang sama dari tabel aslinya? Jika tidak, grafiknya menipu — sadar atau tidak.
sns.barplot(data=df, x="product", y="harga", errorbar=None)
plt.ylim(0, df["harga"].max() * 1.1)
plt.title("Rata-rata Harga per Produk")
plt.show()Pertanyaan: "Apakah ada musiman dalam penjualan, dan produk mana yang sedang naik?"
df["bulan"] = df["tanggal"].dt.to_period("M")
pivot = df.pivot_table(index="bulan", columns="product", values="harga", aggfunc="sum")
pivot.plot(figsize=(10, 5), marker="o")
plt.title("Tren Revenue per Produk per Bulan")
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()Satu gambar menjawab dua pertanyaan sekaligus: tren keseluruhan dan perbandingan antar produk. Ini template yang akan kalian pakai berulang untuk reporting bulanan.
Inti yang harus dibawa pulang:
Di episode 10 selanjutnya kita kembali ke senjata yang sering diremehkan: Excel & Google Sheets lanjutan — pivot table, VLOOKUP/XLOOKUP, formula, dan QUERY di Google Sheets untuk analisis cepat yang tidak perlu menunggu stack Python. Visualisasi sudah kalian kuasai; sekarang kita membuatnya cepat di spreadsheet!