Line plot, bar plot, dan histogram masing-masing hanya melihat satu deret nilai pada satu waktu. Pertanyaan analisis yang lain menuntut pasangan nilai: “apakah biaya promo yang lebih besar diikuti penjualan yang lebih tinggi?” Untuk pertanyaan seperti itu kita memakai scatter plot — satu titik untuk setiap baris data, dengan sumbu x dari satu kolom dan sumbu y dari kolom lain. Pada pandas, method .plot.scatter() mewajibkan parameter x dan y; pandas tidak menebak kolom mana yang dimaksud.

Dataset Kampanye Promo #

Skrip berikut memuat data 12 kampanye promo toko: biaya promo dalam ribu rupiah, unit yang terjual, dan persentase diskon yang berjalan. Skrip menghitung dulu korelasi kedua kolom utamanya, lalu menggambar scatter plot dasar dan varian berwarna:

python
import matplotlib

matplotlib.use("Agg")
import pandas as pd
from pathlib import Path

promo = pd.DataFrame(
    {
        "biaya_promo": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
        "unit_terjual": [148, 187, 160, 197, 248, 225, 270, 307, 276, 335, 318, 379],
        "diskon": [0, 5, 0, 10, 5, 10, 5, 15, 10, 15, 20, 15],
    }
)
print(promo)
print("\nKorelasi biaya_promo vs unit_terjual:",
      round(promo["biaya_promo"].corr(promo["unit_terjual"]), 2))

ax = promo.plot.scatter(x="biaya_promo", y="unit_terjual", figsize=(8, 4))
print("\nTipe objek    :", type(ax).__name__)
print("Jumlah titik  :", len(ax.collections[0].get_offsets()))
print("Label sumbu x :", repr(ax.get_xlabel()))
print("Label sumbu y :", repr(ax.get_ylabel()))

ax.get_figure().savefig("scatter_promo.png", dpi=100)
print("\nPlot tersimpan sebagai scatter_promo.png")

ax_warna = promo.plot.scatter(
    x="biaya_promo", y="unit_terjual", c="diskon", cmap="viridis", s=80, figsize=(8, 4)
)
print("\nVarian warna:")
print("Jumlah titik  :", len(ax_warna.collections[0].get_offsets()))
print("Colorbar label:", repr(ax_warna.collections[0].colorbar.ax.get_ylabel()))

Path("scatter_promo.png").unlink()

Output yang Dihasilkan:

text
    biaya_promo  unit_terjual  diskon
0            10           148       0
1            15           187       5
2            20           160       0
3            25           197      10
4            30           248       5
5            35           225      10
6            40           270       5
7            45           307      15
8            50           276      10
9            55           335      15
10           60           318      20
11           65           379      15

Korelasi biaya_promo vs unit_terjual: 0.96

Tipe objek    : Axes
Jumlah titik  : 12
Label sumbu x : 'biaya_promo'
Label sumbu y : 'unit_terjual'

Plot tersimpan sebagai scatter_promo.png

Varian warna:
Jumlah titik  : 12
Colorbar label: 'diskon'

Angka korelasi 0.96 sudah mengisyaratkan hubungan yang kuat, dan scatter plot membuatnya terlihat: titik-titik naik dari kiri bawah ke kanan atas. Hubungannya tidak sempurna — bandingkan titik di biaya 15 (187 unit) dengan titik di biaya 20 (160 unit); biaya lebih besar justru diikuti penjualan lebih rendah. Justru penyimpangan semacam ini yang baru tampak pada gambar, bukan pada angka korelasi tunggal.

Pada output, len(ax.collections[0].get_offsets()) bernilai 12 — jumlah titik sama dengan jumlah baris — dan label kedua sumbu terisi otomatis dari nama kolom, 'biaya_promo' dan 'unit_terjual'.

Arah hubungan terbaca dari kemiringan awan titik: naik ke kanan berarti hubungan positif, turun ke kanan berarti hubungan negatif, dan menyebar tanpa pola berarti kedua kolom praktis tidak berkaitan. Kekuatan hubungan terbaca dari rapatnya titik mengikuti sebuah garis imajiner; semakin renggang sebarannya, semakin lemah hubungan itu. Dua pembacaan ini persis yang diringkas menjadi satu angka oleh koefisien korelasi, sehingga scatter plot dan corr() saling melengkapi — angka untuk membandingkan banyak pasangan sekaligus, gambar untuk memeriksa bentuk hubungan yang tak tersentuh angka. Ingat pula batas interpretasinya: korelasi menunjukkan kedua kolom bergerak bersama, bukan membuktikan salah satunya menyebabkan yang lain.

Menambahkan Dimensi Warna #

Pemanggilan kedua menambahkan parameter c="diskon", cmap="viridis", dan s=80:

  1. Baris 27-29 (c="diskon", cmap="viridis", s=80): warna tiap titik diambil dari kolom diskon, gradasi warna memakai colormap viridis milik Matplotlib, dan s=80 memperbesar ukuran titik.
  2. Baris 32 (colorbar.ax.get_ylabel()): karena c merujuk ke kolom, pandas menambahkan colorbar berlabel 'diskon' di sisi gambar — pembaca gambar jadi tahu makna gradasi warnanya.

Dengan kolom c, satu gambar kini memuat tiga informasi sekaligus: posisi horizontal dari biaya promo, posisi vertikal dari unit terjual, dan gradasi warna dari diskon. Pada data kita pola warnanya belum menunjukkan kecenderungan khusus, tetapi pada data nyata teknik ini sering memunculkan kelompok — misalnya titik-titik diskon tinggi yang menonjol dari awan utama. Ukuran titik juga bisa dijadikan dimensi keempat lewat parameter s yang merujuk ke kolom, membentuk yang sering disebut bubble plot.

Scatter plot satu pasang kolom mudah dibaca, tetapi dataset dengan lima kolom numerik memiliki sepuluh pasangan berbeda. Menggambarnya satu per satu melelahkan; chapter berikutnya mengotomatiskannya lewat matriks korelasi dan scatter matrix.

Referensi resmi: pandas.DataFrame.plot.scatter yang merinci parameter x, y, c, dan s, serta user guide visualization yang menampilkan contoh scatter plot dengan bubble size.