Python/Scipy

[Scipy] 파이썬 상관계수 구하기 함수 정리(피어슨, 스피어만, 켄달)

jimmy_AI 2022. 2. 20. 14:34
반응형

파이썬 상관계수 함수 종류 및 사용법

안녕하세요. 이번 글에서는 파이썬의 scipy 패키지를 이용하여

두 데이터의 피어슨 및 스피어만 상관계수 그리고 kendall 상관계수를

손쉽게 구하는 방법에 대하여 살펴보도록 하겠습니다.

 

먼저, 아래와 같이 0~9 숫자의 x1 데이터0~9의 제곱수에 2를 나눈 x2 데이터

있다고 가정해보도록 하겠습니다.

import numpy as np
import matplotlib.pyplot as plt

x1 = np.arange(10)
x2 = x1 ** 2 / 2

plt.scatter(x1, x1, color = 'red', label = 'x1', alpha = 0.55)
plt.scatter(x1, x2, color = 'blue', label = 'x2', alpha = 0.55)
plt.legend()

plt.show()

이제 x1과 x2 데이터 사이에서의 피어슨, 스피어만 그리고 켄달타우 상관계수를 구해보겠습니다.

 

 

피어슨 상관계수 함수 : stats.pearsonr

from scipy import stats

stats.pearsonr(x1, x2)
# (0.9626907371412556, 8.103391267431583e-06)

피어슨 상관계수는 위와 같이 scipy 내 stats 라이브러리의 pearsonr 함수를 이용하여

손쉽게 구하는 것이 가능합니다.

위에서는 input으로 리스트를 넣었으나, np.array나 pd.Series 등 자료형도 가능합니다.

 

output의 첫 숫자는 상관계수 숫자를 의미하는 것이며, 약 0.963 정도로

매우 강한 양의 상관관계를 의미하고 있습니다.

(0.7 이상 정도면 매우 큰 상관관계를 의미합니다.)

 

두번째 숫자는 두 집단 간의 상관관계가 얼마나 유의미한지를 나타내는 p-value 값으로

보통 0.05 혹은 0.01 이하 정도면 유의미한 상관이 있다고 간주합니다.

여기서는 약 10^-5 이하로 두 집단은 거의 종속이라고 봐야할 정도의 작은 값이 나왔습니다.

반응형

스피어만 상관계수 함수 : stats.spearmanr

stats.spearmanr(x1, x2)
# SpearmanrResult(correlation=0.9999999999999999, pvalue=6.646897422032013e-64)

스피어만 상관계수도 spearmanr 함수를 이용하여 마찬가지 방식으로 구할 수 있습니다.

 

첫 숫자는 상관계수, 두번째 값은 p-value를 의미하는 점은 동일합니다.

 

x1과 x2는 뒤쪽으로 갈수록 단조 증가하는 패턴이 동일하여 순위 척도가 매우 유사하기에

1에 거의 근접한 상관계수가 관찰된 점을 알 수 있었습니다.

 

 

Kendall 상관계수 함수 : stats.kendalltau

stats.kendalltau(x1, x2)
# KendalltauResult(correlation=0.9999999999999999, pvalue=5.511463844797178e-07)

마지막으로, 켄달타우 상관계수도 같은 방법으로 사용 및 결과 해석을 진행하시면 됩니다.

 

스피어만 상관계수와 마찬가지로, 꾸준히 증가하는 패턴이 동일하여

거의 1에 해당하는 값이 등장하였습니다.