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 rCara membaca
mendekati +1naik bersama; hubungan lurus yang kuat
sekitar 0tidak ada pola lurus yang berarti
mendekati −1berlawanan 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.

python
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:

text
   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.8

Mari kita telaah baris-barisnya:

  1. 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.
  2. Baris 12 (to_string(index=False)): tabel dicetak tanpa nomor indeks agar kolomnya terbaca rapi sebagai data, bukan sebagai daftar indeks.
  3. Baris 14 (corr()): method corr() 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:

python
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:

  1. Baris 12-15 (loop per kelompok): untuk tiap jenis hari, zip() memasangkan suhu dan gelas, lalu filter if j == kelompok mengambil hanya titik milik kelompok itu — cara manual yang transparan untuk mewarnai per kategori.
  2. Baris 17 (np.corrcoef(...)): korelasi dihitung ulang di dalam blok agar anotasi selalu konsisten dengan data yang sedang digambar.
  3. Baris 18 (ax.text(..., transform=ax.transAxes)): dengan transAxes, 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:

python
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 #

  1. Seaborn — scatterplot — dokumentasi resmi scatter plot pada seaborn, termasuk pewarnaan per kategori.
  2. Matplotlib — Plot Types — referensi resmi scatter plot dan line plot beserta opsi penandanya.