푸아송 분포란 무엇인가?

추석 오후 2시 치킨 품절로 생각하는 수요와 재고

카페 방문객 수에서 시작해 추석 치킨 품절 사례로 푸아송 분포, 품절확률, 기대 판매손실과 재고 의사결정을 설명합니다.

카페에 앉아 친구를 기다리고 있다고 해보자.

할 일이 없어 문을 바라보다 보니 손님이 들어오는 모습이 눈에 들어온다. 어떤 10분에는 아무도 들어오지 않고, 어떤 10분에는 다섯 명이 몰려온다. 한 시간쯤 지켜보니 평균적으로는 10분에 세 명 정도가 들어오는 것 같다.

그렇다면 다음 10분 동안 정확히 두 명이 들어올 확률은 얼마일까? 아무도 들어오지 않을 확률은? 다섯 명 이상 들어올 확률은?

여기서 평균만으로는 답할 수 없는 질문이 시작된다.

평균 3명은 다음에도 3명이라는 뜻이 아니다

10분당 평균 방문객 수를 다음처럼 쓰자.

λ=3 customers per 10 minutes.\lambda = 3 \text{ customers per 10 minutes}.

평균이 3명이라는 것은 다음 10분에도 정확히 세 명이 온다는 뜻이 아니다. 실제로는 0명, 1명, 2명, 5명, 때로는 7명이 들어올 수도 있다.

12:00–12:10
2
12:10–12:20
4
12:20–12:30
1
12:30–12:40
3
12:40–12:50
5
평균적으로는 10분에 3명이지만 각 구간의 실제 방문 수는 다르다. 설명을 위해 만든 관측 예시다.

평균은 이 여러 결과의 중심을 한 숫자로 요약한다. 그러나 카페 좌석이나 직원 수를 정하려면 평균 하나보다 더 많은 정보가 필요하다. 우리가 알고 싶은 것은 0명, 1명, 2명, 3명, … 각각이 얼마나 그럴듯한가다. 바로 이 때문에 확률분포가 필요하다.

푸아송 분포(Poisson distribution)는 일정한 구간 안에서 발생하는 사건의 횟수를 모델링하는 가장 기본적인 분포 가운데 하나다. 확률질량함수는 다음과 같다.

P(X=k)=e−λλkk!.P(X=k)=\frac{e^{-\lambda}\lambda^k}{k!}.
  • λ\lambda는 그 구간에서 평균적으로 발생하는 사건 수다.
  • kk는 실제로 발생한 사건 수다.
  • P(X=k)P(X=k)는 사건이 정확히 kk번 발생할 확률이다.

λ=3\lambda=3을 넣으면 다음 10분에 아무도 오지 않을 확률은 약 5.0%, 정확히 두 명이 올 확률은 약 22.4%, 다섯 명 이상 올 확률은 약 18.5%다. 2명과 3명의 확률이 같다는 점도 흥미롭다.

λ=3인 푸아송 분포. 2명과 3명이 가장 그럴듯하지만 0명이나 7명도 불가능하지 않다.

이 글에서는 ee나 팩토리얼이 왜 등장하는지 유도하지 않는다. 더 중요한 직관은 간단하다. 평균 발생횟수를 알더라도 다음 구간의 실제 횟수는 흔들리며, 푸아송 분포는 그 흔들림에 확률을 붙인다.

언제 푸아송으로 생각해볼 수 있을까?

현실의 사건이 ‘푸아송 법칙’을 따라야 하는 것은 아니다. 현실의 특정 구간을 푸아송으로 근사하는 것이 충분히 유용한지가 더 중요한 질문이다. 다음 조건이 대체로 그럴듯할 때 좋은 출발점이 된다.

  • 일정한 시간이나 공간 안에서 발생한 횟수를 센다.
  • 짧은 구간 동안 평균 발생률이 크게 변하지 않는다.
  • 겹치지 않는 구간의 사건 수가 서로 강하게 의존하지 않는다.
  • 아주 짧은 순간에 여러 사건이 한꺼번에 발생하는 구조가 지배적이지 않다.

‘손님들이 서로 약속하고 단체로 들어오지 않는다’는 식의 완벽한 독립을 증명할 필요는 없다. 다만 점심 피크, 단체 주문, 프로모션처럼 뚜렷한 군집이 있다면 단순한 푸아송이 놓치는 것이 커진다. 모형은 현실의 복사본이 아니라 의사결정에 쓸 수 있을 만큼 유용한 압축이어야 한다.

그런데 평균과 분포의 차이가 돈과 연결되면

카페 손님 수를 세는 것은 재미있다. 하지만 평균과 분포의 차이가 실제 돈과 연결되기 시작하면 이야기가 조금 달라진다.

이번 추석 연휴에 집 근처 BHC에서 콰삭킹을 포장해 먹으려고 했다. 오후 2시쯤 전화를 걸었는데 이미 콰삭킹 재료가 품절되어 있었다. 매장에서는 인근 지점에서 재료를 빌려올 수 있을지도 생각하고 있다고 했다.

기다리는 대신 다른 인근 BHC를 확인했다. 그곳에는 재고가 있었고, 결국 그 매장에서 배달로 주문해 잘 먹었다. 집 앞 점포에서는 사지 못했지만 콰삭킹 자체를 포기한 것은 아니었다. 개인적으로는 지난 명절에도 비슷한 품절을 경험했다.

물론 내가 그 매장의 발주 시스템이나 공급 제약을 아는 것은 아니다. 본사 물류, 발주 상한, 저장공간, 원재료 유통기한, 예상하지 못한 수요 급증 같은 다른 이유가 있었을 수도 있다. 오후 2시 품절이라는 결과만으로 누가 발주를 잘못했다고 단정할 수는 없다.

그래도 오지랖 넓은 나는 한 가지가 궁금해졌다.

이 점주는 도대체 콰삭킹 재료를 몇 개 준비했어야 했을까?

카페와 치킨집은 같은 종류의 질문을 던진다

카페에서는 “다음 10분 동안 손님이 몇 명 들어올까?”를 물었다. 치킨집에서는 “남은 몇 시간 동안 주문이 몇 건 들어올까?”를 묻는다. 둘 다 시간 구간 안의 사건 수를 세는 계수 과정이다.

시간당 평균 주문률이 λ=5\lambda=5건이고 그 비율이 일정하다고 가정하면, tt시간 동안의 주문 수 N(t)N(t)는 다음처럼 놓아볼 수 있다.

N(t)∼Poisson⁡(λt).N(t)\sim \operatorname{Poisson}(\lambda t).

두 시간이면 기대 주문 수는 5×2=105\times2=10건이다. 그러나 실제 주문 수가 매번 10건이라는 뜻은 아니다. 7건일 수도 있고 14건일 수도 있다.

이제 설명을 위한 가상 시나리오를 하나 두자. 특정 BHC 점포의 실제 판매량과 무관한 숫자다. 어떤 명절 오후, 남은 영업시간의 기대수요가 30건이라고 하자.

D∼Poisson⁡(30).D\sim \operatorname{Poisson}(30).

평균이 30건이니 재고 30개면 충분하다고 말할 수 있을까? 아니다. 평균은 분포의 가운데일 뿐이다. 질문을 바꿔야 한다.

재고를 QQ개 준비했을 때 품절될 확률은 얼마인가?

수요를 DD, 준비한 재고를 QQ라고 하면 품절확률은 다음과 같다.

P(D>Q).P(D>Q).

수요가 재고보다 많을 확률이다. D∼Poisson⁡(30)D\sim\operatorname{Poisson}(30)이라는 가상 모형에서 Q=30Q=30이면 품절확률은 약 45.2%다. 평균만큼 준비했는데도 거의 절반의 경우에 재고가 모자란다.

재고 Q와 품절확률 P(D > Q)

Q = 25
79.2%
Q = 30
45.2%
Q = 35
15.7%
Q = 40
3.2%
Illustrative · 남은 기간 수요가 Poisson(30)이라는 가정 아래 계산했다. Q=39부터 비품절확률이 95%를 넘는다.

“95%의 날에는 품절되지 않게 하자”

점주가 목표 서비스 수준을 정한다고 해보자. 여기서는 단순하게 “남은 기간 동안 한 번도 재고가 모자라지 않을 확률”, 즉 P(D≤Q)P(D\le Q)를 뜻한다고 하겠다.

95%의 날에는 품절되지 않게 하고 싶다.

그러면 평균 30개가 아니라 수요분포의 상위 분위수를 봐야 한다. 위의 가상 모형에서는 Q=39Q=39가 P(D≤Q)≥95%P(D\le Q)\ge95\%를 처음 만족한다. 재고 35개의 품절확률은 약 15.7%지만, 40개면 약 3.2%로 내려간다.

이 숫자가 권장 발주량이라는 뜻은 아니다. 폐기비용, 추가 발주 가능성, 리드타임, 다른 메뉴로의 대체, 재료 공유 여부가 모두 빠져 있다. 다만 목표를 평균 수요가 아니라 허용할 품절위험으로 표현할 수 있다는 점이 중요하다.

나는 실제로 다른 점포로 이동한 고객이었다

적어도 나 한 명은 구매 의사가 있었지만 집 앞 점포의 재고 부족 때문에 다른 점포로 이동했다. 초점 점포의 관점에서는 관측된 판매손실이라고 볼 수 있다. 다만 BHC 브랜드 전체로 보면 구매가 사라진 것이 아니라 다른 가맹점으로 옮겨갔다. ‘누구의 매출손실인가’를 정의하는 단위가 중요하다.

그렇다면 그날 오후 나 같은 고객은 몇 명 더 있었을까?

수요가 재고보다 많을 때 그 초과분이 잠재적인 판매손실이다. 이를 간단히 쓰면:

LostSales⁡=(D−Q)+,\operatorname{LostSales}=\left(D-Q\right)^+,

여기서 (x)+=max⁡(x,0)(x)^+=\max(x,0)이다. 수요가 38건이고 재고가 35개면 3건, 수요가 32건이면 0건이다. 가능한 모든 수요 수준에 대해 확률가중 평균을 내면 기대 판매손실이 된다.

E[LostSales⁡]=E[(D−Q)+]=∑d=Q+1∞(d−Q)P(D=d).E[\operatorname{LostSales}] =E\left[\left(D-Q\right)^+\right] =\sum_{d=Q+1}^{\infty}(d-Q)P(D=d).

재고선을 넘어선 수요

판매 가능한 수요초과수요기대 초과수요 ≈ 0.57건
Illustrative · D~Poisson(30), Q=35. Q 오른쪽의 주문 수가 모두 사라지는 것은 아니며 대체구매 여부는 별도 데이터가 필요하다.

같은 가상 모형에서 Q=35Q=35일 때 품절확률은 약 15.7%지만 기대 초과수요는 약 0.57건이다. “한 건이라도 모자랄 확률”과 “평균적으로 몇 건이 모자라는가”는 서로 다른 지표다.

오후 2시에 이미 재고가 0이라면

오후 2시부터 마감까지 평균 주문률이 λ\lambda이고 남은 시간이 TT라면 기대수요는 λT\lambda T다. 재고가 완전히 0이고, 해당 제품을 원한 모든 주문이 다른 메뉴로 대체되지 않는다는 단순한 가정 아래 이후 기대 판매손실도 λT\lambda T가 된다.

현실에서는 일부 고객이 다른 메뉴를 고르고, 다음 날 돌아오고, 다른 점포로 이동하거나 구매를 포기한다. 따라서 실제 손실을 추정하려면 점포 내 대체율, 이탈률, 재방문율 같은 데이터가 더 필요하다. 내 사례는 다른 지점으로 이동한 한 번의 관측일 뿐이다.

놓친 매출보다 놓친 공헌이익

단위 판매가격을 pp라고 하면 가장 단순한 기대 매출손실은 다음과 같다.

Expected Lost Revenue=p×E[(D−Q)+].\text{Expected Lost Revenue} =p\times E\left[\left(D-Q\right)^+\right].

그러나 점주의 경제적 손실을 생각할 때는 판매가격 전체보다 공헌이익이 더 자연스러울 수 있다. 한 마리를 팔았다면 원재료, 포장재, 결제·플랫폼 비용처럼 판매량과 함께 늘어나는 변동비도 발생했을 것이기 때문이다.

단위 공헌이익을 m=판매가격−단위 변동비m=\text{판매가격}-\text{단위 변동비}라고 두면:

Expected Lost Contribution=m×E[(D−Q)+].\text{Expected Lost Contribution} =m\times E\left[\left(D-Q\right)^+\right].

물론 실제 점포에서 어떤 비용이 변동비인지, 배달앱 수수료와 할인은 어떻게 적용되는지까지 알아야 정확해진다. 여기서는 “판매가 전부가 이익손실은 아니다”라는 구분만 가져가면 충분하다.

직접 실험

평균, 재고, 이탈률을 바꿔보자

독립적인 주문 도착과 일정한 구간 평균을 가정한 교육용 계산기입니다. 특정 브랜드나 점포의 수요·수익성을 추정하지 않습니다.

기대수요 λT30.00
품절확률 P(D > Q)15.74%
기대 초과수요0.57
기대 lost sales0.57
기대 매출 손실₩13,164
기대 공헌이익 손실₩5,151

이탈률은 초과수요 중 이 점포에서 다른 메뉴로 대체되지 않고 실제 매출이 사라지는 비율로 단순화했습니다. 재방문, 교차판매, 주문 수량, 가격·마진 차이는 반영하지 않습니다.

그렇다고 무조건 많이 준비하면 될까?

재고 100개를 쌓아두면 품절확률은 거의 사라질지 모른다. 대신 다른 비용이 생긴다.

재고가 부족할 때재고가 남을 때
판매와 공헌이익을 놓친다원재료를 폐기할 수 있다
고객이 다른 점포로 이동한다보관공간과 관리비가 든다
불편한 경험이 재방문을 낮출 수 있다운전자본이 묶인다
급한 재배치·조달이 필요할 수 있다유통기한 위험을 진다

그래서 재고 의사결정은 대략 다음 두 비용의 균형으로 볼 수 있다.

Expected Cost(Q)=Expected Underage Cost+Expected Overage Cost.\text{Expected Cost}(Q) =\text{Expected Underage Cost} +\text{Expected Overage Cost}.

이 문제를 더 밀어붙이면 불확실한 단일 기간 수요 아래 부족비용과 과잉비용을 비교해 주문량을 정하는 뉴스벤더 문제(Newsvendor Problem)로 이어진다. 최적화가 무엇인지 살펴본 글의 표현을 빌리면, 수요분포는 세계가 어떻게 흔들릴지를 설명하고 뉴스벤더 모형은 그 분포를 받아 “그래서 몇 개를 준비할 것인가”를 결정한다.

다음 글에서는 “그렇다면 점주는 정확히 몇 개를 주문해야 할까?”를 뉴스벤더 문제로 풀어볼 수 있다.

추석에는 평소의 λ를 넣으면 안 될 수 있다

지금까지는 한 구간 안에서 발생률이 일정하다고 가정했다. 그러나 평일 오후의 λ\lambda와 추석 오후의 λ\lambda가 같을 이유는 없다.

  • 휴일과 가족 단위 주문
  • 외식·배달 수요의 변화
  • 주변 점포의 휴무
  • 점심과 저녁의 집중
  • 프로모션과 배달앱 노출
  • 날씨와 명절별 반복 패턴

이 요인들은 평균 주문률을 바꾼다. 더 현실적으로는 발생률 자체가 시간에 따라 움직인다.

λ=λ(t).\lambda=\lambda(t).

이를 비동질 푸아송 과정(non-homogeneous Poisson process)으로 생각할 수 있다. 시간대 aa부터 bb까지의 기대 주문 수는 하나의 상수 λ\lambda에 시간을 곱하는 대신 다음처럼 시간별 발생률을 누적한다.

E[N(b)−N(a)]=∫abλ(t) dt.E[N(b)-N(a)]=\int_a^b \lambda(t)\,dt.

같은 매장, 다른 λ(t)

평일과 명절의 시간대별 주문 강도 개념도λ(t)시간
평일명절
Conceptual illustration · 실제 매장 데이터가 아니다. 명절에는 시간대별 발생률 λ(t)의 모양 자체가 달라질 수 있다.

푸아송 분포를 쓰는 것보다 더 중요한 것은 어떤 λ\lambda를 넣을 것인가다. 일반 평일·금요일·주말·공휴일·추석·설, 시간대와 프로모션 여부를 모두 섞어 낸 전체 평균은 정작 추석 오후에 별 도움이 안 될 수 있다.

한 번의 품절은 운이 나쁜 하루일 수 있다. 하지만 비슷한 조건에서 반복해서 품절된다면 그때부터는 수요를 어떻게 나누어 추정하고, 어떤 서비스 수준을 목표로 하는지 궁금해질 만하다. 물론 두 번의 개인 경험만으로 해당 점포의 모형이나 운영정책에 문제가 있다고 결론낼 수는 없다.

가상의 명절 재고 소진

10:00
100%
11:00
76%
12:00
49%
13:00
18%
14:00
품절
Illustrative · 실제 BHC 점포의 재고량이나 판매 속도를 추정한 그림이 아니다.

“옆 매장에서 빌려올까요?”는 나쁜 전략일까?

재고가 남은 B점에서 부족한 A점으로 물량을 옮기는 것은 재고관리에서 수평 재배치(lateral transshipment)라고 부르는 전략으로 볼 수 있다. 같은 공급망 단계에 있는 점포 사이에서 재고를 이동해 한쪽의 잉여와 다른 쪽의 부족을 맞추는 방식이다.

옆 매장에서 빌리는 행위 자체가 잘못된 것은 아니다. 점포별로 넉넉한 안전재고를 모두 쌓는 대신 네트워크 전체의 재고를 활용하는 합리적인 위험공유 전략일 수 있다. 다만 다음 둘은 다르다.

  • 예상 수요, 이동시간과 비용을 반영해 설계한 망 단위 재고 전략
  • 품절이 난 다음 매번 급하게 전화하는 임시 응급조치

내가 들은 한마디만으로 실제 매장이 어느 쪽인지 알 수는 없다. 이동 중 품질, 책임, 가맹점 간 정산, 배달시간도 함께 고려해야 한다.

주문 1건이 재료 1개는 아니다

지금까지는 주문 한 건이 재고 한 단위를 소진한다고 단순화했다. 현실의 주문에는 한 마리, 두 마리, 여러 메뉴가 함께 들어갈 수 있다. 따라서 주문 도착 횟수와 실제 재료 소진량은 다르다.

주문 수를 N∼Poisson⁡(μ)N\sim\operatorname{Poisson}(\mu), ii번째 주문의 수량을 YiY_i라고 하면 총수요는 다음처럼 쓸 수 있다.

S=∑i=1NYi.S=\sum_{i=1}^{N}Y_i.

이런 구조를 복합 푸아송 모형(Compound Poisson model)으로 생각할 수 있다. 주문이 언제 몇 번 도착하는지와 주문당 몇 단위가 나가는지를 분리하는 것이다. 여기서는 이름만 기억해두자. 재료 종류별 소진량과 메뉴 조합까지 들어가면 문제는 금세 다품목 재고모형이 된다.

현실에서 푸아송이 틀리는 자리

푸아송은 좋은 출발점이지 자동으로 정답이 되는 도장은 아니다. 다음 상황에서는 가정이 쉽게 깨진다.

  • 점심·저녁에 주문이 몰려 발생률이 빠르게 변한다.
  • 단체 주문이나 프로모션이 주문을 군집시킨다.
  • 배달앱 노출이 갑자기 바뀐다.
  • 주문들이 입소문이나 가족 모임 때문에 독립적이지 않다.
  • 품절 뒤에는 들어왔을 수요 자체가 관측되지 않는다.
  • 주문당 수량이 제각각이다.

단순 푸아송에서는 평균과 분산이 같다. 실제 자료의 분산이 평균보다 훨씬 큰 과산포가 보인다면, 시간대별 λ(t)\lambda(t)나 관측하지 못한 이질성을 먼저 살펴보고 음이항분포(Negative Binomial) 같은 다른 계수 모형도 검토할 수 있다. 모형을 복잡하게 만드는 것이 목표는 아니다. 단순한 모형이 어디에서 틀리는지 아는 것이 목표다.

그날 오후 나 같은 고객은 몇 명 더 있었을까?

내가 못 산 콰삭킹 한 마리는 그 점포 입장에서 큰 손실이 아닐 것이다. 결국 나는 몇 블록 떨어진 다른 BHC에서 배달시켜 잘 먹었다.

하지만 점주 입장에서 중요한 것은 내가 한 명이었다는 사실이 아니다.

그날 오후 나 같은 고객이 몇 명 더 있었을까?

평균 판매량만으로는 이 질문에 답할 수 없다. 수요가 얼마나 흔들리는지, QQ개를 준비했을 때 품절될 확률이 얼마인지, 평균적으로 몇 건의 주문을 놓칠지, 그 손실과 남은 재고의 비용이 각각 얼마인지까지 봐야 한다.

베이즈 통계학을 다룬 글에서는 새 정보가 들어올 때 불확실한 판단을 어떻게 고치는지 살펴봤다. 여기서는 한 걸음 더 나아간다. 불확실성을 분포로 표현하면 그것을 실제 재고와 비용의 언어로 옮길 수 있다.

이 글이 일정 시간의 발생 횟수를 물었다면, 지수분포를 다룬 다음 글에서는 AI 상담이 사람에게 넘어오는 사례로 다음 사건까지의 대기시간을 살펴본다.

재고관리는 결국 얼마나 많이 팔릴지를 맞히는 문제가 아니라, 얼마나 틀릴 수 있는지를 감안해 결정하는 문제인지도 모른다.

관련 토픽: 공급망 · 최적화

출처 / 데이터 / 코드

Discussion

토론

질문, 정정, 반례, 다른 해석이 있다면 남겨 주세요.