공분산과 상관계수 (Covariance and Correlation)

공분산 정의와 성질, 상관계수의 범위, 합의 분산, 무상관과 독립의 차이

공분산은 두 확률변수가 함께 변하는 방향과 강도를 측정하고, 상관계수는 이를 [-1, 1]로 표준화한다. 이 포스트에서는 공분산과 상관계수의 정의, 합의 분산 공식, 상관계수의 범위 증명, 그리고 무상관과 독립의 차이를 교재 기반으로 다루고 코드로 시각화한다.

Statistics
저자

Kwangmin Kim

공개

2026년 03월 30일

1 개요

두 확률변수 사이에 관계가 있다는 것은 독립이 아니라는 의미이다. 그러나 관계가 얼마나 강한지를 수량화하려면 독립/비독립의 이분법으로는 부족하다 (Casella & Berger, 2002, Ch.4).

실무 예시로 이해하기: - 물의 무게 \(X\) 와 부피 \(Y\) : 거의 완벽한 선형 관계 (매우 강한 상관, \(\rho \approx 0.999\) ) - 사람의 체중 \(X\) 와 키 \(Y\) : 관계가 있으되 약한 상관 ( \(\rho \approx 0.5\) ) - 주사위 두 개를 던질 때 눈의 합 \(X\) 와 차 \(Y\) : 관계가 있으나 더 약한 상관 - 독립적으로 던진 주사위 \(X\)\(Y\) : 무상관 ( \(\rho = 0\) )

공분산(covariance)과 상관계수(correlation)는 이 관계의 강도를 정량화하는 도구이다. 독립/비독립이 “스위치”라면, 상관계수는 “슬라이더”이다.


2 공분산 (Covariance)

정의 4.5.1 (Casella & Berger, 2002, Ch.4)

\[ \text{Cov}(X, Y) = E[(X - \mu_X)(Y - \mu_Y)] \]

직관: \(X\) 가 평균보다 클 때 \(Y\) 도 평균보다 크면 \((X - \mu_X)(Y - \mu_Y) > 0\) 이고, \(X\) 가 평균보다 작을 때 \(Y\) 도 평균보다 작으면 역시 양수이다. 따라서 같은 방향으로 함께 변하면 공분산이 양수, 반대 방향이면 음수이다.

2.1 계산 공식

정리 4.5.3 (Casella & Berger, 2002, Ch.4)

\[ \text{Cov}(X, Y) = E[XY] - E[X] \cdot E[Y] \]

이 공식이 실무에서 더 자주 사용된다. \(E[XY]\) , \(E[X]\) , \(E[Y]\) 를 각각 구하면 공분산을 바로 계산할 수 있다.

2.2 공분산의 한계

공분산 자체는 스케일에 의존한다. \(\text{Cov}(X, Y) = 3\) 이라는 값만으로는 관계가 강한지 약한지 판단할 수 없다. \(X\)\(Y\) 의 단위를 바꾸면 공분산도 바뀐다. 이 문제를 해결하는 것이 상관계수이다.


3 상관계수 (Correlation Coefficient)

정의 4.5.2 (Casella & Berger, 2002, Ch.4)

\[ \rho_{XY} = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} \]

상관계수는 공분산을 각 변수의 표준편차로 나누어 무차원(dimensionless)으로 만든 것이다.

3.1 상관계수의 범위

정리 4.5.7 (Casella & Berger, 2002, Ch.4)
  1. \(-1 \leq \rho_{XY} \leq 1\)

  2. \(|\rho_{XY}| = 1\) 인 것은 \(P(Y = aX + b) = 1\)\(a \neq 0\) , \(b\) 가 존재하는 것과 동치이다. \(\rho = 1\) 이면 \(a > 0\) (양의 선형), \(\rho = -1\) 이면 \(a < 0\) (음의 선형)이다.

\(|\rho| = 1\)완벽한 선형 관계를 의미한다. (a)의 증명은 코시-슈바르츠 부등식에 의한다: \(|\text{Cov}(X, Y)|^2 \leq \sigma_X^2 \sigma_Y^2\) .

3.2 상관계수의 해석

\(\rho\) 범위 해석 예시
\(\rho = 1\) 완벽한 양의 선형 관계 물의 무게와 부피
\(0.7 \leq \rho < 1\) 강한 양의 상관 키와 체중 (일부 모집단)
\(0 < \rho < 0.7\) 약한 양의 상관 공부 시간과 성적
\(\rho = 0\) 선형 무상관 독립이면 반드시 여기
\(\rho < 0\) 음의 상관 속도와 도착 시간
\(\rho = -1\) 완벽한 음의 선형 관계 할인율과 채권 가격

4 합의 분산

정리 4.5.6 (Casella & Berger, 2002, Ch.4)

\[ \text{Var}(aX + bY) = a^2 \text{Var}(X) + b^2 \text{Var}(Y) + 2ab \, \text{Cov}(X, Y) \]

\(X\)\(Y\) 가 독립이면:

\[ \text{Var}(aX + bY) = a^2 \text{Var}(X) + b^2 \text{Var}(Y) \]

이 공식의 실무적 해석:

  • 양의 상관 (\(\text{Cov} > 0\)): \(X + Y\) 의 분산이 개별 분산의 합보다 크다. 두 변수가 함께 극단값을 취하므로 합의 변동이 증폭된다.
  • 음의 상관 (\(\text{Cov} < 0\)): \(X + Y\) 의 분산이 개별 분산의 합보다 작다. 한 변수의 극단값이 다른 변수의 반대 극단으로 상쇄된다.
  • 포트폴리오 이론: 음의 상관을 가진 자산을 결합하면 전체 위험(분산)을 줄일 수 있다.

5 무상관과 독립: 왜 같지 않은가

정리 4.5.5 (Casella & Berger, 2002, Ch.4)

\(X\)\(Y\) 가 독립이면 \(\text{Cov}(X, Y) = 0\) 이고 \(\rho_{XY} = 0\) 이다.

그러나 역은 성립하지 않는다. 무상관( \(\rho = 0\) )이지만 독립이 아닌 예시 (Casella & Berger, 2002, Ch.4):

\(X\) 가 0에 대해 대칭인 분포를 따르고 \(Y = I(|X - \theta| < 2)\) 이면:

\[ E[XY] = \int_{-2}^{2} (t + \theta) f(t) \, dt = \theta \int_{-2}^{2} f(t) \, dt = E[X] \cdot E[Y] \]

대칭성에 의해 \(\int_{-2}^{2} t \, f(t) \, dt = 0\) 이므로 \(\text{Cov}(X, Y) = 0\) 이다. 그러나 \(Y\)\(X\) 에 의해 결정되므로 독립이 아니다.

핵심: 공분산과 상관계수는 선형 관계만 포착한다. 비선형 관계( \(Y = X^2\) , \(Y = \sin(X)\) 등)는 감지하지 못할 수 있다.

유일한 예외: 다변량 정규분포에서는 무상관과 독립이 동치이다.


6 응용 분야

분야 개념 구체적 활용
포트폴리오 이론 합의 분산 \(\text{Var}(w_1 X + w_2 Y)\) 최소화 = 분산투자
회귀분석 상관계수 \(R^2 = \rho^2\) (단순 선형 회귀에서)
PCA 공분산행렬 고유값 분해로 주성분 추출
신호처리 공분산 자기공분산(autocovariance)으로 시계열 특성 파악
피처 선택 상관계수 다중공선성 진단, 변수 제거 기준
ANOVA 합의 분산 \(F\)-통계량 유도

7 코드 예시

7.1 Step 1: 순수 Python 구현 (원리 이해)

공분산과 상관계수를 정의에서 직접 계산한다.

import math
import random

random.seed(42)

# 결합 PDF: f(x,y) = 1, 0 < x < 1, x < y < x+1 (Casella Example 4.5.4)
n = 200000
cov_sum = 0
sum_x, sum_y, sum_x2, sum_y2, sum_xy = 0, 0, 0, 0, 0

for _ in range(n):
    x = random.random()           # X ~ Uniform(0, 1)
    y = x + random.random()       # Y|X=x ~ Uniform(x, x+1)
    sum_x += x
    sum_y += y
    sum_x2 += x**2
    sum_y2 += y**2
    sum_xy += x * y

mu_x = sum_x / n
mu_y = sum_y / n
var_x = sum_x2 / n - mu_x**2
var_y = sum_y2 / n - mu_y**2
cov_xy = sum_xy / n - mu_x * mu_y
rho = cov_xy / math.sqrt(var_x * var_y)

print("f(x,y) = 1, 0 < x < 1, x < y < x+1")
print(f"  E[X] = {mu_x:.4f} (이론: 0.5)")
print(f"  E[Y] = {mu_y:.4f} (이론: 1.0)")
print(f"  Var(X) = {var_x:.4f} (이론: 1/12 = {1/12:.4f})")
print(f"  Var(Y) = {var_y:.4f} (이론: 1/6 = {1/6:.4f})")
print(f"  Cov(X,Y) = {cov_xy:.4f} (이론: 1/12 = {1/12:.4f})")
print(f"  rho = {rho:.4f} (이론: 1/sqrt(2) = {1/math.sqrt(2):.4f})")

7.2 Step 2: scipy/numpy 구현 (실무 활용)

무상관이지만 독립이 아닌 경우를 시각화한다.

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

np.random.seed(42)
n = 10000

fig, axes = plt.subplots(1, 3, figsize=(14, 4))

# 1) 양의 상관
rho = 0.8
samples = np.random.multivariate_normal([0, 0], [[1, rho], [rho, 1]], n)
ax = axes[0]
ax.scatter(samples[:, 0], samples[:, 1], alpha=0.1, s=3)
ax.set_title(f"Positive corr (rho={rho})")
ax.set_xlabel("X")
ax.set_ylabel("Y")

# 2) 무상관이지만 비독립: Y = X^2
X = np.random.normal(0, 1, n)
Y_dep = X**2
ax = axes[1]
ax.scatter(X, Y_dep, alpha=0.1, s=3, c='orange')
corr_val = np.corrcoef(X, Y_dep)[0, 1]
ax.set_title(f"Uncorrelated but dependent\n(rho={corr_val:.3f}, Y=X^2)")
ax.set_xlabel("X")
ax.set_ylabel("Y = X^2")

# 3) 합의 분산: 상관에 따른 변화
rho_vals = np.linspace(-0.99, 0.99, 100)
var_sum = 1 + 1 + 2 * rho_vals  # Var(X) = Var(Y) = 1, Cov = rho

ax = axes[2]
ax.plot(rho_vals, var_sum, 'b-', linewidth=2)
ax.axhline(y=2, color='gray', linestyle='--', alpha=0.5, label="Independent (rho=0)")
ax.fill_between(rho_vals, var_sum, 2, where=var_sum > 2, alpha=0.2, color='red', label="Amplified")
ax.fill_between(rho_vals, var_sum, 2, where=var_sum < 2, alpha=0.2, color='green', label="Reduced")
ax.set_xlabel(r"$\rho$")
ax.set_ylabel("Var(X + Y)")
ax.set_title("Effect of Correlation on Sum Variance")
ax.legend(fontsize=8)

plt.tight_layout()
plt.show()

8 관련 주제

선행 지식

후속 주제

관련 개념

Subscribe

Enjoy this blog? Get notified of new posts by email: