파이썬으로 정규분포 그리기

반응형
    반응형

    통계하면 정규분포가 빠질 수 없는데 파이썬으로 정규분포 그리는 방법 알려드립니다. 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을 쓰면 영역을 그려 표현합니다. 영역 그리기에 대한 자세한 내용은 아래 포스팅을 참고하시기 바랍니다.

     matplotlib 그래프 영역 채우기

     

    matplotlib 그래프 영역 채우기

    그래프 영역을 채우는 방법을 소개합니다. fill_between() fill_betweenx() fill 세가지 함수로 실행할 수 있는데요. 범위를 정해주면 그 범위에 맞게 그려주게 됩니다. x축을 기준으로 한다면 fill_between()

    seong6496.tistory.com

     

    $ \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()

    정규분포 영역표시

     

    관련 포스팅

    [matplotlib] 그래프 영역 채우기

    [matplotlib]pyplot.text(글자 쓰기)

    댓글

    Designed by JB FACTORY

    ....