Korelasi

Menghitung korelasi dengan cor dan memisahkan korelasi dari kausalitas.

Daftar isi

Korelasi mengukur kekuatan dan arah hubungan antara dua variabel numerik tanpa menyusun model apa pun. Topik ini menghitung koefisien korelasi dengan cor(), menguji signifikansinya dengan cor.test(), dan membaca matriks korelasi untuk beberapa variabel sekaligus. Pembahasan ditutup dengan dua jebakan yang sering menyesatkan penafsiran, yaitu mencampuradukkan korelasi dengan kausalitas dan menarik garis hubungan di luar rentang data.

Koefisien korelasi dengan cor()#

Koefisien korelasi Pearson (Pearson correlation coefficient), lazim ditulis rr, bergerak di antara -1 dan 1. Tanda positif berarti kedua variabel cenderung naik bersama, tanda negatif berarti satu variabel turun ketika yang lain naik, sedangkan nilai yang mendekati nol menandakan hubungan linear yang lemah. Nilai rr tidak membawa satuan, sehingga yang terbaca dari angkanya hanyalah arah dan kekuatan hubungan. Data contohnya mencatat jam belajar, jam hiburan, dan nilai ujian sepuluh siswa.

r
library(tidyverse)

belajar <- tibble(
  siswa = c("Ali", "Budi", "Citra", "Dewi", "Eka", "Fajar", "Gita", "Hana", "Indra", "Joko"),
  jam_belajar = c(2, 4, 1, 5, 3, 6, 4, 2, 7, 5),
  jam_hiburan = c(5, 4, 7, 3, 5, 2, 5, 6, 1, 3),
  nilai = c(68, 70, 62, 74, 68, 84, 70, 66, 85, 74)
)
belajar
text Keluaran
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# A tibble: 10 × 4
   siswa jam_belajar jam_hiburan nilai
   <chr>       <dbl>       <dbl> <dbl>
 1 Ali             2           5    68
 2 Budi            4           4    70
 3 Citra           1           7    62
 4 Dewi            5           3    74
 5 Eka             3           5    68
 6 Fajar           6           2    84
 7 Gita            4           5    70
 8 Hana            2           6    66
 9 Indra           7           1    85
10 Joko            5           3    74

Fungsi cor() menerima dua vektor numerik dan mengembalikan satu angka.

r
cor(belajar$jam_belajar, belajar$nilai)
text Keluaran
[1] 0.9471346

Nilai 0,947 menunjukkan hubungan positif yang sangat kuat antara jam belajar dan nilai ujian. Sebaran kedua variabel tersebut diperlihatkan pada grafik berikut.

r
p <- ggplot(belajar, aes(x = jam_belajar, y = nilai)) +
  geom_point(size = 2, color = "#4472C4") +
  labs(
    x = "Jam belajar per minggu",
    y = "Nilai ujian",
    title = "Sebaran jam belajar dan nilai ujian"
  ) +
  theme_minimal()
ggplot2::ggsave("sebaran-korelasi.svg", p, width = 5, height = 3.2)
6570758085246Jam belajar per mingguNilai ujianSebaran jam belajar dan nilai ujian
Sebaran jam belajar dan nilai ujian sepuluh siswa yang berkorelasi 0,947

Titik-titik pada grafik bergerak naik dari kiri ke kanan dengan sebaran yang relatif rapat, konsisten dengan nilai r yang tinggi. Koefisien korelasi merangkum kecenderungan itu menjadi satu angka, tetapi grafiknya tetap perlu dilihat karena bentuk hubungan yang tidak linear tidak tertangkap dengan baik oleh Pearson.

Alternatif Spearman#

Korelasi Spearman (Spearman correlation) menghitung korelasi Pearson atas peringkat data, bukan atas nilai aslinya, melalui argumen method = "spearman".

r
cor(belajar$jam_belajar, belajar$nilai, method = "spearman")
text Keluaran
[1] 0.9907407

Spearman lebih tinggi daripada Pearson pada data ini karena urutan jam belajar dan urutan nilai hampir sempurna, sedangkan jarak antar nilai belum sepenuhnya proporsional. Karena hanya menggunakan peringkat, Spearman lebih tahan terhadap pencilan dan tepat digunakan untuk hubungan yang monoton tetapi tidak linear. Satu pencilan hanya menggeser peringkatnya satu posisi, sedangkan pada Pearson nilai ekstremnya menarik koefisien dengan kekuatan penuh. Hubungan yang melengkung namun tetap naik juga tetap diberi nilai tinggi oleh Spearman, sedangkan Pearson menilainya lebih rendah karena kurvanya. Melaporkan keduanya berdampingan wajar dilakukan apabila kestabilan kesimpulan perlu diuji terhadap pilihan metodenya. Nilai yang sama di dalam satu variabel menghasilkan peringkat yang dirata-rata, dan R menanganinya secara otomatis di dalam cor(). Survei dengan skala terbatas menyimpan banyak nilai sama, sehingga Spearman biasanya lebih tepat daripada Pearson pada data semacam itu. Untuk data contoh ini, kesimpulan kedua metodenya sejalan karena keduanya melaporkan hubungan yang sangat kuat.

Signifikansi dengan cor.test()#

Nilai r yang dihitung dari sampel merupakan perkiraan, sehingga signifikansinya perlu diuji terhadap hipotesis nol yang menyatakan korelasi populasi bernilai nol. Fungsi cor.test() menjalankan uji tersebut sekaligus melaporkan interval kepercayaan perkiraannya.

r
cor.test(belajar$jam_belajar, belajar$nilai)
text Keluaran

	Pearson's product-moment correlation

data:  belajar$jam_belajar and belajar$nilai
t = 8.3497, df = 8, p-value = 3.205e-05
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.7865752 0.9877345
sample estimates:
      cor 
0.9471346 

Keluaran melaporkan t = 8,3497 dengan df = 8, karena uji korelasi menggunakan banyak data dikurangi dua. p-value 3,205e-05 jauh di bawah 0,05, sehingga hipotesis nol ditolak dan hubungan jam belajar dengan nilai dinyatakan nyata. Hipotesis nolnya menyatakan korelasi populasi sama dengan nol, sedangkan hipotesis alternatifnya menyatakan korelasi populasi tidak sama dengan nol. Notasi 3,205e-05 adalah penulisan ilmiah untuk 0,00003205. Pada sampel kecil seperti sepuluh titik data, korelasi yang tampak besar bisa saja lahir dari kebetulan. Dalam situasi seperti itu, p-value yang kecil justru menandakan pola yang sungguh konsisten. Interval kepercayaan 95 persen dari 0,79 sampai 0,99 meyakinkan bahwa arah hubungannya positif, bukan sekadar kebetulan sampel. Apabila arahnya sudah diketahui sejak awal, argumen alternative = "greater" menguji hipotesis satu arah, tetapi uji dua arah bawaan tetap menjadi pilihan yang paling aman untuk pertanyaan awal.

Matriks korelasi#

Apabila variabelnya lebih dari dua, cor() menerima data frame numerik dan mengembalikan matriks korelasi yang memuat seluruh pasangan variabel. Kolom siswa dikeluarkan terlebih dahulu karena berisi teks.

r
cor(select(belajar, -siswa))
text Keluaran
            jam_belajar jam_hiburan      nilai
jam_belajar   1.0000000  -0.9691283  0.9471346
jam_hiburan  -0.9691283   1.0000000 -0.9611652
nilai         0.9471346  -0.9611652  1.0000000

Matriksnya simetris, diagonalnya bernilai satu karena setiap variabel berkorelasi sempurna dengan dirinya, dan setiap sel di luar diagonal muncul dua kali dengan nilai yang sama. Jam belajar berkorelasi positif kuat dengan nilai, sedangkan jam hiburan berkorelasi negatif kuat dengan jam belajar maupun nilai. Pada data yang memuat nilai NA, cor() mengembalikan NA dan argumen use = "complete.obs" menghitung korelasi hanya pada baris yang lengkap. Penyebab hilangnya data perlu diperiksa terlebih dahulu, karena penghapusan baris yang tidak acak dapat menggeser koefisiennya. Matriks seperti ini mempercepat pemetaan hubungan sebelum pemodelan, tetapi setiap selnya tetap menuntut kehati-hatian penafsiran yang dibahas berikutnya.

Korelasi bukan kausalitas#

Korelasi yang tinggi tidak menyatakan hubungan sebab akibat. Contoh yang sering dikutip adalah penjualan es krim dan jumlah kasus tenggelam yang naik-turun bersama sepanjang tahun. Kedua variabel itu tidak saling menyebabkan, tetapi keduanya terdorong oleh musim yang sama, yaitu cuaca panas yang memperbanyak pembeli es krim sekaligus orang yang berenang. Faktor yang memengaruhi dua variabel yang diukur sekaligus seperti ini disebut variabel pengganggu (confounding variable). Tanpa variabel pengganggu yang dikendalikan, korelasi tinggi hanya menyatakan bahwa dua variabel bergerak bersama.

Hubungan sebab akibat ditetapkan melalui desain yang mengendalikan faktor lain, misalnya percobaan dengan penugasan acak, bukan dari koefisien korelasi semata. Data observasional seperti contoh jam belajar di atas memang menggoda untuk ditafsirkan secara kausal, sebab bertambahnya jam belajar tampak logis sebagai penyebab naiknya nilai. Penafsiran itu baru dapat dipertahankan apabila variabel pengganggu yang relevan, misalnya kemampuan awal siswa sebelum mengikuti pengajaran, sudah diperhitungkan.

Jebakan kedua adalah ekstrapolasi, yaitu menarik garis hubungan yang terukur hingga di luar rentang datanya. Korelasi pada contoh ini dihitung dari jam belajar 1 sampai 7, sehingga tidak ada dasar untuk menaksir nilai siswa yang belajar 12 jam per minggu. Hubungan yang linear pada satu rentang dapat mendatar, melengkung, atau berbalik pada rentang yang lain, dan nilai ujian sendiri memiliki batas maksimum 100 yang membuat garis lurus tidak mungkin diteruskan tanpa batas.

Ringkasan#

  • cor() menghitung korelasi Pearson yang bergerak di antara -1 dan 1, dengan tanda sebagai arah dan jarak dari nol sebagai kekuatan hubungan.
  • Argumen method = "spearman" menghitung korelasi atas peringkat, yang lebih tahan terhadap pencilan dan cocok untuk hubungan monoton yang tidak linear.
  • cor.test() menguji hipotesis nol korelasi populasi nol dan melaporkan p-value beserta interval kepercayaan 95 persen.
  • Korelasi bukan kausalitas karena bisa lahir dari variabel pengganggu, dan garis hubungan yang terukur tidak boleh ditarik di luar rentang data.

Referensi#