Data Science
Visualisasi Statistik Lanjutan dengan Seaborn
Eksplorasi visualisasi statistik modern dengan Seaborn di Python. Pelajari pembuatan Histogram & KDE, Scatter Plot multi-dimensi, Box Plot deteksi pencilan, serta Heatmap matriks korelasi data.

Meskipun Matplotlib memberikan kendali granular tak tertandingi atas elemen grafis, menulis belasan baris kode konfigurasi hanya untuk melihat sebaran probabilitas suatu variabel atau memetakan korelasi antar-fitur numerik bisa sangat menyita waktu saat tahap Analisis Data Eksploratif (Exploratory Data Analysis / EDA). Praktisi data membutuhkan alat yang mampu menerjemahkan struktur tabel Pandas secara langsung menjadi grafik statistik yang estetis, informatif, dan ringkas.
Di sinilah Seaborn bersinar. Dibangun langsung di atas fondasi Matplotlib, Seaborn dirancang khusus untuk bekerja harmonis dengan Pandas DataFrame. Seaborn secara otomatis mengurus agregasi statistik, estimasi interval kepercayaan (confidence interval), pemetaan palet warna tingkat lanjut, dan pembentukan legenda kategorikal hanya dalam satu baris perintah ekspresif.
Yang akan dipelajari
Dalam panduan praktis ini, kamu akan menguasai:
- Keunggulan integrasi tanpa batas antara Seaborn dan Pandas DataFrame (
data=df). - Analisis distribusi univariat: menggabungkan Histogram dan Kernel Density Estimation (KDE) dengan
sns.histplot. - Analisis bivariat dan multivariat: mengeksplorasi hubungan antarvariabel lewat Scatter Plot berdimensi ketiga (
hue,style,size). - Deteksi pencilan (outliers) dan analisis kuartil interkuartil (IQR) menggunakan Box Plot.
- Pemetaan korelasi linear antar-fitur numerik menggunakan Heatmap matriks korelasi.
Konsep dan Intuisi: Mengapa Seaborn?
Jika Matplotlib adalah kuas lukis manual di mana pelukis harus menentukan letak setiap koordinat garis satu per satu, maka Seaborn adalah kamera canggih dengan filter otomatis yang langsung mengenali objek.
Perbedaan fundamental Seaborn terletak pada konsep Semantic Mapping:
- Integrasi Kolom DataFrame: Anda cukup meneruskan nama kolom sebagai string ke parameter
x,y, atauhue, tanpa perlu mengekstrak array secara manual. - Kalkulasi Statistik Otomatis: Seaborn secara internal menghitung frekuensi bin, estimasi densitas probabilitas, rentang interkuartil (Interquartile Range / IQR), atau regresi linier.
- Pewarnaan Kategori Otomatis: Menambahkan argumen
hue='nama_kolom'akan memecah data menjadi kelompok warna yang berbeda lengkap dengan pembuatan kotak legenda secara instan.
Berikut perbandingan visual pemetaan variabel ke elemen visual grafis (Visual Encodings):
Kolom DataFrame:
- x: 'pendapatan' --> Dipetakan ke sumbu horizontal (Posisi X)
- y: 'pengeluaran' --> Dipetakan ke sumbu vertikal (Posisi Y)
- hue: 'kategori_member'--> Dipetakan ke ragam warna (Warna Marker)
- size: 'frekuensi_trx' --> Dipetakan ke diameter lingkaran (Ukuran Marker)
Praktik Kode Bertahap
Mari kita gunakan dataset realistis tentang profil pelanggan, usia, pendapatan, skor pengeluaran, dan status keanggotaan untuk mempraktikkan fungsi-fungsi visualisasi Seaborn.
1. Menyiapkan Data Eksplorasi
Buka Google Colab dan impor modul yang dibutuhkan:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Menyetel tema visual default Seaborn agar grafik terlihat modern
sns.set_theme(style="whitegrid", palette="muted")
# Membuat dataset profil pelanggan belanja (100 observasi sampel)
np.random.seed(42)
n_samples = 100
usia = np.random.randint(18, 65, size=n_samples)
pendapatan = np.random.normal(loc=12, scale=4, size=n_samples).round(1) # Juta rupiah
# Pengeluaran berkorelasi dengan pendapatan namun dipengaruhi faktor acak
pengeluaran = (0.6 * pendapatan + np.random.normal(0, 2, size=n_samples)).round(1)
pengeluaran = np.clip(pengeluaran, 1.0, 25.0)
kategori_member = np.random.choice(['Reguler', 'Gold', 'Platinum'], size=n_samples, p=[0.5, 0.3, 0.2])
df_mall = pd.DataFrame({
'usia': usia,
'pendapatan_juta': pendapatan,
'pengeluaran_juta': pengeluaran,
'tier_member': kategori_member
})
print("=== 5 Baris Pertama Data Pelanggan ===")
print(df_mall.head())
Output:
=== 5 Baris Pertama Data Pelanggan ===
usia pendapatan_juta pengeluaran_juta tier_member
0 56 13.0 7.6 Reguler
1 46 12.5 7.8 Reguler
2 32 14.6 7.5 Gold
3 60 16.1 11.1 Reguler
4 25 9.8 6.2 Gold
2. Memeriksa Distribusi dengan Histogram dan KDE Plot
Untuk mengetahui apakah variabel numerik terdistribusi secara normal atau mengalami kemiringan (skewness), fungsi sns.histplot() menyediakan kombinasi histogram frekuensi dan kurva Kernel Density Estimation (KDE):
fig, ax = plt.subplots(figsize=(8, 4.5))
# Memvisualisasikan sebaran pendapatan dengan kurva KDE halus
sns.histplot(
data=df_mall,
x='pendapatan_juta',
kde=True,
bins=12,
color='#0284c7',
ax=ax
)
ax.set_title('Distribusi Pendapatan Bulanan Pelanggan (dengan KDE)', fontsize=13, fontweight='bold')
ax.set_xlabel('Pendapatan (Juta Rupiah)')
ax.set_ylabel('Frekuensi Kemunculan')
plt.show()
Output:
(Grafik Histogram ditampilkan dengan 12 batang biru muda yang ditindih kurva garis KDE biru tua mulus,
menunjukkan sebaran lonceng simetris berpusat di sekitar 12 juta rupiah)
Garis KDE merepresentasikan perkiraan fungsi kepekatan probabilitas kontinu dari variabel, membantu kita mengidentifikasi ada tidaknya puncak kembar (bimodal) tanpa terdistorsi oleh pemilihan lebar bin histogram semata.
3. Analisis Hubungan Multivariat dengan Scatter Plot
Bagaimana pengaruh besaran pendapatan terhadap pengeluaran belanja? Dan apakah pelanggan tier Platinum cenderung membelanjakan porsi pendapatan yang lebih besar?
Kita dapat memetakan 3 dimensi data sekaligus menggunakan parameter x, y, dan hue:
fig, ax = plt.subplots(figsize=(9, 5))
# Scatter plot dengan pengelompokan warna berdasarkan tier keanggotaan
sns.scatterplot(
data=df_mall,
x='pendapatan_juta',
y='pengeluaran_juta',
hue='tier_member',
style='tier_member', # Memberikan bentuk marker berbeda untuk tiap tier
s=90, # Ukuran titik marker
palette={'Reguler': '#94a3b8', 'Gold': '#f59e0b', 'Platinum': '#8b5cf6'},
ax=ax
)
ax.set_title('Korelasi Pendapatan vs Pengeluaran Berdasarkan Tier Member', fontsize=13, fontweight='bold')
ax.set_xlabel('Pendapatan Bulanan (Juta Rupiah)')
ax.set_ylabel('Pengeluaran Bulanan (Juta Rupiah)')
plt.show()
Output:
(Grafik Scatter Plot menampilkan sebaran titik yang condong ke kanan atas,
menunjukkan korelasi positif: semakin tinggi pendapatan, semakin tinggi pengeluaran)
Dengan menyematkan hue='tier_member', kita langsung mendapatkan legenda kategorikal rapi tanpa perlu memfilter DataFrame menjadi tiga subset terpisah secara manual.
4. Mendeteksi Outlier Menggunakan Box Plot
Box Plot (diagram kotak garis) adalah standar emas dalam statistik untuk menganalisis lima ringkasan data: nilai minimum, kuartil bawah (Q1), median (Q2), kuartil atas (Q3), dan nilai maksimum non-pencilan. Titik-titik yang terletak di luar batas kumis (whiskers ) secara otomatis ditandai sebagai potensi pencilan (outliers).
fig, ax = plt.subplots(figsize=(8, 5))
# Membandingkan sebaran pengeluaran antar tier member
sns.boxplot(
data=df_mall,
x='tier_member',
y='pengeluaran_juta',
palette=['#94a3b8', '#f59e0b', '#8b5cf6'],
width=0.4,
ax=ax
)
ax.set_title('Sebaran Pengeluaran Berdasarkan Status Keanggotaan', fontsize=13, fontweight='bold')
ax.set_xlabel('Status Member')
ax.set_ylabel('Pengeluaran Bulanan (Juta Rupiah)')
plt.show()
Output:
(Grafik Box Plot menampilkan 3 kotak representasi kuartil dengan garis horizontal tebal di median
dan titik data ekstrem di luar kumis batas)
Dari Box Plot, kita bisa membandingkan nilai tengah (median) antargrup secara objektif sekaligus mengevaluasi variabilitas data (dispersi) tanpa terpengaruh oleh rata-rata aritmatika yang rentan bias.
5. Memetakan Korelasi Fitur dengan Heatmap
Dalam persiapan pemodelan Machine Learning, memeriksa multikolinieritas atau relasi antarseluruh variabel numerik adalah tahapan wajib. Seaborn menyediakan fungsi sns.heatmap() yang sangat mudah dikombinasikan dengan metode .corr() dari Pandas:
fig, ax = plt.subplots(figsize=(6, 5))
# Menghitung matriks korelasi Pearson untuk kolom numerik
matriks_korelasi = df_mall[['usia', 'pendapatan_juta', 'pengeluaran_juta']].corr()
# Menggambar heatmap dengan anotasi angka koefisien korelasi
sns.heatmap(
matriks_korelasi,
annot=True, # Menampilkan angka di dalam setiap kotak sel
fmt='.2f', # Format angka desimal dua angka di belakang koma
cmap='coolwarm', # Palet warna dari biru (negatif) ke merah (positif)
vmin=-1, vmax=1, # Batas skala nilai korelasi Pearson
linewidths=1.0, # Garis pemisah antar sel
cbar=True,
ax=ax
)
ax.set_title('Matriks Korelasi Fitur Numerik', fontsize=13, fontweight='bold', pad=12)
plt.show()
Output:
(Matriks Heatmap berdimensi 3x3 ditampilkan:
Hubungan antara pendapatan_juta dan pengeluaran_juta menampilkan warna kemerahan
dengan koefisien korelasi positif yang signifikan sekitar ~0.65 - 0.70)
Coba sendiri
Buka Google Colab kamu dan jalankan eksplorasi mandiri berikut:
- Dari DataFrame
df_mall, buatlah grafiksns.kdeplot()untuk kolomusia, namun tambahkan parameterhue='tier_member'danfill=True. - Perhatikan bagaimana kurva densitas terisi warna semi-transparan untuk masing-masing tier member.
- Amati pada rentang usia berapakah kelompok pelanggan
Platinumpaling banyak terkonsentrasi! - Gantilah palet warna grafik dengan mencoba palet bawaan seperti
palette='viridis'ataupalette='magma'.
Kesalahan yang sering terjadi
Berikut beberapa jebakan umum yang sering dihadapi pemula saat bekerja dengan Seaborn:
| Kesalahan Pemula | Akar Masalah | Solusi Benar |
|---|---|---|
Meneruskan kolom non-numerik ke perhitungan .corr(). |
Pandas versi terbaru akan memunculkan TypeError jika DataFrame berisi teks/kategori saat memanggil .corr(). |
Gunakan df.select_dtypes(include='number').corr() atau pilih kolom numerik secara eksplisit. |
| Heatmap tidak memunculkan angka di dalam sel kotak. | Parameter annot=True tidak disematkan. |
Tambahkan parameter annot=True dan fmt='.2f' pada pemanggilan sns.heatmap(). |
| Menimpa kanvas plot saat memanggil fungsi Seaborn berkali-kali. | Tidak menyematkan parameter ax=ax saat mengintegrasikan dengan Figure Matplotlib. |
Buat kanvas dengan fig, ax = plt.subplots() lalu teruskan objek ax ke argumen fungsi Seaborn. |
| Grafik terlihat sangat kecil atau label terpotong. | Mengatur ukuran kanvas setelah pemanggilan Seaborn selesai. | Panggil plt.subplots(figsize=(lebar, tinggi)) di awal baris sebelum kode fungsi Seaborn. |
| Interpretasi Box Plot salah menganggap semua titik di luar kumis sebagai data rusak. | Outlier statistik (pencilan) diasumsikan sebagai galat input (typo). | Outlier bisa jadi merupakan perilaku nyata pelanggan bernilai tinggi (whale customer). Jangan langsung dihapus tanpa validasi domain bisnis. |
Kaitannya dengan Praktik Industri / AI: Dalam proyek Machine Learning, pembuatan Heatmap korelasi adalah langkah eliminasi fitur redundan. Apabila dua variabel independen memiliki korelasi linear mendekati 1.0 (misalnya
luas_m2danluas_kaki_persegi), mempertahankan keduanya akan menimbulkan masalah multikolinieritas tinggi yang merusak stabilitas koefisien model regresi linear. Selain itu, visualisasi Box Plot digunakan oleh para Data Scientist untuk menentukan ambang batas pemangkasan data (capping/clipping) pada tahap pra-pemrosesan data sebelum pelatihan algoritma pohon keputusan atau jaringan saraf tiruan.
Latihan
Perdalam pemahaman analisismu dengan menyelesaikan 3 soal latihan berikut:
- Latihan 1: Buatlah visualisasi distribusi variabel
pengeluaran_jutamenggunakansns.histplot(). Pisahkan distribusinya berdasarkan kategoritier_membermenggunakan parameterhue, dan aktifkan kurvakde=Truedengan paletSet2. - Latihan 2: Buatlah Violin Plot (
sns.violinplot) yang membandingkan sebaranpendapatan_jutapada masing-masingtier_member. Analisis bentuk kepadatan datanya dibandingkan dengan Box Plot biasa. - Latihan 3: Tambahkan satu kolom baru bernama
status_usiapadadf_malldengan ketentuan: jikausia < 35diberi nilai'Muda', dan jikausia >= 35diberi nilai'Senior'. Selanjutnya, buatlah Heatmap korelasi numerik terpisah hanya untuk segmen pelanggan'Muda'.
Kunci jawaban dan pembahasan
Berikut solusi kode lengkap untuk mengonfirmasi hasil pengerjaan latihan kamu:
Solusi Latihan 1: Histogram Berlapis dengan KDE per Kategori
fig, ax = plt.subplots(figsize=(8, 4.5))
sns.histplot(
data=df_mall,
x='pengeluaran_juta',
hue='tier_member',
kde=True,
palette='Set2',
element='step', # Menghindari tumpukan batang yang saling menutupi
ax=ax
)
ax.set_title('Distribusi Pengeluaran Berdasarkan Tier Member', fontsize=12, fontweight='bold')
ax.set_xlabel('Pengeluaran (Juta Rupiah)')
ax.set_ylabel('Frekuensi')
plt.show()
Pembahasan:
Argumen element='step' atau multiple='stack' membuat visualisasi histogram bertingkat menjadi rapi sehingga distribusi masing-masing kelas member terlihat jelas tanpa saling menutupi. Kurva KDE secara otomatis dihitung per kategori oleh Seaborn.
Solusi Latihan 2: Violin Plot untuk Analisis Densitas Multivariat
fig, ax = plt.subplots(figsize=(8, 5))
sns.violinplot(
data=df_mall,
x='tier_member',
y='pendapatan_juta',
palette='pastel',
inner='quartile', # Menampilkan garis kuartil di dalam bentuk biola
ax=ax
)
ax.set_title('Densitas Pendapatan per Tier Menggunakan Violin Plot', fontsize=12, fontweight='bold')
ax.set_xlabel('Tier Member')
ax.set_ylabel('Pendapatan Bulanan (Juta Rupiah)')
plt.show()
Pembahasan: Violin Plot menggabungkan fitur Box Plot (menunjukkan kuartil 25%, 50%, dan 75% di bagian tengah) dengan estimasi kurva kepadatan probabilitas (KDE) yang tercermin simetris di kedua sisinya. Hal ini sangat berguna jika dataset memiliki distribusi multi-modal (memiliki lebih dari satu puncak kepadatan data).
Solusi Latihan 3: Segmentasi Data dan Korelasi Bersyarat
# Membuat fitur kategorikal status usia
df_mall['status_usia'] = np.where(df_mall['usia'] < 35, 'Muda', 'Senior')
# Filter hanya pelanggan segmen Muda
df_muda = df_mall[df_mall['status_usia'] == 'Muda']
# Korelasi numerik khusus segmen Muda
korelasi_muda = df_muda[['usia', 'pendapatan_juta', 'pengeluaran_juta']].corr()
fig, ax = plt.subplots(figsize=(5.5, 4.5))
sns.heatmap(
korelasi_muda,
annot=True,
fmt='.2f',
cmap='coolwarm',
vmin=-1, vmax=1,
ax=ax
)
ax.set_title('Korelasi Fitur: Segmen Usia Muda (< 35 Tahun)', fontsize=11, fontweight='bold')
plt.show()
Pembahasan:
Dengan menyaring DataFrame terlebih dahulu (df_mall['status_usia'] == 'Muda'), kita dapat mengamati apakah korelasi antarvariabel bersifat universal atau berbeda pada sub-populasi demografi tertentu. Ini adalah teknik analitis penting untuk mengidentifikasi perilaku unik segmen pasar tertentu.



Diskusi (0)
Kami menyimpan nama (opsional), komentar, dan hash teknis (bukan alamat IP asli) untuk mencegah spam. Cookie fungsional dipakai agar Anda dapat mengedit atau menghapus komentar sendiri dari browser ini. Untuk permintaan penghapusan, gunakan halaman kontak.
Belum ada komentar. Mulai diskusinya.