Apakah hari yang panas menjual lebih banyak es kopi susu? Pertanyaan seperti ini menyangkut dua variabel numerik sekaligus — suhu dan penjualan — dan tidak bisa dijawab oleh satu grafik perbandingan maupun satu histogram. Keluarga grafik hubungan menjawabnya dengan menempatkan tiap pengamatan sebagai satu titik pada bidang dua sumbu, sehingga pola keterkaitannya terlihat langsung. Pada chapter ini kita bedah scatter plot sebagai alat utamanya, cara mewarnai titik per kategori, cara membaca dan menganotasi koefisien korelasi, serta kapan garis lebih tepat dipakai daripada titik.
Membaca Scatter Plot: Arah, Bentuk, Kekuatan #
Scatter plot menggambarkan setiap baris data sebagai satu titik: nilai variabel pertama menjadi posisi mendatar, nilai variabel kedua menjadi posisi tegak. Membacanya berarti menilai tiga hal. Arah: ketika nilai kedua variabel cenderung naik bersama, hubungannya positif; ketika yang satu naik dan yang lain turun, hubungannya negatif. Bentuk: apakah titik-titik mengikuti garis lurus, garis melengkung, atau tidak berpola sama sekali. Kekuatan: seberapa rapat titik-titik menempel pada pola tersebut — makin rapat, makin kuat hubungannya.
Ketiganya tertangkap dalam sekali pandang, itulah keunggulan scatter plot dibanding angka. Koefisien korelasi Pearson (lazim dilambangkan r) merangkum arah dan kekuatan pola lurus tersebut menjadi satu angka antara −1 dan +1:
| Nilai r | Cara membaca |
|---|---|
| mendekati +1 | naik bersama; hubungan lurus yang kuat |
| sekitar 0 | tidak ada pola lurus yang berarti |
| mendekati −1 | berlawanan arah; hubungan lurus yang kuat |
Angka r yang besar tetap tidak menggantikan gambar. Korelasi hanya menangkap pola lurus, sedangkan pola melengkung atau kelompok yang terpisah bisa menghasilkan r kecil padahal hubungannya kuat — karena itu kita selalu gambar scatter plot-nya lebih dulu, lalu gunakan r sebagai rangkuman.
Scatter Plot dengan Warna per Kategori #
Kita pakai data Toko Kopi Kita: suhu tertinggi dan penjualan es kopi susu selama empat belas hari pertama Juli. Satu kolom tambahan, jenis hari, akan kita pakai sebagai warna titik agar terlihat apakah pola suhu berlaku sama untuk hari kerja dan akhir pekan.
import pandas as pd
cuaca = pd.DataFrame({
"hari": [f"{i} Juli" for i in range(1, 15)],
"suhu": [29, 31, 33, 30, 28, 32, 34, 30, 29, 31, 35, 33, 32, 30],
"gelas": [20, 21, 33, 19, 16, 27, 25, 29, 14, 28, 36, 28, 31, 21],
"jenis": ["kerja", "kerja", "kerja", "akhir pekan", "akhir pekan",
"kerja", "kerja", "kerja", "kerja", "kerja",
"akhir pekan", "akhir pekan", "kerja", "kerja"],
})
print(cuaca.to_string(index=False))
print()
r = cuaca["suhu"].corr(cuaca["gelas"])
print("Korelasi suhu vs gelas terjual (r):", round(r, 2))Output yang Dihasilkan:
hari suhu gelas jenis
1 Juli 29 20 kerja
2 Juli 31 21 kerja
3 Juli 33 33 kerja
4 Juli 30 19 akhir pekan
5 Juli 28 16 akhir pekan
6 Juli 32 27 kerja
7 Juli 34 25 kerja
8 Juli 30 29 kerja
9 Juli 29 14 kerja
10 Juli 31 28 kerja
11 Juli 35 36 akhir pekan
12 Juli 33 28 akhir pekan
13 Juli 32 31 kerja
14 Juli 30 21 kerja
Korelasi suhu vs gelas terjual (r): 0.8Mari kita telaah baris-barisnya:
- Baris 3-10 (
pd.DataFrame({...})): empat belas baris data — satu baris satu hari — dengan empat kolom; bentuk “satu baris satu pengamatan” inilah bahan baku scatter plot. - Baris 12 (
to_string(index=False)): tabel dicetak tanpa nomor indeks agar kolomnya terbaca rapi sebagai data, bukan sebagai daftar indeks. - Baris 14 (
corr()): methodcorr()pada pandas menghitung korelasi Pearson dua kolom; hasilnya 0,8 — positif dan kuat, tetapi masih menyisakan sebaran yang layak dilihat sebagai gambar.
Sekarang kita gambar, dengan warna yang mengikuti jenis hari dan nilai r yang ditanam langsung pada bidang gambar:
import matplotlib.pyplot as plt
import numpy as np
suhu = [29, 31, 33, 30, 28, 32, 34, 30, 29, 31, 35, 33, 32, 30]
gelas = [20, 21, 33, 19, 16, 27, 25, 29, 14, 28, 36, 28, 31, 21]
jenis = ["kerja", "kerja", "kerja", "akhir pekan", "akhir pekan",
"kerja", "kerja", "kerja", "kerja", "kerja",
"akhir pekan", "akhir pekan", "kerja", "kerja"]
warna = {"kerja": "tab:blue", "akhir pekan": "tab:orange"}
fig, ax = plt.subplots(figsize=(6, 4))
for kelompok, warna_kelompok in warna.items():
x = [s for s, j in zip(suhu, jenis) if j == kelompok]
y = [g for g, j in zip(gelas, jenis) if j == kelompok]
ax.scatter(x, y, color=warna_kelompok, label=kelompok, s=70)
r = np.corrcoef(suhu, gelas)[0, 1]
ax.text(0.05, 0.92, f"r = {r:.2f}", transform=ax.transAxes)
ax.set_title("Suhu Udara vs Penjualan Es Kopi Susu")
ax.set_xlabel("Suhu tertinggi (derajat Celsius)")
ax.set_ylabel("Gelas terjual")
ax.legend(title="Jenis hari")
plt.show()Gambar yang muncul memuat empat belas titik yang memanjat dari kiri bawah ke kanan atas: hari terdingin 28 derajat hanya menjual 16 gelas, sedangkan hari terpanas 35 derajat menjual 36 gelas. Titik biru (hari kerja) dan oranye (akhir pekan) berbaur sepanjang jalur menanjak — pola suhu berlaku untuk keduanya tanpa perbedaan yang menonjol. Dua titik sedikit melenceng dari jalurnya, yaitu hari 34 derajat dengan 25 gelas dan hari 30 derajat dengan 29 gelas; sebaran kecil seperti inilah yang membuat r berhenti di 0,80, bukan di angka yang lebih dekat ke 1. Teks “r = 0.80” tertulis di pojok kiri atas sebagai pengingat ringkasan.
Tiga keputusan teknis di blok tersebut perlu dicatat:
- Baris 12-15 (loop per kelompok): untuk tiap jenis hari,
zip()memasangkan suhu dan gelas, lalu filterif j == kelompokmengambil hanya titik milik kelompok itu — cara manual yang transparan untuk mewarnai per kategori. - Baris 17 (
np.corrcoef(...)): korelasi dihitung ulang di dalam blok agar anotasi selalu konsisten dengan data yang sedang digambar. - Baris 18 (
ax.text(..., transform=ax.transAxes)): dengantransAxes, koordinat (0.05, 0.92) berarti 5% dari lebar dan 92% dari tinggi bidang — posisi relatif yang tetap aman betapapun rentang datanya.
Kapan Garis Lebih Tepat daripada Titik #
Scatter plot memperlakukan kedua sumbu setara: tiap titik berdiri sendiri. Ketika sumbu mendatar memiliki urutan alami — waktu, dosis, tingkat — dan setiap nilai hanya muncul sekali, garis yang menghubungkan titik-titik menegaskan kesinambungan itu dan membuat pergerakan naik-turun lebih mudah diikuti. Tanpa urutan, garis justru menyesatkan pembaca seolah ada perjalanan antar titik — pesan yang sama dengan kesalahan line chart untuk kategori pada chapter Memilih Jenis Grafik.
Berikut jumlah pelanggan Toko Kopi Kita sepanjang jam buka, dari 07:00 sampai 21:00:
import matplotlib.pyplot as plt
jam = [f"{h:02d}:00" for h in range(7, 22)]
pelanggan = [12, 18, 26, 31, 28, 22, 18, 20, 24, 30, 34, 27, 21, 15, 9]
fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(jam, pelanggan, marker="o", color="tab:blue")
ax.set_title("Pelanggan Sepanjang Jam Buka")
ax.set_xlabel("Jam")
ax.set_ylabel("Pelanggan")
ax.grid(True)
plt.show()Grafiknya berupa satu garis biru yang menghubungkan lima belas titik berpenanda lingkaran. Bentuknya dua gelombang: pelanggan naik tajam dari 12 orang pada 07:00 menuju puncak pagi 31 orang pada 10:00, melandai turun ke titik terendah siang 18 orang pada 13:00, lalu memanjak lagi ke puncak sore 34 orang pada 17:00 sebelum akhirnya merosot ke 9 orang saat tutup pada 21:00. Penanda lingkaran menjaga nilai tiap jam tetap bisa dibaca persis, sementara garis memperlihatkan aliran pergerakannya — kombinasi yang tepat untuk sumbu berurutan seperti ini.
Ketika titiknya berjumlah ratusan, scatter plot biasa mulai bertumpuk dan menyembunyikan kepadatan; masalah itu beserta solusinya — transparansi, jitter, hingga membaca pencilan — kita bedah tuntas pada chapter Scatter Plot.
Rangkuman #
- Grafik hubungan menjawab pertanyaan “apakah dua variabel bergerak bersama?”; tiap baris data menjadi satu titik pada bidang dua sumbu.
- Membaca scatter plot berarti menilai arah, bentuk, dan kekuatan pola; koefisien korelasi r merangkum pola lurus menjadi angka antara −1 dan +1.
- Warna per kategori menambahkan dimensi ketiga tanpa menambah sumbu; anotasi
ax.text()menempatkan nilai r langsung pada bidang gambar. - Korelasi kuat bukan bukti sebab-akibat, dan r tidak menangkap pola melengkung — selalu lihat gambarnya.
- Sumbu berurutan seperti waktu memakai garis yang menghubungkan titik; sumbu tanpa urutan tetap memakai titik lepas.
Hubungan suhu dan penjualan terlihat dari titik-titik yang menanjak; namun saat pertanyaannya berubah menjadi “bagaimana perkembangannya dari bulan ke bulan?”, sumbu waktu-lah yang naik ke peran utama. Chapter berikutnya, Grafik Deret Waktu, mengurus sumbu tanggal secara khusus.
Referensi #
- Seaborn — scatterplot — dokumentasi resmi scatter plot pada seaborn, termasuk pewarnaan per kategori.
- Matplotlib — Plot Types — referensi resmi scatter plot dan line plot beserta opsi penandanya.