Menu

R의 상관분석: cor(), cor.test(), 상관행렬

cor()으로 두 변수가 함께 움직이는 정도를 측정하고, cor.test()로 그 관계가 실재하는지 검정하며, 상관행렬로 여러 변수를 한 번에 훑어보세요.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

두 변수 사이의 상관: cor()

상관분석은 이렇게 묻습니다: 한 변수가 올라갈 때 다른 변수도 함께 올라가는 경향이 있는가(양), 내려가는가(음), 아니면 제멋대로인가(0에 가까움)? R에서는 호출 한 번입니다:

답은 약 −0.87 입니다: 무거운 자동차일수록 연비가 나쁘고, 그 관계는 강합니다. 이 숫자 하나가 Pearson 상관계수이며 보편적으로 r 로 표기합니다.

r 읽는 법

계수는 언제나 −1과 +1 사이에 놓입니다. 부호 는 방향을, 크기 는 강도를 나타냅니다:

| |r| | 일반적인 해석 | | --- | --- | | 0.0 – 0.2 | 무시할 수준 | | 0.2 – 0.4 | 약함 | | 0.4 – 0.6 | 보통 | | 0.6 – 0.8 | 강함 | | 0.8 – 1.0 | 매우 강함 |

이 구간들은 법칙이 아니라 대화의 출발점으로 삼으세요 - 물리학에서 r이 0.6이면 실망스럽지만, 심리학에서는 경력의 하이라이트입니다. 체득할 만한 성질이 두 가지 있습니다: r에는 단위가 없고(톤 단위 무게와 mpg의 상관은 킬로그램 단위 무게와 mpg의 상관과 같은 r을 줍니다. r이 표준화된 값으로 계산되기 때문입니다), r은 오직 선형 연관성만 측정합니다 - 완벽한 U자 관계도 r ≈ 0일 수 있습니다.

그리고 반드시 해야 할 말이 있습니다: 상관은 인과가 아닙니다. 아이스크림 판매량과 익사 사망자 수는 한 해의 달들에 걸쳐 강하게 상관합니다 - 아이스크림이 사람을 익사시켜서가 아니라 여름이 둘 다를 밀어 올리기 때문이죠. 상관은 두 변수가 함께 움직인다는 사실만 알려 주고 에 대해서는 침묵합니다. x가 y를 이끌 수도, y가 x를 이끌 수도, 제3의 요인(여기서는 계절)이 둘 다를 이끌 수도 있습니다. 그중 무엇인지 결정하려면 더 큰 r이 아니라 실험이나 신중한 인과적 추론이 필요합니다.

Spearman과 Kendall: Pearson이 잘못된 도구일 때

Pearson은 원래 값으로 계산하므로 이상치에 민감하고 휘어진 관계를 보지 못합니다. method 인자가 순위 기반 대안으로 전환해 줍니다:

Spearman은 모든 값을 순위로 바꾼 뒤 그 순위에 대해 Pearson을 계산합니다. yx가 커질 때마다 항상 증가하므로 모든 순위가 일치하고 Spearman은 정확히 1을 보고합니다 - 이상치의 크기 는 더 이상 중요하지 않고 위치 만 중요해집니다. 데이터가 순서형이거나(설문 척도) 심하게 치우쳐 있거나, 관계가 단조롭지만 직선이 아닐 때 Spearman을 쓰세요. Kendall은 일치/불일치 쌍으로 비슷한 질문에 답합니다. 작은 표본에서 더 견고하지만 느리며, 일반적인 기본 선택은 Spearman입니다.

상관행렬

여러 변수의 관계를 한 번에 훑어보려면 cor()에 여러 수치형 열을 넘기세요:

모든 변수를 모든 변수와 대조하며, 대각선에는 1이 놓이고(모든 변수는 자기 자신과 완벽하게 상관합니다) 대각선을 기준으로 좌우가 대칭입니다. 소수점 두 자리로 반올림하는 것이 생각보다 중요합니다 - 반올림하지 않은 행렬은 숫자의 벽이고, 행렬의 목적은 훑어보는 것이니까요. 여기서 훑어보면 mpg가 나머지 셋 모두와 음의 상관을 갖고(무겁고 강력하며 엔진이 큰 차가 연료를 더 태웁니다), wt, hp, disp가 서로 강한 양의 상관을 갖는다는 것이 보입니다 - 선형회귀와 그 다중공선성 골칫거리에 이르면 중요해질 "큰 차" 변수 군집입니다.

결측값: use 인자

결측 데이터가 있으면 cor()의 기본 동작은 추측하지 않고 NA를 반환하는 것입니다:

  • use = "complete.obs"NA하나라도 있는 행을 모두 제거한 뒤 살아남은 행으로 행렬 전체를 계산합니다. 일관되지만 낭비가 있습니다 - wt가 결측이면 그 행이 mpghp 쌍에서도 제거되니까요.
  • use = "pairwise.complete.obs"는 각 칸을 해당 쌍 이 존재하는 모든 행으로 계산합니다. 데이터를 더 많이 쓰지만 칸마다 서로 다른 부분집합에 기반하므로 아주 가끔은 내부적으로 일관되지 않은 행렬이 나올 수 있습니다.

NA가 몇 개 흩어져 있는 정도라면 어느 쪽이든 괜찮습니다. 다만 어느 쪽을 썼는지 밝히세요.

유의한가? cor.test()

cor()은 숫자를 주지만 그것이 잡음일 수 있는지에 대해서는 알려 주지 않습니다. cor.test()가 가설검정을 수행합니다:

출력을 블록별로 살펴봅시다:

  • t = −9.56, df = 30 - 검정통계량입니다. 귀무가설은 참 상관계수가 0이라는 것이고, 관측된 r은 자유도 n − 2(자동차 32대 − 2)의 t 통계량으로 변환됩니다.
  • p-value = 1.29e-10 - 참 상관계수가 0이라면, 표본 32개에서 이만큼 0에서 떨어진 r을 볼 확률이 약 0.0000000001이라는 뜻입니다. 연관성이 실재한다는 압도적인 증거입니다 - 다만 p값은 r이 0과 다른지에 대해 말할 뿐, 관계가 큰지인과적인지 에 대해서는 말하지 않는다는 점을 기억하세요.
  • 95 percent confidence interval: −0.93 to −0.74 - 참 상관계수의 그럴듯한 범위입니다. 종종 p값보다 유용합니다: 이 구간의 낙관적인 끝조차 강한 음의 상관입니다.
  • sample estimates: cor = −0.87 - cor()이 준 것과 같은 숫자입니다.

작은 표본은 여기서 각별한 주의를 받아야 합니다: n = 10이면 ±0.5 정도의 상관이 우연히 나타나는 일이 놀랄 만큼 잦고, 넓은 신뢰구간이 그 사실을 알려 줄 것입니다. p값만이 아니라 구간을 보고하세요.

눈으로 보기: 언제나 그래프를 그리세요

상관계수는 관계 전체를 숫자 하나로 압축하며, 그 압축이 곡률이나 군집, 혹은 혼자서 모든 일을 해내는 한 점을 감출 수 있습니다. 어떤 r이든 믿기 전에 산점도를 보세요:

plot(mtcars$wt, mtcars$mpg)              # one pair
pairs(mtcars[, c("mpg", "wt", "hp", "disp")])  # every pair in the matrix

pairs()는 상관행렬에 대응하는 산점도 격자를 그립니다 - 숫자가 생각한 의미인지 확인하는 가장 빠른 방법입니다. 다듬어진 히트맵 형태의 행렬 그래픽에는 corrplot 패키지(install.packages("corrplot")corrplot(cor(m)))가 표준 도구입니다.

핵심 정리

  • cor(x, y)는 Pearson의 r을 줍니다: 부호는 방향, 크기는 강도이며 항상 [−1, 1] 범위에 있고 단위가 없습니다.
  • 상관은 선형 동반 움직임을 측정할 뿐 인과에 대해서는 아무것도 말하지 않습니다 - 숨어 있는 제3의 변수는 언제나 후보입니다.
  • 순위 기반이 필요하면 method = "spearman": 순서형 데이터, 이상치, 단조롭지만 휘어진 관계에 적합합니다.
  • 수치형 열에 대한 cor(df)가 행렬을 주며, round(, 2)로 다듬고, 결측 데이터가 있으면 use = 인자에 유의하세요.
  • cor.test(x, y)는 p값과 신뢰구간을 더해 줍니다 - 구간을 보고하세요.
  • 숫자를 믿기 전에 언제나 산점도를 보세요.

다음 주제: 질문이 "함께 움직이는가?"에서 "이 그룹의 평균이 저 그룹과 다른가?"로 날카로워질 때 - t-검정입니다.

자주 묻는 질문

R에서 상관계수는 어떻게 계산하나요?

cor(x, y)가 두 수치형 벡터 사이의 Pearson 상관계수를 반환합니다. 대신 수치형 열로 이루어진 데이터 프레임을 전달하면 - cor(df) - 전체 상관행렬을 얻습니다. p값과 신뢰구간이 필요하면 cor.test(x, y)를 사용하세요.

R에서 상관계수의 p값은 어떻게 구하나요?

cor()만으로는 p값이 나오지 않습니다 - cor.test(x, y)를 쓰세요. 출력에는 t 통계량, 자유도, 참 상관계수가 0이라는 귀무가설에 대한 p값, 95% 신뢰구간, 그리고 추정된 계수가 포함됩니다.

Pearson 상관과 Spearman 상관의 차이는 무엇인가요?

Pearson(기본값)은 원래 값에 대한 선형 연관성을 측정합니다. Spearman은 값을 먼저 순위로 바꾸므로 관계가 일관되게 증가하거나 감소하는지(단조성)를 측정하며 이상치에 훨씬 덜 민감합니다. 순서형 데이터, 치우친 데이터, 휘어 있지만 단조로운 관계에는 cor(x, y, method = "spearman")을 쓰세요.

cor()에서 NA 값은 어떻게 처리하나요?

기본적으로 cor()은 값이 하나라도 결측이면 NA를 반환합니다. 결측값이 있는 행을 먼저 제거하려면 use = "complete.obs"를, 행렬에서 변수 쌍마다 둘 다 존재하는 모든 행을 사용하려면 use = "pairwise.complete.obs"를 전달하세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기