Python notes/Statistical Analysis

Python-Statistics) 파이썬으로 연속형 확률분포 계산 (+scipy cdf 사용법)

성실한 나무 2022. 7. 1. 14:01

#1. 연속형 확률분포란?

 연속형 확률분포(Continuous Probability Distribution)는 확률변수 x가 두 값 a, b 사이의 가능한 모든 값을 취할 수 있을 때 적용하는 확률분포이며, 확률값은 어느 구간의 누적확률(면적)로 표시된다. 그래프로 나타내면 x축은 확률변수 y축은 확률밀도함수(probability density function)인데 특정 이산형 x에 대한 y값은 0으로 본다. 다만 x의 구간이 a~b로 주어지면 그 사이에 생기는 면적을 구해서 이를 확률값으로 얻을 수 있다.

 연속형 확률분포로는 정규분포, 지수분포, 균등분포, 베타분포, 와이블분포, 감마분포, 코시분포 등이 있다.

 연속형 확률분포 중에서도 표본의 평균, 분산, 분산비가 따르는 연속형 확률분포를 t분포, 카이제곱분포, F분포라고 한다. 이 분포들은 정규분포에서 파생되었다. 이 분포들은 통계분석에서 빈번하게 사용되는 분포들이기 때문에 표본분포라는 제목으로 별도의 포스팅을 통해 정리해보겠다.

 

#2. Python으로 연속형 확률분포 계산

균일분포(균등분포, 직사각형분포, Uniform distribution, Rectangular distribution)

 확률변수 x가 일정한 구간만 정의되고 확률밀도는 균등한 분포이다. 균일분포는 아래와 같이 간단한 파이썬 코드로 확률밀도함수와 누적분포함수를 계산할 수 있다. 

파이썬 균일분포 확률밀도함수, 누적확률밀도함수, 기대값, 분산 계산

 

 

지수분포 (Exponential distribution)

 한 사건에서 다음 사건이 발생할 때까지 걸리는 시간 간격에 관련이 있는 분포이다. 평균 사건 발생건수가 단위 시간당 모수 lambda인 포아송 분포라면, 한 사건이 일어난 후 다음 사건이 일어날 때까지의 시간은 평균이 1/lambda인 지수분포이다. 제품의 수명시간, 상점에서 고객이 한 사람 나간 후에 새로운 고객이 들어올 때까지의 시간, 은행창구 직원의 고객당 서비스 시간과 같이 발생시간을 확률변수로 정의하면 이 발생시간의 분포는 지수분포를 따른다.

 파이썬 scipy 패키지를 사용하면 지수분포의 누적확률값(cdf)을 간편하게 구할 수 있다. 파라미터로 입력하는 값은 x와 mu인데 평균이 mu인 지수분포에서 x이하로 발생할 확률을 계산해준다. 이에 따라 x이상으로 발생할 확률을 구하고 싶다면 expon.cdf()로 x이하인 누적확률을 1에서 빼주면 된다. 구간의 확률을 구할 때도 마찬가지이다. a부터 b사이의 확률을 알고 싶다면 expon.cdf(b, mu) - expon.cdf(a, mu)를 하면 된다.

 수기로 계산하려면 numpy를 import해서 1 - np.exp(-x/mu)를 하면 x 이하일 누적확률을 구할 수 있다.

파이썬 지수분포 누적확률밀도함수, 기대값, 분산 계산

 

정규분포 (Normal distribution)

 가우스분포라고도 하는 정규분포는 확률분포에서 가장 대표적이고 중요한 연속 확률분포이다. 정규분포는 중심 위치가 mu이고, 표준편차 sigma에 따라 달라지는 그림으로 sigma가 작으면 뾰족하고 크면 낮아지는 그래프이다.

 정규분포는 수식의 치환인 표준화를 통해 표준정규분포로 변환이 가능하다. z = (x-mu)/sigma 의 방법으로 표준화할 수 있다. 표준정규분포는 평균은 0, 표준편차는 1인 정규분포로 z~N(0, 1)로 표기한다.

 파이썬 scipy 패키지를 통해서 표준정규분포의 누적확률값을 구할 수 있다. 여기서 중요한 점은 패키지에 적용하기 전에 정규분포를 표준화시켜야 한다는 점이다.

파이썬 정규분포, 표준화를 통한 표준정규분포로 누적확률값 계산