- 공유 링크 만들기
- 이메일
- 기타 앱
정규분포(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()
댓글
댓글 쓰기