Py) 통계 - 포아송 분포

Py) 통계 - 포아송 분포

이산확률분포인 포아송 분포(Poisson Distribution)에 대해 알아본다.


개요

정의

포아송 분포(Poisson Distribution)는 단위(한정된) 시간이나 공간에서 발생하는 평균적인 사건의 횟수($\lambda$)를 바탕으로 특정 횟수의 사건이 발생할 확률을 설명하는 분포

특징

포아송 과정(Poisson process)

포아송 분포를 기반으로 하는 확률 과정인 포아송 과정(Poisson process)은 다음과 같은 특징이 있다.

시각 0에서 $t$까지 특정한 현상이 발생하는 횟수를 $N_t$라고 할 때, 다음의 조건들이 만족되면 ${N_t : t \ge 0}$을 발생률(occurrence rate)이 $\lambda$인 포아송 과정(Poisson process)이라고 함

  • 정상성(stationarity): 현상이 발생하는 횟수의 분포는 시작 시각과 관계없음. 즉, $N_t$의 분포와 $N_{s+t} - N_S$의 분포가 같고 $N_0 = 0$이다.
  • 독립 증분성(independent increment): 시각 0부터 $t$까지 현상이 발생하는 횟수와 시각 $t$후부터 $t+h(h > 0)$까지의 발생 횟수는 서로 독립. 즉, $N_t$와 $N_{t+h} - N_t$는 서로 독립.
  • 비례성(propertionality): 짧은 시간 동안에 현상이 한 번 발생할 확률은 시간에 비례.
    $$P(N_h = 1) = \lambda h + o(h), h \rightarrow 0$$
    ※ $\lambda$는 양의 비례상수, $o(h)$는 $\lim_{h \rightarrow 0}{o(h)/h} = 0$
  • 희귀성(rareness): 짧은 시간 동안에 현상이 두 번 이상 발생할 확률은 매우 작음.
    $$P(N_h \ge 2) = o(h), h \rightarrow 0$$

응용

포아송 분포는 다음과 같은 사례에 응용할 수 있다.

  • 일정 주어진 시간 동안에 방문하는 고객의 수
  • 일정 주어진 생산시간 동안 발생하는 불량 수
  • 하룻동안 발생하는 출생자 수
  • 어떤 시간 동안 톨게이트를 통과하는 차량의 수
  • 어떤 페이지에 있는 오타의 발생률
  • 어떤 특정 면적의 삼림에서 자라는 소나무의 수

기타

시행 횟수 $n$이 매우 크고 성공 확률 $p$가 매우 작을 때 이항 분포는 포아송 분포로 근사할 수 있다. 이 때, $\lambda = np$로 계산한다.

핵심 파라미터 및 관련 수식

파라미터

● $\lambda$: 일정한 단위 시간 또는 단위 공간에서 임의로 발생하는 사건의 평균 횟수이며 포아송 분포의 모양과 위치를 결정

관련 수식

포아송 확률변수 $X$의 확률밀도함수(probability mass function)는 다음과 같다.

$$P(X = k) = \frac{e^{-\lambda}\lambda^k}{k!}$$

여기서 $k$는 사건의 발생 횟수이며 음수가 아닌 정수이다. 그리고 $P(X = k)$는 사건이 $k$번 발생할 확률이다.

분포

$\lambda$를 1부터 5까지 변화시키면서 그린 포아송 분포는 다음과 같다.
포아송 분포(λ = [1, 5])

기타

포아송 회귀모델과 관련이 있다.

실습

포아송 분포를 따르는 임의의 숫자를 생성하려면 다음과 같이 코드를 작성할 수 있다. rvs() 함수의 “mu” 인자는 분포의 평균 및 분산을 의미하며 $\lambda$와 같다.

1
2
3
4
5
6
import numpy as np
from scipy.stats import poisson

np.random.seed(123)
poisson.rvs(mu = 1, size = 10)
## array([1, 0, 2, 2, 1, 1, 0, 1, 0, 0], dtype=int64)

이론 부분의 그래프를 그리기 위한 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import seaborn as sns
from scipy.special import factorial

pal_brbg = sns.color_palette("BrBG", 6)

x = np.arange(0, 11)
for n_lambda in range(1, 6):
y = np.exp(-n_lambda) * np.power(n_lambda, x) / factorial(x)

plt.plot(x, y, color = pal_brbg[n_lambda - 1], label=f"λ = {n_lambda}")
plt.scatter(x, y, color = pal_brbg[n_lambda - 1])

plt.ylabel("Probability")
plt.title(f"Poisson Distribution (λ = [1, 5])")
plt.xticks(x)
plt.grid(axis = "y", linestyle = "--", color = "#CCCCCC")
plt.legend(loc="upper right")
plt.show()
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×