xellstorm
KO
앱 열기

수요가 불확실할 때 몇 개를 주문해야 할까요?

예제 풀이 · 주문 수량 · 2026년 10월 업데이트

수요가 66.7%의 확률로 넘지 않는 수량, 즉 임계 비율에 해당하는 수량을 주문합니다. 수요의 평균이 1,000개(표준편차 200), 단위당 판매 가격이 10, 원가가 4, 남으면 1에 처분하는 이 예제에서는 1,086.1개이고, 기대 이익은 5,345.5입니다. 예제 엑셀 파일을 몬테카를로로 탐색하면 이 최적값에 가장 가까운 단계인 1,090개를 고릅니다.

임계 비율은 한 단위를 더 팔 확률에 그 단위가 벌어 주는 금액을 곱한 값이, 그 단위가 남을 확률에 그 단위가 잃는 금액을 곱한 값과 같아지는 지점입니다. 판매 손실로 놓치는 이익이 남는 한 단위의 손실보다 크면, 그 지점은 수요의 중앙값(수요가 절반의 경우에 넘어서는 수준)보다 위에 있습니다. 이 예제의 수요는 정규 분포여서 중앙값이 평균과 같고, 금액은 엑셀 파일의 통화 단위입니다. 탐색은 주문량을 600개에서 1,600개까지 10개 단위로 바꿔 가며 진행합니다. 1,090개에서 평균 이익은 5,345 ± 31(95% 구간, 시뮬레이션 시즌 5,000개)이고, 수요가 재고를 넘는 시즌은 32.6%입니다.

모델

이것이 뉴스벤더 문제입니다. 판매 시즌 전에 주문을 한 번 하고, 수요는 가능한 범위로만 알며, 팔리지 않은 수량은 시즌이 끝나면 싼값에 처분하고, 주문량을 넘는 수요는 놓칩니다. 엑셀 파일에는 Model 시트 하나가 있고, A열이 레이블, B열이 값입니다.

예제의 숫자(금액은 엑셀 파일의 통화 단위)
주문 수량, B11,000개(의사결정)
가격, B2판매 단위당 10
단위당 원가, B3주문 단위당 4
잔존가, B4남은 단위당 1
수요, B6정규 분포, 평균 1,000개, 표준편차 200

수식 네 개가 주문과 수요를 시즌의 결과로 바꿉니다. Sold(판매 수량): =MIN(B1,B6). Leftover(남은 수량): =MAX(B1-B6,0). Profit(이익): =B2*B8+B4*B9-B3*B1, 즉 매출과 잔존가를 더하고 주문 전체의 비용을 뺀 값. Lost sales(판매 손실): =MAX(B6-B1,0), 주문으로 채우지 못한 수요. 여기서 품절은 수요가 주문량을 넘어 판매 손실이 생긴 시즌입니다. 애드인 함수는 쓰지 않습니다.

내려받는 파일에는 이 수식과 주문량 1,000개, 수요 셀에 넣어 둔 고정값이 들어 있습니다. 수요 분포, 출력 두 개(Profit, Lost sales), 품절 목표, 최적화 스터디는 xellstorm에서 설정해 예제와 함께 불러오며, 엑셀 파일은 직접 만들었을 법한 모습 그대로입니다.

정규 분포는 원칙적으로 0 미만의 수요도 허용하지만, 0은 평균에서 표준편차의 5배만큼 아래에 있어 그럴 확률은 약 3.5 × 10⁶분의 1입니다. 시뮬레이션한 수요 5,000개 중 가장 낮은 값은 200개입니다. 수요는 연속된 수로 뽑으므로 판매량, 남은 수량, 아래 목표값 찾기가 구한 주문량에는 소수점 이하의 값이 나올 수 있습니다. 실제로 주문할 때는 정수로 반올림합니다.

평균 수요보다 더 많이 주문하는 이유

주문의 마지막 한 단위를 생각해 봅니다. 팔리면 가격에서 원가를 뺀 만큼, 즉 10 − 4 = 6의 이익을 냅니다. 남으면 원가에서 잔존가를 뺀 4 − 1 = 3의 손실을 봅니다. 그 단위를 추가하면 이득인지는 팔릴 확률 × 6 > 남을 확률 × 3인지로 정해집니다. 즉 팔릴 확률이 3 / (6 + 3) = 33.3%보다 높은 한 추가할 가치가 있습니다. 주문량이 평균 수요 1,000개와 같을 때 다음 한 단위는 절반의 확률로 팔리므로 더 많이 주문하는 편이 이득입니다. 그 이득은 수요가 주문량을 넘지 않을 확률이 66.7%에 이르는 지점에서 끝납니다.

시뮬레이션은 같은 계산을 시즌별로 보여 줍니다. 같은 시뮬레이션 시즌 5,000개에서 1,000개 대신 1,090개를 주문하면, 수요가 1,090개에 이르는 시즌(32.6%)에서는 정확히 540(90 × 6)만큼 더 벌고, 수요가 1,000개 이하에 머무는 시즌(50%)에서는 정확히 270(90 × 3)만큼 덜 법니다. 그 사이의 시즌에서는 차이가 둘 사이에 놓입니다. 평균적으로는 시즌마다 63.5만큼 더 벌고, 아래의 이론식도 같은 값(63.5)이 나옵니다.

이론값: 임계 비율

이 규칙에는 임계 비율이라는 이름이 있습니다. 최적 주문량 Q*는 수요가 확률 (가격 − 원가) / (가격 − 잔존가)로 넘지 않는 수요 수준이며, 여기서는 (10 − 4) / (10 − 1) = 0.667입니다. 정규 분포 수요에서는 Q* = 평균 + z × 표준편차입니다. 여기서 z = 0.4307입니다. 표준정규분포에서 이 값 아래의 확률이 66.7%입니다(엑셀에서는 =NORM.S.INV(6/9)). 따라서 Q* = 1,000 + 0.4307 × 200 = 1,086.1개입니다.

기대 이익에도 닫힌 식이 있습니다. 주문량 Q가 무엇이든, z = (Q − 평균) / 표준편차일 때 (가격 − 잔존가) × (평균 − 표준편차 × L(z)) − (원가 − 잔존가) × Q입니다. 여기서 L(z) = φ(z) − z × (1 − Φ(z))는 표준정규 손실 함수이고, φ는 표준정규 밀도, Φ는 그 누적 분포입니다(엑셀에서는 =NORM.S.DIST(z,FALSE)-z*(1-NORM.S.DIST(z,TRUE))). 표준편차 × L(z)가 기대 판매 손실입니다. Q*에서는 (가격 − 원가) × 평균 − (가격 − 잔존가) × 표준편차 × φ(z)로 단순해지며 그 값은 5,345.5입니다. 품절 확률은 1 − 0.667 = 33.3%입니다. 평균 수요인 1,000개를 주문하면 기대 이익은 5,281.9입니다.

시뮬레이션으로 주문 수량 탐색하기

공식을 쓰려면 이렇게 단순한 모델(제품 하나, 주문 한 번, 고정 가격)과, 분위수와 기대 판매 손실에 공식이 있는 수요 분포가 있어야 합니다. 시뮬레이션에는 수요를 뽑는 방법만 있으면 되며, 이 예제는 시뮬레이션이 같은 답을 찾는지 확인합니다. 예제와 함께 불러오는 최적화 스터디는 주문 수량(B1)을 의사결정으로 두고, 600개에서 1,600개까지 10개 단위로 모든 주문, 즉 101개 후보를 시도해 Profit의 평균을 최대화합니다. 제약 조건 하나가 적용됩니다. 품절 확률, 즉 Lost sales가 0을 넘는 시행의 비율이 50% 이하여야 합니다. 후보마다 시행 1,000회로 시뮬레이션하고, 상위 세 개는 5,000회로 다시 실행하며, 모든 실행은 같은 수요 난수를 씁니다. 이 공통 난수 덕분에 후보 사이의 차이는 추출의 운이 아니라 주문에서만 나옵니다.

주문 수량별 평균 이익주문 수량 600에서 1,600까지 10씩, 시뮬레이션 시즌 1,000개의 평균 이익과 95% 구간(띠), 이론 기대 이익(파선). 탐색에서 곡선의 정점은 1,100개이고, 시행 5,000회로 재실행하면 1,090개를 고르며 평균 이익은 5,345입니다.3,5004,0004,5005,0005,5006008001,0001,2001,4001,600최적 1,090파선: 이론값
주문 수량(개)별 시즌당 평균 이익: 주문마다 시뮬레이션 시즌 1,000개(실선)와 95% 구간(띠), 정규 분포 공식의 이론 기대 이익(파선). 점선은 시행 5,000회 재실행에서 이긴 주문을 나타냅니다.
시행 5,000회로 재실행한 상위 주문 수량(평균 이익과 95% 구간)
주문 수량(개)평균 이익이론 기대 이익품절 확률
1,0905,345 ± 315,345.432.6%
1,1005,344 ± 315,344.030.9%
1,1105,341 ± 325,340.929.1%

재실행에서는 1,090개를 고릅니다. 평균 이익은 5,345 ± 31이고(이 주문량의 이론값은 5,345.4), 시즌의 32.6%에서 품절됩니다(이론값: 32.6%). 이론 최적값 1,086.1개에 가장 가까운 단계이고, 이론 기대 이익(5,345.5)은 그 구간 안에 있습니다.

상위 세 주문의 구간은 거의 완전히 겹치는데도 승자는 분명합니다. 각 구간은 그 후보의 평균에 낀 잡음을 xellstorm이 추정한 값으로, 시행을 20개 배치로 나눴을 때 평균이 얼마나 달라지는지에서 구합니다. xellstorm의 기본값인 라틴 하이퍼큐브 샘플링은 실행마다 추출값을 수요 분포 전체에 고르게 퍼뜨리므로, 실행 전체의 평균은 구간이 시사하는 것보다도 더 안정적입니다. 다른 시드 3개로 다시 실행해 보면 1,090개에서의 평균 이익은 이번 실행의 값과 0.2 이내입니다.

후보를 가르는 것은 후보 사이의 차이입니다. 같은 추출값이 모든 후보를 함께 올리거나 내리므로 이 차이는 구간보다 훨씬 안정적입니다. 시즌별로 비교하면 1,090개는 1,100개보다 1.43만큼 앞서며(95% 구간 0.47에서 2.39), 구간이 0을 포함하지 않습니다. 우연이 아닌 차이지만 그 폭은 작습니다. 기대 이익의 이론 차이는 1.43입니다. 정점 부근에서 이익 곡선은 평평하므로 한 단계 벗어나도 비용은 거의 들지 않습니다. 범위의 양 끝인 600개와 1,600개에서는 기대 이익이 각각 3,585, 4,199까지 떨어집니다.

탐색에서는 1,100개가 1위(평균 이익 5,370.3)였고 1,090개는 5,369.9에 머물렀습니다. 탐색은 시행 5,000회 중 처음 1,000회를 쓰는데, 이 시행들은 우연히 수요를 약간 더 많이 뽑아 평균 1,003.7개로, 전체 평균 1,000.0개보다 높습니다. 그 때문에 정점 부근에서 큰 주문의 이익이 올라가고 정점이 한 단계 위로 움직입니다. 5,000회 시행으로 재실행하면 결정이 나며, 재실행이 승자를 바꾸면 xellstorm이 그 사실을 알려 줍니다.

제약 조건, 그리고 품절을 줄이는 비용

품절 제약 조건은 여기서 걸리지 않습니다. 1,000개 이하의 주문을 배제하는 조건입니다(1,000개에서 탐색 시행 중 품절되는 비율은 51.6%). 정규 분포 수요에서 평균만큼 주문하면 절반의 확률로 품절되기 때문입니다. 최적 주문량은 이미 품절 확률을 32.6%까지 낮춥니다.

주문 수량별 품절 확률주문 수량별로 시뮬레이션 시즌 1,000개 중 수요가 주문을 넘는 비율. 95% 구간은 띠, 이론 확률은 파선, 제약 조건의 한도 50%는 점선으로 그렸습니다. 최적 주문량 1,090개에서 확률은 32.6%(5,000회 시행)이고, 목표값 찾기는 10% 확률을 1,256.25개에 놓습니다.0%25%50%75%100%6008001,0001,2001,4001,600한도 50%최적 1,090파선: 이론값1,256개에서 10%
주문 수량별 품절 확률(수요가 주문 초과): 주문마다 시뮬레이션 시즌 1,000개(실선, 95% 띠), 이론 확률(파선), 스터디의 한도 50%(점선), 그리고 10%를 목표로 한 목표값 찾기의 답.

품절이 시즌의 32.6%에서 일어나는 것이 너무 잦다면(예를 들어 빈 선반을 본 고객이 돌아오지 않는다면), 받아들일 확률을 정하고 목표값 찾기로 주문량을 구합니다. xellstorm의 목표값 찾기는 통계량이 목표에 닿을 때까지 주문 범위를 반으로 나눕니다. 평가마다 시행 5,000회씩 7번 평가해 1,256.25개를 찾았고, 이때 품절되는 시행의 비율은 정확히 10%입니다. 이론값은 넘지 않을 확률이 90%인 수요 수준으로, 1,000 + 200 × NORM.S.INV(0.9) = 1,256.3개입니다.

같은 시뮬레이션 시즌 5,000개에서 주문 1,000개(평균 수요), 1,090개(평균 이익 최대), 1,256.25개(품절 확률 10%)
주문 수량(개)1,0001,0901,256.25
평균 이익5,2825,3455,146
P10 이익3,6953,4252,926
품절 확률50%32.6%10%
평균 남은 수량80133266
평균 판매 손실(개)80439

품절 확률을 32.6%에서 10%까지 낮추려면 166개를 더 주문해야 합니다. 그중 133개는 평균적인 시즌에 남고, 시즌당 평균 이익은 199만큼 줄어듭니다(3.7%, 두 주문의 기대 이익 차이의 이론값은 199.4). P10 이익, 즉 시즌의 90%가 도달하는 수준도 3,425에서 2,926까지 내려갑니다. 부진한 시즌에는 큰 주문일수록 팔리지 않는 재고가 더 많이 남기 때문입니다(P50, P80, P90 참고). 평균 수요만큼만 주문하면 세 가지 중 P10 이익이 가장 높지만 시즌의 50%에서 품절됩니다. 품절을 줄일 만한 가치가 있는지는 사업상의 결정이고, 시뮬레이션은 그 대가에 숫자를 붙여 줍니다.

직접 해 보기

  1. xellstorm에서 모델을 엽니다. 수요 분포, 출력 Profit과 Lost sales, 목표(Lost sales가 0 초과, 즉 품절 확률), 최적화 스터디가 이미 설정되어 있습니다. 설치도 가입도 필요 없고, 엑셀 파일은 브라우저에서 계산합니다.
  2. 실행합니다. 저장된 주문량 1,000개와 예제의 시드(7), 시행 5,000회에서 평균 이익은 5,282이고 품절 확률은 50%입니다.
  3. Optimize 단계를 엽니다. 주문 수량(Model!B1)이 의사결정 셀이고 범위는 600에서 1,600까지 10씩입니다. 목적은 Profit의 평균 최대화이며, 제약 조건은 Lost sales가 0을 넘을 확률을 50% 이하로 유지하는 것입니다. Optimize를 누르면 앱이 모든 주문을 시행 1,000회로 평가하고 상위 세 개를 5,000회로 다시 실행합니다. 승자와 차순위는 시행별로 비교하고, 주문 수량별 평균 이익은 95% 구간과 함께 차트로 그립니다.
  4. 품절 확률이 10%인 주문량을 찾으려면 Goal seek를 고릅니다. 통계량은 Probability, 조건은 >이고 Lost sales의 임계값은 0, 목표값은 0.1입니다. 주문 수량의 Step 칸은 비우고(스터디에서는 10이 들어 있습니다), Trials per evaluation은 5,000회로 설정한 뒤 Seek goal을 누릅니다.
  5. Set as fixed cells를 누르고 다시 실행하면 선택한 주문량의 전체 결과가 나옵니다. Add as scenario를 누르면 같은 난수에서 저장된 주문과 비교합니다.

일반 엑셀로도 할 수 있나요?

이 경우에는 가능합니다. 정규 분포 수요라면 =NORM.INV((B2-B3)/(B2-B4), 1000, 200) 수식이 임계 비율 주문량 1,086.1개를 바로 돌려줍니다. 한쪽으로 치우친 수요라면 NORM.INV를 그 분포의 역함수(LOGNORM.INV, GAMMA.INV, 또는 과거 판매량에 쓰는 PERCENTILE.INC)로 바꾸면 되지만, 여러 제품이 예산이나 창고를 공유하거나, 최소 주문 단위가 있거나, 할인 가격이 남은 수량에 따라 달라지면 이 규칙 자체가 더는 맞지 않습니다. 시뮬레이션은 이런 경우를 다룰 수 있지만, 일반 엑셀에서 시뮬레이션 모델을 최적화하기는 번거롭습니다. 다시 계산할 때마다 새 난수가 뽑히므로 데이터 표나 해 찾기(Solver)는 서로 다른 난수로 주문 수량을 비교하며 잡음을 쫓게 됩니다. 후보마다 고정한 같은 난수 세트로 평가하는 일을 xellstorm이 대신 해 줍니다. 엑셀 몬테카를로 시뮬레이션에서 일반적인 접근법을 보여 줍니다.

자주 묻는 질문

뉴스벤더 모델이란 무엇인가요?

뉴스벤더 모델은 수요를 알기 전에 단일 판매 기간의 재고량을 정하는 고전적인 문제입니다. 남은 수량은 원가보다 싸게 처분하고, 재고를 넘는 수요는 놓칩니다. 최적 주문량은 수요의 임계 비율, 즉 수요가 (가격 − 원가) / (가격 − 잔존가) 확률로 넘지 않는 수량입니다. 이름은 매일 아침 신문을 몇 부 살지 정하는 신문 판매원에서 왔으며, 계절 상품, 신선 식품, 행사 수용 인원, 일회성 생산에서도 같은 문제가 생깁니다. 반복해서 보충하는 재고는 어떤 재주문점이 비용과 품절의 균형을 맞출까를 참고하세요.

최적 주문량이 평균 수요보다 낮은 경우는 언제인가요?

남은 한 단위가 입히는 손실이 판매 손실로 놓치는 이익보다 클 때, 즉 원가에서 잔존가를 뺀 값이 가격에서 원가를 뺀 값보다 클 때 최적 주문량은 평균 수요보다 낮습니다. 이때 임계 비율은 2분의 1보다 작고, 정규 분포처럼 대칭인 수요 분포에서는 최적 주문량이 평균보다 낮습니다. 마진이 얇고 팔리지 않은 재고의 가치가 없으면 주문량이 내려가고, 마진이 크고 잔존가가 좋으면 올라갑니다.

왜 모든 주문 수량을 같은 난수로 평가하나요?

모든 주문 수량을 같은 시뮬레이션 수요로 평가하는 것을 공통 난수라고 하며, 후보 사이의 차이가 주문에서만 나오게 합니다. 이 예제에서 상위 세 주문의 95% 구간은 거의 완전히 겹치지만, 상위 두 개의 시즌별 차이의 구간은 0.47에서 2.39까지이며 0을 포함하지 않습니다. 일반 몬테카를로 샘플링에서 후보마다 새 난수를 뽑으면 탐색이 잡음을 쫓게 됩니다. 이 두 주문의 차이를 공통 난수일 때만큼 정밀하게 재려면 시행이 약 2,000배 필요합니다.

수요가 정규 분포가 아니라면 어떻게 하나요?

수요가 정규 분포가 아니어도 임계 비율은 그대로 성립하지만, 주문량은 그 분포의 분위수 함수에서 구해야 하고 위의 기대 이익 같은 공식은 더 이상 적용되지 않습니다. 시뮬레이션에는 분포 자체만 있으면 됩니다. xellstorm에서 수요 셀에 로그정규, 감마, PERT, 푸아송, 음이항 같은 다른 분포를 고르거나, Distributions 단계에서 과거 판매량에 분포를 적합하거나, 엑셀 파일이 다른 불확실한 입력으로 수요를 계산하게 한 뒤 같은 최적화를 실행합니다.

관련 글

xellstorm은 엑셀 모델을 브라우저에서 몬테카를로 시뮬레이션하는 도구입니다. 애드인은 필요 없고, 엑셀 파일은 내 컴퓨터 밖으로 나가지 않습니다.