programming/파이썬으로 배우는 통계학

[파이썬/통계] Python에 의한 기술 통계 :정규 분포와 그 응용(확률밀도,t분포,누적분포함수,하측확률,퍼센트포인트)

Jofresh 2023. 5. 6. 15:48
728x90
반응형

파이썬 라이브러리를 통하지 않는다면, 확률 밀도/정규 분포 등등을 계산하는 방식은 굉장히 까다롭습니다.

공식을 알고 있다고해도 실무에서 응용하는 것은 쉽지가 않을 것 입니다. 그래서 파이썬 라이브러리를 통해서 공부하는 것이기도 합니다. 원리만 알면 누구나 쉽게 통계를 내볼 수 있으니깐요! 

 

아래 식은 확률 밀도를 계산하는 공식입니다. 하지만 우리는 이런 복잡한 계산을 하지 않고도 원하는 것을 얻을 수 있죠!

계산 공식을 다 올리려고 했지만 그러면 오히려 더 어렵고, 가독성이 떨어질 것 같아서 빼고 진행하기로 했습니다. 참고 부탁드립니다!

# '평균 4, 분산 0.64(표준편차 0.8)의 정규분포'에서 확률변수가 3일 때 확률밀도
x = 3
mu = 4
sigma = 0.8

1 / (sp.sqrt(2 * sp.pi * sigma**2)) * \
    sp.exp(- ((x - mu)**2) / (2 * sigma**2))

>>>>>>>>>>>>>>>>>>>>>

이 어려운 공식을 코드 몇줄로 바꾸면 원하는 것을 얻을 수 있다.

x_plot = np.arange(start = 1, stop = 7.1, step = 0.1)
plt.plot(
    x_plot, 
    stats.norm.pdf(x = x_plot, loc = 4, scale = 0.8),
    color = 'black'
)

 

필요한 라이브러리 임포트

# 수치 계산에 사용하는 라이브러리입니다.
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats

# 그래프를 그리는 라이브러리입니다.
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

# 표시 자리수 지정입니다.
%precision 3
# 그래프를 jupyter Notebook 내에 표시하도록 하기 위한 지정입니다.
%matplotlib inline

확률 밀도


위 코드는 평균이 4, 표준편차가 0.8인 정규 분포를 따르는 확률 밀도 함수를 그리는 코드입니다. x_plot 변수는 그래프의 x축 범위를 설정하는데 사용되며, stats.norm.pdf() 함수를 사용하여 정규 분포 확률 밀도 함수를 계산하고 그래프를 그리게 됩니다. loc 인수는 평균값을, scale 인수는 표준편차를 설정하는데 사용됩니다. color 인수는 그래프 색상을 설정하는데 사용됩니다.

 

표본이 어떤 값 이하가 되는 비율

위 코드는 다음과 같은 작업을 수행합니다:

시드값을 1로 설정합니다.
평균이 4이고 표준편차가 0.8인 정규분포에서 10만개의 표본을 추출합니다.
이 표본에서 3 이하인 값의 개수를 계산합니다.
3 이하인 값의 개수를 전체 표본 개수로 나눠서 비율을 구합니다.
즉, 3보다 작은 값의 비율을 구하는 것입니다.

 

누적 분포 함수

cdf = 누적분포함수의 약자

 

stats.norm.cdf 함수는 정규분포의 누적분포함수(Cumulative Distribution Function) 값을 계산하는 함수입니다.

loc 인자는 분포의 평균값(mean), scale 인자는 분포의 표준편차(standard deviation)를 지정하며, x 인자는 해당 확률변수의 값을 의미합니다.

위의 두 줄 코드에서 첫번째 줄은 정규분포를 따르는 100,000개의 난수를 생성한 후, 그 중에서 값이 3보다 작은 데이터의 수를 계산하고 있습니다. 이를 전체 데이터 수로 나누어서 비율을 계산하여 3보다 작은 값을 가지는 확률을 추정하고 있습니다. 이 값은 약 0.1055 입니다.

두번째 줄은 stats.norm.cdf 함수를 사용하여 평균값이 4, 표준편차가 0.8인 정규분포에서 확률변수가 4보다 작거나 같은 값을 가질 확률을 계산하고 있습니다. 이 값은 약 0.5 입니다.

 

퍼센트포인트(어떤확률이되는기준치)

데이터가 어떤 값이하가 될 확률을 하측확률이라 합니다. 하측확률은 누적분포함수를 사용해서 구할 수 있습니다. 반대로 어떤 확률이 될 기준치를 퍼센트포인트라고 합니다.

ppf = percent point function의 약자입니다.

stats.norm.ppf는 특정 확률 값을 인자로 받아 해당 확률 값에 해당하는 분위수를 계산하는 함수입니다.

첫번째 실행에서는 평균 4, 표준편차 0.8인 정규분포에서 2.5% 확률 값에 해당하는 분위수를 계산하고 있습니다. 

두번째 실행에서는 평균 4, 표준편차 0.8인 정규분포에서 3보다 작은 값이 나올 확률 값을 계산하고 있습니다. 

세번째 실행에서는 평균 4, 표준편차 0.8인 정규분포에서 50% 확률 값에 해당하는 분위수를 계산하고 있습니다. 이 경우, stats.norm.ppf(loc=4, scale=0.8, q=0.5)는 4를 반환합니다. 즉, 평균 4, 표준편차 0.8인 정규분포에서 50% 확률 값은 4이라는 것입니다.

 

t값의 표본 분포

이 코드는 t 분포를 시뮬레이션하여 시각화하는 것입니다.

먼저, 난수의 씨앗을 고정합니다. 그리고 t값을 저장할 배열 t_value_array를 만들고, 이후에 t값들이 저장됩니다. 그리고 정규 분포 클래스 norm_dist를 만들어서 평균 4, 표준편차 0.8을 갖는 정규 분포를 생성합니다.

그리고 나서 10개의 샘플을 생성하고, 샘플의 평균과 표준편차를 계산하여 표준 오차를 구합니다. 그리고 이 표준 오차를 사용하여 t값을 계산합니다. 이 과정을 10000번 반복하여 t_value_array에 10000개의 t값이 저장됩니다.

마지막으로, 표준화된 표본 평균의 분포를 시각화하는데, 이는 t값의 히스토그램을 보여줍니다. 그리고 표준 정규 분포의 확률 밀도도 함께 플롯됩니다.

 

t분포

이전 코드에서 시뮬레이션한 결과로 얻은 표준화된 표본 평균 t-value들의 히스토그램과 자유도 9인 t-분포의 확률 밀도 함수를 비교하는 그래프를 그린 것 입니다.

 

위 그래프는 표준화된 표본평균의 t분포와 정규분포를 비교한 것입니다. t 분포와 정규 분포는 매우 유사하지만, t 분포가 약간 더 넓은 꼬리를 가지고 있습니다. 이것은 t 분포에서 t 값이 크거나 자유도(df)가 작을수록 일어날 가능성이 더 큰 '극단값'이 있기 때문입니다.

t 분포는 정규분포보다 '불확실성'이 높은 작은 샘플에서 t 값을 계산할 때 사용됩니다. 자유도(df)는 샘플 크기에 비례하므로, 샘플 크기가 커질수록 t 분포는 점점 더 정규 분포에 가까워집니다.

728x90
반응형