Angka korelasi yang kita hitung pada chapter scatter plot hanya mencakup satu pasangan kolom. Dataset kampanye promo dengan empat kolom numerik memiliki enam pasangan sekaligus — menghitung dan membacanya satu per satu melelahkan dan mudah terlewat. Chapter ini merangkum ke enam pasangan tersebut: dulu sebagai matriks korelasi berbentuk tabel, lalu sebagai scatter matrix yang menggambar seluruh pasangan dalam satu gambar. Di tengah jalan kita juga bertemu perilaku pandas 3.0 yang perlu diwaspadai: corr() meminta kolom numerik secara eksplisit.
Matriks Korelasi dan Parameter numeric_only #
Method df.corr() menghitung koefisien korelasi untuk setiap pasangan kolom numerik. Pada pandas 3.0.6, bawaan numeric_only=False membuat method tersebut menolak DataFrame yang memuat kolom teks — persis dataset kampanye kita yang punya kolom kota:
import numpy as np
import pandas as pd
kampanye = pd.DataFrame(
{
"kota": ["Jakarta", "Bandung", "Surabaya", "Medan", "Semarang", "Makassar",
"Palembang", "Denpasar", "Bogor", "Malang", "Balikpapan", "Manado"],
"biaya_promo": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
"pengunjung": [125, 170, 180, 265, 310, 300, 400, 440, 460, 510, 545, 600],
"unit_terjual": [45, 70, 58, 105, 128, 115, 170, 150, 205, 182, 245, 215],
"jam_tayang": [12, 4, 18, 6, 15, 9, 20, 5, 14, 8, 3, 11],
}
)
print("Kolom dataset:", kampanye.columns.tolist())
try:
kampanye.corr()
except ValueError as e:
print("corr() tanpa numeric_only gagal:", str(e).splitlines()[0])
korelasi = kampanye.corr(numeric_only=True).round(2)
print("\nMatriks korelasi:")
print(korelasi)
tanpa_diagonal = korelasi.where(~np.eye(len(korelasi), dtype=bool))
terkuat = tanpa_diagonal.stack().idxmax()
print("\nPasangan dengan korelasi tertinggi:", terkuat, "=", tanpa_diagonal.stack().max())Output yang Dihasilkan:
Kolom dataset: ['kota', 'biaya_promo', 'pengunjung', 'unit_terjual', 'jam_tayang']
corr() tanpa numeric_only gagal: could not convert string to float: 'Jakarta'
Matriks korelasi:
biaya_promo pengunjung unit_terjual jam_tayang
biaya_promo 1.00 0.99 0.96 -0.16
pengunjung 0.99 1.00 0.96 -0.16
unit_terjual 0.96 0.96 1.00 -0.14
jam_tayang -0.16 -0.16 -0.14 1.00
Pasangan dengan korelasi tertinggi: ('biaya_promo', 'pengunjung') = 0.99Panggilan kampanye.corr() tanpa parameter gagal dengan pesan could not convert string to float: 'Jakarta' — pandas mencoba menghitung korelasi kolom teks dan menolaknya. Solusinya numeric_only=True, yang menghasilkan matriks 4x4 pada output. Membaca tabelnya sistematis: nilai 1.00 di diagonal adalah korelasi kolom dengan dirinya sendiri; sel biaya_promo-pengunjung bernilai 0.99 (hubungan paling kuat, juga tercetak sebagai hasil pencarian pasangan terkuat), biaya_promo-unit_terjual 0.96, sedangkan jam_tayang berkorelasi lemah negatif sekitar -0.16 terhadap ketiga kolom lain.
Tanda negatif pada korelasi layak dibaca dengan tenang. Nilai -0.16 berarti ketika jam tayang naik, kecenderungan ketiga kolom lain justru sedikit menurun — hubungan yang lemah karena nilainya jauh dari -1. Pada data kampanye seperti ini, temuan itu justru informasi: jam tayang iklan tidak bergerak seiring biaya promo, karena keduanya diputuskan terpisah. Bandingkan dengan angka mendekati -1 yang berarti hubungan negatif kuat, dan angka di sekitar 0 yang berarti praktis tidak berhubungan. Matriks kecil ini memakan waktu satu detik untuk dihitung, tetapi menjawab enam pertanyaan hubungan sekaligus.
Mari kita telaah baris-baris kuncinya:
- Baris 16-19 (
try…except ValueError): pesan galat ditangkap lalu hanya baris pertamanya yang dicetak, sehingga skrip tetap selesai dengan rapi dan output tetap deterministik. - Baris 21 (
kampanye.corr(numeric_only=True).round(2)):numeric_only=Truemenyaring kolom teks sebelum perhitungan, danround(2)merapikan tampilan. - Baris 25-27 (
where(~np.eye(...)),stack(),idxmax()): diagonal 1.00 ditutup denganNaNlewatwhere,stack()membentangkan matriks menjadi pasangan, danidxmax()mengambil pasangan dengan nilai tertinggi.
Scatter Matrix: Seluruh Pasangan dalam Satu Gambar #
Fungsi scatter_matrix dari modul pandas.plotting menggambar setiap pasangan kolom numerik sebagai scatter plot kecil, dengan histogram di diagonalnya:
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import scatter_matrix
from pathlib import Path
kampanye = pd.DataFrame(
{
"kota": ["Jakarta", "Bandung", "Surabaya", "Medan", "Semarang", "Makassar",
"Palembang", "Denpasar", "Bogor", "Malang", "Balikpapan", "Manado"],
"biaya_promo": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
"pengunjung": [125, 170, 180, 265, 310, 300, 400, 440, 460, 510, 545, 600],
"unit_terjual": [45, 70, 58, 105, 128, 115, 170, 150, 205, 182, 245, 215],
"jam_tayang": [12, 4, 18, 6, 15, 9, 20, 5, 14, 8, 3, 11],
}
)
numerik = kampanye[["biaya_promo", "pengunjung", "unit_terjual"]]
res = scatter_matrix(numerik, figsize=(8, 8), diagonal="hist")
print("Tipe hasil scatter_matrix :", type(res).__name__)
print("Bentuk grid :", res.shape)
print("Jumlah axes :", res.flatten().size)
print("Elemen [0][0] :", type(res[0][0]).__name__)
fig = res[0][0].get_figure()
fig.savefig("scatter_matrix_demo.png", dpi=100)
print("\nPlot tersimpan sebagai scatter_matrix_demo.png")
plt.close(fig)
Path("scatter_matrix_demo.png").unlink()Output yang Dihasilkan:
Tipe hasil scatter_matrix : ndarray
Bentuk grid : (3, 3)
Jumlah axes : 9
Elemen [0][0] : Axes
Plot tersimpan sebagai scatter_matrix_demo.pngHasilnya bukan objek Axes tunggal melainkan ndarray numpy berbentuk (3, 3) — sembilan axes untuk tiga kolom terpilih. Baris i dan kolom j berisi scatter plot kolom_i terhadap kolom_j; elemen diagonalnya diganti histogram karena scatter kolom terhadap dirinya sendiri tidak informatif. Parameter diagonal="hist" menentukan bentuk diagonal; alternatifnya "kde" menggambar kurva kepadatan. Dari tampilan itu, pasangan biaya_promo-pengunjung tampak sebagai titik-titik yang nyaris membentuk garis lurus, konsisten dengan nilai 0.99 pada matriks.
Pola kerja yang kita pelajari di sini adalah kombinasi dua kekuatan pandas: angka dulu untuk mempersempit kandidat, gambar kemudian untuk memeriksa bentuk hubungannya. Matriks korelasi menandai pasangan mana yang layak diperiksa, scatter matrix memperlihatkan semuanya sekali jalan, dan scatter plot tunggal dari chapter sebelumnya menjadi lensa zoom pada pasangan terpilih.
Referensi resmi: pandas.DataFrame.corr
untuk parameter numeric_only dan method, pandas.plotting.scatter_matrix
untuk opsi diagonal dan ukuran gambar, serta user guide visualization
yang menampilkan contoh scatter matrix lengkap. Grafik kita kini informatif, tetapi labelnya masih pemberian bawaan pandas — chapter berikutnya merapikan judul, label sumbu, dan legend.