결론부터 말하겠습니다. 열 번 중 아홉 번은 데이터 문제입니다.

저는 창고 업계에서 20년을 일하면서 이런 장면을 수없이 봤습니다. 어느 물류센터(DC)가 AI 수요 예측 모듈에 거액을 투자하고, 모델이 가동되고, 3개월 뒤에도 보충 발주는 여전히 베테랑 플래너의 직감에 의존하고 있더군요. IT팀의 첫 반응은 항상 "모델이 잘못됐으니 다른 알고리즘을 써보자"입니다. 제 반응은 항상 같습니다. 모델은 건드리지 말고 — 모델에 먹인 데이터를 꺼내서 제대로 들여다보세요. 거의 항상 문제의 근원은 거기에 있습니다.

모델은 그저 매우 성실한 학생일 뿐입니다. 빈 페이지와 오타투성이 교과서를 건네주면, 시험을 못 본 게 학생 탓이라고 할 수는 없죠.

첫 번째 질문: 데이터가 완전하기나 한가?

수요 예측 프로젝트는 1단계에서 죽는 경우가 많습니다. SKU 마스터 데이터가 엉망인 거죠.

몇 년 전 캘리포니아 온타리오에 있는 한 3PL 물류센터를 둘러본 적이 있습니다. 100,000평방피트가 훨씬 넘는 규모에 SKU만 20,000개가 넘는 곳이었는데, ML 기반 보충 예측을 도입한 지 반년이 지났습니다. 정확도는 처참했죠. 파고들어 보니 상품 카테고리, 계절성 플래그, 대체관계 같은 필드가 전체 SKU의 상당수에서 비어 있었습니다. 신상품은 카테고리조차 부여받지 못한 채 몇 달씩 시스템에 방치됐고요. 모델이 도대체 뭘 배워야 했던 걸까요? 허공에서요?

일관성 없는 태깅 문제도 있습니다. 같은 상품인데 어느 DC에서는 "winter style", 다른 DC에서는 "Winter-2023", 또 다른 DC에서는 아예 비어 있는 식입니다. 모델 입장에서는 세 개의 다른 상품이 되고, 세 개 모두에서 잘못된 패턴을 학습하죠.

점검 방법은 간단합니다: 무작위로 SKU 200개를 뽑아 카테고리, 계절성, 라이프사이클 상태, 대체관계 필드를 보세요. 결측률이 20퍼센트를 넘으면 모델 얘기는 접고 마스터 데이터부터 고치십시오. 멋없는 작업이지만, 이걸 건너뛰면 이후의 모든 과정은 헛수고입니다.

두 번째 질문: 애초에 측정하는 게 맞기나 한가?

이건 제가 아는 실패 모드 중 가장 교묘한 겁니다. 모델이 학습하는 "과거 판매 실적"이라는 게 실제 수요가 아닌 경우가 많거든요.

전형적인 사례: 어떤 SKU가 작년 11월에 2주간 품절이 났습니다. 시스템은 판매 0건을 기록했죠. 모델은 "이 SKU는 11월에 수요가 없다"고 배웠고 올해 과소 발주를 했습니다. 그런데 올해는 품절이 나지 않았고 수요는 평소대로 발생했습니다. 선반은 비게 됐죠. 품절 기간의 0은 수요가 아닙니다. 공급할 수 있었던 상한선일 뿐입니다. 상한선을 하한선으로 착각하도록 가르치면 모델이 맞을 리가 없습니다.

또 하나: DC 간 이동(인터-웨어하우스 전송)입니다. DC A의 재고가 부족해서 DC B에서 500단위를 옮겨왔습니다. DC B의 출고 기록에는 500단위의 "판매"가 찍혔죠. 모델은 "이 SKU가 DC B에서 수요가 강하다"고 보고 재고를 쌓으라고 합니다. 그런데 그건 사실 내부 이동일 뿐인데요. 실제 수요와 내부 이동이 하나의 숫자에 섞여 있으면 모든 예측이 삐뚤어집니다.

높은 파렛트 랙에 상품을 보충하고 있는 창고 작업자

반품도 잊지 마세요. 이커머스 풀필먼트에서는 총매출과 순매출이 크게 다를 수 있습니다. 총매출로 학습시키면 모델은 만성적으로 수요를 과대평가합니다.

점검 방법: 판매 지표의 정의서를 찾아보세요. 있다면 세 가지를 물어보십시오. 품절 기간은 어떻게 처리하는가 — 실제 수요를 복원했는가? 내부 이동 출고는 제외했는가? 총매출인가 순매출인가? 아무도 답을 못 하거나 "그런 건 한 번도 다룬 적 없다"가 답이면, 바로 그게 근본 원인입니다. 지표가 흐릿하면 모델이 똑똑할수록 틀리는 데도 자신감이 넘칩니다.

한 가지 더 짚고 넘어갈 말이 있습니다. 많은 창고가 판매 데이터를 ERP에서 그대로 끌어옵니다. 그런데 ERP 출고 기록은 "고객에게 팔았다"와 "자매 DC로 보냈다"를 구분하지 않죠. 그 정제 과정을 아무도 하지 않으니 모델은 하루 종일 가짜 수요를 공부합니다. 저는 보통 데이터팀에 1년치 출고 기록을 판매/이동/폐기로 먼저 나누라고 합니다. 이 한 단계만으로 여러 SKU의 "과거 수요"가 눈에 띄게 줄어드는 경우가 많은데, 사라진 단위는 전부 노이즈였던 겁니다.

세 번째 질문: 이벤트는 태깅이라도 했는가?

예측 모델은 설명되지 않는 급증(spike)을 싫어합니다. 작년 어느 달 매출이 두 배로 뛰었습니다. 모델은 그 패턴을 외웠고, 올해는 두 배를 쌓아뒀습니다. 그런데 작년의 급증은 대규모 프로모션이었고 올해는 그런 게 없죠. 이제 창고는 악성 재고로 가득합니다.

프로모션, 클리어런스, 인플루언서발 수요 급증, 이상 기후, 경쟁사의 품절 — 이런 게 하나도 태깅되어 있지 않으면 모델은 그걸 "자연스러운 수요"로 흡수합니다. 모델이 배우는 건 패턴이 아니라 노이즈입니다.

제가 본 최악의 사례: 팬데믹 시기 사재기 데이터 3년치가 주석 하나 없이 학습 세트에 들어 있었습니다. 모델은 그 비정상적인 피크를 베이스라인으로 삼아 일상 안전재고를 계속 높게 유지했고, 악성 재고가 통로 두 개를 가득 채웠습니다. 그 기간을 태깅하고 가중치를 낮추자 예측이 현실로 돌아왔습니다.

놓치기 쉬운 차원이 하나 더 있습니다. 공급 측 이벤트입니다. 공급사의 납기 지연, 항만 파업으로 입고가 3주 밀리는 상황 — 이런 건 매출 곡선에 설명 안 되는 구멍을 냅니다. 모델은 "상품이 안 들어와서 못 팔았다"를 이해하지 못합니다. 그냥 "그달에 이 SKU를 아무도 안 샀다"고 배울 뿐이죠. 그래서 이벤트 캘린더에는 프로모션만 들어 있으면 안 됩니다. 주요 공급 차질과 입고 이상도 기록하세요. 양쪽 다 태깅하지 않으면 그림은 계속 불완전합니다.

점검 방법: 과거 변동이 가장 극심했던 SKU-월 상위 10개를 뽑아 현장 팀에 무슨 일이 있었는지 물어보세요. 절반 이상을 설명할 수 있는데 시스템에는 그 중 하나도 기록되어 있지 않다면, 이벤트 캘린더는 비어 있는 겁니다. 이벤트 태깅을 잡는 데는 현장 팀 설명 10분, 데이터팀 작업 2주면 충분합니다. 충분히 투자할 가치가 있죠.

그렇다면 모델 탓인 경우는 언제인가?

세 가지 점검이 다 통과했다면 — 마스터 데이터가 완전하고, 지표가 깨끗하고, 이벤트가 태깅되어 있는데도 예측이 틀린다면 — 그때야 비로소 모델 얘기를 합시다. 저도 가장 먼저 동의하겠습니다.

진짜 모델 문제는 이렇게 생겼습니다. 데이터는 깨끗한데 단순한 모델과 복잡한 모델의 성능이 비슷하고, 오히려 단순한 쪽이 살짝 앞서는 경우요. 혹은 수요 분포가 구조적으로 바뀌었는데 — 예를 들어 사업이 도매에서 소매로, 오프라인에서 온라인으로 이동했는데 — 구 모델이 이미 사라진 세상의 규칙을 배워버린 경우죠.

특성 공학(feature engineering)이 부족한 경우도 있습니다. 매출 시계열만 모델에 먹이면서 가격, 재고 위치, 리드타임 — 현장에서 실제로 돌아가는 특징들을 빼먹는 거죠. 이건 "알고리즘이 틀렸다"가 아니라 "모델러가 창고를 모른다"에 가깝습니다. 알고리즘을 바꾸는 건 소용없고, 보충을 이해하는 사람을 데려와야 합니다.

제 경험상 이 분야에서는 특성(feature)이 알고리즘을 거의 항상 이깁니다. 보충 발주 로직을 이해하는 플래너 + 평범한 회귀분석이면, 창고 바닥을 밟아본 적 없는 사람이 튜닝한 화려한 모델보다 대개 나은 결과가 나옵니다. 창고 수요를 움직이는 요인은 구체적입니다. 프로모션 캘린더, 미출고 주문, 계절성, 공급사 리드타임 변동성. 이걸 특성으로 만들면 어떤 아키텍처 교체보다 멀리 갑니다.

제 원칙은 간단합니다. 같은 깨끗한 데이터셋에서 세 가지 모델이 비슷한 점수를 낸다면, 병목은 모델이 아닙니다. 더러운 데이터로 모델 선정을 튜닝하는 건 비싸게 시간만 태우는 일입니다.

당장 쓸 수 있는 데이터 정제 체크리스트

진단은 끝났습니다. 이제 청소하러 가죠. 순서대로, 건너뛰기 없이:

  • 마스터 데이터: 모든 SKU에 카테고리, 계절성, 라이프사이클, 대체관계 필드 입력, 결측률 5퍼센트 이하
  • 지표: 품절 기간의 실제 수요를 복원(최소한 플래그라도 표시), 내부 이동 출고 제외, 순매출로 학습
  • 이벤트: 이벤트 캘린더 구축 — 프로모션, 클리어런스, 이상 기후, 일회성 대량 주문, 전부 태깅
  • 집계 단위(granularity): 예측 단위(SKU-DC-주)가 보충 발주 의사결정 단위와 일치하는지 확인. 단위가 틀리면 예측이 맞아도 소용없습니다
  • 백테스트: 정제된 데이터로 3개월 백테스트를 돌리고, 가동 전 오차 분포를 검토

이 다섯 단계를 끝낸 창고 대부분이 재미있는 걸 발견합니다. 구 모델이 갑자기 "똑똑해졌다"는 거죠. 모델이 바보였던 게 아닙니다. 오타투성이 교과서를 읽고 있었던 것뿐입니다.

집에 가져갈 자가진단 질문 하나: 지금 예측 모델에 먹이고 있는 과거 판매 데이터에서, 어떤 행이 실제 수요이고 어떤 행이 품절이고 어떤 행이 내부 이동인지 구분할 수 있습니까? 구분이 안 된다면 모델을 바꾸는 데 서두르지 마세요. 세 가지를 먼저 분리하는 게 우선입니다. 이 질문에 답이 나오면 나쁜 예측의 미스터리는 대부분 풀립니다.

영어판 번역본입니다. 내용이 다를 경우 영어판을 우선합니다.