📘 Pertemuan 5 - Visualisasi Data dengan Matplotlib dan Seaborn
🎯 Tujuan Pembelajaran
- Memahami pentingnya visualisasi dalam data sains
- Menggunakan Matplotlib untuk membuat grafik dasar
- Menggunakan Seaborn untuk visualisasi statistik
- Memilih jenis grafik yang tepat untuk data tertentu
- Membuat visualisasi informatif dan menarik
🧩 1. Pengenalan Visualisasi Data
Visualisasi Data adalah representasi grafis dari informasi dan data menggunakan elemen visual seperti chart, grafik, dan map.
Mengapa Visualisasi Penting?
- 🧠 Manusia memproses visual 60,000x lebih cepat dari teks
- 📊 Mudah menemukan pattern, trend, dan outlier
- 💡 Komunikasi insight kompleks dengan sederhana
- 🎯 Storytelling data yang powerful
Jenis Grafik dan Kegunaannya
| Jenis Grafik | Kegunaan | Contoh |
|---|---|---|
| Bar Chart | Perbandingan kategori | Penjualan per produk |
| Line Chart | Tren waktu | Harga saham |
| Histogram | Distribusi data | Distribusi umur |
| Scatter Plot | Hubungan variabel | Tinggi vs berat |
| Box Plot | Sebaran & outlier | Gaji per dept |
| Pie Chart | Proporsi bagian | Market share |
📦 2. Import Library dan Dataset
# Import library visualisasi
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Setting style
plt.style.use('seaborn-v0_8')
sns.set_palette("husl")
# Dataset contoh
data = {
"Mahasiswa": ["Ani", "Budi", "Cici", "Dodi", "Eka", "Fajar"],
"Nilai_UTS": [85, 70, 90, 65, 75, 88],
"Nilai_UAS": [88, 75, 92, 68, 80, 85],
"Kehadiran": [95, 80, 100, 70, 85, 90]
}
df = pd.DataFrame(data)
print(df)
📊 3. Visualisasi dengan Matplotlib
a. Bar Chart - Grafik Batang
# Bar Chart sederhana
plt.figure(figsize=(10, 6))
plt.bar(df["Mahasiswa"], df["Nilai_UTS"], color='crimson', edgecolor='black', alpha=0.7)
plt.title("Nilai UTS Mahasiswa", fontsize=14, fontweight='bold')
plt.xlabel("Mahasiswa")
plt.ylabel("Nilai")
plt.ylim(0, 100)
plt.grid(axis='y', alpha=0.3)
# Tambahkan nilai di atas bar
for i, v in enumerate(df["Nilai_UTS"]):
plt.text(i, v + 2, str(v), ha='center', fontweight='bold')
plt.tight_layout()
plt.show()
# Grouped Bar Chart
x = np.arange(len(df["Mahasiswa"]))
width = 0.35
plt.figure(figsize=(12, 6))
bars1 = plt.bar(x - width/2, df["Nilai_UTS"], width, label='UTS', color='#c31432')
bars2 = plt.bar(x + width/2, df["Nilai_UAS"], width, label='UAS', color='#e74c3c')
plt.xlabel('Mahasiswa', fontweight='bold')
plt.ylabel('Nilai', fontweight='bold')
plt.title('Perbandingan Nilai UTS dan UAS', fontsize=14, fontweight='bold')
plt.xticks(x, df["Mahasiswa"])
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
b. Line Chart - Grafik Garis
# Data time series
bulan = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun']
penjualan = [120, 135, 128, 150, 165, 170]
plt.figure(figsize=(12, 6))
plt.plot(bulan, penjualan, marker='o', linewidth=2.5, markersize=10,
color='#c31432', label='Penjualan 2024')
plt.title('Tren Penjualan Bulanan', fontsize=16, fontweight='bold')
plt.xlabel('Bulan', fontsize=12)
plt.ylabel('Penjualan (Unit)', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
c. Scatter Plot - Hubungan Variabel
# Scatter plot
plt.figure(figsize=(10, 6))
plt.scatter(df["Nilai_UTS"], df["Nilai_UAS"], s=200,
c=df["Kehadiran"], cmap='RdYlGn',
edgecolor='black', alpha=0.7)
plt.colorbar(label='Kehadiran (%)')
plt.title('Hubungan Nilai UTS vs UAS', fontsize=14, fontweight='bold')
plt.xlabel('Nilai UTS')
plt.ylabel('Nilai UAS')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
d. Histogram - Distribusi Data
# Generate data random
np.random.seed(42)
nilai = np.random.normal(75, 10, 100)
plt.figure(figsize=(10, 6))
plt.hist(nilai, bins=20, color='crimson', edgecolor='black', alpha=0.7)
plt.axvline(nilai.mean(), color='blue', linestyle='--', linewidth=2,
label=f'Mean: {nilai.mean():.1f}')
plt.title('Distribusi Nilai Mahasiswa', fontsize=14, fontweight='bold')
plt.xlabel('Nilai')
plt.ylabel('Frekuensi')
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
📈 4. Visualisasi dengan Seaborn
a. Box Plot - Sebaran Data
# Box plot
plt.figure(figsize=(10, 6))
sns.boxplot(data=df[["Nilai_UTS", "Nilai_UAS", "Kehadiran"]], palette="Set2")
plt.title('Distribusi Nilai dan Kehadiran', fontsize=14, fontweight='bold')
plt.ylabel('Nilai/Persentase')
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
b. Heatmap - Korelasi
# Heatmap korelasi
correlation = df[["Nilai_UTS", "Nilai_UAS", "Kehadiran"]].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation, annot=True, cmap='RdYlGn', center=0,
square=True, linewidths=2, fmt='.2f', vmin=-1, vmax=1)
plt.title('Heatmap Korelasi', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
📊 5. Studi Kasus - Dashboard Analisis
🛒 Dashboard Penjualan E-Commerce
Membuat dashboard komprehensif untuk analisis penjualan
# Data penjualan
bulan = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun']
elektronik = [120, 135, 145, 160, 170, 180]
fashion = [80, 85, 90, 95, 100, 110]
# Dashboard 2x2
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
fig.suptitle('Dashboard Analisis Penjualan', fontsize=18, fontweight='bold')
# Plot 1: Line chart tren
axes[0, 0].plot(bulan, elektronik, marker='o', linewidth=2, label='Elektronik', color='#c31432')
axes[0, 0].plot(bulan, fashion, marker='s', linewidth=2, label='Fashion', color='#2ecc71')
axes[0, 0].set_title('Tren Penjualan', fontweight='bold')
axes[0, 0].set_xlabel('Bulan')
axes[0, 0].set_ylabel('Penjualan')
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)
# Plot 2: Bar chart perbandingan
x = np.arange(len(bulan))
width = 0.35
axes[0, 1].bar(x - width/2, elektronik, width, label='Elektronik', color='#c31432', alpha=0.8)
axes[0, 1].bar(x + width/2, fashion, width, label='Fashion', color='#2ecc71', alpha=0.8)
axes[0, 1].set_title('Perbandingan Penjualan', fontweight='bold')
axes[0, 1].set_xlabel('Bulan')
axes[0, 1].set_ylabel('Penjualan')
axes[0, 1].set_xticks(x)
axes[0, 1].set_xticklabels(bulan)
axes[0, 1].legend()
axes[0, 1].grid(axis='y', alpha=0.3)
# Plot 3: Pie chart market share
total = [sum(elektronik), sum(fashion)]
labels = ['Elektronik', 'Fashion']
colors = ['#c31432', '#2ecc71']
axes[1, 0].pie(total, labels=labels, autopct='%1.1f%%', colors=colors, startangle=90)
axes[1, 0].set_title('Market Share', fontweight='bold')
# Plot 4: Box plot distribusi
data_dist = [elektronik, fashion]
axes[1, 1].boxplot(data_dist, labels=['Elektronik', 'Fashion'], patch_artist=True)
axes[1, 1].set_title('Distribusi Penjualan', fontweight='bold')
axes[1, 1].set_ylabel('Penjualan')
axes[1, 1].grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
# Statistik
print("="*60)
print("ANALISIS STATISTIK")
print("="*60)
print(f"Total Penjualan Elektronik: {sum(elektronik)} unit")
print(f"Total Penjualan Fashion: {sum(fashion)} unit")
print(f"Rata-rata Elektronik: {np.mean(elektronik):.1f} unit/bulan")
print(f"Rata-rata Fashion: {np.mean(fashion):.1f} unit/bulan")
💡 Best Practices Visualisasi:
- Pilih grafik yang tepat untuk tipe data Anda
- Gunakan warna yang konsisten dan mudah dibedakan
- Berikan judul, label axis, dan legend yang jelas
- Hindari visualisasi yang terlalu kompleks
- Pertimbangkan colorblind-friendly palette
- Tambahkan annotations untuk context penting
🧩 6. Latihan Mandiri
Latihan 1: Visualisasi Data Cuaca
- Buat dataset suhu harian 30 hari (random 25-35°C)
- Buat line chart tren suhu
- Tambahkan moving average 7 hari
- Highlight suhu tertinggi dan terendah
Latihan 2: Dashboard Nilai
- Buat dataset 20 mahasiswa dengan nilai
- Buat 4 visualisasi: histogram, box plot, scatter, bar
- Arrange dalam satu dashboard
- Tambahkan styling yang menarik
✍️ Kesimpulan
Pada pertemuan ini, mahasiswa telah mempelajari:
- ✅ Pentingnya visualisasi dalam data sains
- ✅ Jenis-jenis grafik dan kegunaannya
- ✅ Matplotlib untuk visualisasi dasar
- ✅ Seaborn untuk visualisasi statistik
- ✅ Membuat dashboard analisis lengkap
- ✅ Best practices visualisasi data
Pertemuan selanjutnya: Pembersihan dan Transformasi Data