TL;DR

  • 공분산 행렬은 여러 변수의 분산(variance)공분산을 한 행렬에 모은 구조다.
  • 대각 원소는 각 변수의 분산이고, 비대각 원소는 변수 쌍 사이의 공분산이다.

공분산 행렬

공분산 행렬(covariance matrix)은 다변량 데이터에서 변수들이 각각 얼마나 퍼져 있고, 서로 어떤 방향으로 함께 움직이는지를 한 번에 보여준다.

변수가 두 개일 때는 공분산 하나만 보면 된다. 하지만 변수가 개라면 변수 쌍이 많아진다. 공분산 행렬은 이 정보를 행렬로 정리한다.


구조

변수 가 있다고 하자. 공분산 행렬은 다음과 같은 형태다.

읽는 방식은 단순하다.

위치의미
대각 원소각 변수의 분산(variance)
비대각 원소두 변수 사이의 공분산

예를 들어 위치의 값은 의 공분산이다. 위치도 같은 값을 갖는다.


왜 대칭 행렬인가

공분산은 순서를 바꿔도 같다.

따라서 공분산 행렬은 대칭 행렬이다.

이 성질 때문에 공분산 행렬은 [[주성분 분석]]처럼 고유값 분해를 사용하는 방법에서 핵심 입력으로 쓰인다.


수식

확률변수 벡터 와 평균 벡터 가 있을 때 모집단 공분산 행렬은 다음과 같이 쓴다.

표본 데이터 행렬을 평균 중심화한 값을 라고 하면, 표본 공분산 행렬은 다음과 같이 계산할 수 있다.

여기서는 행이 관측치, 열이 변수인 데이터 행렬을 가정한다.


직관

공분산 행렬은 데이터의 “퍼짐 모양”을 설명한다.

  • 대각 원소가 크다: 해당 변수가 평균 주변에서 많이 퍼져 있다.
  • 비대각 원소가 양수다: 두 변수가 같은 방향으로 움직이는 경향이 있다.
  • 비대각 원소가 음수다: 두 변수가 반대 방향으로 움직이는 경향이 있다.
  • 비대각 원소가 0에 가깝다: 두 변수의 평균 기준 동반 움직임이 약하다.

2차원 데이터에서는 공분산 행렬이 점구름의 방향과 납작한 정도를 설명한다. 두 변수가 강하게 함께 움직이면 점구름은 대각선 방향으로 길어진다.


어디에 쓰이는가

PCA

[[주성분 분석]]은 데이터의 분산이 큰 방향을 찾는다. 이때 공분산 행렬의 고유벡터는 주요 방향을, 고유값은 그 방향의 분산 크기를 나타낸다.

변수 스케일이 서로 크게 다르면 공분산 행렬 기반 PCA는 스케일이 큰 변수에 끌릴 수 있다. 이 경우 표준화 후 상관계수 행렬을 사용하는 선택지가 생긴다.

Mahalanobis distance

[[마할라노비스 거리]]는 변수별 스케일과 변수 간 공분산 구조를 반영한 거리다. 단순 유클리드 거리가 각 축을 독립적으로 보는 데 비해, 마할라노비스 거리는 데이터의 퍼짐 방향을 고려한다.

LDA/QDA

[[선형 판별 분석]][[이차 판별 분석]]은 클래스별 공분산 구조에 대한 가정을 사용한다. LDA는 클래스들이 같은 공분산 행렬을 공유한다고 가정하고, QDA는 클래스별 공분산 행렬이 다를 수 있다고 본다.


구현

import numpy as np
 
# 행은 관측치, 열은 변수
X = np.array([
    [1, 50, 160],
    [2, 55, 165],
    [3, 65, 170],
    [4, 75, 175],
    [5, 90, 180],
])
 
cov_matrix = np.cov(X, rowvar=False)

np.cov의 기본값은 각 행을 변수로 해석한다. 일반적인 데이터프레임처럼 행이 관측치, 열이 변수라면 rowvar=False를 지정해야 한다.


주의할 점

단위와 스케일에 민감하다

공분산 행렬은 각 변수의 단위가 그대로 반영된다. cm, kg, 원처럼 스케일이 다른 변수를 함께 넣으면 큰 스케일의 변수가 전체 구조를 지배할 수 있다.

상관계수 행렬과 다르다

공분산 행렬은 원래 단위를 보존한다. [[상관계수 행렬]]은 각 변수를 표준화한 뒤 관계를 부터 사이로 표현한다. 변수 간 상대적 관계만 비교하려면 상관계수 행렬이 더 적합할 수 있다.

변수 수가 표본 수보다 많으면 불안정할 수 있다

변수가 많고 표본이 적으면 공분산 행렬 추정이 불안정해진다. 이 경우 PCA, LDA, 마할라노비스 거리 같은 방법의 결과도 흔들릴 수 있다.


Connections