ML/Articles

How to Use Poisson Distribution like You Know What You Are Doing

a292run 2021. 3. 18. 08:20
반응형

원본 링크



How to Use Poisson Distribution like You Know What You Are Doing

고맙게도 이러한 케이스를 위한 푸아송(Poisson) 분포가 있다.


Photo by Andrea Piacquadio from Pexels



The Story

당신은 지금 10년동안 프리랜서이다. 지금까지 평균 연간 수입은 약 $80,000였다. 금년에 당신은 판에 박힌 생활에 빠져있는 것처럼 느껴 6가지 모습에 맞추기를 결심한다. 그렇게 하기 위해 당신은 이 흥미로운 업적이 일어날 확률을 계산하는 것으로 시작하고 싶지만 어떻게 하는지 모른다.

당신은 혼자가 아니다. 세상에는 몇몇 무작위 사건의 알려진 비율이 있고 비즈니스는 미래에 이 비율보다 많거나 적은 이벤트의 기회를 찾으려고하는 많은 시나리오가 있다.

예를 들면, 이미 평균 판매율을 아는 소매업자는 블랙프라이데이 또는 사이버 먼데이 같은 특별한 날에 그들이 얼마나 더 벌지 예측하려고 한다. 이는 더 많은 물품을 저장하고 그에 맞춰 직월을 관리하는데 도움이 된다.

이 글에서는 위와 같은 상황을 모델링하기 위해 사용되는 푸아송 분포(Poisson distribution)의 직관에 대해 다룬다. 어떻게 이 식을 이해하고 사용하는지 그리고 파이썬을 사용하여 시뮬레이션하는지 알아본다.



이산 확률 분포(Discrete Probability Distributions)

이 글은 여러분이 기본적인 확률에 대한 이해를 하고 있다고 가정한다. 만약 그렇지 않다면 이 글을 참조하자.

글의 실제 내용을 얻기 전에 몇가지 이산확률분포에 대한 이해를 한다.

우선, 이산(discrete)의 뜻이 무엇인지 정의해 보자. 설명적 통계학에서 이산 데이터는 숫자를 세는 것에 의해 기록되거나 수집된 데이터(즉, 정수)이다. 예제로는 시험 점수, 주차장내 차량의 수, 병원에서 출산수 등이다.

그리고 병개의 결과(discrete outcomes)를 갖는 임의 실험들이 있다. 예를 들면, 동전 던지기는 앞면과 뒷면(1과 0) 2가지 결과를 갖는다. 주사위 굴리그는 6가지 별개의 결과를 갖는다. 만약 임의의 변수 X가 별개의 실험에 대해 가능한 결과를 저장하기 위해 사용된다면 이 변수 X는 이산확률분포를 갖는다.

확률 분포는 임의 실험에 대해 모든 가능한 결과를 기록한다.

예로써 하나의 동전 전지기의 분포를 만들어 보자.


아주 쉽다. 프로그램적으로 분포를 기록하려면, 파이썬 list 또는 넘파이 배열의 형태일 것이다.


그러나, 많은 가능한 결과를 갖는 대규모 실험에 대해 이런 방법으로 분포를 만들고 활률을 찾는 것은 불가능하다는 것을 상상할 수 있다. 고맙게도 모든 확률 분포는 어떤 결과의 확률을 계산하기 위한 자체 수식과 함께 발명되었다. 이산확률분포에서 이 함수는 PMF(Probability Mass Functions)라고 불린다. 더 자세한 설명은 이 글에서 이산 분포를 참조하자.



Poisson Distribution

사례 연구를 통해 푸아송 분포를 이해해보자. 당신이 병원에서 신생아를 보는 것을 정말로 좋아한다고 가정하자. 당신의 관찰과 보고로부터 병원이 평균 1시간에 6명의 신생아를 관찰한다는 것을 안다.


Photo by Michal Bar Haim on Unsplash

당신이 내일 출장을 가야한다는 것을 알았다. 그래서 공항으로 출발하기 전에 남은 시간동안 병원을 방문하길 원하고 있다. 왜냐하면 몇달동안 출장을 가기 때문에 가능한 많은 신생아를 보길 원한다. 그래서 당신은 비행전 한시간 동안 10명 이상이의 아기를 볼 기회에 대해 궁금하다.

무작위 실험으로써 신생아를 관찰한다고 하면 결과는 고전적인 푸아송 분포를 따른다. 그 이유는 푸아송 분포에 필요한 모든 조건을 포함하기 때문이다.

  • 알려진 이벤트 비율이 존재한다. : 평균 시간당 6명의 신생아
  • 이벤트는 독립적으로 발생한다. : 1명의 아기가 태어나는 것은 는 다음 타이밍에 영향을 미치지 않는다.
  • 알려진 비율은 시간이 지남에 따라 일정하다. : 평균 시간당 아이 수는 시간이 지나도 변하지 않는다.
  • 2개의 이벤트는 정확하게 같은 순간에 발생하지 않는다.
  • (알림 : 각 결과는 별개이다.)

푸아송 분포는 많은 중요한 비즈니스 의미를 갖는다. 비즈니스는 판매 수 또는 평균 일일 비율을 아는 주어진 특정일에 고객이 발생하는 것에 대한 예측을 만들기 위해 자주 사용한다. 예측같은 것을 만든는 것은 비즈니스가 제품, 일정 또는 직원에 대한 더 나은 결정을 하는데 도움이 된다. 예를 들면, 과잉저장은 판에에서 낮은 활동에 대한 손실을 의미한다. 또는 충분한 물건을 갖지 않는 것은 비즈니스 기회를 잃는 것을 의미한다.

간단하게 푸아송 분포는 고정된 시간 간격에서 이미 기록된 비율(때때로 람다($\lambda$)로써 표기된다.)보다 더 많이 또는 더 적게 발생하는 이벤트의 확률을 찾는데 도움이 된다.

푸아송 분포의 PMF(확률 질량 함수, Probability Mass Functions)은 아래 식과 같다.


여기서,

  • $k$ : 성공한 수(원하는 이베트가 발생하는 횟수))
  • $\lambda$ : 주어진 비율(rate)
  • $e$ : 오일러 수(Euler's number) : $e = 2.71828...$
  • $k!$ : k factorial

여전히 PMF에 익숙하지 않다면 이 글을 참조하자.

이 식을 사용하여 평균 비율이 6인것을 알고 있는 10명의 신생아를 보는 확률을 찾을 수 있다.


불행하게도 10명의 아기를 보는 기회는 단지 ~4%이다.

여기서는 어떻게 식이 도출되었지에 대해 자세히 알아보지는 않지만, 만약 궁금하다면 칸아카데미의 이 비디오를 참조하자.

여전히 기억해야 할 몇가지 포인트가 있다. 비록 비율을 알더라도 이것은 단지 평균일 뿐이다. 따라서 이벤트 발생 타이밍이 완전히 무작위일 수 있다. 예를 들면, 여러분은 연속적으로 2명의 출생을 관찰할 수 있거나 다음을 위해 30분동안 기다릴 수 도 있다.

또한 실제로 비율($\lambda$)은 항상 일정하지 않을 수 있다. 비율이 오직 이 신생아 실험에서만 올바를 수 있다. 비록 이 조건이 실패일지라도 우리는 푸아송 분포가 상황의 행동(situation's behavior)을 모델링하기에 충분히 가깝기 때문에 푸아송으로써 분포를 고려할 수 있다.



Simulating the Poisson Distribution

푸아송 분포에서 샘플을 시뮬레이션 또는 그리는 것은 넘파이를 사용하면 아주 쉽다. 우선 시뮬레이션을 위해 'numpy'를 임포트하고 넘파이의 'random' 모듈을 사용한다.


import numpy as np

푸아송 분포에서 샘프을 그리려면 단지 비율 파이리터 $\lambda$만 있으면 된다. 이를 'nu.random.poisson'의 인자로 전달하고 샘플의 수를 지정한다.


poisson = np.random.poisson(lam=10, size=10000)

여기서는 비율 10과 10,000개의 데이터 포인트를 갖는 분포를 시뮬레이션해본다. 이 분포를 보기 위해 이것의 PMF의 결과를 그린다. 비록 손으로 가능하지만 이미 'empiricaldist'이라는 훌륭한 라이브러리가 존재한다. 이 라이브러리는 설치하고 'Pmf' 함수를 임포트한다.


from empiricaldist import Pmf  # pip install empiricaldist

'Pmf'에 어떤 분포를 취하여 PMF를 계산하는 'from_seq'라는 함수가 있다.


poisson = np.random.poisson(lam=10, size=10000)

pmf_poisson = Pmf.from_seq(poisson)
pmf_poisson


PMF가 각각의 유일한 결과에 대한 확율을 보여준다는 기억하자. 따라서 위의 표에서 결과는 인덱스와 'probs'아래 확률로써 주어진다. 이를 'matplotlib'를 사용하여 도식화 해보자.


# Create figure and axes objects
fig, ax = plt.subplots(figsize=(20, 10))

# Plot the PMF
ax.plot(pmf_poisson, marker='.')  # label each data point with a dot

# Labelling
ax.set(title='Probability Mass Function of Poisson Distribution',
       ylabel='P (X = x)', xlabel='Number of events')

plt.show();


예상했던 것처럼 가장 높은 확률이 평균이다. (비율 파라미터 $\lambda$)

이번에는 푸아송 분포의 PMF에 관한 수식을 모른다고 해보자. 신생아 관찰에 대한 실험을 진행하고 있다면 비율 6으로 10명의 신생아를 볼 확률을 어떻게 찾을까?

시작하기 위해 파라미터로써 주어진 비율을 가진 완벽한 푸아송 분포를 시뮬레이션 한다. 또한 더 나은 정확도를 위해 많은 샘플을 그린다.


child_births = np.random.poisson(lam=6, size=1000000)

비율 6과 1백만의 크기로 분포를 샘플링한다. 다음으로 이중 얼마나 많은 수가 10명의 아기를 갖는지 찾는다.


births_10 = np.sum(child_births == 10)

>>> births_10
41114

41,114번의 시험(trial)에서 10명의 아기가 관찰되었다. (각 시간은 하나의 시험을 갖는다고 간주될 수 있다.) 그리고 이 숫자를 샘플의 전체 수로 나눈다.


>>> births_10 / 1e6

0.041114

PMF 수식을 사용한 결과가 0.0413으로 수작업으로 풀어낸 것이 매우 가깝게 일치한다는 것을 알 수 있다.



Conclusion

푸아송 분포에 관해 이야기될 것이 아직 많이 있다. 이 글에서는 기본 사용법과 비즈니스에서의 의미를 다뤄보았다. 어떻게 푸아송 분포가 이항분포(binominal distribution)과 관련이 있는지와 같이 흥미로운 푸아송 분포의 부분이 여전히 남아 있다. 전체적인 이해를 위해서는 다음 글을 참조해 보는 것을 추천한다.

  • Article by Brilliant.org
  • Post by one of my favorite authors on Medium, Will Koehrsen
  • Article by Statisticshowto.com
  • As always😊, the Wikipedia page
  • Numpy documentation of np.random.poisson
반응형