파이썬으로 정규분포 그리기
- 수학
- 2022. 10. 6.
통계하면 정규분포가 빠질 수 없는데 파이썬으로 정규분포 그리는 방법 알려드립니다. scipy로 간단하게 그릴 수 있기도 하지만 직접 식으로 그려보고 scipy 통해서도 그려보겠습니다.
확률밀도함수로 직접 구하기
수학자가 만든 함수 중에 전체넓이가 1이거나 1로 제한할 수 있는 경우 분포함수로 쓰게 되는데 정규분포의 확률밀도함수는 가우스 함수라고도 합니다. 함수의 모양이 대칭이고 넓이가 1이 되는 함수입니다. 정규분포 확률밀도함수 식은 다음과 같습니다.
$$ f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{1}{2}(\frac{(x-\mu)}{\sigma})^2} $$
데이터가 무엇이냐에 따라 코딩이 달라질 수 있기 때문에 정규분포의 확률밀도함수(pdf) 를 통해 직접 구하는 것도 필요할 때가 있습니다.
직접 식을 써서 그릴경우 numpy를 이용합니다. plt는 x,y 값이 모두 필요하므로 x를 랜덤값으로 잡고 y는 함수이므로 x값을 넣는 방식으로 합니다.
ipmort numpy as np
import matplotlib.pylot as plt
np.random.seed(0) #랜덤값 고정
mean = 0.0
simga = 1.0
x = np.linspace(-3, 3, 500)
y = (1 / np.sqrt(2 * np.pi * sigma**2)) * np.exp(-(x-mu)**2 / (2 * sigma**2))
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Normal distribution(0,1)')
plt.show()
scipy 이용
수학 라이브러리인 scipy 라이브러리를 통해 구할 수도 있습니다.
scipy는 실제로 많이 쓰는 함수를 가져다 쓸 수 있도록 구현되어 있어서 유용합니다.
정규분포를 그리기 위해 norm.pdf를 이용합니다.파라미터는 data, loc(평균),scale(표준편차)로 구성되어 있습니다.
평균이 0, 표준편차가 1인 표준정규분포를 그려보겠습니다.
import matplotlib.pyplot as plt
from scipy.stats import norm
x = np.linspace(-3,3,500)
plt.plot(x, norm.pdf(x, loc=0, scale=1))
plt.title('Standard normal distribution')
누적 표시
정규분포를 통해 모수 추정을 하게 되는데 그럴 때 신뢰구간을 표시하면 시각적 효과를 얻을 수 있습니다.
plt. fill_between을 쓰면 영역을 그려 표현합니다. 영역 그리기에 대한 자세한 내용은 아래 포스팅을 참고하시기 바랍니다.
$ \mu - \sigma $ 와 $ \mu + \sigma $ 까지의 범위를 표시해보겠습니다.
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
x = np.linspace(-3, 3, 500)
plt.plot(x, norm.pdf(x, loc=0, scale=1))
plt.xlabel('x')
plt.ylabel('f(x)')
cum = np.arange(-1, 1,0.01)
plt.fill_between(cum, norm.pdf(cum), alpha=0.1, color='blue')
plt.title('Standard normal distribution')
plt.show()
관련 포스팅
'수학' 카테고리의 다른 글
[미적분] 자연상수 e의 정의 (0) | 2023.07.13 |
---|---|
[파이썬] 사분위수(Quantiles)란? (0) | 2022.11.07 |
[sympy] 파이썬으로 미분방정식 해 구하기(증명 필요없음) (0) | 2022.06.23 |
수학 기호 입력 사이트들 (0) | 2022.06.17 |
[sympy] 파이썬으로 함수 그래프 그리기 (0) | 2022.04.11 |