
Pearson Correlation Coefficient와 Spearman Correlation Coefficient
2022, Sep 19
- 참조 : 분산과 공분산 (variance and covariance)
- 참조 : 피어슨 상관 계수, 위키피디아
- 참조 : 스피어먼 상관 계수, 위키피디아
- 이번 글에서는 두 변수의 상관관계를 측정하는 대표적인 방식인
Pearson Correlation Coefficient
와Spearman Correlation Coefficient
에 대하여 살펴보도록 하겠습니다.
목차
-
Pearson Correlation과 Spearman Correlation의 비교
-
Pearson Correlation의 정의와 예제
-
Spearman Correlation의 정의와 예제
Pearson Correlation과 Spearman Correlation의 비교
- 먼저 본 글에서 살펴 볼
Pearson Correlation
과Spearman Correlation
의 특성에 대하여 먼저 살펴보도록 하겠습니다.

- 위 도표와 같이
Spearman Correlation
이 아웃라이어에 좀 더 강건할 뿐 아니라 단조 증가 관계만 가지면 사용할 수 있기 때문에 처음 시도하기에 좀 더 용이합니다. - 반면 두 변량이 선형 관계를 가지는 지 여부에 좀 더 초점을 두고자 한다면
Pearson Correlation
을 사용할 수 있습니다. - 따라서 본 글의 내용을 살펴 보기 전에 어떤 상관 관계를 사용해야 하는 지 위 도표를 보고 먼저 접근하는 과정이 필요합니다.
Pearson Correlation의 정의와 예제
- 먼저
Pearson Correlation
에 대하여 살펴보도록 하겠습니다. 살펴볼 순서는Pearson Correlation
의 정의와 식의 의미이며 간단한 예시도 살펴보도록 하겠습니다.
Pearson Correlation의 정의
- 먼저
Pearson Correlation
의 정의는 다음과 같습니다.
- ρ(X,Y)=COV(X,Y)√VAR(X)√VAR(Y)=1n−1∑ni=1(Xi−¯X)(Yi−¯Y)√1n−1∑ni=1(Xi−¯X)2√1n−1∑ni=1(Xi−¯X)2=∑ni=1(Xi−¯X)(Yi−¯Y)√∑ni=1(Xi−¯X)2√∑ni=1(Xi−¯X)2ρ(X,Y)=COV(X,Y)√VAR(X)√VAR(Y)=1n−1∑ni=1(Xi−¯¯¯¯¯X)(Yi−¯¯¯¯Y)√1n−1∑ni=1(Xi−¯¯¯¯¯X)2√1n−1∑ni=1(Xi−¯¯¯¯¯X)2=∑ni=1(Xi−¯¯¯¯¯X)(Yi−¯¯¯¯Y)√∑ni=1(Xi−¯¯¯¯¯X)2√∑ni=1(Xi−¯¯¯¯¯X)2
- 위 식에서 분자는 변수 X,Y 의 표본의 공분산을 의미하고 분모는 X,Y 각각의 표본 표준 편차를 의미합니다. 이와 같이
Pearson Correlation
의 정의에는 정규 분포를 가정하는 요소인 표본의 공분산과 표준편차가 존재하기 때문에 도표와 같이 정규 분포를 가정하는 데이터 셋에서 잘 동작합니다. - 위 식에서 COV(X,Y)=1n−1∑ni=1(Xi−¯X)(Yi−¯Y) 는 두 변수의 공분산을 나타내며 공분산이 양수이면 두 확률변수는 서로 양의 관계가 있음을 의미하고 공분산이 음수이면 두 확률변수는 서로 음의 관계가 있음을 의미합니다.
- 하지만 공분산의 크기값이 상관관계의 강한 정도를 나타내는 것은 아닙니다. 왜냐하면 X,Y 값 각각의 스케일이 있기 때문에 이 스케일을 통일시켜 주지 않으면 상관관계의 강한 정도를 비교할 수 없기 때문입니다.
- 따라서 공분산이 가장 크게 나타날 수 있는 경우를 분모로 나누어 주는
Normalization
과정을 통해 값의 스케일을 1 이하로 조정할 수 있습니다. 이 때, 공분산이 가장 크게 나타날 수 있는 경우가 √VAR(X)√VAR(Y) 입니다. 즉, 다음 조건을 만족합니다.
- |COV(X,Y)|≤√VAR(X)√VAR(Y)
- 이 식이 성립하는 조건은
Cauchy-Schwarz Inequality
를 통해 증명이 가능합니다. 바로 아래 내용에서 왜 √VAR(X)√VAR(Y) 가 공분산의 최댓값인 지와Pearson Correlation
의 범위가 왜 -1과 1 사이인 지 살펴보도록 하겠습니다.
Pearson Correlation의 범위가 -1과 1사이인 이유
Pearson Correlation
에서값의 범위
와Normalization
은 다음과 같은Cauchy-Schwarz Inequality
에 의하여 결정됩니다.Cauchy-Schwarz Inequality
의 정의는 다음과 같습니다.
- |⟨a,b⟩|≤‖a‖⋅‖b‖
- ⟨a,b⟩ : inner product of vectors a and b.
- ‖a‖ : norm of vector a.
- 위 식이
Cauchy-Schwarz Inequality
의 정의이며 좌변의 값은 두 벡터 내적의 절대값을 의미하고 우변의 각 값은 벡터의norm
을 의미합니다. Pearson Correlation
을 구할 때, 분자에 해당하는Covariance
의 정의는 다음과 같습니다.
- |COV(X,Y)|=|E[(X−¯X)(Y−¯Y)]|=|E[(X−¯X)]E[(Y−¯Y)]|
- 위 식에서 (X−¯X) 와 (Y−¯Y) 각각은 벡터를 의미하고 (X−¯X)(Y−¯Y) 는 내적을 의미합니다.
- 따라서 위 내적과 관련된 식은
Pearson Correlation
에서의 분자 요소에 해당하고Cauchy-Schwarz Inequality
에서는 좌변의 요소에 해당합니다.
Pearson Correlation
을 구할 때, 분모에 해당하는 식은 다음과 같습니다.
- √VAR(X)√VAR(Y)=√E[(X−¯X)2]√E[(Y−¯Y)2]
- 어떤 벡터 a 의
norm
의 정의는 다음과 같습니다.
- √a⋅a=√a21+a22+...+a2n
- 이 정의를
표본 분산
을 구하는 데 사용해 보겠습니다.
- √E[(X−¯X)2] = √1n−1∑n−1i=1(Xi−¯X)2=√VAR(X)
- 따라서
Pearson Correlation
의 분모는 √VAR(X)√VAR(Y) 로 정의되Cauchy-Schwarz Inequality
에서는 우변의 요소로 정의될 수 있습니다. - 앞에서 다룬
Cauchy-Schwarz Inequality
에 따른 식을 전개해 보도록 하겠습니다.
- |⟨a,b⟩|≤‖a‖⋅‖b‖
- ⇒|COV(X,Y)|≤√VAR(X)√VAR(Y)
- |COV(X,Y)|√VAR(X)√VAR(Y)≤1
- −1≤COV(X,Y)√VAR(X)√VAR(Y)≤1
Pearson Correlation이 선형 관계만 설명 가능한 이유
- 아래 식에서 표본의 갯수는 n 개이며 ¯X,¯Y 는 각각 X,Y 변량에 대한 표본의 평균을 의미합니다. sx,sy 는
표본 표준편차
를 의미합니다. - 아래 식에서 사용된 1/(n−1) 은
표분분산의 평균이 모분산과 같아져야 하기 때문
에 적용한 것이며 상세 내용은 아래 링크에서 확인가능합니다.
- ρ(X,Y)=COV(X,Y)√VAR(X)√VAR(Y)=1n−1∑ni=1(Xi−¯X)(Yi−¯Y)√1n−1∑ni=1(Xi−¯X)2√1n−1∑ni=1(Xi−¯X)2=1n−1∑ni=1(Xi−¯X)(Yi−¯Y)sxsy=1n−1n∑i=1(Xi−¯X)sx(Yi−¯Y)sy=1n−1n∑i=1ZXiZYi
- 위 식에서 ZXi,ZYi 각각은
Standardization
이 적용된 상태의 변량이 됩니다. 각 변량은 표준 정규 분포를 따르도록Standardization
가 적용된 것이기 때문에 각 변량의 스케일에 상관없이 모두 평균이 0, 표준편차는 sx,sy 를 따르도록 형성됩니다. - 이 때, ZXi,ZYi 가 같이 양의 값 방향으로 증가하거나 음의값 방향으로 감소해야 두 값을 곱하였을 때, 큰 양수 값이 되며 평균을 내었을 때, 1에 가까운 값이 됩니다.
- 반면 ZXi,ZYi 값 중 한 값이 증가할 때, 나머지 값은 감소하게 되면 두 값을 곱하였을 때, 큰 음수 값이 되며 평균을 내었을 때, -1에 가까운 값이 됩니다.
- 만약 한 값이 증가하더라도 나머지 한 값이 뚜렷한 증감 없이 평균에 가까운 0에 머물게 되는 경우가 많이 생기게 된다면 평균을 내었을 때, 0에 가까운 값이 됩니다. 이러한 이유로
Pearson Correlation
에서는 두 변수의 증감에 대한 상관관계가 없으면 0에 가까운 값을 얻게 됩니다. - 앞에서 설명한 이유로 두 변량의 양의 상관관계가 클수록 1에 가까운 값을 얻게 되고 음의 상관관계가 클수록 -1에 가까운 값을 얻게 됩니다.
Pearson Correlation
은 두 변량 간의 선형관계를 나타내는 특성을 가지고 있습니다. 앞에서Standardization
을 하는 과정에서 각 변량에 평균을 빼고 표본 표준편차를 나누어 주는 과정을 통해 두 변량의 스케일을 맞춰준 후 곱하게 됩니다. 이Standardization
이 선형 변환을 적용하기 때문에Pearson Correlation
은 두 변량의 선형 관계만 설명할 수 있습니다. 비선형적인 관계라면 관계성이 있다고 하더라도 낮은 correlation 수치를 얻을 수도 있습니다. 이러한 점이Pearson Correlation
의 특징이면서 단점으로 작용하기도 합니다.- 뿐만 아니라 몇 개의 데이터 쌍이 이상치가 되어 노이즈 처럼 작용된다면 비록 대부분의 데이터가 선형 관계를 가지더라도
Pearson Correlation
을 계산할 때, 악영향을 끼칠 수 있습니다. 즉,Pearson Correlation
은 노이즈에 취약하다는 단점이 있습니다. 관련 내용은 아래 예시를 살펴보면서 확인해 보도록 하겠습니다. - 상세 내용 및 추가 해석등은 다음 위키피디아에서 참조할 수 있습니다.
- 링크 : https://en.wikipedia.org/wiki/Pearson_correlation_coefficient#Interpretation
Pearson Correlation의 예시
- 아래는 강한 선형 관계를 가지는 표본의 갯수가 10개인 데이터 셋 입니다.

import numpy as np
# Given data for X and Y
X = np.array([2, 4, 5, 6, 8, 7, 9, 10, 11, 12])
Y = np.array([3, 4, 6, 5, 7, 8, 9, 10, 12, 11])
# Calculate means of X and Y
mean_X = np.mean(X)
mean_Y = np.mean(Y)
# Calculate Pearson Correlation Coefficient
numerator = np.sum((X - mean_X) * (Y - mean_Y))
denominator = np.sqrt(np.sum((X - mean_X)**2) * np.sum((Y - mean_Y)**2))
r = numerator / denominator
print(r)
# 0.9620913858416693
- 계산 결과 0.96의 매우 강한 선형 관계임을 확인할 수 있습니다.
- 이번에는 아래와 같이 선형 관계가 없는 데이터 셋으로 상관 관계를 구해보도록 하겠습니다.

- 위 코드를 이용하여 동일한 방식으로 구하면 0.078 이라는 매우 낮은 값을 얻을 수 있습니다.
Spearman Correlation의 정의와 예제
- 앞에서 살펴본
Pearson Correlation
의 경우 두 변량의선형 관계 정도
를 -1에서 1 사이의 범위로 나타냄을 확인할 수 있었습니다. 그리고Pearson Correlation
의 정의에 따라서 오직 선형 관계만 설명할 수 있다는 단점과 소수의 노이즈 데이터 쌍에도 상관계수가 영향을 받을 수 있음을 확인하였습니다. - 이러한 문제점을 개선하기 위하여 데이터의 분산을 이용하는 방법이 아닌
rank
를 이용하는 방법에 대하여 살펴보도록 하겠습니다.
Spearman Correlation의 정의
- 먼저
Spearman Correlation
의 정의는 다음과 같습니다.
- r(X,Y)=1−6∑ni=1(d2i)n(n2−1)
- di=R(Xi)−R(Yi)
- R(Xi):Ranking order of X_i among all X data
- R(Yi):Ranking order of Y_i among all Y data
- 위 식에서 r(X,Y) 의 값의 범위는
Pearson Correlation
과 동일하게 -1 에서 1의 범위를 가지게 되고 그 의미 또한 1에 가까울 수록 양의 상관관계가 높고 -1에 가까울수록 음의 상관관계가 높습니다. Pearson Correlation
과의 차이점에 대하여 살펴보면 di=R(Xi)−R(Yi) 에 있습니다.Pearson Correlation
은Standardization
과정으로 전처리한 값을 사용하는 반면에Spearman Correlation
은ranking
을 이용합니다. 즉, 가지고 있는 데이터 셋에서 크기 순서의 인덱스 번호를 값으로 대체합니다. 예를 들어 X1=100,X2=−10,X3=3 이면 R(X1)=1,R(X2)=3,R(X3)=2 가 됩니다.- 이와 같은 방법으로
ranking
을 이용하면Pearson Correlation
에서 발생한 노이즈에 대한 영향을 줄일 수 있습니다. 뿐만 아니라Pearson Correlation
에서는선형 관계
만 설명 가능하였지만Spearman Correlation
는ranking
으로 표현 가능한 단조 증가 관계 (monotonic relationship
)는 모두 설명 가능합니다. 단조 증가 관계는
Spearman Correlation 식 유도 과정
- 아래와 같이 두 변수 X,Y 의 원소가 n 개라고 가정해 보겠습니다.
- X={X1,X2,⋯,Xn}
- Y={Y1,Y2,⋯,Yn}
- 만약 X,Y 에서 각 변수의 크기 순서를 R(Xi),R(Yi) 라고 가정하겠습니다. 즉, 서수 (order)를 의미합니다. 이것을 랭킹으로 부르겠습니다.
- 두 변수의 랭킹의 차이가 없을 수록 두 변수가 모두 단조 증가 관계를 가진다고 말할 수 있습니다. 따라서 두 변수의 랭킹 차이가 없을수록 두 변수의 상관관계가 크다라고 말할 수 있으며 이와 같은 상관관계가 정의될 수 있도록 식을 세을 필요가 있습니다.
- 먼저 두 변수 간의 랭킹 차이를
Sum of Square
방식으로 나타내 보겠습니다.
- n∑i=1d2i=n∑i=1(R(Xi)−R(Yi))2
- 앞에서 다룬
Pearson Correaltion
은 강한 양의 상관관계는 1, 강한 음의 상관관계는 -1, 그리고 상관관계가 없으면 0에 가까워 지도록 설계되었습니다. Spearman Correlation
또한 같은 상관관계 지수를 가지도록 값을 설계해보도록 하겠습니다.Pearson Correlation
은 값의 범위는Cauchy–Schwarz inequality
로 인하여 -1 ~ 1 사이 값으로Normalization
된 것을 앞에서 확인하였습니다.Spearman Correlation
또한Normalization
과정을 통하여 범위를 -1 ~ 1 사이 범위로 만들어 보겠습니다.Normalization
을 위해서 ∑ni=1di 가 가장 커지는 경우를 분모로 나누어 주어야 합니다. ∑ni=1di 값이 가장 커지는 경우는 두 변수의 랭킹 순서가 반대로 되어 있는 경우입니다.
- R(X1)=1,R(X2)=2,R(X3)=3,...,R(Xn−1)=n−1,R(Xn)=n
- R(Y1)=n,R(Y2)=n−1,R(Y3)=n−2,...,R(Yn−1)=2,R(Yn)=1
- n∑i=1di=n∑i=1(R(Xi)−R(Yi))2=(R(X1)−R(Y1))2+(R(X2)−R(Y2))2+(R(X3)−R(Y3))2+...+(R(Xn−1)−R(Yn−1))2+(R(Xn)−R(Yn))2=(n−1)2+(n−3)2+(n−5)2+...+(3−n)2+(1−n)2=(n−1)2+(n−3)2+(n−5)2+...+(n−3)2+(n−1)2=n(n2−1)3
- 위 식의 전개 과정을
sympy
를 이용하여 풀면 다음과 같습니다.
from sympy import Sum
from sympy import symbols, solve
# Define symbols
n, k = symbols('n k')
# Calculate the number of terms for odd and even n
# For odd n, solve n - (2k-1) = 1
middle_term_odd = solve(n - (2*k - 1) - 1, k)
# For even n, solve n - (2k-1) = 0
middle_term_even = solve(n - (2*k - 1), k)
# Total number of terms for odd and even n (since the series is symmetric)
total_terms_odd = 2 * middle_term_odd[0] - 1
total_terms_even = 2 * middle_term_even[0]
total_terms_odd, total_terms_even
# Define the general term of the series
general_term = (n - (2*k - 1))**2
# Summation for odd n (from k=1 to (n-1)/2, double it, and add the middle term 0)
sum_odd_n = 2 * Sum(general_term, (k, 1, (n - 1)/2)).doit()
# Summation for even n (from k=1 to n/2, double it)
sum_even_n = 2 * Sum(general_term, (k, 1, n/2)).doit()
print(sum_odd_n.simplify())
# n*(n**2 - 1)/3
print(sum_even_n.simplify())
# n*(n**2 - 1)/3
- 따라서 ∑ni=1d2i 을
Normalize
하면 다음과 같습니다.
- 0≤∑ni=1d2in(n2−1)3≤1
- 위 식은 0일 때, 가장 큰 양의 상관관계를 가지고 1일 때 가장 큰 음의 상관관계를 가집니다.
Pearson Correlation
과 같이 -1 ~ 1 사이의 범위를 가지고 -1을 가질 때, 가장 큰 음의 상관관계, 1일 때 가장 큰 양의 상관관계를 가지도록 식을 수정해 보도록 하겠습니다.
- 0≤∑ni=1d2in(n2−1)3≤1
- 0≤3∑ni=1d2in(n2−1)≤1
- 0≤6∑ni=1d2in(n2−1)≤2
- −2≤−6∑ni=1d2in(n2−1)≤0
- −1≤1−6∑ni=1d2in(n2−1)≤1
- 따라서 처음에 정의한
Spearman correlation
의 식인 r(X,Y)=1−6∑ni=1(d2i)n(n2−1) 를 유도할 수 있습니다. - 위 식의 결과 ∑d2i 이 작아질수록 양의 상관관계가 커지게 되고 ∑d2i 이 커질수록 음의 상관관계가 커지게 됩니다. 반면 ∑d2i 가 n(n2−1)/6 에 가까워질수록 상관관계가 없어짐을 알 수 있습니다.
Spearman Correlation
식 유도 과정을 통해Spearman Correlation
의 의미와 값의 범위 그리고 단조 증가를 가지는 다양한 관계를 설명할 수 있다는 장점을 이해할 수 있었습니다.
Spearman Correlation의 예시
- 이번에는 앞의
Pearson Correlation
예시를 살펴본 바와 동일하게Spearman Correlation
에 대하여 살펴보도록 하겠습니다. - 살펴볼 예시는 2가지 입니다. ① 선형 관계가 아니지만 단조 증가하는 관계와 ② 노이즈가 섞여있는 예제입니다.
- 먼저 아래는 ① 선형 관계가 아니지만 단조 증가하는 관계 예시입니다. 데이터는 9차 방정식을 가정하였습니다.
# Function to calculate ranks
def rank_data(data):
sorted_data = sorted(enumerate(data), key=lambda x: x[1])
ranks = [0] * len(data)
for rank, (index, _) in enumerate(sorted_data, start=1):
ranks[index] = rank
return ranks
# Define the data for the 9th-degree polynomial relationship
X_data = np.array(range(1, 21))
Y_data = X_data ** 9 # 9th-degree relationship
n = len(X_data)
# Calculate ranks for X and Y
X_ranks = rank_data(X_data)
Y_ranks = rank_data(Y_data)
# Calculate Spearman's rank correlation coefficient manually
differences = [x - y for x, y in zip(X_ranks, Y_ranks)]
squared_differences = [d**2 for d in differences]
rho_spearman = 1 - (6 * sum(squared_differences)) / (n * (n**2 - 1))
# Calculate Pearson correlation coefficient manually
mean_Y_data = np.mean(Y_data)
covariance_data = np.sum((X_data - mean_X_data_cubic) * (Y_data - mean_Y_data))
variance_Y_data = np.sum((Y_data - mean_Y_data)**2)
r_pearson = covariance_data / np.sqrt(variance_X_data_cubic * variance_Y_data)
print(rho_spearman)
# 1.0,
print(r_pearson)
# 0.6976735795972945
Spearman Correlation
은 1.0인 반면에Pearson Correlation
은 0.69인 것을 확인할 수 있습니다.
- 이번에는 ② 노이즈가 섞여있는 예제를 살펴보도록 하겠습니다.
# Set up the base linear relationship with noise
np.random.seed(0)
X_data = np.linspace(-10, 10, 47)
Y_data = 2 * X_data + np.random.normal(0, 3, 47)
# Adding outliers that disrupt the ranks but not the overall linear trend
x_outliers = np.array([-9, 0, 9])
y_outliers = np.array([-30, 100, -25])
X_data = np.append(X_data, x_outliers)
Y_data = np.append(Y_data, y_outliers)
# Calculate Spearman's rank correlation coefficient manually
x_ranks = rank_data(X_data)
y_ranks = rank_data(Y_data)
differences = [x - y for x, y in zip(x_ranks, y_ranks)]
squared_differences = [d**2 for d in differences]
rho_spearman = 1 - (6 * sum(squared_differences)) / (len(X_data) * (len(X_data)**2 - 1))
# Calculate Pearson correlation coefficient manually
mean_x = np.mean(X_data)
mean_y = np.mean(Y_data)
covariance = np.sum((X_data - mean_x) * (Y_data - mean_y))
variance_x = np.sum((X_data - mean_x)**2)
variance_y = np.sum((Y_data - mean_y)**2)
rho_pearson = covariance / np.sqrt(variance_x * variance_y)
print(rho_spearman)
# 0.8436494597839136
print(rho_pearson)
# 0.5354899275518871
- 이번 예제에서는 꽤 큰 차이를 확인할 수 있습니다.
Spearman Correlation
을 이용 시, 약 0.84의 상관관계를 얻을 수 있는 반면에Pearson Correlation
은 0.53으로 상대적으로 낮은 상관관계를 얻은 것을 볼 수 있습니다.