[패스트캠퍼스 환급챌린지]딥러닝/Chapter 1. 통계

[패스트캠퍼스][환급 챌린지]Chapter 1. 딥러닝을 위한 통계 01-12 공분산과 상관계수

포리셔 2023. 3. 3. 23:52

01-12 공분산과 상관계수

분산이 어떤 데이터로부터 평균까지의 편차를 기반으로 한 데이터였다는 것을 지난 포스트에서 알아봤습니다. 이번에는 확률변수가 여러 개일 때로 상황을 바꿔서 데이터의 분포를 나타내보도록 하겠습니다.

공분산

def) 공분산 (Covariance): 다변수 데이터가 평균으로부터 얼마나 멀리 떨어져 있는지를 나타내는 척도

공분산 공식은 아래와 같이, 분산을 2차원으로 확장시킨 것과 같은 모습을 띕니다.

$$s_{xy}=\frac{1}{N}\sum_{i=1}^N\left(x_i-\mu_x\right)\left(y_i-\mu_y\right)$$

다만, 하나의 확률변수에 대해서는 평균값의 위치와 표본 위치의 거리로 나타낸 것과 다르게, 공분산은 평균값과 표본을 연결하는 사각형의 면적과 같습니다. 게다가 데이터의 위치에 따라 값의 부호가 +가 될 때도, -가 될 때도 있습니다. 1사분면, 3사분면에 위치할 경우 양수(우상향), 2사분면, 4사분면에 위치할 때는 음수(우하향)가 됩니다.

따라서 공분산은 데이터의 분포에 대한 크기와 방향성을 함께 보여줍니다.

상관계수

def) 상관계수 (Correlation Coefficient):
공분산은 크기와 방향성 정보를 모두 가지고 있지만, 보통은 공분산의 크기보다는 얼마나 퍼져 있는지에 대한 상관성만을 보려고 하므로 정규화를 통해 크기만 취할 수도 있습니다. 이를 피어슨(Pearson) 상관계수 또는 줄여서 상관계수라고 하며, 아래 공식과 같이 표현됩니다.
$$r_{xy}=\frac{s_{xy}}{\sqrt{s_x^2\cdot s_y^2}}$$

확률변수의 공분산과 상관계수

그럼 배운 걸 확률변수에 적용해보죠. 공식을 그대로 적용해주면 됩니다. 그러면 두 확률변수 $X$와 $Y$의 공분산과 상관계수는 아래와 같습니다.
$$Cov\left[X,Y\right]=E\left[\left(X-E\left[X\right]\right)\left(Y-E\left[Y\right]\right)\right]$$
$$\rho\left[X,Y\right]=\frac{Cov\left[X,Y\right]}{\sqrt{Var\left[X\right]\cdot Var\left[Y\right]}}$$

정규화한 결과, 이 상관계수는 -1 에서 1까지의 값을 가지게 됩니다. -1이면 완전 반비례, +1이면 완전 정비례이며, 크기가 0에 가까울수록 상관관계가 옅어져 0이 되면 아무런 상관관계가 없습니다.

공분산 행렬

ML 분야에서는 확률변수가 여러 개인 경우가 많습니다. 우리가 지금 예로 들어왔던 2개, 3개 정도가 아니라 많게는 십수 개가 넘어가는 경우가 부지기수입니다. 그러다보면 자연스럽게 어떤 확률변수가 이 확률변수와는 연관이 깊지만 다른 확률변수와는 거의 상관관계가 없어서 남남이나 다름없는 지경에 이릅니다. 이를 시각적이고 직관적으로 나타내기 위해 각각의 확률변수에 대한 공분산을 계산해서 행렬 형태로 나타낼 수 있습니다. 이를 공분산 행렬(covariance matrix)입니다.
$$\Sigma=\begin{bmatrix}\sigma_{x1}^2 & \sigma_{x_1x_2}& \sigma_{x_1x_3} & \cdots & \sigma_{x_1x_d} \\
\sigma_{x_1x_2} & \sigma_{x_2}^2 & \sigma_{x_2x_3} & \cdots & \sigma_{x_2x_d} \\ \sigma_{x_1x_3} & \sigma_{x_2x_3} & \sigma_{x_3}^2 & \cdots & \sigma_{x_3x_d} \\ \vdots & \vdots & \vdots & \ddots & \cdots \\ \sigma_{x_1x_d} & \sigma_{x_2x_d} & \sigma_{x_3x_d} & \cdots & \sigma_{x_d}^2
\end{bmatrix}$$

위 행렬 $\Sigma$은 데이터가 $N$개이고, 특징이 $d$개인 확률분포에 대한 공분산 행렬입니다. 대각 성분은 개별적인 확률변수 각각의 분산이며, 그 외의 성분들이 두 확률변수의 공분산이 되겠습니다.

공분산과 독립

공분산의 개념을 독립과 연관지어 보겠습니다. 두 확률변수 $X$와 $Y$가 서로 독립일 때 아래와 같은 관계가 성립했습니다.
$$P_{XY}\left(x,y\right)=P\left(x\right)P\left(y\right)$$

결과적으로 $X$와 $Y$가 서로 독립이면 아래의 공식도 성립합니다.

$$E\left(XY\right)=E\left(X\right)E\left(Y\right)$$

이때 공분산 $Cov\left(X,Y\right)=E\left(XY\right)-E\left(X\right)E\left(Y\right)=0$이므로, 두 확률변수가 독립이면 공분산은 0입니다.

여기서 주의할 점은 저 명제의 역은 성립하지 않습니다. 공분산이 0이라고 해서 두 확률변수가 독립이라는 보장은 없다는 것입니다.

파이썬 예시 1

지난 포스트에서 수학 성적에 따른 영어 성적의 분포를 이용했습니다. 이번에도 비슷한 데이터를 이용해 수학 성적과 영어 성적 사이의 상관관계를 계산해보겠습니다. 먼저 주어진 데이터를 시각화하면 아래와 같습니다.

import matplotlib.pyplot as plt

X = [97, 85, 26, 54, 76, 15, 33, 83, 88, 91]
Y = [100, 92, 31, 61, 83, 28, 57, 45, 92, 93]
plt.figure(figsize=(6,6))
plt.plot(X, Y, 'o')
plt.xlabel('Math', fontsize=12)
plt.ylabel('English', fontsize=12)
plt.grid()
plt.show()

이제 정의를 이용한 계산과 넘파이 라이브러리를 이용해 계산한 두 값을 비교해보겠습니다. cov 메서드와 corrcoef 메서드를 사용하면 결과를 얻을 수 있습니다. 단, 이 두 메서드는 결과값으로 행렬을 돌려주기 때문에 공분산과 상관계수 행렬에서 어떤 성분이 어떤 의미인지를 알아두시는 게 좋습니다. 공분산 및 상관계수 행렬의 대각성분은 각 변수의 분산이고, 나머지 성분들이 공분산, 상관계수가 됩니다. 자기자신에 대한 상관계수는 1입니다!

import numpy as np
import math

x_mean = np.mean(X)
y_mean = np.mean(Y)
x_var = np.var(X)
y_var = np.var(Y)

print(x_var)
print(y_var)

covar = 0
for x, y in zip(X,Y):
    covar += ((x - x_mean) * (y - y_mean)) / (len(X)-1)
print(f"Sample covariance: {covar:.3f}")
print("[Sample covariance (NumPy)]")
print(np.cov(X, Y))

cor_coeff = covar / math.sqrt(x_var*y_var)
print(f"Correlation coefficient: {cor_coeff:.3f}")
print("[Correlation coefficient (NumPy)]")
print(np.corrcoef(X, Y))
915.5111111111112
743.7333333333333

Sample covariance: 703.267
[Sample covariance (NumPy)]
[[915.511 703.267]
 [703.267 743.733]]

 Correlation coefficient: 0.947
[Correlation coefficient (NumPy)]
[[1.    0.852]
 [0.852 1.   ]]

파이썬 예시 2

이번에는 성적과 수면시간에 대한 데이터를 이용해보겠습니다. 흔히 적게 잘수록 그 시간에 공부를 하니까 성적도 잘 나오겠거니 생각하는데, 사실 그 시간에 공부 안하고 놀다가 밤을 셀 수도 있는 거고, 반대로 깨어있는 시간에 빡세게 공부하고 잠을 푹 자야하는 우등생이 있을 수도 있겠죠.

import matplotlib.pyplot as plt
X = [97, 100, 25, 42, 55, 19, 41, 97, 95, 91]
Y = [5.5, 7, 8, 9, 8.5, 8, 10, 7.5, 6, 6]
plt.plot(X, Y, "o")
plt.xlabel("Score")
plt.ylabel("Sleep")
plt.grid()
plt.show()

위와 동일한 코드를 이용해 분산과 공분산을 구해보겠습니다. 결과는 아래와 같습니다.

Sample covariance: -34.844
[Sample covariance (NumPy)]
[[1083.956  -34.844]
 [ -34.844    2.081]]
Correlation coefficient: -0.734
[Correlation coefficient (NumPy)]
[[ 1.         -0.734]
 [-0.734  1.        ]]

첫번째 예시에서와 달리 음의 상관계수가 나왔으므로 전반적으로 수면시간이 적을수록 성적도 더 잘 나오는 반비례 관계에 가까운 상관관계가 나옴을 알 수 있습니다.

12일차 후기

한 것도 없는 것 같은데 벌써 2주차 주말이 다가오고 있습니다... 미뤄둔 책도 좀 보고 복습해야 되는데 내 시간 어디 간 거지...?

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.