= 정규 분포(Normal Distribution)
$ P(x)=\frac { 1 }{ { \sigma \sqrt { 2\pi } } } e^{ { { \frac { -\left( { x-\mu } \right) ^{ 2 } }{ { { 2\sigma ^{ 2 } } } } } } } $
%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()
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()
# default: 1000개(range 0 ~ 250)
# 랜덤하게 생성하나 많이 생성하므로 고르게 분포됨
x = np.random.randint(0,250,1000)
print_prob_chart(x)
# range 500 ~ 600 사이 20000개 추가
print_prob_chart(np.append(x, np.repeat(np.arange(600,800, 1), 200)))
# range 0 ~ 100 사이에 30000개 추가
print_prob_chart(np.append(x, np.repeat(np.arange(0,100, 1), 300)))
# outlier 1개 추가
print_prob_chart(np.append(x, 8000))
norm(mu, sigma).cdf(x)
로 동일한 누적 분포를 얻을 수 있다.1 - cdf
값은 실제 데이타 분포와 매우 유사함을 확인할 수 있다.# 표준 편차가 1과 2인 분포의 표준 편차 1 구간 누적 분포는 68%로 동일하다.
norm(0, 1).cdf(1) - norm(0, 1).cdf(-1), \
norm(0, 2).cdf(2) - norm(0, 2).cdf(-2)
(0.68268949213708585, 0.68268949213708585)
# 확률 밀도 함수(probability density function)는 정규 분포와 표준 정규 분포의 값이 상이하다.
norm(14, 27).pdf(10), norm(0, 1).pdf((10-14)/27)
(0.014614379523263053, 0.39458824712810242)
# 누적 분포 함수(cumulative distribution function)는 정규 분포와 표준 정규 분포의 값이 동일하다.
# 즉, 적분의 값은 동일
norm(14, 27).cdf(10), norm(0, 1).cdf((10-14)/27)
(0.4411129259617243, 0.4411129259617243)