파이썬에서 커널 밀도 추정

커널 밀도 추정(Kernel Density Estimation: KDE)이란?



Wikipedia 당 참고 바랍니다.
상황에 따라 (데이터 수가 많고 부드러운 분포 함수를 따르는 등) 히스토그램보다 데이터의 개요를 파악할 수 있습니다.

적당한 데이터 만들기



우선은 필요한 패키지를 읽어, 정규 분포를 거듭한 쌍봉성의 데이터 세트를 5개 정도 만듭니다.
import numpy as np
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt

N = 5

means = np.random.randn(N,2) * 10 + np.array([100, 200])
stdev = np.random.randn(N,2) * 10 + 30
count = np.int64(np.int64(np.random.randn(N,2) * 10000 + 50000))

a = [
    np.hstack([
        np.random.randn(count[i,j]) * stdev[i,j] + means[i,j]
        for j in range(2)])
    for i in range(N)]

데이터로부터 분포를 추정하여 그래프를 작성한다.



터무니없는 이상치가 있으면 귀찮기 때문에 0.1%에서 99.9%까지의 백분위점에서 데이터를 잘라 버립니다.
(여담입니다만 numpy에서는 percentile(array, x) 로 0..100의 범위로 지정인데, pandas에서는 Series.quantile(x) 로 0..1로 지정입니다.

계속해서 scipy.stats.gaussian_kde() 에 데이터를 건네주면, 가우시안 커널에서 추정된 밀도 함수를 돌려주므로 numpy.linspace 와 조합하면 바삭바삭하게 플롯할 수 있습니다.
limmin = min(np.percentile(x, 0.1) for x in a)
limmax = max(np.percentile(x, 99.9) for x in a)
ls = np.linspace(limmin, limmax, 100)

for n in range(N):
    x = a[n]
    x = x[(x > limmin)&(x < limmax)]
    kde = gaussian_kde(x)
    plt.plot(ls, kde(ls), label='data %d' % n)

plt.xlim([limmin, limmax])
plt.legend()
plt.title('data distributions')
plt.show()



kde 객체의 resample() 메소드라든지 사용하면, 측정 데이터에 가까운 분포의 시뮬레이션용의 데이터 생성이라든지 뿌리 합니다. 자세한 내용은 공식 문서 에서.

좋은 웹페이지 즐겨찾기