S&OP Engineering III: 엑셀의 종말 (Linear Programming for Supply Planning)

발행: (2026년 3월 13일 오후 04:16 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

“We always want 4 weeks of coverage.”
이 문구는 전 세계 모든 S&OP 회의에서 주문처럼 반복되지만, 재정적으로는 독성이 있습니다.

Why? Because it’s a fixed rule applied to a dynamic system.
만약 1월에 수요가 200개이고 7월에 20개라면, 각각 “혹시 모를 경우”를 대비해 800개와 80개를 유지하도록 스스로 강요하는 것입니다. 1월은 부족하고, 7월은 이유 없이 자본을 묶어 둡니다.

The alternative isn’t more sophisticated intuition. It’s mathematics.

요약

이 장에서는 Chapter 2의 확률적 예측을 선형 계획법 엔진(PuLP)과 연결하여, 안전 재고 제약을 만족하면서 총 비용(생산 + 보관)을 최소화하는 정확한 생산 계획을 계산합니다. 우리는 수동적인 예측에서 능동적인 처방으로 전환합니다.

예측에서 의사결정으로: 아키텍처

In Chapter 1 우리는 신호를 정제했습니다.
In Chapter 2 우리는 수요를 예측했습니다.
이제 엑셀로는 할 수 없는 단계를 진행합니다: 최적화.

우리의 GitHub 파이프라인은 Supabase에 연결하여 demand_forecasts 테이블(우리가 예측한 미래)을 읽고 새로운 supply_plans 테이블을 생성합니다. 시스템은 다음 단계로 발전했습니다

  • Descriptive – 무슨 일이 일어났나요?
  • Predictive – 무슨 일이 일어날까요?
  • Prescriptive – 우리가 무엇을 해야 할까요?

이는 운영 연구(Operations Research)이며, 항공 노선, 군사 물류, 전 세계 공급망을 최적화하는 동일한 학문이고, 우리는 이를 약 50줄의 파이썬 코드로 실행합니다.

Source:

비즈니스 수학

우리는 방정식을 숨기고 있지 않습니다; 방정식이 바로 의사결정의 핵심입니다. 아래는 우리 SupplyOptimizer 클래스의 핵심 조각입니다:

# Objective Function: Minimise total cost
problem += pulp.lpSum(
    production_cost * production[t] + holding_cost * inventory[t]
    for t in range(T)
), "Total_Cost"

# Constraint: Inventory Balance (Conservation of Mass)
for t in range(T):
    prev_inv = initial_inventory if t == 0 else inventory[t - 1]
    problem += (
        inventory[t] == prev_inv + production[t] - demand[t],
        f"Balance_t{t}"
    )

# Constraint: Safety Stock (Risk Policy)
for t in range(T):
    problem += (
        inventory[t] >= safety_stock,
        f"SafetyStock_t{t}"
    )

설명할 가치가 있는 세 가지 엔지니어링 결정

  1. 목표 함수 – “많은 재고”나 “높은 생산량”을 추구하는 것이 아니라 최소 재무 비용을 목표로 합니다. 즉, 비용이 많이 드는 제조와 비용이 많이 드는 보관 사이의 균형점입니다. 솔버가 자동으로 결합 비용이 최소가 되는 정확한 지점을 찾아냅니다.

  2. 질량 균형 – 물리적 제약: 가지고 있지 않은 것을 팔 수 없습니다. 오늘의 재고는 어제의 재고에 오늘 생산량을 더하고 오늘 수요를 뺀 값과 같습니다. 마법이 없으며, 방정식이 부정 행위를 금지합니다.

  3. 안전 재고 – 위험 정책: 재고가 안전 최소치(우리 경우 평균 수요의 1.5개월) 이하로 떨어지지 않도록 합니다. 이 값은 시스템이 계산하며, 억지로 만든 숫자를 스프레드시트에 넣는 것이 아닙니다.

마스터 플랜: 알고리즘에서 비즈니스 의사결정까지

PuLP로 최적화된 마스터 생산 일정: 월별 생산, 재고 및 안전 재고

이것이 운영 이사가 확인해야 할 내용입니다.
알고리즘은 균일하게 생산하지 않습니다. 특정 기간에 급격한 수요 급증을 감지하면, 생산 부하를 평탄화하기 위해 이전 몇 달에 재고를 “미리 구축”합니다. 보관 비용이 높으면 창고를 비워두고 적시 생산(Just‑in‑Time)으로 제조합니다. 엑셀만으로는 이를 구현할 수 없으며, 수학이 가능하게 합니다.

테스트 데이터로 풀러에서 얻은 결과

비용 유형금액
생산 비용€1,680
보관 비용€540
총 최적화 비용€2,220

이 수치는 추정치가 아닙니다. 제약 조건을 고려한 증명 가능한 전역 최소값입니다. 동일한 매개변수로 더 저렴한 계획을 제시한다면, 제약을 위반하는 것입니다.

Open Kitchen: Solver와 함께 놀아보기

실제로 적용할 수 없는 이론은 믿지 않습니다. 그래서 실제 데이터 스냅샷에 최적화 프로그램을 실행할 수 있는 Google Colab을 준비했습니다.

실험: holding_cost를 매우 높은 값(예: €50/단위)으로 바꿔 보세요. 알고리즘이 자동으로 Just‑in‑Time 생산을 선택하고 창고를 거의 비워두는 것을 확인할 수 있습니다. 그런 다음 생산 비용을 낮추면 대량 생산 및 저장을 선호하게 됩니다. 수학은 상황에 맞게 적응하지만, Excel의 고정된 규칙은 그렇지 못합니다.

📎 인터랙티브 Google Colab 열기

비용, 용량 제약, 안전 재고를 수정해 보세요. 믿음이 아니라 엔지니어링으로 접근하십시오.

완전한 체인: 데이터에서 의사결정까지

이번 세 번째 장에서는 더럽혀진 ERP CSV 파일에서 최적의 생산 계획에 이르는 엔드‑투‑엔드 S&OP 시스템을 구축했습니다:

Architecture diagram

다음 단계: 엔터프라이즈로 확장

우리는 지금 데이터베이스에 완벽한 계획을 가지고 있지만 – 단일 제품에만 해당됩니다. 동일한 공장을 공유하는 세 개의 SKU를 추가하면 어떻게 될까요?

**Chapter 4**에서 여정을 계속하세요.

Engineering – Part 4 – Enterprise

우리는 MVP를 깨뜨립니다: 급격히 다른 프로파일을 가진 다중 제품 데이터를 주입하고, MLOps로 예측을 병렬화하며, 제품들이 공유 생산 용량을 위해 수학적으로 경쟁하는 통합 선형 프로그래밍 모델을 구축합니다.

계획을 하는 운영 이사와 최적화하는 운영 이사 사이의 차이는 그들의 직관과 현실 사이에 있는 목적 함수입니다.

0 조회
Back to Blog

관련 글

더 보기 »

트라비고

Gemini와 함께 말하는 속도만큼 빠르게 여행하세요! 라이브 에이전트가 몰입형 스토리텔링 및 3D 내비게이션과 만나는 곳. 이 프로젝트는 Gemini Live Ag...에 진입하기 위해 만들어졌습니다.