Dua pertanyaan klasik dalam data bisnis: apakah mahasiswa yang belajar lebih lama cenderung memperoleh nilai lebih tinggi, dan apakah kenaikan harga menurunkan jumlah terjual? Keduanya menanyakan hubungan antara dua variabel. NumPy menyediakan np.cov untuk mengukur kovariasi dua variabel dan np.corrcoef untuk versi terstandarisasinya. Karena keduanya mengembalikan matriks 2×2 saat diberi dua variabel, membaca posisi elemen matriks menjadi keterampilan utama pada bab ini.

Matriks Kovarians 2x2 dari np.cov #

Mekanisme np.cov(x, y) bekerja seperti ini: hitung deviasi tiap elemen dari rata-ratanya, kalikan deviasi x dan y elemen demi elemen, jumlahkan, lalu bagi dengan N − 1. Hasilnya disusun menjadi matriks 2×2 simetris — diagonal berisi variance masing-masing variabel, sedangkan sel off-diagonal berisi covariance keduanya:

python
import numpy as np

jam_belajar = np.array([2, 3, 4, 5, 6])
nilai = np.array([60, 65, 70, 80, 85])

matriks = np.cov(jam_belajar, nilai)

print(matriks)
print("diagonal    :", np.diag(matriks))
print("var ddof=1  :", np.var(jam_belajar, ddof=1), np.var(nilai, ddof=1))
print("var default :", np.var(jam_belajar), np.var(nilai))

Output yang Dihasilkan:

text
[[  2.5   16.25]
 [ 16.25 107.5 ]]
diagonal    : [  2.5 107.5]
var ddof=1  : 2.5 107.5
var default : 2.0 86.0

Mari kita baca matriks tersebut posisi demi posisi:

  1. Baris 6 (np.cov(...)): elemen [0, 0] bernilai 2.5 (variance jam belajar), elemen [1, 1] bernilai 107.5 (variance nilai), dan elemen [0, 1] maupun [1, 0] sama-sama 16.25 (covariance) — matriksnya simetris.
  2. Baris 9 (np.diag(matriks)): mengekstrak diagonal [ 2.5 107.5] — variance jam belajar dan variance nilai; covariance 16.25 yang positif menandakan kedua variabel cenderung bergerak searah: mahasiswa dengan jam belajar di atas rata-rata umumnya memperoleh nilai di atas rata-rata.
  3. Baris 10-11: diagonal matriks cocok dengan np.var(..., ddof=1) — bukan np.var bawaan yang memakai pembagi N (hasilnya 2.0 dan 86.0).

corrcoef — Korelasi Terstandarisasi #

Kovarians mengikuti satuan data, sehingga angka 16.25 sulit dibandingkan antar pasangan variabel yang satuannya berbeda. np.corrcoef menstandarkan kovarians dengan membaginya terhadap hasil kali standard deviation kedua variabel. Hasilnya selalu berada pada rentang −1 sampai 1, dan diagonal matriksnya pasti 1.0:

python
import numpy as np

jam_belajar = np.array([2, 3, 4, 5, 6])
nilai = np.array([60, 65, 70, 80, 85])

print(np.corrcoef(jam_belajar, nilai))

harga = np.array([10, 12, 15, 18, 20])    # ribu rupiah
terjual = np.array([90, 80, 62, 50, 40])  # porsi per hari

print("r harga-terjual :", np.corrcoef(harga, terjual)[0, 1])
print("cov harga-terjual:", np.cov(harga, terjual)[0, 1])

Output yang Dihasilkan:

text
[[1.         0.99124071]
 [0.99124071 1.        ]]
r harga-terjual : -0.9978890559313277
cov harga-terjual: -85.0

Tiga hal yang perlu kita amati:

  1. Baris 6: diagonal matriks bernilai 1.0 karena setiap variabel berkorelasi sempurna dengan dirinya sendiri; off-diagonal 0.99124071 adalah korelasi positif yang sangat kuat antara jam belajar dan nilai.
  2. Baris 11: pasangan harga–terjual menghasilkan r = -0.9978890559313277 — korelasi negatif sangat kuat: makin mahal, makin sedikit porsi yang terjual.
  3. Baris 12: covariance pasangan tersebut -85.0 bertanda negatif juga. Tanda cov dan r selalu sama karena standard deviation selalu positif.

Panduan membaca nilai r:

Nilai rArti praktis
Mendekati +1hubungan positif kuat; satu variabel naik, yang lain cenderung naik
Mendekati -1hubungan negatif kuat; satu variabel naik, yang lain cenderung turun
Mendekati 0tidak ada hubungan linear yang jelas
Selalu 1.0 pada diagonalvariabel berkorelasi sempurna dengan dirinya sendiri
Aspeknp.covnp.corrcoef
Ukuran hubungankovarians, mengikuti satuan datakoefisien korelasi r, bebas satuan
Rentang off-diagonalbebas, tergantung skala-1.0 sampai 1.0
Nilai diagonalvariance tiap variabelselalu 1.0
Dipengaruhi skalaya, ikut berubah bila data dikalikan konstantatidak berubah bila transformasi linearnya positif
Cocok untukmelihat variabilitas bersamamembandingkan kekuatan hubungan antar pasangan variabel

Invarian terhadap Perubahan Skala Linear #

Sifat yang membuat korelasi praktis: r tidak berubah bila salah satu variabel digeser atau dikalikan konstanta positif. Mari kita buktikan dengan mengonversi suhu Celsius ke Fahrenheit pada data penjualan minuman es:

python
import numpy as np

suhu = np.array([24.0, 25.0, 26.0, 27.0])
penjualan_es = np.array([40.0, 55.0, 70.0, 85.0])

print("r celsius   :", np.corrcoef(suhu, penjualan_es)[0, 1])
print("r fahrenheit:", np.corrcoef(suhu * 9 / 5 + 32, penjualan_es)[0, 1])
print("cov celsius :", np.cov(suhu, penjualan_es)[0, 1])

Output yang Dihasilkan:

text
r celsius   : 1.0
r fahrenheit: 1.0
cov celsius : 25.0

Hubungan suhu dan penjualan es pada data ini linear sempurna, sehingga r tepat 1.0. Konversi ke Fahrenheit (suhu * 9 / 5 + 32) tidak mengubah r sedikit pun. Sebaliknya, cov mengikuti skala: bila suhu dinyatakan dalam Fahrenheit, cov berubah dari 25.0 menjadi sekitar 45.0. Inilah alasan perbandingan kekuatan hubungan antar pasangan variabel selalu memakai corrcoef, bukan cov.