EDA & 데이터 분석/통계

통계학 5주차[상관관계]

edcrfv458 2025. 1. 17. 14:50

목표

  1. 상관관계에 대해 이해
  2. 다양한 상관관계 계산의 특징과 차이점 이해하고 적용

5.1 피어슨 상관계수: 데이터가 연속형이고 정규 분포를 따를 때 사용

  • 두 연속형 변수(숫자형) 간의 선형 관계를 측정하는 지표
    • -1에서 1사이의 값을 가짐
      • 1은 완전한 양의 상관 관계
      • -1은 완전한 음의 상관 관계
      • 0은 선형 관계가 없음

 

실습: 선형적인 관계가 예상될때 ➡️ 공부 시간, 시험 점수 간의 상관관계 분석

from scipy.stats import pearsonr

# 예시 데이터
np.random.seed(0)
study_hours = np.random.rand(100) * 10
exam_scores = 3 * study_hours + np.random.randn(100) * 5

# 데이터 프레임 생성
df = pd.DataFrame({'Study Hours': study_hours, 'Exam Scores': exam_scores})

# 피어슨 상관계수 계산
prearson_corr, _ = pearsonr(df['Study Hours'], df['Exam Scores'])
print("피어슨 상관계수: ", pearson_corr)

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('피어슨 상관계수 히트맵')
plt.show()

5.2 비모수 상관계수: 데이터가 정규분포를 따르지 않을때 사용

  • 데이터가 정규분포 따르지 않거나 변수들이 순서형 데이터일 때 사용
  • 데이터의 분포에 대한 가정 없이 두 변수 간의 상관관계 측정할 때 사용
  • 대표적으로 스피어만 상관계수와 켄탈의 타우 상관계수가 있음
  • 스피어만 상관계수
    • 두 변수의 순위 간의 일관성을 측정
    • 데이터 내 편차와 에러에 민감
  • 켄달의 타우 상관계수
    • 순위 간의 일치 쌍 및 불일치 쌍의 비율을 바탕으로 계산
    • 예를 들어 사람의 키와 몸무게에 대한 상관계수가 궁금할 때, 키가 크고 몸무게가 많이 나가면 일치 쌍에 해당, 키가 크지만 몸무게가 낮다면 불일치 쌍에 해당하고 이들의 개수 비율로 상관계수 결정
  • 사용 경우
    • 데이터의 분포에 대한 가정을 하지 못할 때
    • 순서형 데이터에서도 사용하고 싶을 때
    • 일반적으로 df.corr() 메소드는 일반적으로 피어슨 상관계수를 게산하므로 스피어만으로 계산할 수 있도록 method='spearman'을 작성하는 것이고 켄달의 타우 상관관계수를 계산하기 위해서는 method='kendall' 작성
from scipy.stats import spearmanr, kendalltau

# 예시 데이터
np.random.seed(0)
customer_satisfaction = np.random.rand(100)
repurchase_intent = 3 * customer_satisfaction + np.random.randn(100) * 0.5

# 데이터 프레임 생성
df = pd.DataFrame({'Customer Satisfaction': customer_satisfaction, 'Repurchase Intent': repurchase_intent})

# 스피어만 상관계수 계산, p는 p-값
spearman_corr, p = spearmanr(df['Customer Satisfaction'], df['Repurchase Intent'])
print("스피어만 상관계수: ", spearman_corr)

# 켄달의 타우 상관계수 계산
kendall_corr, _ = spearmanr(df['Customer Satisfaction'], df['Repurchase Intent'])
print("켄달의 타우 상관계수: ", kendall_corr)

# 스피어만 상관관계 히트맵 시각화
sns.heatmap(df.corr(method='spearman'), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('스피어만 상관계수 히트맵')
plt.show()

# 켄달의 타우 상관계수 히트맵 시각화
sns.heatmap(df.corr(method='kendall'), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('켄달의 타우 상관계수 히트맵')
plt.show()

5.3 상호정보 상관계수: 상호정보를 이용한 변수끼리의 상관계수 계산

  • 두 변수 간의 상호 정보를 측정
    • 변수 간의 정보 의존성을 바탕으로 비선형 관계를 탐지
    • 서로의 정보에 대한 불확실성을 줄이는 정도를 바탕으로 계산
    • 범주형 데이터에 대해서도 적용 가능
  • 사용 경우
    • 두 변수가 범주형 변수일때
    • 비선형적이고 복잡한 관계를 탐지하고자 할때
from sklearn.metrics import mutual_info_score

# 범주형 예제
X = np.array(['cat', 'dog', 'cat', 'cat', 'dog', 'dog']
Y = np.array(['high', 'low', 'high', 'high', 'low', 'low']

# 상호 정보량 계산
mi = mutual_info_score(X, Y)
print("상호 정보량: ", mi)