Topik ini mengumpulkan lima grafik kerja yang menutupi sebagian besar tugas visualisasi harian, yaitu grafik garis, diagram batang, histogram, diagram sebaran (scatter), dan box plot. Kelima grafik dibangun dalam satu skrip dari dataset nilai ujian yang sama, kemudian setiap grafik dibahas menurut tugas yang cocok untuknya dan keputusan yang menyertainya. Kejujuran grafik menjadi sorotan khusus pada diagram batang dan histogram, karena dua jenis itu paling sering menyampaikan cerita yang tidak sesuai datanya.
Skrip lima grafik#
Dataset nilai_ujian.csv berisi 24 baris nilai siswa kelas 7A dan 7B untuk matematika, fisika, dan literasi, ditambah persentase kehadiran. Satu skrip koleksi_grafik.py membaca dataset tersebut dan menyimpan lima berkas SVG, satu berkas untuk setiap jenis grafik. Ringkasan angka untuk setiap grafik dicetak ke terminal, sehingga keluaran skrip sekaligus menjadi bahan pemeriksaan nilai yang digambar.
Satu bagian data tidak berasal dari dataset, yaitu deret rata-rata tiga ujian berulang kelas 7A yang digunakan pada grafik garis. Deret [81.4, 83.1, 84.0] adalah data sintetis yang dinyatakan di sini secara eksplisit, dipilih karena demonstrasi hanya membutuhkan urutan tiga titik dengan nilai yang wajar dibandingkan rata-rata matematika kelas 7A. Jalankan skrip berikut dari direktori topiknya, lalu periksa lima SVG yang dihasilkannya.
import csv
import matplotlib.pyplot as plt
import numpy as np
with open("nilai_ujian.csv", newline="", encoding="utf-8") as f:
baris = list(csv.DictReader(f))
mat_A = [int(r["nilai_matematika"]) for r in baris if r["kelas"] == "7A"]
mat_B = [int(r["nilai_matematika"]) for r in baris if r["kelas"] == "7B"]
mat_semua = [int(r["nilai_matematika"]) for r in baris]
lit_semua = [int(r["nilai_literasi"]) for r in baris]
# 1. garis: rata-rata tiga ujian berulang kelas 7A (deret sintetis)
pengulangan = ["Ujian 1", "Ujian 2", "Ujian 3"]
rata_7a = [81.4, 83.1, 84.0]
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.plot(pengulangan, rata_7a, marker="o")
ax.set_title("Rata-rata ujian berulang kelas 7A")
ax.set_xlabel("Pengulangan ujian")
ax.set_ylabel("Rata-rata nilai")
fig.savefig("garis.svg")
print("garis :", rata_7a)
# 2. batang: rata-rata nilai matematika per kelas, berawal dari nol
kelas = ["7A", "7B"]
rata_mat = [sum(mat_A) / len(mat_A), sum(mat_B) / len(mat_B)]
fig, ax = plt.subplots(figsize=(6, 3.5))
batang = ax.bar(kelas, rata_mat, width=0.5)
ax.set_ylim(0, 100)
ax.set_ylabel("Rata-rata nilai matematika")
ax.bar_label(batang, fmt="%.2f")
fig.savefig("batang.svg")
print("batang :", [round(v, 2) for v in rata_mat])
# 3. histogram: distribusi nilai matematika seluruh siswa
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.hist(mat_semua, bins=8, edgecolor="white")
ax.set_title("Distribusi nilai matematika")
ax.set_xlabel("Nilai matematika")
ax.set_ylabel("Banyak siswa")
fig.savefig("histogram.svg")
count_8, tepi = np.histogram(mat_semua, bins=8)
count_4, _ = np.histogram(mat_semua, bins=4)
print("hist 8 bin:", count_8.tolist())
print("hist 4 bin:", count_4.tolist())
# 4. scatter: hubungan nilai literasi dan nilai matematika
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.scatter(lit_semua, mat_semua)
ax.set_xlabel("Nilai literasi")
ax.set_ylabel("Nilai matematika")
fig.savefig("sebaran.svg")
korelasi = np.corrcoef(lit_semua, mat_semua)[0, 1]
print("sebaran : korelasi =", round(korelasi, 2))
# 5. box plot: distribusi nilai matematika per kelas
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.boxplot([mat_A, mat_B], tick_labels=["7A", "7B"])
ax.set_ylabel("Nilai matematika")
fig.savefig("kotak.svg")
print("kotak : median =", [round(float(np.median(mat_A)), 1),
round(float(np.median(mat_B)), 1)])garis : [81.4, 83.1, 84.0]
batang : [81.42, 77.58]
hist 8 bin: [3, 2, 2, 4, 3, 3, 4, 3]
hist 4 bin: [5, 6, 6, 7]
sebaran : korelasi = 0.86
kotak : median = [82.0, 77.5]Keluaran memuat enam baris: satu baris deret sintetis untuk grafik garis, satu baris rata-rata kelas untuk diagram batang, dua baris hitungan bin untuk histogram, satu baris korelasi untuk diagram sebaran, dan satu baris median untuk box plot. Setiap baris dicetak tepat setelah SVG yang sesuai disimpan. Angka-angka itulah yang dibaca ulang pada lima bagian berikut.
Garis untuk tren#
Grafik garis menghubungkan titik-titik data berurutan dengan segmen garis dan menampilkan tren sepanjang sumbu horizontal yang terurut. Tugasnya menunjukkan perubahan dari satu tahap ke tahap berikutnya, sehingga sumbu x perlu menyatakan urutan yang bermakna seperti waktu atau pengulangan. Pada garis.svg, sumbu x memuat tiga pengulangan ujian dan sumbu y memuat rata-rata nilai, dengan penanda (marker) berupa titik agar setiap nilai tetap terbaca di ujung garis.
Pemetaan data ke saluran visual (encoding) pada grafik garis sederhana dan kuat: posisi vertikal titik membawa nilai, sedangkan posisi horizontal membawa urutan. Karena garis menghubungkan titik-titik yang berurutan, grafik garis hanya tepat apabila urutan antartitik benar-benar bermakna dan jarak antartitik dapat dibandingkan. Grafik garis bukan alat untuk kategori yang tidak terurut, dan kasus semacam itu lebih tepat dikerjakan dengan diagram batang.
Batang untuk perbandingan antarkelompok#
Diagram batang membandingkan nilai antarkelompok dengan panjang batang, satu batang untuk satu kelompok. Pada batang.svg, dua batang membandingkan rata-rata nilai matematika kelas 7A sebesar 81.42 dan kelas 7B sebesar 77.58, dengan label nilai di atas tiap batang melalui ax.bar_label(). Panjang batang membawa nilai, sehingga perbandingan antarkelompok dilakukan oleh pembaca melalui panjang, bukan melalui posisi ujung yang bias terhadap dasar sumbu.
Batang yang jujur berawal dari nol. Karena panjang adalah saluran yang dibaca, memotong dasar sumbu dengan ax.set_ylim(78, 82) membuat selisih antara 81.42 dan 77.58 terlihat besar, padahal selisihnya sekitar lima persen dari nilai itu sendiri. Skrip menetapkan ax.set_ylim(0, 100) secara eksplisit agar dasar sumbu berada di nol dan nol itu tampak pada gambar, bukan sekadar tersirat.
Selisih kecil tetap boleh ditampilkan, tetapi alatnya disesuaikan. Diagram titik pada skala penuh atau tabel dua baris menyampaikan angka tanpa memberi kesan berlebihan. Keputusan semacam ini kembali pada tugas visualisasi, yaitu menyampaikan perbandingan seadanya, bukan memperbesarnya.
Histogram untuk distribusi#
Histogram membagi rentang data kontinu ke dalam bin (bin), yaitu kotak berlebar sama, lalu menghitung banyak data pada setiap kotak. Tinggi batang histogram membawa hitungan, sehingga bentuk keseluruhannya menampilkan distribusi. Pada histogram.svg, nilai matematika 24 siswa dibagi ke dalam delapan bin, dengan garis tepi putih agar kotak yang bersentuhan tetap terbaca sebagai kotak terpisah.
Jumlah bin memengaruhi cerita yang terlihat. Skrip menghitung hitungan bin untuk dua pilihan: delapan bin menghasilkan [3, 2, 2, 4, 3, 3, 4, 3], sedangkan empat bin menghasilkan [5, 6, 6, 7]. Empat bin menampilkan bentuk bertangga yang merata, sedangkan delapan bin memunculkan lekukan pada rentang 67 sampai 75. Keduanya benar secara hitungan, tetapi keduanya mendorong penafsiran yang berbeda.
Histogram dibedakan dari diagram batang kategori oleh kontinuitas sumbunya. Batang histogram berdampingan tanpa celah karena sumbu x adalah skala kontinu, sedangkan batang kategori diberi jarak karena setiap batang adalah kelompok tersendiri. Mencampur kedua bentuk pada satu sumbu biasanya tanda bahwa tugasnya belum dipisahkan.
Sebaran untuk hubungan#
Diagram sebaran (scatter plot) menempatkan satu titik untuk setiap pasangan nilai pada dua sumbu angka. Tugasnya menampilkan hubungan antara dua variabel kuantitatif. Pada sebaran.svg, sumbu x membawa nilai literasi dan sumbu y membawa nilai matematika untuk 24 siswa, sehingga satu titik pada gambar adalah satu siswa.
Pola titik-titiknya naik dari kiri bawah ke kanan atas, dan korelasi yang dicetak skrip bernilai 0.86. Nilai itu menegaskan hubungan naik yang kuat antara kemampuan literasi dan nilai matematika pada data ini. Pembacaan tetap memerlukan kehati-hatian, karena korelasi tidak menjelaskan sebab, dan satu titik seperti pasangan literasi 79 dengan nilai matematika 68 memperlihatkan pengecualian yang tampak jelas pada gambar.
Kekuatan diagram sebaran ada pada kejujurannya dalam menampilkan data apa adanya tanpa agregasi. Kebalannya muncul pada data besar dengan ribuan titik yang saling menutupi, sehingga kasus semacam itu memerlukan transparansi warna atau agregasi titik. Pada 24 titik, gambar tetap terbaca tanpa pengolahan tambahan.
Box plot untuk distribusi per kelas#
Box plot merangkum distribusi satu kelompok dalam satu gambar: kotak memuat data dari kuartil pertama sampai kuartil ketiga, garis di tengah kotak menandai median, dan garis kumis (whisker) menjangkau data yang berada dalam 1,5 kali rentang antarkuartil. Data di luar jangkauan itu digambar sebagai titik pencilan (outlier). Pada kotak.svg, dua kotak membandingkan nilai matematika kelas 7A dan 7B yang diambil dari dataset yang sama.
Median yang dicetak skrip memperlihatkan selisihnya, yaitu 82.0 untuk kelas 7A dan 77.5 untuk kelas 7B, sedangkan lebar kotak keduanya mirip sehingga variasi internal kedua kelas tidak jauh berbeda. Perbandingan dua distribusi semacam ini sulit dibaca hanya dari dua rata-rata, karena rata-rata menyembunyikan variasi, sedangkan box plot menampilkannya. Angka yang dicetak pada keluaran skrip memudahkan pemeriksaan ulang median sebelum kutipannya digunakan.
Box plot paling berguna ketika jumlah kelompok cukup banyak, misalnya enam kelas sekaligus, karena enam kotak berdampingan tetap terbaca. Untuk dua kelompok, histogram berdampingan atau titik per siswa juga layak dipertimbangkan. Pilihan akhirnya tetap mengikuti pertanyaan yang dijawab, bukan jenis grafik yang sekadar tersedia.
Ringkasan#
- Grafik garis menampilkan tren pada sumbu terurut, dan diagram batang membandingkan kelompok dengan panjang yang berawal dari nol.
- Histogram menampilkan distribusi data kontinu, dan jumlah bin yang dipilih ikut membentuk cerita yang terlihat.
- Diagram sebaran menampilkan hubungan dua variabel kuantitatif satu titik per observasi.
- Box plot merangkum distribusi per kelompok dengan median, kuartil, dan pencilan dalam satu gambar.
Referensi#
- Axes API — Matplotlib — Dokumentasi metode plot, bar, hist, scatter, dan boxplot yang digunakan skrip.
- Quick start guide — Matplotlib — Pengantar resmi antarmuka berorientasi objek yang menjadi pola seluruh skrip topik ini.
- Galeri contoh grafik — Matplotlib — Galeri contoh resmi untuk setiap jenis grafik beserta kode sumbernya.