Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib로 두 분포의 차이 시각화하기: KDE 밀도 곡선 비교 방법

데이터 분석을 하다 보면 두 개의 분포가 얼마나 다른지 시각적으로 확인해야 하는 경우가 많습니다. Matplotlib와 SciPy의 커널 밀도 추정(KDE)을 활용하면 두 분포의 차이를 하나의 그래프에 깔끔하게 나타낼 수 있습니다.

구현 단계

두 분포의 차이를 그리려면 아래 순서대로 진행하면 됩니다.

  • 그림 크기를 설정하고 서브플롯 주변의 여백(padding)을 조정합니다.
  • Numpy를 사용해 a, b 두 개의 데이터셋을 생성합니다.
  • Gaussian 커널을 이용한 커널 밀도 추정값인 kdeakdeb를 구합니다.
  • Numpy로 그리드(grid)를 생성합니다.
  • plot() 메서드를 사용해 그리드 위에 kdea(grid), kdeb(grid), 그리고 두 값의 차이인 kdea(grid) - kdeb(grid)를 각각 그립니다.
  • 범례(legend)를 왼쪽 상단에 배치합니다.
  • show() 메서드로 그림을 화면에 표시합니다.

예제 코드

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

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

a = np.random.gumbel(50, 28, 100)
b = np.random.gumbel(60, 37, 100)

kdea = scipy.stats.gaussian_kde(a)
kdeb = scipy.stats.gaussian_kde(b)

grid = np.linspace(0, 50, 100)

plt.plot(grid, kdea(grid), label="Kde A")
plt.plot(grid, kdeb(grid), label="Kde B")
plt.plot(grid, kdea(grid)-kdeb(grid), label="Difference")

plt.legend(loc='upper left')

plt.show()

코드 설명

위 예제에서는 np.random.gumbel() 함수로 서로 다른 평균과 표준편차를 가진 두 개의 검벨(Gumbel) 분포 데이터를 100개씩 생성합니다. 이후 scipy.stats.gaussian_kde()를 통해 각 데이터셋의 확률 밀도 함수를 부드러운 곡선으로 추정합니다.

np.linspace(0, 50, 100)은 0부터 50 사이를 100개 구간으로 나눈 균일한 그리드를 만들어, 밀도 값을 일정한 간격으로 평가하는 데 사용됩니다.

핵심은 세 번째 plot 호출입니다. kdea(grid) - kdeb(grid)는 두 밀도 곡선의 y값 차이를 계산하여, 어느 구간에서 A 분포가 B 분포보다 높거나 낮은지 직관적으로 보여줍니다. 결과 그래프에서 'Difference' 곡선이 0 위에 있으면 A의 밀도가 더 높고, 0 아래에 있으면 B의 밀도가 더 높다는 의미입니다.

출력 결과

실행하면 Kde A(파란색), Kde B(주황색), Difference(녹색) 세 개의 곡선이 함께 표시된 그래프를 확인할 수 있습니다. 범례는 왼쪽 상단에 위치하며, 두 분포의 겹치는 영역과 차이가 나는 영역을 한눈에 파악할 수 있습니다.

활용 팁

  • 그리드 범위(np.linspace)는 실제 데이터의 최솟값과 최댓값에 맞게 조정하면 더 정확한 시각화가 가능합니다.
  • 데이터 개수가 많아질수록 KDE 곡선이 실제 분포에 가까워집니다.
  • 두 분포의 차이가 통계적으로 유의미한지 확인하려면 KS 검정(Kolmogorov-Smirnov test) 같은 통계 검정을 함께 사용하는 것이 좋습니다.