Sign In

[데이터 분석] 상관관계 분석

Y
Yerim
  1. DataAnalysis

상관

두 개의 양적 변수
•
양적 변수 사이의 관계를 분석하는 방법으로 상관과 회귀가 있다
산점도 scatter plot
•
2개의 양적 변수로 이루어진 그래프
•
두 양적 변수의 관계를 시각화하여 어떤 관계가 있는지 대략적으로 파악 가능
상관 correlation
•
2개의 확률변수 또는 데이터 사이의 관계썽을 의미
•
상관이 있다고 인과관계가 있는지는 알 수 없다
회귀
•
y=f(x)라는 함수로 두 변수 사이의 관계를 공식화
•
x를 설명변수 또는 독립변수, y를 반응변수 또는 종속변수라 한다
•
2개의 양적 변수 간의 관계의 강도를 정량화하는 방법으로 피어슨 상관계수를 사용

상관관계

피어슨 상관계수

•
2개 양적 변수 사이의 선형 관계가 얼마나 직선 관계에 가까운가를 평가
•
상관계수라고 하면 보통 피어슨 상관계수를 말한다
r = \frac{\frac{1}{n}\sum^n_{i=1}{(x_i - \bar x)(y_i - \bar{y})}}{\sqrt{\frac{1}{n} \sum^n_{i=1}{(x_i - \bar x)^2}}\sqrt{\frac{1}{n}}\sum^n_{i=1}{(y_i - \bar{y})^2}}
•
분자: 공분산
•
분모: $x_i$와 $y_i$ 각각의 표준편차
•
-1 ≤ r ≤ +1
•
양의 상관: x가 작아질수록 y도 함께 작아진다
•
음의 상관: x가 작아질수록 y는 커진다
•
r가 1에 가까울수록 강한 상관관계를 갖는다
•
r은 기울기의 영향을 받지 않는다
정규성 검사
•
평균 분산에 기반한 모수적인 방법
•
피어슨 상관계수의 경우 이상값을 하나만 추가해도 크게 달라진다
•
상관계수를 계산하기 전에 x축 데이터, y축 데이터를 샤피로-윌크 검정 등으로 정규성 검정
→ 정규성이 없다면 비모수 상관계수를 이용하는 것이 좋다

스피어만 순위 상관계수

p = 1- \frac{6\sum{d^2_i}}{n(n^2-1)}
•
적어도 하나 이상의 데이터에 정규성이 없을 때는 비모수 상관계수를 사용
•
p는 피어슨 상관계수 r와 마찬가지로 -1~+1 사이의 실수값을 사용

켄달 순위상관계수

\tau = \frac{\text{(부합 데이터쌍의 수) - (비부합 데이터쌍의 수)}}{\frac{1}{2}n(n-1)}
•
스피어만 순위 상관계수와 유사
•
표준 크기 n이 매우 작을 때는 켄달 순위 상관계수를 사용한다

상관계수와 가설

•
표본의 크기가 작을 경우 가설검정을 실행한 결과 p<0.05임을 알고 나서 상관계수의 결과를 사용할 수 있다
•
표본의 크기가 클 경우는 p<0.05라고 하여 바로 상관이 있다고 판단하는 것이 아니라 r값의 크기를 기준으로 해석할 필요가 있다

선형회귀

회귀분석

f(x) = a + bx
•
회귀계수: 회귀식 f(x)의 형태를 결정하는 파라미터 a, b
•
특정 평가 기준에 따라 회귀의 좋음을 평가
•
회귀 계쑤의 값을 구체적으로 구하는 것이 회귀분석의 큰 흐름
•
$\epsilon$를 확률오차라고 할 때 $y=a+bx+\epsilon$를 회귀모형이라고 한다
•
회귀 분석을 할 때는 다음이 중요
◦
어떤 회귀식 적용?
◦
어떻게 회귀식을 데이터에 적용?
◦
얻은 회귀 모형을 어떻게 평가?

평가 방법

•
a, b를 결정할 때 모형의 좋음을 판단하는 기준이 필요
•
데이터에 가능한 한 들어맞는 회귀모형이 좋은 모형이라고 할 수 있다
•
= 데이터와 회귀식의 차이가 가능한 작은 모형이 좋은 모형이다
최소제곱법
MSE = \sum^{n}_{i=1} {(\hat y_i - y_i)^2}
•
My데이터와 모형 차이의 제곱을 모두 더한 값 E를 최소화하는 방법
•
어떻게 하더라도 회귀직선이 모든 데이터 점을 통과할 수는 없다

Python

산점도 그래프

import seaborn as sns
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time', style='time')

상관계수

import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic_float64 = titanic.select_dtypes(include=['float64'])
print("pearson")
cor_pearson = titanic_float64.corr(method='pearson')
print(cor_pearson)

print("kendall")
cor_kendall = titanic_float64.corr(method='kendall')
print(cor_kendall)

print("spearman")
cor_spearman = titanic_float64.corr(method='spearman')
print(cor_spearman)
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
mask = np.triu(np.ones_like(cor_pearson, dtype=bool), k=1)
sns.heatmap(cor_pearson, annot=True, fmt=".2f", mask=mask)
plt.show()
sns.heatmap(cor_kendall, annot=True, fmt=".2f", mask=mask)
plt.show()
sns.heatmap(cor_spearman, annot=True, fmt=".2f", mask=mask)
plt.show()
Yerim-DevNote
Subscribe to 'Yerim-DevNote'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'Yerim-DevNote'!
Subscribe
👍