S&OP: 왜 당신의 Excel이 거짓말을 하는가 (그리고 Python으로 그것을 조사하는 방법)
Source: Dev.to

소개
S&OP (Sales & Operations Planning) 회의에서는 종종 사실보다 의견에 대해 논의합니다:
“우리는 더 많이 팔릴 거라고 생각해요”, “지난 달은 이상했어요”.
근본적인 문제는 상업적 비전의 부족이 아니라, 신호 무결성의 부족입니다.
대부분의 공급망은 어떤 것이든 받아들이는 스프레드시트로 관리됩니다: 텍스트 형태의 날짜, 공백, 그리고 100개의 주문을 100 000으로 바꾸는 오타 등. 예측 알고리즘에 이러한 “쓰레기”를 입력하면, 증폭된 쓰레기를 얻게 됩니다 (재무적인 Bullwhip 효과).
오늘 우리는 S&OP 엔지니어링 시리즈를 시작합니다. 이론을 이야기하지 않을 것입니다; 자동으로 비즈니스를 감사하는 데이터 아키텍처를 구축할 것입니다.
문제: Signal‑to‑Noise Ratio
통신(내 원래 배경)에서 잡음은 신호를 손상시키는 모든 간섭을 의미합니다. 공급망에서는 “잡음”이 더러운 데이터입니다.
수요를 계획하기 전에 잡음을 필터링하지 않으면 자본을 고정하게 됩니다. 감지되지 않은 outlier는 불타는 돈과 같습니다. 알고리즘이 100 000 단위의 가짜 피크를 감지하면, 필요 없는 원자재를 주문하게 되어 현금을 소모하고 창고 공간을 차지합니다. 데이터 위생은 “청소”가 아니라 운영 마진을 보호하는 것입니다.
시각적 증거
코드 한 줄도 보기 전에, ERP가 내보내는 데이터(위)와 수요의 통계적 실제(아래) 사이의 차이를 확인하세요.
위: 인간 오류가 포함된 원시 데이터.
아래: AI 알고리즘을 위한 정제된 신호.
솔루션: “품질 밸브” 아키텍처
이를 해결하기 위해 First‑Principles Thinking을 적용했습니다. Excel을 “더 조심해서” 사용할 필요가 없습니다; 우리는 깨끗하지 않은 데이터가 우리의 “단일 진실”에 들어오는 것을 수학적으로 금지하는 시스템이 필요합니다.
우리는 다음 스택으로 자동화 파이프라인을 설계했습니다:
| 구성 요소 | 기술 스택 |
|---|---|
| 뇌 | Python (Pandas + SciPy) – 통계 로직 |
| 저장소 | Supabase (PostgreSQL) – “단일 진실” 역할 |
| 에이전트 | 새로운 파일이 들어올 때 자동으로 실행되는 스크립트 |
코드: 통계 > 직관
우리는 고정된 규칙을 사용하지 않습니다(“1000보다 크면 삭제”). 통계를 사용합니다. Z‑Score를 구현했으며, 이는 데이터가 평균에서 몇 표준편차만큼 떨어져 있는지를 측정합니다.
Z‑Score > 3인 판매(정규성에서 3σ 이상)라면, 표준적인 행동일 가능성이 수학적으로 낮습니다. 시스템은 이를 삭제하지 않으며(실제 판매일 수 있음), 감사를 위해 표시하고 자동 예측에서 제외합니다.
노트: 이 예제를 단순화하기 위해 정규성을 가정하고 Z‑Score를 사용합니다. 수요가 간헐적인 실제 환경에서는 IQR(Interquartile Range)이나 MAD(Median Absolute Deviation)와 같은 방법을 사용합니다. 이러한 방법은 비정규 분포에 대해 더 강건합니다.
SupplyChainSanitizer 클래스
def detect_outliers_zscore(self, threshold=3):
"""
Detecta anomalías estadísticas usando Z‑Score.
No borramos la fila (pérdida de info), la etiquetamos.
"""
# Calculamos la desviación estándar de la señal
z_scores = np.abs(stats.zscore(self.df['qty']))
# Marcamos lo que es matemáticamente sospechoso
self.df['is_outlier'] = z_scores > threshold
return self
Open Kitchen: 직접 해보세요
엔지니어로서 나는 실행할 수 없는 것에 대해 회의적입니다. 그래서 정리 로직을 **Notebook interactivo en Colab**에 격리했습니다.
Python을 설치하거나 데이터베이스를 설정할 필요가 없습니다. 나는 일시적인 환경을 준비했으며, 여기서 다음을 할 수 있습니다:
- 손상된(시뮬레이션된) 판매 데이터셋 생성
- 정리 엔진
SupplyChainSanitizer실행 - 알고리즘이 잡음(noise)을 감지하고 분리하는 과정을 확인
버튼을 클릭하고 셀을 “Play” 하면 데이터 엔지니어링이 실제로 어떻게 작동하는지 볼 수 있습니다.
생산 아키텍처 (Behind the Scenes)
실제 기업(Datalaria Core)에서 어떻게 확장되는지에 관심이 있는 기술 프로필을 위해:
- Ingesta – CSV 파일을 Supabase Storage의 프라이빗 버킷이나 로컬 데이터베이스에 업로드합니다.
- Trigger – Python 워커가 파일 도착을 감지합니다.
- Proceso – Docker 컨테이너 내에서 메모리 상에서 정제를 실행합니다.
- Persistencia – 정제된 데이터가 “단일 진실” 테이블에 삽입됩니다.
- Exposición – Supabase API가 downstream(AI 모델, 대시보드, ERP)이 검증된 신호만 소비하도록 허용합니다.
이 아키텍처를 통해 “품질 밸브”가 데이터 오염으로부터 공급망을 보호하고, S&OP 의사결정이 신뢰할 수 있는 신호에 기반하도록 보장합니다.
Row Level Security (RLS)를 사용한 PostgreSQL에서 재무 히스토리를 수동으로 변경하지 못하도록 보장하기
보안 주의사항: 운영 환경에서는 절대 슈퍼유저 권한으로 스크립트를 실행하지 않습니다. 특정 서비스 역할과 엄격한 RLS 정책을 사용하여 공급망 무결성을 보장합니다.
데이터 흐름 시각화
다음 다이어그램은 “더러운” 데이터가 품질 밸브를 거쳐 단일 진실에 도달하기까지의 과정을 보여줍니다:
범례
- 🔴 빨강: 노이즈가 포함된 원시 데이터 (문제)
- 🟢 초록: 예측 준비가 된 깨끗한 신호
- 🟠 주황: 인간 검토를 위해 라벨링된 이상치
- 🔵 파랑: 중앙 저장소 (Supabase)
다음 단계: 과학적 예측
이제 깨끗한 데이터베이스(순수 신호)를 갖게 되었으니, 미래를 바라볼 준비가 되었습니다.
시리즈의 다음 장에서는 이 정제된 테이블을 Facebook Prophet과 연결하여 확률적 수요 예측을 생성하고, Excel의 단순 이동 평균을 영원히 포기할 것입니다.
구독하여 챕터 2를 받아보세요: “Demand Planning: 점술에서 확률로”



