본문 바로가기
프로그래밍/SciPy

[SciPy] 1. 확률 분포와 확률 변수 (feat. scipy.stat)

by 부자 꽁냥이 2022. 8. 28.

Scipy에서는 여러가지 확률 분포에 대한 확률 밀도 함수 값, 누적 분포 값 및 확률 변수를 생성할 수 있는 강력한 기능을 제공한다. 이번 포스팅에서는 실제로 통계에서 자주 활용되는 여러 분포(정규 분포, 카이 제곱 분포, 이항 분포 등)에 대해서 확률 밀도 함수 값(pdf, pmf), 누적 분포(cdf), 분위수(ppq) 그리고 확률 변수(난수) 생성 방법(rvs)을 알아보려고 한다.

 

- 목차 -

1. 연속형 확률 변수

2. 이산형 확률 변수


   1. 연속형 확률 변수

여기서는 정규분포, 유니폼(균등)분포, t 분포, 카이 제곱 분포, F 분포를 다룬다.

1) 확률 분포 정의

먼저 필요한 모듈을 불러오고 확률 분포를 먼저 정의한다.

 

from scipy.stats import norm, uniform, t, f, chi2

## 확률 분포 정의
## loc은 평균, scale은 표준편차, df는 자유도
norm_rv = norm(loc=0, scale=1) ## 평균이 0이고 표준편차가 1인 정규 분포
uniform_rv = uniform(loc=0, scale=1) ## [loc, loc+scale]에서의 유니폼 분포
t_rv = t(df=20) ## 자유도가 20인 t 분포
chi2_rv = chi2(df=30) ## 자유도가 30인 카이 제곱 분포
f_rv = f(dfn=20, dfd=30) ## 분자의 자유도 20, 분모의 자유도 30인 F 분포

2) 확률 밀도 함수 값 : pdf

확률 밀도 함수 값은 pdf를 사용하여 계산할 수 있다. 이때 스칼라 또는 배열을 이용하여 필요한 값을 계산할 수 있다.

 

## 확률 밀도 함수 값 f(x)
norm_rv.pdf([0, 2, 4]) 
uniform_rv.pdf([0, 0.5, 2]) ## 서포트 벗어난 값에 대해서는 0
t_rv.pdf([0, 2, 4]) 
chi2_rv.pdf([0, 2, 4])
f_rv.pdf([0, 2, 4])

3) 누적 분포 값 : cdf

 누적 분포 값은 cdf를 사용하여 계산할 수 있다.

## 누적 분포값
norm_rv.cdf([0, 2, 4]) 
uniform_rv.cdf([0, 0.5, 2])
t_rv.cdf([0, 2, 4]) 
chi2_rv.cdf([0, 2, 4])
f_rv.cdf([0, 2, 4])

4) 분위수 : ppf

분위수는 ppf를 사용하여 계산할 수 있다.

## 분위수
norm_rv.ppf([0.025,0.05,0.95,0.975])
uniform_rv.ppf([0.025,0.05,0.95,0.975])
t_rv.ppf([0.025,0.05,0.95,0.975])
chi2_rv.ppf([0.025,0.05,0.95,0.975])
f_rv.ppf([0.025,0.05,0.95,0.975])

 


5) 확률 변수(난수) 생성 : rvs

확률 변수(난수) 생성은 rvs를 이용하며 size를 통하여 개수를 설정할 수 있다.

## 크기가 10인 확률 변수 생성
size = 10
norm_rv.rvs(size=size)
uniform_rv.rvs(size=size)
t_rv.rvs(size=size)
chi2_rv.rvs(size=size)
f_rv.rvs(size=size)

   2. 이산형 확률 변수

여기서는 베르누이 분포, 이항 분포, 이산형 유니폼(균등) 분포를 다룬다.

1) 확률 분포 정의

먼저 필요한 모듈을 불러오고 확률 분포를 정의해준다.

 

from scipy.stats import binom, bernoulli, randint

## 확률 분포 정의
bernoulli_rv = bernoulli(p=0.3) ## 성공의 확률이 0.3인 베르누이 분포
binomial_rv = binom(p=0.4, n=20) ## 성공의 확률이 0.4, 시행횟수 20인 이항 분포
discrete_uniform_rv = randint(low=1, high=10) ## [1, 9]인 이산 유니폼 분포

2) 확률 질량 함수 : pmf

확률 질량 함수는 pmf를 사용하여 계산할 수 있다(pdf X).

 

## 확률 질량 함수 값
bernoulli_rv.pmf([0, 1, 2]) ## 0, 1 아닌 값은 0
binomial_rv.pmf([0, 5, 21]) ## 0, 1, ... , 20이 아닌 값은 0
discrete_uniform_rv.pmf([0, 5, 10]) ## 1, 2, ... ,9가 아닌 값은 0

3) 누적 분포 값 : cdf

cdf를 사용하여 누적 분포 값을 계산할 수 있다.

 

## 누적 분포 값
bernoulli_rv.cdf([0, 1]) 
binomial_rv.cdf([0, 5, 20]) 
discrete_uniform_rv.cdf([0, 5, 9])

4) 분위수 : ppf

분위수는 ppf를 사용하여 계산할 수 있다.

 

## 분위수
bernoulli_rv.ppf([0.025,0.05,0.95,0.975])
binomial_rv.ppf([0.025,0.05,0.95,0.975])
discrete_uniform_rv.ppf([0.025,0.05,0.95,0.975])

5)확률 변수(난수) 생성 : rvs

확률 변수(난수) 생성은 rvs를 이용하며 size를 통하여 개수를 설정할 수 있다.

 

## 크기가 10인 확률 변수 생성
size = 10
bernoulli_rv.rvs(size=size)
binomial_rv.rvs(size=size)
discrete_uniform_rv.rvs(size=size)

댓글


맨 위로