확률 분포 관련 메서드 [데이터 사이언스 in Python #2]

 

Python의 scipy.stats 라이브러리는 통계에서 사용하는 확률 분포를 표현할 수 있습니다. 앞선 포스트(https://citizen.tistory.com/41)에서 가장 잘 알려진 6가지의 scipy 확률 분포 클래스를 소개드렸었죠.

  • 베르누이 분포: bernoulli
  • 이항 분포: binom
  • 푸아송 분포: poisson
  • 균일 분포: uniform
  • 정규 분포: norm
  • 지수 분포: expon

 

여기에 더해, scipy는 통계 모형에 대한 세밀한 분석을 위한 확률 질량 함수, 확률 밀도 함수와 같은 여러 통계 개념들을 메서드 형태로 제공합니다. 

cdf 누적 분포 함수 (Cumulative Distribution Function)
ppf 누적 분포 함수의 역함수 (Probability Point Function)
pmf 확률 질량 함수 (Probability Mass Function)
pdf 확률 밀도 함수 (Probability Density Function)

 

 

cdf: 누적 분포 함수

누적 분포함수(Cumulative Distribution Function)의 정의는 "예상 결과값이 'x'보다 낮을 확률"입니다. 식으로 표현하면 아래와 같습니다.

$$ F(x) = P(X \leq x)$$

 

동전 던지기 예시를 떠올려 봅시다. 2번의 동전 던지기에서 앞면이 $X$번 나올 확률을 다음 표와 같이 정리해보았습니다.

$X$ $P(\#head = X)$
0 0.25 (TT)
1 0.5 (HT, TH)
2 0.25 (HH)

 

이를 토대로 cdf를 계산해보면,

  • cdf(1): "앞면이 1번 이하로 나올 확률" $= 0.25 + 0.5 = 0.75$
  • cdf(1.99): "앞면이 1.99번 이하로 나올 확률" $= 0.25 + 0.5 = 0.75$
  • cdf(2): "앞면이 2번 이하로 나올 확률" $= 0.25 + 0.5 + 0.25 = 1.0$

 

물론 cdf(1.99)처럼 앞면이 1.99번 이하로 나올 확률이라는 질문은 다소 어색하게 들릴 수 있습니다. 등장 횟수는 1번, 2번, ... 이런 식으로 세어지는 데 말이죠.

 

그러나 누적 분포 함수를 구할 때는 upper bound인 '$x$'가 소수이든, 실제로 여러 trial에서 나올 수 없는 값이건 별로 중요하지 않습니다. '누적'이라는 의미에만 초점을 두기 때문입니다. 그래서 cdf(1.99)의 값은 cdf(1)과 그저 동일한 값으로 산출될 뿐입니다.

 

cdf 그래프는 값이 누적되는 형태로 표현되기에, 아래 코드(이번에는 동전을 20번 던졌습니다)처럼 일정 간격마다 값을 찍어보면 우상향하는 계단 그래프를 볼 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 20, 0.1)
   
coin20 = binom.cdf(x, n=20, p=0.5)
   
plt.plot(x, coin20) 
plt.show()

 

 

ppf: 누적 분포 함수의 역함수

이름에서 유추할 수 있듯이, ppf는 "x 정도의 확률이면 어느 정도의 결과값을 기대해볼 수 있는지"를 계산하는 함수입니다. 즉 하위 ~%의 기대값인 셈이죠.

 

동전 던지기 예시를 그대로 빌려보면, 앞면이 0번 나올 확률은 0.25이므로 하위 0~25%의 결과들은 '$0$'일 것이라 예측할 수 있죠. 반면 하위 25~75% 구간은 '$1$' 정도의 결과가 나올 거라 짐작 가능합니다. 나머지 그룹에 해당하는 하위 75%~(상위 25%)는 가장 많은 횟수인 '$2$'에 해당할테구요.

 

이를 ppf 개념에 적용해보면 다음과 같습니다.

  • ppf(0.2): 하위 20%의 예상 결과 = $0$
  • ppf(0.7): 하위 70%의 예상 결과 = $1$
  • ppf(0.99): 하위 99%(상위 1%)의 예상 결과 = $2$

 

pmf: 확률 질량 함수

이번 그리고 다음에 소개할 pmfpdf특정 결과 'y'가 나올 확률, 간단하게 $P(X = y)$를 계산하는 함수입니다. 둘의 차이는 이산 확률 변수를 다룰때는 pmf를, 연속 확률 변수를 다룰때는 pdf라는 명칭을 사용한다는 점입니다.

 

앞서 위에서 정리한 각 동전 던지기 결과에 대한 발생 확률이 곧 pmf가 되는 것입니다.

  • pmf(0): $0.25$
  • pmf(1): $0.5$
  • pmf(2): $0.25$

 

pmf는 곧 각 사건의 대한 확률이므로, 가능한 $X$ 값을 모두 계산하여 다음과 같이 막대바로 확률 분포를 시각화할 수 있습니다 (아래는 동전을 8번 던질때의 예시).

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 9) # 0, 1, 2 ... 8
   
coin8 = binom.pmf(x, n=8, p=0.5)
   
plt.bar(x, coin8) 
plt.show()

 

pdf: 확률 밀도 함수

pdf의 정의는 pmf와 함께 설명 드렸었고, 다만 지금까지 사용한 동전 던지기 모델은 이산 확률 모형이므로 그대신 대표적인 연속 확률 모형인 표준 정규 분포 함수로 예시를 들어보고자 합니다.

 

표준 정규 분포의 확률 밀도 함수는 식으로 아래와 같이 표현됩니다.

$$f(x) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}x^2}$$

 

pdf는 위 그래프에서 해당하는 x축 지점에 대응하는 값을 산출합니다.

  • pdf(1): $\approx 0.242$
  • pdf(2): $\approx 0.054$
  • pdf(3): $\approx 0.004$

 

 

반응형