공분산과 상관분석의 비교
공분산과 상관분석은 두 변수 간의 관계를 측정하는 통계 기법이다. 공분산은 두 변수 간의 변동 방향을 측정하는 반면, 상관분석은 두 변수 간의 관계의 강도와 방향을 측정한다. 공분산과 상관분석의 차이를 표로 정리해보았다.
특징 | 공분산(Covariance) | 상관분석(Correlation Analysis) |
정의 | 두 변수 간의 변동 방향을 측정 | 두 변수 간의 관계의 강도와 방향을 측정 |
범위 | -∞에서 +∞ 사이의 값 | -1에서 +1 사이의 값 |
의존성 | 단위와 크기에 의존함 | 단위와 크기에 독립적임 |
예제 데이터를 활용한 비교
키와 몸무게 데이터를 활용해 공분산과 상관분석의 차이를 살펴보았다. 연속형 데이터를 사용했으며, 상관 분석 기법으로는 피어슨 상관계수를 사용했다. (데이터 출처: Kaggle)
공분산은 데이터의 단위와 크기에 의존한다고 한 것처럼 코드 블럭 마지막의 출력 결과를 보면 단위를 바꾸었을 때 값이 달라지는 것을 확인할 수 있다. 이처럼 데이터를 전처리하면서 값이 달라지기 때문에 값의 크기만으로 변동성의 크기를 논할 수 없다. 변동 방향이 같은지, 다른지만을 측정할 수 있다.
반면, 상관계수는 단위를 바꿔도 같은 값을 보이기 때문에 두 변수 간의 관계가 강한지, 약한지를 논할 수 있다. 약 0.5의 값을 가지기 때문에 사용한 데이터에서는 어느정도 상관관계가 있다고 말할 수 있으며, 산점도를 그렸을 때도 양의 상관관계를 예상할 수 있게 나타났다.
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 데이터 로드
data = pd.read_csv('C:/Users/rmstn/Desktop/블로깅/SOCR-HeightWeight.csv')
data.head()
# 두 변수 선택 - pound, inch
x = data['Weight(Pounds)']
y = data['Height(Inches)']
# 공분산 계산
cov_matrix = np.cov(x, y)
cov_xy = cov_matrix[0, 1]
# 상관계수 계산
corr_xy = np.corrcoef(x, y)[0, 1]
print(f'공분산 (Weight(Pounds), Height(Inches)): {cov_xy}')
print(f'상관계수 (Weight(Pounds), Height(Inches)): {corr_xy}')
# 두 변수 전처리 - kg, cm
x = data['Weight(Pounds)']*2.20462 # pound to kg
y = data['Height(Inches)']*2.54 # inch to cm
# 공분산 계산
cov_matrix = np.cov(x, y)
cov_xy = cov_matrix[0, 1]
# 상관계수 계산
corr_xy = np.corrcoef(x, y)[0, 1]
print(f'공분산 (Weight(kg), Height(cm)): {cov_xy}')
print(f'상관계수 (Weight(kg), Height(cm)): {corr_xy}')
# 산점도 및 회귀선 그리기 (선형성 확인)
plt.figure(figsize=(8, 6))
sns.regplot(x=x, y=y, ci=None, line_kws={"color": "red"})
plt.title('Scatter Plot of Weight(kg) vs. Height(cm)')
plt.xlabel('Weight(kg)')
plt.ylabel('Height(cm)')
plt.grid(True)
plt.show()
# -- 출력 결과 --
# 공분산 (Weight(Pounds), Height(Inches)): 11.151029173567318
# 상관계수 (Weight(Pounds), Height(Inches)): 0.5028585206028438
# 공분산 (Weight(kg), Height(cm)): 62.442806119040156
# 상관계수 (Weight(kg), Height(cm)): 0.5028585206028439