다음학기에는 다변량 통계학을 강의하는데, 가장 기본이되는 다변량정규분포의 3차원 그래프를 그려보았다. 코드는 없지만 영감을 얻은 모델은 아래 링크와 같다. 여려분들도 공분산의 평균, 공분산값등을 이리 저리 조정해보면 그래프거 바뀌는 것을 볼수 있다.
Multivariate normal distribution / Mattias Villani | Observable
이 저자가 코드를 주지 않았기 때문에 저 그림을 Mimic해서 python code를 만들어 보았다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
def plot_bivariate_normal_static(mu1, mu2, sigma1, sigma2, rho):
cov_matrix = np.array([
[sigma1**2, rho * sigma1 * sigma2],
[rho * sigma1 * sigma2, sigma2**2]
])
if np.linalg.det(cov_matrix) <= 0:
print(f"공분산 행렬이 유효하지 않습니다. (rho={rho})")
return
x = np.linspace(-4, 4, 100)
y = np.linspace(-3, 5, 100)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
mu = np.array([mu1, mu2])
rv = multivariate_normal(mu, cov_matrix)
Z = rv.pdf(pos)
fig, ax = plt.subplots(figsize=(5, 5))
#contour_filled = ax.contourf(X, Y, Z, levels=15, cmap='Blues', alpha=0.8)
#ax.contour(X, Y, Z, levels=15, colors='black', linewidths=0.5, alpha=0.6)
#ax.contourf(X, Y, Z, levels=20, cmap='turbo')
#ax.contourf(X, Y, Z, levels=20, cmap='viridis')
#ax.contourf(X, Y, Z, levels=20, cmap='cividis')
contour_filled = ax.contourf(
X, Y, Z,
levels=30,
cmap='plasma',
alpha=0.9
)
ax.contour(
X, Y, Z,
levels=30,
colors='white',
linewidths=0.4,
alpha=0.6
)
# 수업 시각자료용 제목 추가
ax.set_title(f'$\mu_1$={mu1}, $\mu_2$={mu2}\n$\sigma_1$={sigma1}, $\sigma_2$={sigma2}, $\\rho$={rho}')
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 5)
ax.set_aspect('equal', adjustable='box')
plt.show()
# 수업에서 비교해서 보여줄 파라미터 조합 예시
print("1. 상관관계(rho)가 0인 경우 (독립)")
plot_bivariate_normal_static(mu1=-0.1, mu2=0.0, sigma1=1.1, sigma2=1.1, rho=0.8)
plt.savefig('mn1.png', dpi=300)