📘 Pertemuan 5 - Visualisasi Data dengan Matplotlib dan Seaborn

🎯 Tujuan Pembelajaran

  1. Memahami pentingnya visualisasi dalam data sains
  2. Menggunakan Matplotlib untuk membuat grafik dasar
  3. Menggunakan Seaborn untuk visualisasi statistik
  4. Memilih jenis grafik yang tepat untuk data tertentu
  5. 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

  1. Buat dataset suhu harian 30 hari (random 25-35°C)
  2. Buat line chart tren suhu
  3. Tambahkan moving average 7 hari
  4. Highlight suhu tertinggi dan terendah

Latihan 2: Dashboard Nilai

  1. Buat dataset 20 mahasiswa dengan nilai
  2. Buat 4 visualisasi: histogram, box plot, scatter, bar
  3. Arrange dalam satu dashboard
  4. 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