두 변수 유사성 확인 (피어슨, 스피어만, 켄달타우)
Reference
- https://medium.com/@leejukyung/%EC%BC%84%EB%8B%AC%ED%83%80%EC%9A%B0-kendalltau-18fb90ba4e7
- https://jimmy-ai.tistory.com/142
- https://medistat.tistory.com/89
켄달타우
- 두 사람이 시스템에 대해 평가를 했다고 하자.
- 이 두사람 A,B가 평가한 점수가 얼마나 연관성있는지 확인하고 싶다.
- 5개의 데이터에 대한 평가 (5개의 데이터: d1,d2,d3,d4,d5 라고하자)
- 예1)
- 사람A: 1,2,3,4,5
- 사람B: 3,4,1,2,5
- di_X: i번째 데이터에 대한 X사람의 점수
- concordant pair 계산
- 같은 상관관계를 가진 쌍을 의미한다.
- (d1, d2)와의 관계
- d2_A > d1_A
- d2_B > d1_B
- 따라서 concordant pair임
- 마찬가지로 (d1, d5), (d2, d5), (d3, d4), (d3, d5), (d4, d5)도 concordant pair이다.
- 따라서 총 6개의 concordant pair가 있다. 이를 C라하자.
- discordant pair
- concordant pair와 반대로 반대의 상관관계를 가진 것을 의미한다.
- 당연히 4C2-6=4가 된다. (여기서는 동점이 없으니까 일단 무시)
- 켄달타우 = (C-D)/(C+D)=2/10=0.2 가 된다.
- 예2)
- 사람A: 1,2,3,5,5
- 사람B: 3,4,1,5,5
- concordant pair 계산
- (d1, d2)와의 관계
- d2_A > d1_A
- d2_B > d1_B
- 따라서 concordant pair임
- 마찬가지로 (d1,d4), (d1,d5), (d2,d4), (d2,d5), (d3,d4), (d3,d5) concordant pair이다.
- 따라서 C=7개의 concordant pair가 있다.
- discordant pair
- 여기서는 동점이 있으므로 실제 discordant pair은 (d1,d3), (d2,d3) 2개이다.
- 켄달타우 = (C-D)/(C+D)=5/9=0.555 가 된다.
from scipy import stats
"""
tau = (P - Q) / sqrt((P + Q + T) * (P + Q + U))
where P is the number of concordant pairs, Q the number of discordant pairs,
T the number of ties only in x, and U the number of ties only in y.
If a tie occurs for the same pair in both x and y, it is not added to either
T or U
h = [1, 2, 3, 4, 5]
w = [3, 4, 1, 2, 5]
"""tau, p_value = stats.kendalltau(h, w)
tau
# 0.19999999999999998
p_value
# 0.8166666666666667- 식에서 분모가 T, U와 같이 뭔가 추가 된다.
- T: x에만 있는 동점수
- U: y에만 있는 동점 수
- 예 3에서 살펴보자
- 예3)
- 사람A = [3, 3, 1, 3, 4, 4]
- 사람B = [1, 2, 2, 5, 4, 4]
- concordant pair
- d1,d5
- d1,d6
- d2,d5
- d2,d6
- d3,d4
- d3,d5
- d3,d6
- discordant pair
- d1,d3
- d4,d5
- d4,d6
- T
- 1,2
- 1,4
- 2,4
- U
- 2,3
- 켄달타우 = (C-D)/sqrt((C+D+T)*(C+D+U))=(7-3)/sqrt((7+3+3)*(7+3+1))=0.3345
- 일반적으로 말할때 켄달타우의 하나의 변수를 순서대로 나열한다.
- 즉 위 예시에서 h=[1,3,3,3,4,4] 이러게 소팅한다.
- 그리고 그에 해당하는 w만을 보면서 계산한다.
피어슨 상관계수
- 표본(sample) 피어슨 상관 계수는 등간척도(간격척도)나 비례척도(비율척도)의 데이타에서 두 변수의 공분산(covariance) 을 각각의 표준 편차의 곱으로 나눈 값이다
- 위처럼 계산한다.
- X-Xmean = X'
- Y-Ymean = Y'
- 로 생각하면 X'와 Y'의 내적값이 분자, 이 둘의 norm이 분모가 된다.
- 즉 X'와 Y'의 cosine similarity을 계산하는것과 같아 보임
- 코드
스피어만 상관계수
- 레퍼런스
- https://m.blog.naver.com/pmw9440/221955081796
- 피어슨과 달리 스피어만은 시작할 때, 변수를 순서형으로 취급한다.
- 즉 켄달타우처럼 하나의 변수를 소팅하고, 다른 변수를 통해서 값을 계산한다.
- 단, 스피어만은 동점(tie)가 없다고 가정하기 때문에, 상황에 따라 써야한다.
- 자세한식은 좀 복잡하다.
- $\combi{r}_s\ =\frac{\sum _{i=1}^n\left(i-\frac{n+1}{2}\right)\left(R_i\ -\ \overline {R}\right)}{\sqrt{\sum _{i=1}^n\left(i-\frac{n+1}{2}\right)^2}\sqrt{\sum _{i=1}^n\left(R_i\ -\ \overline {R}\right)^2}}$
- 위 식을 정리하면
- $r_s=\frac{12}{n\left(n^2-1\right)}\sum _{i=1}^n\left(i-\frac{n+1}{2}\right)R_i$$=\frac{12}{n(n^2−1)}\sum _{i=1}^niR_i\ -\ \frac{3\left(n+1\right)}{n-1}$$=\ 1-\ \frac{6}{n\left(n^2-1\right)}\sum _{i=1}^n\left(i-R_i\right)^2$
- 위 식을 최종적으로 계산하면 된다.
- 코드
댓글
댓글 쓰기