가우시안 분포(Gaussian Distribution)

= 정규 분포(Normal Distribution)

$ P(x)=\frac { 1 }{ { \sigma \sqrt { 2\pi } } } e^{ { { \frac { -\left( { x-\mu } \right) ^{ 2 } }{ { { 2\sigma ^{ 2 } } } } } } } $

In [1]:
%matplotlib inline

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
import math

mu = 0                          # mean
variance = 1
sigma = math.sqrt(variance)     # stddev
plt_z = np.linspace(-4, 4, 100) # z-score

# Python: 1./(np.sqrt(2*np.pi)*sigma)*np.exp(-0.5 * (1./sigma*(x - mu))**2)
plt.plot(plt_z, mlab.normpdf(plt_z, mu, sigma))

# Standard Normal Distribution
plt.show()
In [2]:
from scipy.stats import norm

# 표준 정규 분포(Standard Normal Distribution)를 이용한 누적 분포 표현
def print_prob_chart(x):
    # plt_x 설정(range 1 ~ max)
    plt_x = np.arange(0, x.max(), 1)
    y = []
    for i in np.nditer(plt_x):
        y.append(np.sum(x > i))
    # actual ratio
    y = np.array(y) / x.size

    # mean, stddev, z-score    
    mu = np.mean(x)
    sigma = np.std(x)
    z = (plt_x - mu) / sigma
    
    plt.fill_between(plt_x, y, facecolor='blue', alpha=0.2)
    plt.plot(plt_x, 1 - norm(0, 1).cdf(z), color='red')     # 표준 정규 분포의 (1 - 적분) 값
    plt.plot(plt_x, norm(0, 1).pdf(z), color='blue')        # 표준 정규 분포의 y 값
    plt.legend(['1 - cdf', 'pdf', 'actual ratio'])
    plt.show()
    
    # z-score plot
    plt.plot(plt_x, z)
    plt.legend(['z-score'])
    plt.show()
In [3]:
# default: 1000개(range 0 ~ 250)
# 랜덤하게 생성하나 많이 생성하므로 고르게 분포됨
x = np.random.randint(0,250,1000)
print_prob_chart(x)
In [4]:
# range 500 ~ 600 사이 20000개 추가
print_prob_chart(np.append(x, np.repeat(np.arange(600,800, 1), 200)))
In [5]:
# range 0 ~ 100 사이에 30000개 추가
print_prob_chart(np.append(x, np.repeat(np.arange(0,100, 1), 300)))
In [6]:
# outlier 1개 추가
print_prob_chart(np.append(x, 8000))
  1. 확률 분포(probability distribution)는 평균(mu)에서 볼록한 벨 커브(Bell Curve) 모양이다.
  2. 표준 편차 구간에 따라 68-95-99.7 누적 분포(cumulative distribution)를 지닌다.
  3. mu = 0, sigma = 1 일때 표준 편차는 표준 점수(Standard Score, z-score)다.
  4. 오래전에는 적분 계산이 어려웠기 때문에 표준 정규 분포로 변환하여 계산했으나 이제는 norm(mu, sigma).cdf(x)로 동일한 누적 분포를 얻을 수 있다.
  5. 누적 분포의 1 - cdf 값은 실제 데이타 분포와 매우 유사함을 확인할 수 있다.
  6. z-score는 outlier로 인해 매우 큰 수로 증가할 수 있으며, 이 경우 누적 분포 오차가 크다.
In [7]:
# 표준 편차가 1과 2인 분포의 표준 편차 1 구간 누적 분포는 68%로 동일하다.
norm(0, 1).cdf(1) - norm(0, 1).cdf(-1), \
norm(0, 2).cdf(2) - norm(0, 2).cdf(-2)
Out[7]:
(0.68268949213708585, 0.68268949213708585)
In [8]:
# 확률 밀도 함수(probability density function)는 정규 분포와 표준 정규 분포의 값이 상이하다.
norm(14, 27).pdf(10), norm(0, 1).pdf((10-14)/27)
Out[8]:
(0.014614379523263053, 0.39458824712810242)
In [9]:
# 누적 분포 함수(cumulative distribution function)는 정규 분포와 표준 정규 분포의 값이 동일하다.
# 즉, 적분의 값은 동일
norm(14, 27).cdf(10), norm(0, 1).cdf((10-14)/27)
Out[9]:
(0.4411129259617243, 0.4411129259617243)