Grafik sering menunjukkan masalah data yang lolos dari ringkasan angka: pencilan tersembunyi, fitur yang tidak informatif, atau kelas yang saling tumpang tindih. Matplotlib adalah pustaka gambar standar di ekosistem Python dan menjadi alat utama untuk memantau kurva pelatihan model. Chapter ini memakai object-oriented API matplotlib (fig dan ax) agar kode tetap rapi ketika grafik menjadi kompleks, membuat empat jenis grafik dasar, lalu menutup dengan visualisasi dua kelas beserta garis keputusan — pola yang akan berulang di hampir setiap proyek klasifikasi.

Dua Antarmuka matplotlib #

Matplotlib menyediakan dua gaya penulisan. Gaya state-based memakai plt.plot(...) yang menggambar ke “sumbu aktif” — cepat untuk sketsa, tetapi membingungkan ketika satu gambar memiliki banyak panel. Gaya object-oriented (OO) membuat dua objek secara eksplisit: fig mewakili kanvas gambar penuh dan ax mewakili satu panel sumbu berisi data. Seluruh penggambaran, judul, dan label diperintahkan melalui objek ax, sehingga setiap panel dapat dikendalikan satu per satu tanpa bergantung pada status tersembunyi. Kita akan memakai gaya OO sepenuhnya pada chapter ini.

Empat Grafik Dasar #

Berkas empat-grafik.py membuat satu gambar berisi empat panel: line plot, bar chart, histogram, dan scatter plot. Data yang digambar adalah data sintetis 60 siswa dengan seed tetap, dan hasilnya disimpan sebagai berkas PNG di folder yang sama.

python
import matplotlib

matplotlib.use("Agg")

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

# Data sintetis: jam belajar dan nilai ujian 60 siswa
jam_belajar = np.random.rand(60) * 8.0
nilai = 40 + 7.5 * jam_belajar + np.random.randn(60) * 5.0

# Objek gambar dan sumbu: satu figur 2x2
fig, ax = plt.subplots(2, 2, figsize=(9, 6), constrained_layout=True)

# Grafik 1 (kiri atas): line plot fungsi sigmoid
z = np.linspace(-6, 6, 200)
ax[0, 0].plot(z, 1 / (1 + np.exp(-z)), color="tab:blue")
ax[0, 0].set_title("Fungsi aktivasi sigmoid")
ax[0, 0].set_xlabel("nilai z")
ax[0, 0].set_ylabel("sigmoid(z)")

# Grafik 2 (kanan atas): bar chart rata-rata nilai per kelompok
kelompok = ["<2 jam", "2-5 jam", ">5 jam"]
mask = [
    jam_belajar < 2,
    (jam_belajar >= 2) & (jam_belajar <= 5),
    jam_belajar > 5,
]
rata = [nilai[m].mean() for m in mask]
ax[0, 1].bar(kelompok, rata, color="tab:orange")
ax[0, 1].set_title("Rata-rata nilai per kelompok")
ax[0, 1].set_xlabel("lama belajar")
ax[0, 1].set_ylabel("rata-rata nilai")

# Grafik 3 (kiri bawah): histogram sebaran nilai
ax[1, 0].hist(nilai, bins=10, color="tab:green", edgecolor="white")
ax[1, 0].set_title("Sebaran nilai ujian")
ax[1, 0].set_xlabel("nilai")
ax[1, 0].set_ylabel("jumlah siswa")

# Grafik 4 (kanan bawah): scatter jam belajar vs nilai
ax[1, 1].scatter(jam_belajar, nilai, s=25, alpha=0.7, color="tab:red")
ax[1, 1].set_title("Jam belajar vs nilai")
ax[1, 1].set_xlabel("jam belajar")
ax[1, 1].set_ylabel("nilai")

fig.suptitle("Empat jenis grafik dasar matplotlib")
fig.savefig("empat-grafik.png", dpi=110, bbox_inches="tight")
print("grafik tersimpan: empat-grafik.png")
print("rata-rata nilai per kelompok:", np.round(rata, 2))

Output yang Dihasilkan:

text
grafik tersimpan: empat-grafik.png
rata-rata nilai per kelompok: [48.26 65.9  90.27]

Hasil gambarnya tampak seperti berikut:

Empat panel grafik: kurva sigmoid, bar chart rata-rata per kelompok, histogram sebaran nilai, dan scatter jam belajar terhadap nilai

Mari kita telaah kode di atas baris per baris:

  1. Baris 3 (matplotlib.use("Agg")): backend Agg menggambar ke berkas tanpa layar grafis. Pada skrip yang berjalan di server atau lingkungan tanpa tampilan, backend ini mencegah galat pembukaan jendela.
  2. Baris 13 (fig, ax = plt.subplots(2, 2, ...)): satu panggilan menghasilkan kanvas fig dan array sumbu ax berukuran 2x2 — total empat panel. Parameter figsize=(9, 6) mengatur ukuran gambar dalam inci.
  3. Baris 17 (ax[0, 0].plot(z, ...)): panel kiri atas menerima line plot kurva sigmoid; akses panel memakai indeks baris-kolom pada array ax.
  4. Baris 26-31 (mask = [...]): tiga filter boolean NumPy membagi siswa ke tiga kelompok lama belajar, lalu nilai[m].mean() menghitung rata-rata tiap kelompok — pola penyaringan dari Chapter pandas tetap berlaku di NumPy.
  5. Baris 35 (ax[0, 1].bar(...)): bar chart membandingkan rata-rata tiga kelompok; keluaran teks memperlihatkan nilai 48.26, 65.9, dan 90.27.
  6. Baris 41 (ax[1, 0].hist(nilai, bins=10)): histogram membagi rentang nilai ke 10 wadah dan menghitung jumlah siswa per wadah.
  7. Baris 47 (ax[1, 1].scatter(...)): scatter plot menampilkan pasangan (jam belajar, nilai) sebagai titik; parameter alpha=0.7 membuat titik bertumpuk tetap terbaca.
  8. Baris 55 (fig.savefig("empat-grafik.png", dpi=110, ...)): savefig menulis gambar ke berkas — setiap panel memuat judul dan label sumbu sendiri karena ditetapkan per ax.

Scatter Dua Kelas dan Garis Keputusan #

Pola visualisasi paling penting di klasifikasi adalah sebaran kelas pada bidang fitur. Berkas sebar-kelas.py membuat dua kelompok titik sintetis, menggambar keduanya dengan warna berbeda, menambahkan garis keputusan sederhana, lalu menghitung akurasi garis tersebut.

python
import matplotlib

matplotlib.use("Agg")

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

# Data sintetis dua kelas yang saling berdekatan
n = 50
kelas0 = np.random.randn(n, 2) * 2.0 + np.array([2.0, 2.5])
kelas1 = np.random.randn(n, 2) * 2.0 + np.array([5.0, 5.5])

fig, ax = plt.subplots(figsize=(6.5, 5.5), constrained_layout=True)
ax.scatter(kelas0[:, 0], kelas0[:, 1], s=25, alpha=0.8, label="Kelas 0")
ax.scatter(kelas1[:, 0], kelas1[:, 1], s=25, alpha=0.8, label="Kelas 1")

# Garis keputusan sederhana: titik dengan fitur1 + fitur2 >= 7.5 masuk Kelas 1
batas_x = np.array([-4.0, 10.0])
batas_y = 7.5 - batas_x
ax.plot(batas_x, batas_y, "k--", linewidth=2, label="Garis keputusan")

ax.set_xlabel("Fitur 1")
ax.set_ylabel("Fitur 2")
ax.set_title("Sebaran dua kelas dan garis keputusan")
ax.legend(loc="upper left")
fig.savefig("sebar-kelas.png", dpi=110, bbox_inches="tight")
print("grafik tersimpan: sebar-kelas.png")

# Akurasi garis keputusan sederhana pada data latih
prediksi0 = (kelas0.sum(axis=1) >= 7.5).astype(int)
prediksi1 = (kelas1.sum(axis=1) >= 7.5).astype(int)
benar = np.sum(prediksi0 == 0) + np.sum(prediksi1 == 1)
print(f"prediksi benar: {benar} dari {2 * n} titik")
print(f"akurasi       : {benar / (2 * n):.2%}")

Output yang Dihasilkan:

text
grafik tersimpan: sebar-kelas.png
prediksi benar: 88 dari 100 titik
akurasi       : 88.00%

Sebaran titik dua kelas dengan garis putus-putus sebagai pemisah; sebagian kecil titik berada di sisi yang keliru

Mari kita telaah kode di atas baris per baris:

  1. Baris 14-15 (kelas0 = ..., kelas1 = ...): setiap kelas adalah 50 titik acak berdistribusi normal yang digeser ke pusat berbeda — kelas 0 di sekitar (2.0, 2.5) dan kelas 1 di sekitar (5.0, 5.5). Penyebaran * 2.0 membuat kedua kelompok saling mendekat, sehingga pemisahan tidak sempurna.
  2. Baris 18-20 (ax.scatter(...)): kedua kelas digambar pada sumbu yang sama dengan label berbeda. Pemanggilan scatter dua kali menghasilkan dua warna otomatis dan dua entri pada legend.
  3. Baris 23-25 (batas_y = 7.5 - batas_x): garis keputusan mengikuti aturan fitur1 + fitur2 = 7.5, dihitung pada dua titik ujung lalu digambar bergaris putus-putus dengan format "k--". Titik di atas garis diprediksi masuk Kelas 1.
  4. Baris 32 (ax.legend(loc="upper left")): legend menampilkan nama setiap kelas dan garis keputusan sesuai parameter label yang kita isi saat menggambar.
  5. Baris 35-40 (prediksi0 = ...): kelas0.sum(axis=1) menjumlahkan kedua fitur setiap titik, hasilnya dibandingkan dengan ambang 7.5, lalu dihitung berapa titik yang garis ini pisahkan dengan benar. Akurasi 88% memperlihatkan garis lurus sederhana sudah cukup baik, tetapi 12 titik tetap berada di sisi yang keliru — tugas model yang akan kita bangun adalah menemukan pemisah yang lebih baik.

Memilih Jenis Grafik #

Tabel berikut memetakan jenis grafik ke pemakaian paling umum dalam proyek deep learning:

Jenis grafikFungsiPemakaian khas di deep learning
Lineax.plot(x, y)Kurva loss dan akurasi per epoch
Scatterax.scatter(x, y)Sebaran fitur, proyeksi embedding dua dimensi
Barax.bar(label, nilai)Perbandingan metrik antar model
Histogramax.hist(data, bins=...)Sebaran fitur, distribusi bobot, analisis galat
Heatmapax.imshow(matriks)Matriks konfusi dan visualisasi citra

Galeri contoh resmi matplotlib di matplotlib.org/stable/gallery memuat ratusan resep grafik siap pakai, dan panduan pemula tersedia di matplotlib.org/stable/tutorials .

Visualisasi membantu kita memahami data dan hasil model, tetapi ada satu ranah yang tidak terlihat pada grafik: keandalan angka di balik layar. Pembulatan titik mengambang, nilai inf dan NaN, sampai softmax yang meluap akan kita bedah pada Chapter komputasi numerik — fondasi terakhir sebelum membangun neural network.