확률 변수가 하나일 때에 대해서 분산을 계산할 수 있었다.
변수가 여러 개일 때(다변수 확률 분포)의 분산은?
공식은 다음과 같다.

평균으로부터 얼마나 떨어져 있는지를 나타냄
평균값의 위치와 표본 위치 사이의 사각형 면적을 사용

데이터 위치에 따라 부호가 다르게 반영된다.
양수 부호 : 1,3사분면
음수 부호 : 2,4사분면
데이터의 분포에 대한 크기와 방향성을 같이 보여준다.
크기 : 원점에서 얼마나 떨어져 있는지
방향성 : 양/음수에 따라 어느 뱡향을 가지는지
양의 상관 관계 : 공분산이 양수값을 가진다.
음의 상관 관계 : 공분산이 음수값을 가진다.
공분산은 크기와 방향성 정보를 같이 가지고 있다.
일반적으로 상관성만을 보자고 한다.
따라서 다음과정을 통한 정규화 진행

이를 피어슨 상관계수라고 한다.
피어슨 상관계수를 그림으로 이해하면


기계학습 분야에서 다변수 확률변수(벡터 형태의 표본값) 가정하는 경우가 많다.
ex) 얼굴의 특징 3가지(얼굴길이, 코 길이, 입술 두께)
-> 하나의 데이터는 3개의 원소를 가지는 벡터
-> 얼굴 데이터 x = [얼굴길이, 코 길이, 입술 두께]
이러한 데이터 N개 있다고 가정
N개의 얼굴 데이터를 하나의 행렬로 표현 NX3 행렬이다.

얼굴 길이, 코 길이는 양의 상관 관계 예상가능
공분산 행렬을 통해 상관정도가 얼마나 큰지 표현 가능
3개의 서로 다른 확률 변수의 모든 조합에 대해 공분산을 한꺼번에 표기할 수 있다.
이를 공분산 행렬이라 한다.

공분산 행렬은 다음과 같이 정의된다. (데이터 개수 :N개, 특징의 개수: d개)
대각 성분(diagonal)은 각 확률 변수의 분산
비대각 성분(off- diagonal)은 두 확률변수의 공분산이다.


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.plot(X, Y, "o")
plt.xlabel("math")
plt.ylabel("english")
plt.show()

X = [97, 85, 26, 54, 76, 15, 33, 83, 88, 91]
Y = [100, 92, 31, 61, 83, 28, 57, 45, 92, 93]
# 평균
def mean(lst):
lst_mean = 0
for i in lst:
lst_mean += i/len(lst)
return lst_mean
# 분산
def var(lst):
lst_var = 0
for i in lst:
lst_var += ((i - mean(lst))**2)/(len(lst) -1)
return lst_var
print(f"x_mean = {mean(X):.3f}, x_var = {var(X):.3f}")
print(f"y_mean = {mean(Y):.3f}, y_var = {var(Y):.3f}")
import numpy as np
np.set_printoptions(precision = 3) # 소숫점 아래 3자리 반올림
import math
X = [97, 85, 26, 54, 76, 15, 33, 83, 88, 91]
Y = [100, 92, 31, 61, 83, 28, 57, 45, 92, 93]
# 평균
def mean(lst):
lst_mean = 0
for i in lst:
lst_mean += i/len(lst)
return lst_mean
# 분산
def var(lst):
lst_var = 0
for i in lst:
lst_var += ((i - mean(lst))**2)/(len(lst) -1)
return lst_var
# 공분산
def covar(lst1, lst2):
lst_covar = 0
for x, y in zip(lst1, lst2):
lst_covar += ((x - mean(lst1)) * (y - mean(lst2)))/(len(lst1)-1)
return lst_covar
# 상관 계수
def corr_coeff(lst1, lst2):
lst_corr_coeff = covar(lst1, lst2) / math.sqrt(var(lst1)*var(lst2))
return lst_corr_coeff
print(f"sample covariance: {covar(X,Y):.3f}")
print(f"sample covariance (Numpy) : {np.cov(X,Y)}")
print(f"correlation coefficient: {corr_coeff(X,Y):.3f}")
print(f"correlation coefficient (Numpy) : {np.corrcoef(X,Y)}")