오랑우탄의 반란
[기초통계] 상관관계 (파이썬) 본문
반응형
이전 포스트에 이어 몇 가지 상관관계 종류를 살펴보겠습니다.
피어슨 상관계수
- 두 연속형 변수 간의 선형 관계 측정
- 절대값이 1에 가까울수록 높은 상관관계, 0은 선형 관계가 없음을 의미
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
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})
# 피어슨 상관계수 계산
pearson_corr, _ = pearsonr(df['Study Hours'], df['Exam Scores'])
print(f"피어슨 상관계수: {pearson_corr}")
# 언더바 있는 부분에 p값을 넣어서 유의성 검증도 가능
# 상관관계 히트맵 시각화
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('pearson coefficient heatmap')
plt.show()
피어슨 상관계수: 0.8642702080660165 로 높은 상관관계를 보입니다.
비모수 상관계수
- 데이터가 정규분포를 따르지 않거나 (비선형 변수로 구성) 변수들이 순서형 데이터일 때 사용
- 분포를 모를 때 사용
스피어만
- 두 변수 간의 일관성 측정
- 겐달타우보다 데이터 내 편차와 에러에 취약함
켄달타우
- 순위 간의 일치 쌍 (키도 크고 몸무게도 큼) 및 불일치 쌍 (키는 크지만 몸무게는 작음) 비율 바탕으로 계산
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})
# 스피어만 상관계수 계산
spearman_corr, _ = spearmanr(df['Customer Satisfaction'], df['Repurchase Intent'])
print(f"스피어만 상관계수: {spearman_corr}")
# 켄달의 타우 상관계수 계산
kendall_corr, _ = kendalltau(df['Customer Satisfaction'], df['Repurchase Intent'])
print(f"켄달의 타우 상관계수: {kendall_corr}")
# 상관관계 히트맵 시각화
sns.heatmap(df.corr(method='spearman'), annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('spearman coefficient heatmap')
plt.show()
스피어만 상관계수: 0.8663546354635462
켄달의 타우 상관계수: 0.6690909090909092
둘 다 높은 상관도를 보입니다.
상호정보 상관계수
- 두 변수가 범주형 변수이면서 데이터가 비선형적이고 복잡할 때 사용, 정보량을 계산하는 것
- 두 변수 간의 상호 정보 (의존성) 을 바탕으로 관계 탐지
- 서로의 정보에 대한 불확실성을 줄이는 정도를 바탕으로 계산
import numpy as np
from sklearn.metrics import mutual_info_score
# 범주형 예제 데이터
X = np.array(['cat', 'dog', 'cat', 'cat', 'dog', 'dog', 'cat', 'dog', 'dog', 'cat'])
Y = np.array(['high', 'low', 'high', 'high', 'low', 'low', 'high', 'low', 'low', 'high'])
# 상호 정보량 계산
mi = mutual_info_score(X, Y)
print(f"Mutual Information (categorical): {mi}")
Mutual Information (categorical): 0.6931471805599456
나름의 강한 상관관계를 보입니다.
이상 세 가지 상관계수를 살펴봤습니다.
다음 포스트는 기초통계 시리즈의 마지막으로 가설검정의 주의점을 다뤄보도록 하겠습니다.
오랑우탄이 영어를 하고 오랑이가 데이터분석가가 되는 그날까지~
반응형
'PYTHON > 데이터분석' 카테고리의 다른 글
[Pandas] value_counts 완전분석 (활용 포함) (0) | 2024.08.02 |
---|---|
[기초통계] 가설검정의 주의점 (파이썬) (0) | 2024.08.02 |
[기초통계] 회귀 (파이썬) (0) | 2024.08.02 |
[기초통계] 유의성검정 (파이썬) (0) | 2024.08.01 |
[기초통계] 데이터 분포 시각화 (파이썬) (0) | 2024.08.01 |