콘텐츠로 이동
Data Prep
상세

Supply Chain Analytics (공급망 분석)

공급망 최적화를 위한 데이터 분석 기법과 실무 가이드.

개요

공급망 분석은 원자재 조달부터 최종 고객 배송까지 전체 프로세스를 데이터 기반으로 최적화한다. 비용 절감, 리드타임 단축, 재고 최적화가 핵심 목표다.

분석 영역

영역 핵심 질문 분석 기법
수요 예측 얼마나 팔릴까? 시계열, ML
재고 최적화 얼마나 보유할까? 최적화, 시뮬레이션
공급자 평가 누구에게 살까? 스코어링, AHP
물류 최적화 어떻게 보낼까? 경로 최적화, OR
리스크 관리 무엇이 위험한가? 시나리오 분석

수요 예측 (Demand Forecasting)

예측 수준

Level 1: 전체 → 국가/지역 → 카테고리 → SKU → SKU×지역
(가장 정확)                              (가장 세분화)

기법 선택 가이드

상황 추천 기법 이유
안정적 수요 Exponential Smoothing 단순, 해석 용이
트렌드+계절성 SARIMA, Prophet 패턴 자동 감지
복잡한 패턴 LightGBM, XGBoost 다양한 특성 활용
다중 SKU DeepAR, TFT 계층적 예측

특성 예시

features = {
    # 시간 특성
    'day_of_week': '요일',
    'month': '월',
    'is_holiday': '공휴일 여부',
    'days_to_promotion': '프로모션까지 일수',

    # 외부 요인
    'weather_temperature': '기온',
    'competitor_price': '경쟁사 가격',
    'economic_index': '경기 지수',

    # 자기회귀 특성
    'lag_7': '7일 전 판매량',
    'rolling_mean_28': '28일 이동평균'
}

평가 지표

지표 수식 용도
MAPE mean(|actual-pred|/actual) 상대적 오차
WMAPE sum(|actual-pred|)/sum(actual) 가중 오차
Bias mean(pred-actual) 과대/과소 예측
RMSE sqrt(mean((actual-pred)²)) 큰 오차 패널티

재고 최적화 (Inventory Optimization)

핵심 개념

Safety Stock = Z × σ × √(LT)

Z: 서비스 수준 (95% → 1.65, 99% → 2.33)
σ: 수요 표준편차
LT: 리드타임 (일)

EOQ (Economic Order Quantity)

def calculate_eoq(annual_demand, order_cost, holding_cost):
    """
    annual_demand: 연간 수요량
    order_cost: 주문당 비용
    holding_cost: 단위당 연간 보관 비용
    """
    eoq = math.sqrt((2 * annual_demand * order_cost) / holding_cost)
    return eoq

ABC 분석

def abc_classification(df):
    df['cumulative_value'] = df['revenue'].cumsum()
    df['cumulative_pct'] = df['cumulative_value'] / df['revenue'].sum()

    df['class'] = 'C'
    df.loc[df['cumulative_pct'] <= 0.80, 'class'] = 'A'
    df.loc[(df['cumulative_pct'] > 0.80) & 
           (df['cumulative_pct'] <= 0.95), 'class'] = 'B'

    return df

# 결과: A (상위 80% 매출), B (다음 15%), C (하위 5%)

재고 정책 비교

정책 설명 적합한 상황
(s, Q) 재주문점 s 도달 시 Q 주문 안정적 수요
(s, S) 재주문점 s 도달 시 S까지 채움 변동적 수요
(R, S) 주기 R마다 S까지 채움 다품목 통합 주문

물류 최적화 (Logistics Optimization)

경로 최적화

# Vehicle Routing Problem (VRP)
from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp

def create_routing_model(distance_matrix, num_vehicles, depot):
    manager = pywrapcp.RoutingIndexManager(
        len(distance_matrix), num_vehicles, depot
    )
    routing = pywrapcp.RoutingModel(manager)

    def distance_callback(from_index, to_index):
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return distance_matrix[from_node][to_node]

    transit_callback_index = routing.RegisterTransitCallback(distance_callback)
    routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

    return manager, routing

창고 배치 최적화

최적 위치 = argmin Σ (수요_i × 거리_i)

고려 요소:
- 고객 분포
- 운송 비용
- 부지 비용
- 인력 가용성

공급자 평가 (Supplier Evaluation)

스코어카드 지표

카테고리 지표 가중치 예시
품질 불량률, 반품률 30%
납기 정시 납품률, 리드타임 25%
비용 단가, 총비용 25%
유연성 긴급 대응, 최소 주문량 10%
리스크 재무 안정성, 지역 집중도 10%

공급자 리스크 분석

def supplier_risk_score(supplier):
    scores = {
        'financial_stability': check_credit_rating(supplier),
        'geographic_risk': assess_location_risk(supplier.country),
        'concentration_risk': calculate_dependency_ratio(supplier),
        'compliance_risk': audit_score(supplier),
        'capacity_risk': capacity_utilization(supplier)
    }

    weights = [0.25, 0.20, 0.20, 0.15, 0.20]
    total_risk = sum(s * w for s, w in zip(scores.values(), weights))

    return total_risk

리스크 관리

Bullwhip Effect 완화

원인 → 대응
수요 왜곡 → 실시간 POS 데이터 공유
배치 주문 → 지속적 보충 (Continuous Replenishment)
가격 변동 → EDLP (Everyday Low Price)
리드타임 변동 → VMI (Vendor Managed Inventory)

시나리오 분석

scenarios = {
    'base': {'demand_change': 1.0, 'lead_time_change': 1.0},
    'demand_surge': {'demand_change': 1.5, 'lead_time_change': 1.0},
    'supply_disruption': {'demand_change': 1.0, 'lead_time_change': 2.0},
    'worst_case': {'demand_change': 1.5, 'lead_time_change': 2.0}
}

for name, params in scenarios.items():
    result = simulate_supply_chain(**params)
    print(f"{name}: Service Level {result['service_level']:.1%}, "
          f"Cost ${result['total_cost']:,.0f}")

KPI 대시보드

운영 지표

지표 계산식 목표 예시
Fill Rate 충족 주문 / 전체 주문 >98%
OTIF 정시+완전 배송 비율 >95%
Inventory Turnover 매출원가 / 평균재고 >12회/년
Days of Supply 평균재고 / 일평균수요 <30일
Perfect Order Rate 완벽 주문 비율 >90%

재무 지표

지표 설명
Total Supply Chain Cost 조달+물류+재고+폐기 비용
Cash-to-Cash Cycle 현금 회전 주기
Return on Assets 공급망 자산 수익률

기술 스택

데이터 수집: SAP, Oracle ERP, IoT 센서
데이터 저장: Snowflake, BigQuery
분석/ML: Python, Spark
최적화: OR-Tools, Gurobi, CPLEX
시각화: Power BI, Tableau

구현 로드맵

Phase 1 (1-3개월): 가시성 확보
- 데이터 통합 (ERP, WMS, TMS)
- 기본 대시보드 구축

Phase 2 (3-6개월): 예측 고도화
- 수요 예측 모델 개발
- 재고 최적화 파일럿

Phase 3 (6-12개월): 자동화
- 자동 발주 시스템
- 실시간 경로 최적화
- 예외 관리 자동화

참고 자료

  • SCOR Model (Supply Chain Operations Reference)
  • APICS CPIM Certification
  • Kaggle: Store Sales Forecasting, M5 Competition