본문 바로가기
Covariance 공분산과 Pearson 상관계수의 속사정. 그리고 Spearman의 꼽사리

바로 직전에 교차분석에서 연관도(상관도)를 계산해 보았기 때문에 그렇다면 자~연~스럽게~ 일반적인 연속형-연속형 변수들의 관계를 볼 수 있지 않겠느냐 하는 생각에 이르렀다면 이제는 꽤나 앞으로 나올 줄거리를 꿰차고 있는 것으로 생각되니까 잠시 빵긋 웃어보고 시작하도록 하겠습니다. 

일단, 상관이라는 것을 할 때는 어김없이 나타납니다. 공분산이라는 것이. 아, 공분산이라니 또 분산이 하나 출현하는군요. 그놈의 분산이라니. 공분산은 Covariance를 그대로 한국어로 번역했는데 이건 전혀 이해에 도움이 되지 않는 해석이라고 생각합니다.

왜냐하면, 1개 변수의 흩어짐에 대한 정도를 나타내는 것이 분산인 데 비해서, 공분산은 2개의 확률변수의 차이에 대한 분산이 아닌 같이 변화하는 양을 나타내는 상관 정도를 나타내는 값이기 때문에 더더욱 네이밍이 조금은 동떨어진 것 아니니까 생각이 들기 때문이죠. 다시 Scattering 관점에서 이야기하면 분산은 값이 커질수록 더 흩어지는데, 공분산은 값이 커질수록 더 흩어지는 지표가 아닙니다. Scattering 과 관련이 없습니다. 그러니까 이 네이밍이 이상하다고 생각합니다. - 값이 커질수록 두 변수가 각각의 평균으로 부터 같이 흩어진다 정도라면 이해할만 합니다만 -

하지만, 서로 같이 변화하는 정도를 어떤 식으로 수치화할 수 있는가 생각해 보면 두 확률변수가 각각의 평균에 대해서 얼마나 같이 흩어져(떨어져) 있는지를 구해서 서로 곱해 합한 후에 평균 내어 수치화하면 대충 맞지 않을까 하는 접근인데 이렇게 하고 보면 분산의 공식과 비슷합니다. 그리고 분산의 원래 정의인 확률변수가 평균으로부터 얼마나 떨어진 곳에 분포하는지를 가늠하는 숫자라는 면에서는 또 어느 정도 맞는 번역 같기도 합니다. 하지만 여전히 분산이라는 용어는 아무래도 머릿속에 충돌을 일으키는 것 같고, 동반 변화량 정도로 이름 지었다면 훨씬 더 이해하기 쉽지 않았을까 합니다.

어쨌든, 이 접근을 그대로 적용한 표본에 대한 공분산은 
$$ s_{XY} = {\cfrac{\sum\limits_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right) }{(n-1)}}$$
으로 정의할 수 있겠습니다. 

비교할 수 있도록 분산의 공식을 보면, 
$$s^2 =  \dfrac{ \sum\limits_{i=1}^{n}(x_{i}-\bar{x})^2}{n-1} = {\cfrac{\sum\limits_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(x_{i}-\bar{x}\right) }{(n-1)}} $$
이런 식으로 풀어쓴다면, 분산은 자신과 자신의 관계라고 볼 수 있다고 볼 수 있겠는데, 공분산 Covariance 네이밍이 이런 면에서는 기가막힌 네이밍 아닌가 합니다. 그러니까 각각의 평균으로부터 얼마나 같이 흩어져 있는가! 를 수치화! 하려고 만들고 보니 어라? 분산과 비슷하네?라는 이야기입니다. 후. - 사실 수리적 접근을 계속 공부해 보면 상호 관계를 기존의 정의로부터 약간 변형해서 기존의 term을 이어서 사용하는 경우가 왕왕 있습니다. 예를 들면 auto correlation도 그렇죠 - 

여기에서 유심히 봐야 할 것은 공분산은 제곱이 없고, 표본분산은 제곱이라는 점. 공분산은 제곱해야 비로소 분산처럼 다룰 수 있습니다.

상관관계는 (x, y) 쌍의 데이터의 좌표를 나타내는 점들이 오른쪽 위 또는 오른쪽 아래를 향하는 경향성을 보인다면 양의 또는 음의 상관관계가 있다고 표현하는데, 오른쪽 위를 향한 경향성을 띌때 공분산을 계산해보면 Positive가 나와서 양의 상관, 오른쪽 아래를 향하는 경향성이 보이면 공분산 계산 결과가 Negative가 나와서 음의 상관으로 볼 수 있는데, 이걸 결과로부터 거꾸로 생각해 보면, 당연한 이야기지만, 양의 상관이 나온다면 같이 증가하는 형태, 음의 상관이 나온다면 하나가 증가할 때 나머지 하나가 감소하는 형태라고 생각할 수 있겠습니다.

 

그러면 이게 왜이러냐 하는 것을 곰곰이 턱을 괴고 생각해 보면,

 

x, y 각각의 평균으로부터 차이의 부호를 - $(x-\bar{x})(y-\bar{y})$의 부호 - 4사분면으로 표시해서 따져보면, 공분산이 Positive인 경우에는 +를 갖는 값이 -를 갖는 값보다 훨씬 많을 테니까, 다 더하면 +값을 가질 테고, 공분산이 Negative인 경우에는 -를 갖는 값이 +값을 갖는 값보다 훨씬 많을테니까 다 더하면 -값을 가질 것입니다. 이것에 더하여 +와 -값이 비등하게 있다면 다 더했을 때 0에 가까운 값을 가질 테고 그럴 때는 서로 상관도가 작다고 볼 수 있겠습니다. - 사실 데이터가 있는 곳에서 부호만 따진 것이지 크기를 따진다면 각 x, y 쌍 데이터의 각 평균으로부터의 차이에 대한 면적입니다.  - 

그래서 Positive이든, Negative이든 공분산이 크다면 선형적 연관성이 높다는 결론에 이룰 수 있습니다. 참고로 공분산은 -∞~+∞ 값을 갖습니다. 

자, 잠깐만! 공분산의 의미를 되새겨 보면, 값의 크기 보다는 Sign(부호)에 의해서 선형 관계의 방향을 나타내기 때문에 큰 문제가 있습니다. 무슨 문제냐면 x, y의 단위에 영향을 많이 받는다는 것인데, 상관관계 강도와 상관없이 단위가 크면 큰 값이 나온다는 것입니다. 

예를 들면 1000점 만점의 영어성적과 수학성적의 공분산과 50점 만점의 영어성적과 수학 성적을 비교하게 되면 1000점 만점의 영어성적과 수학 성적의 상관관계가 더 적더라도 50점 만점의 공분산이 더 큰 값을 가질 수 있겠습니다. 어어. 이러면 안 되잖아요

이 단점을 해결하기 위해서, 어떻게 하느냐 하면 통계에서 좋아하는 정규화라는 것이 있죠. Correlation Coefficient라는 것을 정의해서 비교가 가능하도록 사용하는데, 마치 데이터 정규화처럼 데이터의 크기를 조정할 필요가 있으니까, 각각의 표준편차로 정규화를 한다는 것이고, 이렇게 하면 -1~+1 사이의 값을 갖게 됩니다. 그러니까, 선형 관계의 Strength도 다른 것과 비교해서 알 수 있고, 방향도 알 수 있는 그런 지표가 됩니다. 휴.

이런 관계를 잘 표현하려면, 

 

상관계수를 이런 식으로 정의하면 좋은데, 이걸 실제 수식으로 나타내면 다음과 같습니다. 

$$r= \cfrac{s_{XY}}{s_X\cdot s_Y} = \dfrac{\cfrac{\sum\limits_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right) }{(n-1)}}{\sqrt{\cfrac{\sum\limits_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}}{(n-1)}} \cdot \sqrt{\cfrac{\sum\limits_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}}{(n-1)}}}$$

음. 좀 복잡해 보이지만, 결국 공분산을 각각의 분산으로 나눈다는 것일 뿐입니다. 이게 자기 자신과의 상관이면 최댓값이 되는데, 1이 나옵니다. (당연한 이야기지만, 자기 자신과의 공분산은 분산이니까요.) 이것을 Pearson 상관계수라고 합니다. 

그리고 이제 와서 별로 놀랍지도 않겠지만, 상관계수도 검정이 가능합니다. 표본을 통해 구했으니까 검정을 해볼 수 있겠고요. 미리 이야기하자면, 이 상관계수라는 것이 회귀계수와 연결됩니다. 아니 갑자기 무슨 회귀 타령이냐?라는 생각이 들더라도 그냥 그 정도는 그렇다더라 하고 적당히 알고 있는 것이 좋지 않을까 생각합니다. 

여기에서 그렇다면 상관계수가 어떤 분포를 따를지를 알아야 Null Hypothesis를 세울 수 있겠는데요, 이때 Notation을 짚고 넘어간다면 일반적으로 모집단의 분산을 σ²으로, 표본의 분산을 s²로 표시하듯이 모집단의 상관계수를 ρ로 표본의 상관계수를  r로 표현합니다. 

일단 자세한 유도는 도움이 안 될 것 같고 직관적인 접근이 더 도움이 될 것 같아서 느낌적인 느낌으로 접근해 보시죠. 이 접근은 뭔가 수리적인 접근이라기보다는 이해를 위한 접근입니다. 이런 걸 일컬어 intuition이라는 좋은 말이 있으니까요! 헤헤. 일단 결론을 먼저 이야기하면, r분포는 t분포를 따르고요, 통계량은 다음과 같습니다.

$$ t_{stat} = \cfrac{r-\rho_0}{\cfrac{\sqrt{1-r^2}}{\sqrt{n-2}}} $$

주어진 데이터(표본)에서 r을 계산하고 나면 모상관계수 ρ₀를 안다는 가정하에 이런 식으로 t분포에서의 검정 통계량을 계산할 수 있습니다. 그렇다면, 이걸 평균의 경우의 t 검정 통계량과 비교하면, 

이렇게 실제로 묘하게 뭔가 닮아 있습니다. 오. 그렇군요. 

지금부터 하는 이야기는 정말 Intuition적인 이야기라서, 그냥 그런가 하는 이야기 정도로 이해를 해야지, 이 이야기를 어디 가서 내가 잘 아는데 말이야 이건 말이야 하면서 이렇다고 주장하면 곤란합니다. 그냥 이해하기 좋은 범위 내에서 그럴듯하게 지어낸 이야기입니다.

$\cfrac{s_{XY}}{s_X\cdot s_Y}$ 요것을 보면, 분자는 뭔가 2개를 곱한 후에 평균을 냈거든요. 그렇다면 곱하는 것들의 개수가 30개가 넘거나, 원래 모분포가 Gaussian이라면 당연히 Gaussian을 따르겠군요. 분자는 이렇게 해결. 분모는 표본편차 곱하기 표본편차잖아요? 그러면 차원은 분산의 차원이지 않겠어요? 그러면 χ²분포를 따르지 않을까? 정도로 이해할 수 있겠다는 뭐 그런 이야기입니다.    그렇다면! 엇! 엇! $\frac{N}{\chi^2}$이 느낌 어디서 보지 않았나요? 이 느낌은 t분포. 그래 t분포입니다. 음 그래 그렇습니다. 익숙한 t분포를 다시 만나니 좀 반갑군요. 평균의 분포를 따지는 t분포에서의 검정 통계량을 구하려면 어땠나요? 표본의 평균과 표준오차를 이용해서 구했었죠? 그렇다면 상관계수도 표본에 의한 상관계수와 표준오차가 있으면 되겠군요. 

이 부분에서 분모에 대해서 조금만 더 이야기해 보자면 표준오차 부분이 두 개가 조금 다르군요. 이것이 무엇이냐 하는 관점에서, 일단 r²라는 것이 무엇인가 하면 0~1 사이의 값으로써 얼마나 두 변수가 서로 얼마나 관련이 있는가에 관한 분산 차원의 값입니다. 그렇기 때문에 1-r²은 서로 관련이 없는 부분이 얼마나 있는가를 나타냅니다. 상관계수 오차의 제곱 합과 같다고 보면 됩니다. 그렇다면 표준오차처럼 다룰 수 있겠군요. 그리고 추가하여, 회귀를 하기 전에 이 느낌을 설명하기가 좀 그렇긴 한데 - 에라이 모르겠다 - 미리 이야기하면 r²를 회귀에서는 결정계수라고 부르는데, 이게 "단순 회귀"에서의 정의는 $r^2 = 1-\cfrac{\sum{residual}^2}{\sum{deviation}^2}$ 로 해서 분산 느낌의 컨셉으로 얼마나 모형이 데이터에 잘 fitting 하는가를 판단하는 척도로 사용합니다. - 당연히 오차가 작을수록 1에 가까운 값이 되고, 모델이 데이터를 잘 설명한다고 말할 수 있겠습니다. - 이걸 표본분산의 term으로 정리하면 $\cfrac{\sum{residual}^2}{\sum{deviation}^2} = 1-r^2$로써 거꾸로 이것은 0~1 사이의 r의 아직 평균을 내지 않은 오차 제곱 합이라고 볼 수 있습니다. - 여기에서 deviation은 관측치와 평균의 차이이고, residual은 관측치와 예측치의 차이입니다 - 그러니까 이걸 자유도로 나누어 평균 낸 후에 root을 씌우면 표준오차가 되겠군요! 으이구.


마지막으로 표본평균분포의 자유도 n-1과 상관계수분포의 n-2의 차이가 있겠는데, 표본평균을 따질 때는 평균을 구할 때 데이터를 1개 써먹으면서 s를 구합니다. 이때 이미 n-1로 나누어서 말이죠, n-1이 수식에는 나타나지는 않습니다. t(n-1)을 따르고요, 상관계수는 r을 구할 때는 분모의 분산을 구할 떄 이미 X의 평균과 Y의 평균을 구하기 위해서 데이터를 하나씩 써먹었잖아요? 그러니까 최종 자유도는 n-2입니다. t(n-2)를 따릅니다. 

이걸 1 Sample t Test 했을 때의 분포 그림과 비교해서 보면 

 

⓵ r의 분포는 t분포이고요, t(n-2) 
⓶ 이때 ρ₀를 중심으로 종모양 비스므리한 분포를 보입니다. 
⓷ 이때의 표준오차는 $\sqrt{1-r^2}/\sqrt{n-2}$ 입니다. 
⓸ 이제 분포를 알았으니 관측한 r을 이용해서 ρ₀가 진짜 그 값이어도 되는가! 하는 1 Sample t Test를 할 수 있겠습니다. 

조금은 정리가 되는 되는군요. 그렇다면, 이제는 상관계수는 t 분포를 따른다고 보면 되고, 이때 Null Hypothesis와 Alternative Hypothesis는 ρ₀를 특정해서 검정을 해야겠습니다. 그렇다면 정말 ρ₀가 이래도 될까?라는 질문이라면 ρ₀=0 이어도 되는 걸까?라는 질문에서 시작하면,

H0 : 모상관계수는 0이다. ρ₀ = 0  
H1 : 모상관계수는 0이 아니다. ρ₀≠0

물론 ρ₀가 0이 아닌 어떤 특정값으로도 t Testing이 가능합니다! 예를 들면 ρ₀가 0.5이어도 될까?라는 식이죠. 그냥 0으로 가정할 때 가장 합리적인 Hypothesis가 된다는 의미입니다. 자 이제 r을 구하기만 하면 표본평균에 대한 1 Sample t Test와 똑같습니다. 그러니까 Hypothesis를 다시 정리하면 어떤 r을 관측했는데 모상관계수가 0이어도 될까?를 검정한다고 보면 되겠습니다. 여기에서 Significant 하다면 0이기에는 관측치가 좀 거시기한데?라는 접근이죠.

그러면, 실제 예를 들어서 한번 해볼까 합니다.

import numpy as np
import pandas as pd

x_data = [1, 2, 4, 8, 10, 12, 13, 8, 17, 20]
y_data =  [2, 3, 7, 7, 9, 11, 12, 11, 15, 17]

 

자, Covariance공분산은 numpy에서 직접 계산할 수가 있고요, Pearson Correlation Coefficient상관계수는 pandas의 Dataframe에서 직접 계산할 수가 있습니다. 

import math

### 공분산 ; numpy로 곧바로 계산 가능하다.
dof = len(x_data)-1  # 자유도
np.cov(x_data, y_data, ddof=dof) # covariace
>
array([[348.5, 260. ],
       [260. , 208.4]])

### 상관계수 ; pandas로 곧바로 계산 가능하다. 
df_corr = pd.DataFrame({'x_data':x_data, 'y_data':y_data})
>
x_data  y_data
0       1       2
1       2       3
2       4       7
3       8       7
4      10       9
....

df_corr.corr() # 상관계수를 계산!
>
          x_data    y_data
x_data  1.000000  0.964768
y_data  0.964768  1.000000

 

둘 다 결과가 행렬 형태로 나오는데요. x_data와 y_data를 행과 열로 순서대로 두고 결과가 나옵니다. Covariance는 260이고요, x_data의 분산은 348.5, y의 분산은 208.4로 읽으면 되고요, Correlation Coefficient는 0.964768입니다. 당연히 자기 자신과의 Correlation은 1.000000가 나오고요. 얏호, 간단하군요!

Correlation Coefficient의 t 검정도 간단하게 할 수 있겠는데요, 이건 scipy의 pearsonr()를 이용해서 할 수 있습니다. 

from scipy.stats import pearsonr
pearsonr(x_data, y_data)
>
(0.9647684650479604, 6.459870025582558e-06)

 

결과는 Correlation Coefficient는 0.9647684650479604, p value는 6.459870025582558e-06 순으로 나타냅니다. 상관도가 굉장히 큽니다. t 검정 결과도 역시 Significant 하군요. 이 이야기는 ρ₀=0라는 Null Hypothesis를 기각할 수 있으며, 결국 모상관계수는 값이 0이 아니라고 주장하는 것이 무리가 없고, 그러므로 x와 y는 상관이 있다 정도의 결론이면 되겠습니다. 

참고로, 이걸 손으로 풀듯이 한번 해 보면, 다음과 같이 할 수 있겠습니다. 공분산과 각각의 표준편차를 구한 후에 상관계수를 직접 계산해 보면, - 이걸 직접 풀 때는 cov, var를 구할 때 자유도를 꼭 입력해 주어야 합니다. 그렇지 않으면 다른 결과가 나와요 (주의) -

import math
dof = len(x_data)-1  # 자유도
covariance_xy = np.cov(x_data,y_data, ddof=dof) # 공분산
standard_deviations_xy = math.sqrt(np.var(x_data, ddof=dof)*np.var(y_data, ddof=dof)) # 각 분산의 곱
r = (covariance_xy/standard_deviations_xy)[0][1] # 상관계수

>
0.9647684650479608  # 상관계수

 

오. 그러면 상관계수를 구했으니까 t 통계량도 공식과 똑같이 계산해 보면 

n = len(x_data) # 데이터 수
t = r/(math.sqrt((1-r**2)/(n-2))) # t 통계량

>
10.371620586270566 # t 통계량

 

짠! 이떄 p value를 구해보면!

from scipy.stats import t as t_distribution
p = (1-t_distribution.cdf(t,df=n-2))*2   # p value

>
6.459870025565806e-06  # p value

 

오, pearsonr() 로 구한 값과 똑같이 나왔군요. 너무 당연한 걸 다시 했나요.

 

t 검정으로 검정을 했으니까, 표본수가 적당히 크다면 당연히 z 검정을 할 수 있습니다.  

상관관계는 두 개의 변수끼리 선형 관계가 있는지에 대한 간단한 조사 방법이라고 볼 수 있겠습니다. 서로 독립이라는 조건은 선형관계가 없다고 할 수 있겠습니다. 즉, 독립 → 공분산 = 0의 논리의 흐름이 작동하지만, 반대로, 공분산이 0이라고 해서 항상 독립이 되진 않습니다. 왜냐하면 공분산은 선형 관계에 대한 의존성을 측정하고, 공분산이 0이 되면 두 변수의 선형 관계가 없다는 것을 의미합니다만, 독립이다라고 볼 수는 없습니다. 말 그대로 선형 이외의 관계가 있을 수 있으니까요. 가장 많이 예로 드는 것이 y=x² 관계 등의 비선형 관계가 있는데 이때에는 상관관계를 제대로 측정하지 못합니다. 

어, 자유도. 그런데, 중간에 조금 이상한 것을 느끼지 않았나요? 공분산은 자유도가 n-2가 왜 아닌가요?라는 질문이 있는 것이 이제는 통계를 다루는 사람으로서 당연한 질문이 될 것 같은데, - 중간에 이 이야기를 하긴 했지만, 정확하게 정리한다면 - x와 y의 평균을 구했으니 n-2가 될 것 같지만 실은 공분산의 경우에는 x, y로 이루어진 2차원의 $(x_i, y_i)$ 데이터 중에서 쌍으로 된 $(\bar{x}, \bar{y})$로 이루어진 표본평균을 구했거든요. 그때 (x,y) 한 쌍을 사용했으니까 n-1이 됩니다만, 그러면 상관계수에 대한 통계량은요? 왜 n-2죠?라는 질문이 당연히 따라오게 되겠지요? 이것은 Normalization을 위해서 분모에 나눌 때 x와 y의 분산을 따로 사용하게 되지요? 그래서 그때는 따로따로 x와 y의 데이터를 하나씩 사용했기 때문에 2개의 데이터가 빠집니다. 그래서 n-2이에요. 홋   

상관계수를 해석할 때 주의할 점이 몇 가지가 있는데, 이 정도는 알고 있는 것이 신상에 도움이 되겠습니다.

➊ 상관계수가 크다고 해서 데이터가 더 조밀하게 모여 있다고 할 수 없습니다. (근엄) 그저 4사분면 중 어디에 더 (x, y) 쌍이 많은지만 나타낼 뿐입니다. 결국 더 빽빽한가보다는 선형관계인가 정도만 가늠할 수 있고 데이터의 관계가 어떨지 rough 하게 들여다보는 방법론이라고 보는 것이 더 마음 편합니다.

➋ 상관관계는 개별 데이터가 아닌 그룹별 평균 데이터를 사용하여 상관관계에 대한 결론을 내게 되면 개개인에 대한 상관관계가 과장될 수 있습니다. 그러니까 개별데이터에 대한 상관관계는 실제로는 훨씬 작을 수 있음을 알고 있으면 당황하지 않을 수 있습니다.


➌ 마지막으로 상관관계를 볼 때 Outlier가 있거나 비선형관계일 때는 상관계수가 의미를 퇴색합니다. 당연하겠지만 비선형관계일 때는 의미를 찾기 어렵고 Outlier는 큰 cov값을 갖는 점이 있을 테니 이것이 상관관계의 왜곡을 만들어 냅니다. 상관분석을 할 때는 Scatter Plot을 꼭 그려보는 습관을 기르면 좋겠습니다. 덧붙여 비선형관계에서 이야기는 어쩔 수 없는 이야기이고, Outlier가 있는 경우에 Robust 하게 상관관계를 측정할 수 있는 방법이 있는데 그것이 Spearman 상관계수입니다. 왜냐하면 Spearman 상관계수를 계산할 때는 숫자 데이터를 그냥 다 쓰는 것이 아니라 숫자 데이터에 순위를 다시 매긴 후에 그것을 이용하니까 갑자기 큰 숫자가 나오더라도 그닥 문제가 되지 않습니다. 게다가 범주형-범주형일 때 Cramer V를 이용해서 보았었는데, 이 범주형 데이터가 순서를 갖는 Ordinal 데이터라면 범주형 데이터를 raw 데이터가 아니라 순서에 맞도록 순위를 매긴후에 그 순위를 숫자와 똑같이 취급하면 또 그 나름대로의 상관관계를 따질 수 있습니다. 예를 들어, 직원들의 출근순서가 고용된 기간순서와 상관관계가 있는지를 Spearman 상관계수로 평가할 수 있습니다. 

Spearman 상관계수는 Pearson 상관계수로부터 시작하는데, 
$$r= \dfrac{\cfrac{\sum\limits_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right) }{(n-1)}}{\sqrt{\cfrac{\sum\limits_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}}{(n-1)}} \cdot \sqrt{\cfrac{\sum\limits_{i=1}^{n}\left(y_{i}-\bar{y}\right)^{2}}{(n-1)}}}$$
여기에서 $d_i = x_i - y_i$로 정의해서 d에 대해서 아주 복잡하고 귀찮은 과정을 거쳐서 정리하면  $r= 1-\cfrac{6\sum  d_i^2}{n(n^2-1)}$ 이 됩니다. d는 x의 순위와 y 순위의 차를 의미합니다. 같은 데이터에 대한 순위는 평균 순위를 넣고요. 외울 수 있는 사람은 외우겠죠. 아닙니다. 저는.  외우진 못해도 예제 하나 정도는 보고 가면 이해에 많은 도움이 되겠습니다. 방금 이야기한 직원들의 출근순서와 근속개월의 관계를 간단하게 볼까요?

 

$r = \left. 1-\cfrac{6\sum  d_i^2}{n(n^2-1)} \right\rvert_{\begin{align*}
\sum d_i^2&=90 \\ n&=7 \end{align*} } = -0.6071428571428572 $ 입니다. 어, 꽤 큰 음의 상관관계가 있군요? 이렇다는 이야기는 근속기간이 길수록 순위가 작고, 출근 시간이 빠를수록 순위가 작으니까, 근속기간이 길수록 출근 시간이 늦은 것 아닌가 하는 관계를 생각해 볼 수 있겠습니다만. scipy를 이용해서 p value를 계산해 보면

from scipy.stats import spearmanr
spearmanr(df_raw['출근시간순위'], df_raw['근속개월순위'])
>
SpearmanrResult(correlation=-0.6071428571428572, pvalue=0.1482311614811614)

 

엇. p value가 유의하지는 않습니다? 이 이야기는 표본에 대해서는 높은 상관관계를 보이는 것처럼 보이지만, 막상 모집단에서의 상관관계는 없다고 봐야 한다 정도로 interpretation을 하면 되지 않을까 합니다. - 사실 이 경우는 상관관계가 크게 나옴에도 불구하고 Significant하지 않게 나온 이유는 표본의 크기가 너무 작아서라고 보는 것이 훨씬 현실적입니다. - 다행히 spearmanr과 손으로 푼 것이 같은 값이 나왔으나 표본크기가 작은 경우에는 두 결과가 다르게 나오는 경우도 있습니다. 좀 그렇죠. 이런식으로 상관관계를 보는 켄달계수라는 것도 있는데 이건 그런 게 있었나 정도로 끝내는 것이 좋겠습니다.  생각보다 너무 긴 이야기가 되어 버렸군요. 

친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -



댓글





친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -