스피어만 상관계수란?
스피어만 상관계수(Spearman's Rank Correlation Coefficient)는 두 변수 간의 순위 상관관계를 측정하는 비모수적 통계 지표이다. 피어슨 상관계수와 달리, 데이터의 분포에 대한 가정이 필요 없으며, 두 변수 간의 비선형적인 관계도 평가할 수 있다. 스피어만 상관계수는 두 변수의 순위 값을 기반으로 계산된다.
스피어만 상관계수의 계산
스피어만 상관계수 $\gamma_s$ 는 다음과 같은 수식으로 계산한다.
$$\gamma_s = 1-\frac{6\sum d^2_i}{n(n^2-1)}$$
- $d_i$: 각 데이터 포인트의 순위 차이 ( $d_i = R(X_i) - R(Y_i)$ )
- $R(X_i)$와 $R(Y_i)$: 각각 변수 $X$와 $Y$의 순위
스피어만 상관계수의 해석
스피어만 상관계수의 절대값이 클수록 두 변수 간의 순위 관계가 강하다는 것을 의미하며, 절대값이 1이 되면 동일한 비율로 증가한다고 해석할 수 있다.
- +1: 완벽한 양의 순위 상관관계 (한 변수의 순위가 증가할 때 다른 변수의 순위도 동일한 비율로 증가)
- -1: 완벽한 음의 순위 상관관계 (한 변수의 순위가 증가할 때 다른 변수의 순위는 동일한 비율로 감소)
- 0: 순위 상관관계가 없음 (두 변수 간에 순위 상관관계가 없음)
스피어만 상관계수 계산 예재 (python)
아이리스(Iris) 데이터셋의 sepal length(cm), petal length(cm)는 모두 정규성을 만족하지 않는다. 그렇기에 두 변수간의 상관관계를 스피어만 상관계수로 계산해보았다.
import pandas as pd
from scipy.stats import spearmanr
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import pingouin as pg
# 데이터 로드
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
# 두 변수 선택
x = df['sepal length (cm)']
y = df['petal length (cm)']
# 정규성 검정
display(pg.normality(x)) # False
display(pg.normality(y)) # False
# 스피어만 상관계수 계산
spearman_corr, _ = spearmanr(x, y)
print(f'스피어만 상관계수 (Sepal Length, Petal Length): {spearman_corr}')
# 스피어만 상관계수 (Sepal Length, Petal Length): 0.881898126434986
# 산점도 및 회귀선 그리기 (선형성 확인)
plt.figure(figsize=(8, 6))
sns.regplot(x=x, y=y, ci=None, line_kws={"color": "red"})
plt.title('Scatter Plot of Sepal Length(cm) vs. Petal Length(cm)')
plt.xlabel('Sepal Length(cm)')
plt.ylabel('Petal Length(cm)')
plt.grid(True)
plt.show()