표준 정규 분포의 사분위 범위의 도출을 시작으로 정교하게

4267 단어 파이썬통계학

목표



표준 정규 분포의 사분위 범위 도출
흔히 통계학의 책의 부록에 관한 「표준 정규 분포표」의 수치의 엄밀한 계산 방법

계산 절차



우선, 제1사분위수를 $Q_1$, 제3사분위수를 $Q_3$로 두면, 표준 정규 분포의 확률밀도 함수이다
$$ f(x)=\frac{1}{\sqrt{2\pi}}exp\left(-\frac{x^2}{2}\right)$$
반대로 다음 관계가 성립합니다.

$$\int_{-\infty}^{Q_1} f(x)\dx=\frac{1}{4}$$
$$\int_{-\infty}^{Q_3} f(x)\dx=\frac{3}{4}$$

그리고 이 2식의 차이를 취하면,

\begin{align}
\int_{-\infty}^{Q_3} f(x) \ dx-\int_{-\infty}^{Q_1} f(x) \ dx&=\int_{Q_1}^{Q_3} f(x) \ dx \\
&=\frac{1}{2}
\end{align}

여기서 표준 정규 분포이므로 평균 $\mu=0$가 성립합니다. 상수 c를 사용하여,

$$Q_1=\mu-c=-c$$
$$Q_3=\mu+c=c$$
라고 표현할 수 있기 때문에
\begin{align}
\int_{Q_1}^{Q_3} f(x) \ dx&=\int_{-c}^{c} f(x) \ dx\\ &=\frac{1}{2}
\end{align}

됩니다.
여기서 오차 함수 erf $ (x) $를 사용하여,
\begin{align}
\int_{-c}^{c} exp\left(-\frac{x^2}{2}\right) \ dx&=\left[\frac{\pi}{2} erf\left(\frac{x}{\sqrt{2}}\right)\right]_{-c}^{c}\\ 
&= \sqrt{2\pi} erf\left(\frac{c}{\sqrt{2}}\right)
\end{align}

라고 표시됩니다( Wolfram Alpha 씨, 감사합니다) 때문에, 이하의 등식이 성립합니다.
$$erf\left(\frac{c}{\sqrt{2}}\right)=\frac{1}{2}$$

여기서 오차 함수에 포함되는 c를 구하고 싶습니다만, 부분 적분 등의 해석 어프로치에서는 전혀 치아가 서 있지 않습니다. 여기서 적분의 늪에 들어가는 것입니다. 어떤 정책으로 구할까요?

오류 함수에 대한 방정식을 프로그래밍 방식으로



이번에는 Numpy를 모듈로 사용합니다.
다행히 numpy에는 오차 함수가 이미 짜넣어져 있기 때문에 굉장히 편해집니다.
(Scipy에서도 마찬가지로 할 수있는 것 같습니다.)

나중에 함수의 시각화도 하기 때문에 matplotlib도 넣을 때입니다.
import numpy as np
import matplotlib.pyplot as plt

그런데, 여기로부터 하기의 등식이 성립되는 $c$를 요구하려고 생각합니다. $$erf\left(\frac{c}{\sqrt{2}}\right)=\frac{1}{2}$$

그런데이 오차 함수는
$$erf(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x}exp\left(-t^2\right)dt$$
라는 형태로 표현됩니다. 이 오차 함수가 어떤 함수형인지 시각화해 보면
fig = plt.figure(figsize = (6, 4))
ax = fig.add_subplot(111)

x=np.linspace(-2.0,2.0,2000000)
y=np.erf(x/np.sqrt(2))

ax.set_xlabel("x", fontsize = 14)
ax.set_ylabel("erf(x)", fontsize = 14)

plt.plot(x, y, ls="-", label="erf(x)", color="red")
plt.title("Error function")
plt.legend()
plt.show()

<출력 결과>



Sigmoid 함수 같은 개략으로, 협의 단조 증가하고 있네요.

그래서 다음과 같은 접근법으로 c를 푸십시오.

표준 정규분포이므로 표준편차의 특징
②$ erf (\frac{c}{\sqrt{2}}) <\frac{1}{2} $ 미만이 되는 동안은 계산을 실행시켜, 적분값을 증가시켜 가, $ erf (\frac {c}{\sqrt{2}}) ≒\frac{1}{2} $가 되는 빠듯한 값 c를 구한다.

이것은 오차 함수의 프로그램과 마찬가지로 코딩됩니다.
for c in np.arange(-1.000000,1.000000):
    while np.erf(c/np.sqrt(2)) < 1/2:
        c=c+0.000001
    break
print(c)

<출력 결과>
0.6744900000064764

시각화도 실행해 보면,
fig = plt.figure(figsize = (6, 4))
ax = fig.add_subplot(111)

x=np.linspace(-1.0,1.0,1000000)
y=np.erf(x/np.sqrt(2))

ax.set_xlabel("c", fontsize = 14)
ax.set_ylabel("erf score", fontsize = 14)

plt.plot(x, y, ls="-", label="erf(c/√2)")
ax.axhline(0.5, ls = "-.", color = "green", label="erf score = 1/2")
plt.title("Error function")
plt.legend()
plt.show()

<출력 결과>
(USE OF STANDARD DEVIATION)
두 선의 교차점의 c 값은 이전 출력 결과의 0.67449...에 해당합니다.

마지막



프로그램 결과로부터, $c=0.674490$...이 되기 때문에, 사분위 범위는
\begin{align}
c-(-c)&=2c \\ 
&= 2*(0.674490...) \\ 
&≒ 1.349
\end{align}

따라서 표준 정규 분포의 사분위 범위는 $1.349$로 구해집니다.

[2022/01/17 16:45 추가]
현재는 Python의 scipy 패키지의 special 에 의해, 아래와 같이 간단하게 오차 함수를 거치므로 상기와 같은 대등한 분할은 필요 없습니다.
from scipy import special
import matplotlib.pyplot as plt
x = np.linspace(-1.00, 1.00)
plt.plot(x, special.erf(x))
plt.xlabel('x')
plt.ylabel('erf(x)')
plt.show()

좋은 웹페이지 즐겨찾기