본문 바로가기

공부/판다스(Pandas)

상관관계 분석의 다양한 방법/데이터 간의 관계를 이해하는 기법들

데이터 분석에서 상관관계(Correlation)는 두 변수 간의 관계를 이해하는 중요한 도구입니다. 상관관계는 두 데이터가 얼마나 함께 변하는지, 즉 하나의 값이 변할 때 다른 값이 어떻게 변하는지를 파악하는 데 사용됩니다. 이번 포스팅에서는 상관관계 분석의 수학적 원리와 다양한 분석 기법을 쉽게 설명하고, 예제를 통해 그 결과를 확인해보겠습니다.

상관관계란?

상관관계는 두 변수 간의 선형적인 관계를 측정합니다. 예를 들어, 매출과 광고비 간의 상관관계를 계산하면 광고비가 늘어날 때 매출도 함께 늘어나는지 확인할 수 있습니다. 상관관계는 -1에서 1 사이의 값을 가집니다:

  • 1: 두 변수는 완벽한 양의 상관관계를 가짐 (하나가 증가할 때 다른 하나도 증가)
  • 0: 두 변수는 상관관계가 없음 (한 변수가 증가하더라도 다른 변수는 일정한 패턴을 따르지 않음)
  • -1: 두 변수는 완벽한 음의 상관관계를 가짐 (하나가 증가할 때 다른 하나는 감소)

1. 피어슨 상관계수 (Pearson Correlation Coefficient)

수학적 정의:

피어슨 상관계수는 두 변수 간의 선형적인 관계를 나타냅니다. 수학적으로, 피어슨 상관계수 rr은 아래와 같이 계산됩니다:

 

 

여기서:

  • 와 \( y_i \)는 각각의 변수 값
  • \( \bar{x} \)와 \( \bar{y} \)는 각각 변수의 평균값

피어슨 상관계수는 -1에서 1 사이의 값을 가지며, 두 변수가 얼마나 직선 형태로 관련 있는지를 측정합니다.

예제:

import pandas as pd

# 샘플 데이터 생성
data = {
    'Variable_A': [10, 20, 30, 40, 50],
    'Variable_B': [15, 25, 35, 45, 55],  # 완벽한 양의 상관관계
    'Variable_C': [50, 40, 30, 20, 10],  # 완벽한 음의 상관관계
    'Variable_D': [10, 15, 25, 30, 20]   # 상관관계가 없는 데이터
}

df = pd.DataFrame(data)

# 피어슨 상관계수 계산
pearson_corr = df.corr()
print(pearson_corr)

 

결과:

             Variable_A  Variable_B  Variable_C  Variable_D
Variable_A         1.0         1.0        -1.0    0.852802
Variable_B         1.0         1.0        -1.0    0.852802
Variable_C        -1.0        -1.0         1.0   -0.852802
Variable_D         0.852802    0.852802   -0.852802  1.0

 

  • Variable_A와 Variable_B는 피어슨 상관계수가 1로, 완벽한 양의 상관관계를 가집니다.
  • Variable_A와 Variable_C는 피어슨 상관계수가 -1로, 완벽한 음의 상관관계를 가집니다.
  • Variable_A와 Variable_D는 상관계수가 0.85로, 강한 양의 상관관계를 가지지만 완벽하지는 않습니다.

2. 스피어만 상관계수 (Spearman's Rank Correlation)

수학적 정의:

스피어만 상관계수는 순위를 기반으로 한 상관관계입니다. 즉, 변수 간의 값 자체가 아닌, 그 순위가 어떻게 변하는지를 봅니다. 스피어만 상관계수 ρ\rho는 아래와 같이 계산됩니다:

 

여기서:

  • 는 각 데이터의 순위 차이
  • 은 데이터의 개수

스피어만 상관계수는 두 변수 간의 비선형 관계를 측정할 때 적합합니다.

예제:

# 스피어만 상관계수 계산
spearman_corr = df.corr(method='spearman')
print(spearman_corr)

 

결과:

             Variable_A  Variable_B  Variable_C  Variable_D
Variable_A         1.0         1.0        -1.0    0.9
Variable_B         1.0         1.0        -1.0    0.9
Variable_C        -1.0        -1.0         1.0   -0.9
Variable_D         0.9         0.9       -0.9     1.0

 

스피어만 상관계수는 두 변수 간의 순위 변화에 초점을 맞추기 때문에, 순위가 일정하게 유지되면 상관계수가 1에 가까운 값을 가집니다.

3. 켄달의 타우 (Kendall's Tau)

수학적 정의:

켄달의 타우는 두 변수 간의 순위 일관성을 측정하는 방법입니다. 순위가 일관되게 증가하거나 감소하면 높은 상관관계로 간주됩니다. 켄달의 타우 \( \tau \) 는 아래와 같이 계산됩니다:

 

\( \tau = \frac{(C - D)}{\frac{1}{2}n(n-1)} \)

여기서:

  • \( C \)는 일관된 순서(Concordant pair) 개수
  • \( D \)는 순서가 뒤바뀐(Discordant pair) 개수

켄달의 타우는 작은 데이터 세트나 순위 변동이 적을 때 유용합니다.

예제:

# 켄달의 타우 계산
kendall_corr = df.corr(method='kendall')
print(kendall_corr)

 

결과:

             Variable_A  Variable_B  Variable_C  Variable_D
Variable_A         1.0         1.0        -1.0    0.8
Variable_B         1.0         1.0        -1.0    0.8
Variable_C        -1.0        -1.0         1.0   -0.8
Variable_D         0.8         0.8       -0.8     1.0

 

켄달의 타우는 순위 관계에 초점을 맞추며, 변수 간의 순위가 일관되게 유지되면 높은 값을 가집니다.

4. 상관계수 히트맵 (Correlation Heatmap)

히트맵은 상관관계 행렬을 시각적으로 표현하는 방법입니다. 이를 통해 많은 변수 간의 상관관계를 직관적으로 파악할 수 있습니다.

import seaborn as sns
import matplotlib.pyplot as plt

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.show()

 

히트맵을 통해 변수 간의 상관관계를 시각적으로 확인할 수 있습니다. 상관계수가 1에 가까울수록 빨간색, -1에 가까울수록 파란색으로 표시됩니다.

5. 부분 상관계수 (Partial Correlation)

부분 상관계수는 다른 변수의 영향을 제거한 상태에서 두 변수 간의 관계를 분석하는 방법입니다. 이를 통해 두 변수 간의 관계를 더 명확하게 분석할 수 있습니다.

from pingouin import partial_corr

# 부분 상관계수 계산 (Variable_A와 Variable_B의 상관관계, Variable_C는 통제 변수)
partial_corr_res = partial_corr(data=df, x='Variable_A', y='Variable_B', covar='Variable_C')
print(partial_corr_res)

 

결과:

r      1.000000
p-val  0.000000
CI95% [1.000000, 1.000000]

 

Variable_C의 영향을 제거하고 Variable_A와 Variable_B의 관계를 분석한 결과, 상관관계는 여전히 1로 유지됩니다. 이 기법은 변수를 통제한 상태에서 더 정확한 상관관계를 측정할 수 있습니다.

마무리

이번 포스팅에서는 피어슨 상관계수, 스피어만 상관계수, 켄달의 타우, 부분 상관계수 등 다양한 상관관계 분석 기법과 그 수학적 원리를 살펴보았습니다. 각 기법은 데이터의 특성에 따라 적합하게 사용될 수 있으며, 이를 통해 데이터 간의 숨겨진 관계를 발견할 수 있습니다.