정규분포(Normal (Gaussian) Distribution)
여러 현상들에 대해 큰 규모의 자료를 조사하면 그림 1과 같이 평균에서 가장 높은 확률을 보이며 그 평균을 중심으로 양쪽으로 같은 정도로 확률 감소를 보이는 종 모양의 형태를 보입니다. 이러한 분포를 정규분포(normal Distribution)라고 합니다. 특히 큰 규모의 확률변수들에 대한 분포는 그 변수들의 조건에 상관없이 정규분포에 근접하기 때문에 데이터들의 여러 특성들을 연구하는데 중심이 되는 분포입니다.
x=np.linspace(-4, 4, 100)
p=stats.norm.pdf(x)
nme=[r"-2.56$\sigma$", r"-1.96$\sigma$", r"$\sigma$", r'$\mu$', r"$\sigma$", r"1.96$\sigma$", r"2.56$\sigma$"]
x1=np.linspace(-1, 1, 100)
x21=np.linspace(-1.96, -1, 100)
x22=np.linspace(1, 1.96, 100)
x31=np.linspace(-2.56, -1.96, 100 )
x32=np.linspace(1.96, 2.56, 100)
fig, ax=plt.subplots(figsize=(9,3))
ax.plot(x, p, color="r")
ax.fill_between(x1, stats.norm.pdf(x1), color="g", alpha=0.3, label="68%")
ax.fill_between(x21, stats.norm.pdf(x21), color="b", alpha=0.3, label="95%")
ax.fill_between(x22, stats.norm.pdf(x22), color="b", alpha=0.3)
ax.fill_between(x31, stats.norm.pdf(x31), color="brown", alpha=0.3, label="99%")
ax.fill_between(x32, stats.norm.pdf(x32), color="brown", alpha=0.3)
ax.set_xlabel("x")
ax.set_ylabel("Probability")
ax.set_xticks(ticks=[-2.56, -1.96, -1, 0, 1, 1.96, 2.56], labels=nme)
ax.set_title("Normal Distribution")
ax.legend(loc="best")
plt.show()
그림 1과 같이 정규분포는 가장 높은 확률을 보이는 평균을 중심으로 양쪽이 대칭인 형태를 보입니다. 그러므로 이 분포의 평균, 최빈값, 중앙값이 모두 같습니다. 또한 이 분포의 총 면적은 1이 됩니다.
정규분포의 두 가지 특성을 사용하여 특정 구간의 누적확률은 쉽게 계산할 수 있습니다. 예를 들어 표 1에서 나타낸 것과 같이 분포의 평균과 표준편차를 사용하여 일정한 영역의 누적확률을 결정할 수 있습니다.
| 구간 | 누적확률 |
| μ ± σ | 0.68 |
| μ ± 1.96σ | 0.95 |
| μ ± 2.56σ | 0.99 |
결과적으로 정규분포에서 평균과 분산은 각각 분포의 중심 위치(location)과 규모(scale)를 결정하는 통계량입니다.
일반적으로 데이터의 규모가 클수록 정규분포에 적합해집니다. 그림 2는 랜덤 샘플의 크기에 따른 히스토그램과 정규분포의 부합정도를 나타낸 것입니다.
x=np.sort(stats.norm.rvs(size=50, random_state=3))
y=stats.norm.pdf(x)
x2=np.sort(stats.norm.rvs(size=1000, random_state=3))
y2=stats.norm.pdf(x2)
fig, (ax1, ax2)=plt.subplots(nrows=1, ncols=2, figsize=(8, 3))
ax1.hist(x,bins=10, density=True, rwidth=0.8, label="size=50")
ax1.plot(x, y, color="r", label="N(0,1)")
ax1.set_xlabel("x")
ax1.set_ylabel("probability")
ax1.legend(loc="best")
ax2.hist(x2,bins=10, density=True, rwidth=0.8, label="size=1000")
ax2.plot(x2, y2, color="r", label="N(0,1)")
ax2.set_xlabel("x")
ax2.legend(loc="best")
plt.show()
그림 2와 같이 샘플의 크기가 증가할수록 정규분포에 적합해지는 현상을 중심극한정리(Central Limit Theorem, CLT)라 합니다. 이 정리를 사용하여 분포를 특정할 수 없는 다양한 자료들의 통계분석의 근거를 제공합니다.
그림 3과 같이 정규분포의 전체적인 형상은 정규분포의 모수(parameter)인 평균과 분산에 의해 결정됩니다.
x=np.sort(stats.norm.rvs(size=1000, random_state=3))
y=stats.norm.pdf(x)
mu=[-2, 0, 1, 2]
sigma=[1, 1.5, 2, 2.5]
col=["r",'b', 'g','orange']
fig, (ax1, ax2)=plt.subplots(nrows=1, ncols=2, figsize=(8, 3))
for i in range(4):
ax1.plot(x, stats.norm.pdf(x, mu[i], 1), color=col[i], label=f"N({mu[i]},1)")
ax2.plot(x, stats.norm.pdf(x, 0, sigma[i]), color=col[i], label=f"N(0, {sigma[i]})")
ax1.set_xlabel("x, (a) Change in $\mu$", loc="right")
ax1.set_ylabel("probability")
ax1.set_ylim(0, 0.7)
ax1.vlines(0, 0, 0.7, color="k", alpha=0.3)
ax1.legend(loc="best", frameon=False)
ax2.set_xlabel("x, (b) Change in $\sigma$", loc="right")
ax2.legend(loc="best", frameon=False)
ax2.set_ylim(0, 0.42)
ax2.vlines(0, 0, 0.42, color="k", alpha=0.3)
plt.show()
그림 3에서 나타낸 것과 같이 정규분포의 형태는 평균(μ)과 분산(σ2)에 의존합니다. 정규분포의 표현과 두 모수(parameter)들로 정의된 확률밀도함수는 식 1과 같습니다.
| X ~ N(μ, σ2) | (식 1) |
| \begin{align}f(x)&=\frac{1}{2\sigma\sqrt{2\pi}}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)\\& -\infty \lt x \lt \infty\end{align} |
정규분포를 따르는 변수는 식 2와 같이 표준화(standardization)하여 평균 0, 분산 1인 새로운 변수 Z으로 변환할 수 있습니다. 변환된 Z을 표준점수(Z score)라고 합니다.
| $$Z = \frac{X − μ_x}{\sigma_x}$$ | (식 2) |
정규분포를 따르는 모든 자료는 Z score로 변환할 수 있으며 이 변환된 자료의 분포는 고정된 평균과 분산을 가집니다. 이 분포를 표준정규분포(Standard Normal Distribution)라 하며 이 분포의 표현과 확률밀도함수는 식 3과 같이 정의됩니다.
| \begin{align}Z&\sim N(0, 1)\\f(z)&=\frac{1}{\sqrt{2\pi}}\exp\left(-\frac{z^2}{2}\right) \end{align} | (식 3) |
정규분포를 따르는 확률변수는 scipy.stats 모듈의 zscore()함수를 사용하여 의 표준화 할 수 있습니다. 또한 표준화는 sklearn.preprocessing 모듈의 StandardScaler() 클래스를 적용할 수 있습니다.
표준정규분포의 평균과 분산은 각각 0, 1입니다. 그 통계량은 기대값과 분산의 정의를 사용하여 확인해 볼 수 있습니다.
z=symbols('z', real=True)
f=1/sqrt(2*pi)*exp(-z**2/2)
E=integrate(z*f, (z, -oo, oo)); E
0
Ex2=integrate(z**2*f, (z, -oo, oo)); Ex2
1
var=Ex2-E**2; var
1
정규분포의 pdf는 stats.norm 클래스의 .pdf(x, loc=0, scale=1) 메소드에 의해 계산할 수 있습니다. 이 메소드에서 x는 확률변수값이고 loc와 scale은 각각 평균과 표준편차을 나타냅니다. 표준정규분포의 경우 평균과 표준편차는 0 과 1로서 이 메소드의 기본값입니다. 그림 4는 표준정규분포의 곡선을 나타낸 것으로 평균 0을 기준으로 대칭이 됨을 나타냅니다.
x=np.linspace(-3, 3, 100)
y=stats.norm.pdf(x)
fig, ax=plt.subplots(figsize=(4,3))
ax.plot(x, y, color="g", label="N(0, 1)")
ax.fill_between(x1, stats.norm.pdf(x1), color="b", alpha=0.3, label="50%")
ax.fill_between(x2, stats.norm.pdf(x2), color="g", alpha=0.3, label="50%")
ax.set_xlabel("x", loc="right")
ax.set_ylabel("pdf", loc="top")
ax.set_yticks([0.1, 0.2, 0.3, 0.4])
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)
ax.spines["left"].set_position("center")
ax.spines["bottom"].set_position(('data', 0))
ax.legend(loc="upper left", frameon=False)
ax.text(1, 0.3, r"f(x)=$\frac{1}{\sqrt{2}}e^{-\frac{x^2}{2}}$", color="g", size="12")
x1=np.linspace(-3, 0, 100)
x2=np.linspace(0, 3, 100)
plt.show()




댓글
댓글 쓰기