새해 복 많이 받으세요. 여러분. 올해도 여러분에서 더 친근하고 유익한 통계 이야기를 전달하려 합니다. 오늘은 기억도 가물가물한 뽀아송분포를 주제로 잡았어요. 재미있는 주제가 되었으면 합니다.
자, 이제 파이썬을 들고 실생활로 들어가 봅시다. 여러분이 인기 있는 빵집을 운영한다고 가정해 보겠습니다. 이 집의 시그니처 메뉴인 '소금빵'은 한 시간 평균 5개가 팔립니다(λ=5).
그런데 어느 날, 갑자기 손님이 몰려 한 시간에 10개를 구워야 할 상황이 생길 확률은 얼마나 될까요? 혹은 손님이 한 명도 안 올 확률은요? 파이썬으로 시뮬레이션해 보겠습니다.
# 필요한 라이브러리를 불러옵니다.
from scipy.stats import poisson
# 평균 판매량 (람다, λ)을 설정합니다.
lambda_ = 5 # 시간당 평균 5개 판매
# 1. 한 시간에 정확히 10개를 팔 확률 (k=10)
prob_10 = poisson.pmf(k=10, mu=lambda_)
print(f"한 시간에 정확히 10개의 소금빵을 팔 확률: {prob_10:. 4f} ({prob_10*100:. 2f}%)")
# 2. 한 시간에 한 개도 팔지 못할 확률 (k=0)
prob_0 = poisson.pmf(k=0, mu=lambda_)
print(f"한 시간에 한 개도 팔지 못할 확률: {prob_0:. 4f} ({prob_0*100:. 2f}%)")
# 3. (Bonus) 한 시간에 10개 이상을 팔 확률 (k>=10)
# 이는 1에서 '9개 이하로 팔 확률'을 빼서 계산합니다.
prob_10_or_more = 1 - poisson.cdf(k=9, mu=lambda_) # cdf는 누적 확률
print(f"한 시간에 10개 이상의 소금빵을 팔 확률: {prob_10_or_more:. 4f} ({prob_10_or_more*100:. 2f}%)")
# 4. (Bonus) 가능한 판매량별 확률을 그래프로 그려보기
import matplotlib.pyplot as plt
import numpy as np
# 0부터 15개까지의 가능한 판매량을 생성
k_values = np.arrange(0, 16)
# 각 판매량에 대한 확률 질량 함수(PMF) 값을 계산
pmf_values = poisson.pmf(k_values, lambda_)
# 그래프를 그립니다.
plt.figure(figsize=(10, 6))
plt.bar(k_values, pmf_values, color='skyblue', edgecolor='black', alpha=0.7)
plt.title('한 시간 동안의 소금빵 판매량 확률 분포 (λ=5)')
plt.xlabel('판매량 (개)')
plt.ylabel('확률')
plt.xticks(k_values)
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 각 막대 위에 확률 값을 표시 (선택 사항)
for i, v in enumerate(pmf_values):
plt.text(i, v + 0.003, f'{v:. 3f}', ha='center', va='bottom')
plt.tight_layout()
plt.show()
뽀아송분포(PMF)는 이산(discrete) 확률분포로 사건의 개수: 0, 1, 2, 3… 같은 정수만 가능 예: 한 시간 동안 들어오는 전화 수, 하루 교통사고 건수
정규분포(PDF)는 연속(continuous) 확률분포 키, 몸무게처럼 실수 값 전체를 가질 수 있음 예: 동물의 몸무게, 식물의 키, 온도
뽀아송분포는 PMF(Probability Mass Function)로 특정 정수값 k가 나올 확률을 직접 계산
오른쪽으로 치우친(skewed) 형태
λ가 커질수록 정규분포에 가까워짐
평균 = 분산 = λ
이 코드는 여러분이 코드를 작성할 능력이 되어야 한다거나 이해를 해야 한다거나 하는 목적이 아니고 이것이 코드이구나 하는 의미에서 전달하는 것이니 코딩을 못한다고 기죽지 마세요.
한 시간에 정확히 10개 팔 확률: 약 0.0181 (1.81%) 생각보다 매우 낮은 확률입니다! "갑자기 손님이 몰려 10개를 구워야 하는" 상황은 100시간 동안 가게를 운영하면 roughly 1~2번 일어날 법한 꽤 드문 사건이라는 걸 알 수 있습니다.
한 시간에 한 개도 팔지 못할 확률: 약 0.0067 (0.67%) : 이 역시 매우 드문 사건입니다. 평균적으로 5개나 팔리는 가게이기 때문에, 단 한 개도 팔리지 않는 날은 정말 특별한 경우(예: 폭설, 지하철 운행 중단 등)에 해당한다고 해석할 수 있습니다.
한 시간에 10개 이상 팔 확률: 약 0.0318 (3.18%, 10 이상의 확률을 더한 값): '정확히 10개'뿐만 아니라 '11개', '12개'... 15까지 모두 포함한 확률입니다. '10개 이상의 수요가 발생할' 전반적인 가능성을 보고 싶을 때는 이 값이 더 유용합니다.
결론적으로, 통계와 확률은 이렇게 예측 불가능해 보이는 일상의 사건들에 대해 '얼마나 드물게' 혹은 '얼마나 자주' 발생하는지 수치적으로 이해할 수 있는 눈을 제공해 줍니다. 빵집 주인이라면 이 확률을 참고하여 재고를 관리하거나 특별한 날에 대비하는 데 활용할 수 있을 것입니다
포아송 분포는 단순한 수학 도구를 넘어 세상을 바라보는 관점을 제공합니다.
예측 불가능의 예측: 우리는 내일 몇 통의 스팸 메일이 올지 정확히 알 수 없지만, 지난 한 달간의 평균을 알면 "내일 메일이 20통 이상 쏟아져 업무가 마비될 확률"은 계산할 수 있습니다.
희귀 사건의 대비: 100년에 한 번 올 법한 대홍수나 지진 같은 재난도 포아송 분포의 관점에서는 '언젠가 반드시 일어날 확률의 영역'에 있습니다. 보험사나 도시 설계자들이 이 분포를 사랑하는 이유입니다.
비즈니스의 효율성: 콜센터 상담원 배치, 병원 응급실의 침대 수 확보, 웹사이트 서버 용량 증설 등 현대 비즈니스의 대기 행렬 이론(Queueing Theory)은 모두 포아송 분포에서 시작됩니다.