Ukuran efek pada chapter sebelumnya membandingkan dua kelompok pada satu variabel; pertanyaan penutupnya menunggu jawaban: bagaimana mengukur kekuatan hubungan dua variabel numerik, misalnya suhu udara terhadap penjualan es teh? Alatnya adalah kovarians dan korelasi — sepasang ukuran yang menghitung hal yang sama dengan dua cara berbeda: yang satu membawa satuan, yang satu tidak. Pada chapter penutup Section ini kita menghitung keduanya dari data mentah, membandingkan korelasi Pearson dan Spearman, lalu menegaskan satu batas tafsir yang paling sering dilanggar: korelasi bukan kausalitas.

Kovarians: Arah Hubungan dengan Satuan Terkali #

Pertanyaannya sederhana: saat suhu berada di atas rata-ratanya, apakah penjualan es teh juga cenderung di atas rata-ratanya? Kovarians menjawab dengan mengalikan deviasi kedua variabel pada tiap pengamatan, lalu merata-ratakannya:

text
Cov(X, Y) = (1/(n-1)) × Σ (xi - x̄)(yi - ȳ)

Hasil kali deviasi ini justru intuisinya. Bila kedua variabel naik-turun bersama, deviasi searah (dua-duanya positif atau dua-duanya negatif) sehingga hasil kalinya positif; bila berlawanan arah, hasil kalinya negatif. Pembagi n−1 mengikuti konvensi varians sampel dari chapter Ukuran Penyebaran — dan memang kovarians adalah varians yang diperluas ke dua variabel. Kita hitung dari catatan 12 hari di Toko Kopi Kita:

python
import numpy as np

# Catatan penjualan 12 hari di Toko Kopi Kita
suhu = np.array([24, 25, 23, 26, 28, 27, 29, 30, 31, 28, 32, 33])
es_teh = np.array([18, 22, 15, 24, 31, 28, 36, 41, 44, 33, 48, 52])

n = suhu.size
xbar, ybar = suhu.mean(), es_teh.mean()
kovarians = sum((x - xbar) * (y - ybar) for x, y in zip(suhu, es_teh)) / (n - 1)

print(f"Rata-rata suhu     : {xbar:.2f} °C")
print(f"Rata-rata es teh   : {ybar:.2f} gelas")
print(f"Kovarians (manual) : {kovarians:.4f}")
print(f"Kovarians (np.cov) : {np.cov(suhu, es_teh)[0, 1]:.4f}")
print(f"Satuan hasil       : °C × gelas")

Output yang Dihasilkan:

text
Rata-rata suhu     : 28.00 °C
Rata-rata es teh   : 32.67 gelas
Kovarians (manual) : 37.5455
Kovarians (np.cov) : 37.5455
Satuan hasil       : °C × gelas

Mari kita telaah kode di atas:

  1. Baris 8 (xbar, ybar = ...): kedua rata-rata menjadi titik acuan. Deviasi dihitung terhadap rata-rata masing-masing variabel.
  2. Baris 9 (kovarians = ...): rumus diterjemahkan apa adanya — generator zip memasangkan suhu dan es teh di hari yang sama, hasil kali deviasinya dijumlah, lalu dibagi n−1 = 11.
  3. Baris 14 (np.cov(...)): NumPy mengembalikan matriks 2×2; sel [0, 1] (dan [1, 0]) adalah kovarians silang, sedangkan diagonalnya adalah varians masing-masing variabel. Kovarians suhu dengan dirinya sendiri memang varians — konsisten dengan definisi.
  4. Baris 15 (satuan): hasil 37,5455 membawa satuan °C × gelas — hasil kali satuan kedua variabel.

Angka 37,5455 positif, jadi suhu dan penjualan es teh memang cenderung bergerak searah. Tetapi berapa besar itu? Tidak ada yang bisa menjawab: kovarians berbanding satuan, dan “37,5 °C-gelas” tidak punya patokan naik-turun. Ganti termometer ke Fahrenheit atau penjualan ke liter, angkanya berubah total meski pola datanya sama persis. Tanda kovarians informatif; besarnya tidak.

Korelasi Pearson: Kovarians yang Distandardisasi #

Jalan keluarnya adalah menstandardisasi, sama seperti z-score pada chapter Distribusi Normal. Korelasi Pearson membagi kovarians dengan hasil kali kedua simpangan baku, sehingga satuan saling menghapus:

text
r = Cov(X, Y) / (sX × sY)

Hasilnya r selalu berada antara −1 dan +1, tanpa satuan, dan bisa dibandingkan antar pasangan variabel dari dunia yang berbeda sekalipun. Ada satu cara pandang yang membuat rumus ini terasa wajar: r adalah rata-rata hasil kali z-score kedua variabel. Kita hitung dengan dua jalan:

python
import numpy as np

suhu = np.array([24, 25, 23, 26, 28, 27, 29, 30, 31, 28, 32, 33])
es_teh = np.array([18, 22, 15, 24, 31, 28, 36, 41, 44, 33, 48, 52])

z_suhu = (suhu - suhu.mean()) / suhu.std(ddof=1)
z_teh = (es_teh - es_teh.mean()) / es_teh.std(ddof=1)
r_z = (z_suhu * z_teh).sum() / (suhu.size - 1)

print(f"r dari rata-rata z_suhu * z_teh : {r_z:.4f}")
print(f"r dari np.corrcoef              : {np.corrcoef(suhu, es_teh)[0, 1]:.4f}")

Output yang Dihasilkan:

text
r dari rata-rata z_suhu * z_teh : 0.9974
r dari np.corrcoef              : 0.9974

Mari kita telaah kode di atas:

  1. Baris 6-7 (z_suhu, z_teh): setiap variabel diubah menjadi z-score — jaraknya dari rata-rata dalam satuan simpangan baku. Setelah langkah ini, kedua variabel berdiri di atas standar yang sama.
  2. Baris 8 (r_z): hasil kali z per hari dijumlah lalu dirata-rata. Hari yang “panas dan ramai” menyumbang positif besar; hari yang “panas tapi sepi” menyumbang negatif; r = 0,9974 berarti hampir semua hari menyumbang searah.
  3. Baris 11 (np.corrcoef): fungsi NumPy memberi angka yang sama lewat rumus pembagian simpangan baku — dua definisi, satu hasil.

Untuk membaca angka r, komunitas statistika memakai patokan tafsir berikut — konvensi komunikasi, bukan hukum alam:

Nilai |r|Kekuatan hubungan linear
0,00-0,19sangat lemah
0,20-0,39lemah
0,40-0,59sedang
0,60-0,79kuat
0,80-1,00sangat kuat

Dengan patokan itu, r = 0,9974 antara suhu dan es teh masuk kategori sangat kuat — hubungan nyaris sempurna linear pada 12 hari pengamatan ini. Sebelum lanjut, kita rangkum perbedaan kedua ukuran berdampingan:

AspekKovariansKorelasi Pearson
Satuansatuan X × satuan Ytak bersatuan
Rentang nilaitak terbatas−1 sampai +1
Tandaarah hubunganarah hubungan
Dibanding antar pasangan variabel berbeda?tidak bisabisa
Rumusrata-rata hasil kali deviasikovarians ÷ (sX × sY)

Matriks Korelasi dengan pandas #

Data nyata jarang berisi dua variabel saja. Untuk memindai hubungan seluruh pasangan kolom sekaligus, pandas menyediakan df.corr() yang mengembalikan matriks korelasi. Kita tambahkan kopi panas — minuman yang patutnya lebih laris saat udara dingin:

python
import pandas as pd

penjualan = pd.DataFrame({
    "suhu": [24, 25, 23, 26, 28, 27, 29, 30, 31, 28, 32, 33],
    "es_teh": [18, 22, 15, 24, 31, 28, 36, 41, 44, 33, 48, 52],
    "kopi_panas": [45, 42, 47, 40, 33, 36, 30, 26, 24, 34, 20, 17],
})

print(penjualan.corr().round(3))

Output yang Dihasilkan:

text
             suhu  es_teh  kopi_panas
suhu        1.000   0.997      -0.998
es_teh      0.997   1.000      -0.998
kopi_panas -0.998  -0.998       1.000

Mari kita telaah hasilnya:

  1. Diagonal bernilai 1,000: korelasi variabel dengan dirinya sendiri selalu 1 — pemeriksaan konsistensi yang gratis.
  2. suhu vs es_teh = +0,997: hubungan positif sangat kuat, sesuai hitungan manual kita sebelumnya; matriks ini simetris sehingga angka yang sama muncul dua kali.
  3. suhu vs kopi_panas = −0,998: korelasi negatif nyaris sempurna — makin panas udara, makin sepi penjualan kopi panas. Tanda negatif sama informatifnya dengan tanda positif.
  4. Metode default: df.corr() tanpa argumen menghitung Pearson; parameter method bisa menggantinya — kita pakai sebentar lagi.

Pearson vs Spearman: Ketika Hubungan Tidak Linear #

Pearson mengukur kekuatan hubungan linear. Bila pola hubungannya melengkung, Pearson meremehkan kekuatannya meski hubungan itu konsisten sepanjang data. Spearman menangkapnya dengan trik sederhana: ganti setiap nilai dengan peringkatnya (rank) sebelum menghitung korelasi, sehingga yang diukur adalah hubungan monotonik — naik terus atau turun terus, lurus atau tidak. Kasusnya: program loyalitas Toko Kopi Kita, tempat total poin member bertambah cepat di bulan-bulan awal lalu melambat ketika bonus mulai jenuh:

python
import pandas as pd

bulan = range(1, 13)
poin = [30, 52, 68, 79, 86, 91, 94, 96, 97, 98, 99, 100]
loyalti = pd.DataFrame({"bulan": bulan, "poin": poin})

r_pearson = loyalti["bulan"].corr(loyalti["poin"])
r_spearman = loyalti["bulan"].corr(loyalti["poin"], method="spearman")

print(f"Pearson  : {r_pearson:.4f}")
print(f"Spearman : {r_spearman:.4f}")

Output yang Dihasilkan:

text
Pearson  : 0.8734
Spearman : 1.0000

Mari kita telaah hasilnya:

  1. Bentuk datanya: poin naik setiap bulan tanpa pernah turun — hubungan monotonik sempurna — tetapi kenaikannya menyusut (22 poin pada awal, hanya 1-2 poin di akhir), membentuk kurva melengkung yang mendatar.
  2. Pearson 0,8734: hubungan linear pada kurva melengkung menyisakan galat — garis lurus terbaik pun meleset di kedua ujung, dan “hukuman” itu menjatuhkan r di bawah 1.
  3. Spearman 1,0000: karena poin selalu bertambah setiap bulan, peringkat kedua kolom identik — korelasi peringkat menyentuh nilai maksimum. Spearman melaporkan persis yang ditanyakan: “makin lama jadi member, makin besar poinnya”, tanpa peduli bentuk lengkungnya.

Kapan memakai yang mana? Pearson saat kita peduli kekuatan hubungan linear dan datanya bebas outlier; Spearman saat hubungan cukup dipahami sebagai monotonik, saat ada outlier yang menarik r, atau saat data berbentuk peringkat sejak awal (rating, urutan preferensi).

Korelasi Bukan Kausalitas #

Dua variabel yang berkorelasi bisa jadi X memang menyebabkan Y — tetapi tiga penjelasan lain sama kuatnya, dan data observasional tidak bisa membedakannya:

Penjelasan atas korelasi X dan YContoh di kafe
X memengaruhi YSuhu tinggi membuat pelanggan memilih minuman dingin, es teh laris
Y memengaruhi XPenjualan ramai membuat pemilik memperbesar stok es batu — stok besar “berkorelasi” dengan penjualan besar karena penjualanlah yang mendorong stok
Variabel ketigaPromosi besar-besaran menarik pembeli teh sekaligus pembeli kopi — penjualan es teh dan kopi panas naik bersama tanpa saling memengaruhi
Kebetulan samplingPada sampel kecil, dua variabel yang tak berhubungan pun bisa tampak berkorelasi

Cara paling andal membedakannya adalah eksperimen: ubah X sengaja (acak), tahan variabel lain, lalu lihat apakah Y ikut berubah — logika yang akan kita dalami pada chapter Pengujian Hipotesis. Tanpa eksperimen, korelasi tetap sangat berguna sebagai kompas: ia menunjukkan pasangan variabel mana yang layak diperiksa lebih jauh, cukup kuat untuk dipakai sebagai prediktor, atau cukup mencurigakan untuk dicari sebabnya.

Rangkuman #

  • Kovarians merata-ratakan hasil kali deviasi dua variabel: tandanya memberi arah hubungan, tetapi besarannya membawa satuan terkali sehingga tidak punya patokan tafsir.
  • Korelasi Pearson r = Cov(X,Y)/(sX·sY) menstandardisasi kovarians: tak bersatuan, rentang −1 sampai +1, dan setara dengan rata-rata hasil kali z-score.
  • df.corr() memindai seluruh pasangan kolom sekaligus; diagonal selalu 1 dan matriksnya simetris; tanda negatif sama pentingnya dengan positif.
  • Spearman menghitung korelasi atas peringkat, sehingga mengukur hubungan monotonik; pada hubungan melengkung yang konsisten, Spearman bisa mencapai ±1 saat Pearson lebih rendah.
  • Korelasi bukan kausalitas: arah sebab bisa terbalik, ada variabel ketiga, atau sekadar kebetulan — hanya eksperimen terkendali yang bisa memutuskan sebab-akibat.

Dengan ini perjalanan kita pada Section Statistika untuk Data Science tuntas: dari populasi dan sampel, ukuran deskriptif, probabilitas beserta Bayes, variabel acak dan distribusinya, hingga inferensi lengkap dari estimasi, interval kepercayaan, pengujian hipotesis, p-value, kesalahan tipe, ukuran efek, dan hubungan antar variabel. Seluruh bekal teori ini akan diangkat menjadi praktik analisis pada Section Teknik Analisis Data — mulai dari analisis univariat dan bivariat, regresi, hingga analisis korelasi dalam bentuk yang lebih utuh.

Referensi #

  1. pandas — User Guide
  2. SciPy — scipy.stats: Statistical Functions
  3. NumPy — numpy.mean