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:
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:
[[ 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.0Mari kita baca matriks tersebut posisi demi posisi:
- Baris 6 (
np.cov(...)): elemen[0, 0]bernilai2.5(variance jam belajar), elemen[1, 1]bernilai107.5(variance nilai), dan elemen[0, 1]maupun[1, 0]sama-sama16.25(covariance) — matriksnya simetris. - Baris 9 (
np.diag(matriks)): mengekstrak diagonal[ 2.5 107.5]— variance jam belajar dan variance nilai; covariance16.25yang positif menandakan kedua variabel cenderung bergerak searah: mahasiswa dengan jam belajar di atas rata-rata umumnya memperoleh nilai di atas rata-rata. - Baris 10-11: diagonal matriks cocok dengan
np.var(..., ddof=1)— bukannp.varbawaan yang memakai pembagiN(hasilnya2.0dan86.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:
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:
[[1. 0.99124071]
[0.99124071 1. ]]
r harga-terjual : -0.9978890559313277
cov harga-terjual: -85.0Tiga hal yang perlu kita amati:
- Baris 6: diagonal matriks bernilai
1.0karena setiap variabel berkorelasi sempurna dengan dirinya sendiri; off-diagonal0.99124071adalah korelasi positif yang sangat kuat antara jam belajar dan nilai. - Baris 11: pasangan harga–terjual menghasilkan
r = -0.9978890559313277— korelasi negatif sangat kuat: makin mahal, makin sedikit porsi yang terjual. - Baris 12: covariance pasangan tersebut
-85.0bertanda negatif juga. Tanda cov dan r selalu sama karena standard deviation selalu positif.
Panduan membaca nilai r:
| Nilai r | Arti praktis |
|---|---|
Mendekati +1 | hubungan positif kuat; satu variabel naik, yang lain cenderung naik |
Mendekati -1 | hubungan negatif kuat; satu variabel naik, yang lain cenderung turun |
Mendekati 0 | tidak ada hubungan linear yang jelas |
Selalu 1.0 pada diagonal | variabel berkorelasi sempurna dengan dirinya sendiri |
| Aspek | np.cov | np.corrcoef |
|---|---|---|
| Ukuran hubungan | kovarians, mengikuti satuan data | koefisien korelasi r, bebas satuan |
| Rentang off-diagonal | bebas, tergantung skala | -1.0 sampai 1.0 |
| Nilai diagonal | variance tiap variabel | selalu 1.0 |
| Dipengaruhi skala | ya, ikut berubah bila data dikalikan konstanta | tidak berubah bila transformasi linearnya positif |
| Cocok untuk | melihat variabilitas bersama | membandingkan 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:
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:
r celsius : 1.0
r fahrenheit: 1.0
cov celsius : 25.0Hubungan 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.