과거 이력에 대한 지원 중단: Trade Spend 최적화를 위한 수요 예측 앱 구축
요약
FMCG 분야의 트레이드 마케팅 예산 최적화를 위해 잠재 수요를 모델링하는 분석 파이프라인과 Next.js 앱을 구축했습니다. 우측 절단(right-censoring) 문제를 해결하기 위해 클러스터링과 분위 회귀를 결합한 앙상블 모델을 사용했습니다.
핵심 포인트
- 우측 절단 문제를 해결하기 위해 유사 고객 클러스터링과 분위 회귀를 활용한 앙상블 모델 구축
- OpenStreetMap POI 데이터를 활용하여 거리 감쇠 모델 기반의 공간적 특성 엔지니어링 수행
- 수확 체감 모델을 적용하여 지출 대비 증분 판매량을 극대화하는 예산 최적화 구현
- 단순 이력 기반 배분 대비 253%의 성과 향상 달성
솔직해집시다. FMCG (Fast-Moving Consumer Goods, 일용소비재) 분야에서 트레이드 마케팅 (trade marketing) 예산은 거의 항상 잘못 배분됩니다. 기업들은 실제 잠재력보다는 송장 이력 (invoice history)에 자금을 지원하는 경향이 있습니다.
DataStorm 7.0 경진대회를 위해 저희 팀, Stack Kings는 추측을 멈추고 잠재 수요 (latent demand)를 모델링하기로 결정했습니다. 저희는 스리랑카의 20,000개 소매점에 걸친 500만 LKR의 트레이드 스펜드 (trade spend)를 최적화하기 위해 분석 파이프라인과 Next.js 필드 앱을 구축했습니다. 단순한 예산 배분 방식 대비 +253%의 상승을 어떻게 달성했는지에 대한 가감 없는 분석을 소개합니다.
"빈 선반" 문제 (우측 절단, Right-Censoring)
여기서 핵심적인 데이터 과학 문제는 우측 절단 (right-censoring)이라고 불리는 개념입니다. 230만 개의 트랜잭션 (transaction) 기록에서 관찰된 월간 판매량은 단지 하한선일 뿐이었습니다. 만약 작은 상점의 판매량이 낮게 나타난다면, 그것은 고객 수요가 부족해서가 아니라 단순히 재고가 부족하거나 신용 제약 (credit-constrained) 때문일 수 있습니다.
이 때문에 표준 평균값은 상점의 실제 잠재력을 체계적으로 과소평가하게 됩니다. 상점이 정확히 언제 품절되었는지에 대한 엄격한 지표(저희에게는 없었습니다)가 필요한 Tobit과 같은 표준 교과서적 모델을 사용하는 대신, 저희는 앙상블 모델 (ensemble model)을 구축했습니다.
저희는 두 가지 접근 방식을 취했습니다:
-
유사 고객 클러스터링 (Lookalike Clustering): 유사한 매장들을 클러스터링하여 해당 그룹 내 상위 성과자들이 무엇을 달성하고 있는지 확인했습니다. 제약이 적은 상점들이 실제 한계치(ceiling)를 보여준다고 가정했습니다.
-
상위 꼬리 회귀 (Upper-Tail Regression): 평균이 아닌 상점의 특성을 기반으로 가능한 최대 수요를 추정하도록 설계된 특정 유형의 회귀 (Quantile Regression, 분위 회귀)를 사용했습니다.
이 두 추정치의 최댓값을 취함으로써 상점의 잠재력을 인위적으로 낮추지 않도록 보장했습니다.
현실 세계 매핑 (공간적 특성, Spatial Features)
모델에 실제 신호를 제공하기 위해, 저희는 OpenStreetMap의 POI (Points of Interest, 관심 지점)를 사용하여 공간적 특성 (spatial features)을 엔지니어링했습니다.
단순히 3km 반경 내에 상점이 몇 개 있는지 세는 것과 같은 임의적인 "평면적 디스크 (flat disk)" 카운트를 사용하는 대신, 저희는 거리 감쇠 모델 (distance-decay model)을 구현했습니다. 쉽게 말해, 200m 떨어진 버스 정류장은 2km 떨어진 정류장보다 유동 인구에 훨씬 더 큰 영향을 미친다는 뜻입니다.
저희는 위치를 계층 (tiers)별로 그룹화했습니다. 교통 시설과 음식점은 영향력이 "빠르게" 감소하는데, 이는 그 혜택을 얻으려면 바로 옆에 있어야 함을 의미합니다. 반면, 학교와 사원은 동네 전체에 걸쳐 더 넓고 "느리게" 퍼지는 영향력의 그물을 형성합니다.
예산의 모든 방울을 짜내기 (최적화 도구)
잠재력에 따라 판매점을 순위 매기는 것만으로는 부족합니다. 지출된 루피 (rupee)당 얻을 수 있는 증분 리터 (incremental liters)를 극대화해야 합니다.
저희는 판매 비용 (trade spend)에 따른 판매량 반응을 수확 체감 (diminishing returns)이 발생하는 곡선으로 모델링했습니다. 간단히 말해, 단일 상점에 더 많은 비용을 지출할수록, 다음 1루피로 얻을 수 있는 추가 판매량은 줄어듭니다.
서부 주 (Western Province)의 9,000개 판매점에 대해 이를 효율적으로 해결하기 위해, 저희는 해당 곡선을 직선 세그먼트 (straight-line segments)로 나누었습니다. 이를 통해 선형 계획법 (Linear Programming) 솔버를 사용하여 500만 LKR의 예산을 수학적으로 완벽하게 할당할 수 있었습니다. 그 결과는 어땠을까요? 상위 상점들에 예산을 균등하게 배분하는 기존의 직관적인 방식과 비교했을 때 253%라는 엄청난 상승을 기록했습니다.
현장 앱을 통한 신뢰 구축
현장 영업 사원들이 수치를 신뢰하지 않는다면 복잡한 최적화 도구는 무용지물입니다. 그들은 특정 상점이 왜 특정 예산을 받게 되었는지 알아야 합니다.
저희는 Next.js와 Postgres를 사용하여 실시간 판매점 인텔리전스 웹 앱 (Outlet Intelligence Web App)을 구축했습니다. 출력값을 설명하기 위해 설명 가능한 AI (XAI) 레이어를 추가했습니다. 이 레이어는 브라우저에서 실행되는 로컬 Ollama 프로세스 (gemma3:1b)를 사용하여 구조화된 SWOT 요약을 생성합니다. 로컬 AI가 오프라인 상태인 경우, Gemini 클라우드 API 또는 안전한 결정론적 템플릿 (deterministic template)으로 전환됩니다.
결정적으로, AI가 예측을 수행하는 것은 아닙니다. AI는 단지 미리 계산된 정교한 데이터를 쉬운 비즈니스 언어로 번역하여 영업 사원들이 현장에서 실제로 활용할 수 있도록 돕는 역할을 합니다.
데이터의 냉혹한 현실
데이터 엔지니어링 (Data engineering)은 화려하지 않습니다. 우리는 엄격한 메달리온 아키텍처 (Medallion architecture)를 구축했습니다. 지저분한 데이터를 조용히 삭제하지 않았습니다. 우리는 실패 사유 코드 (failure reason codes)를 사용하여 37,205개의 레코드를 명시적으로 격리 (quarantine)했습니다. 심지어 12월 거래가 전혀 없는 상점인 7,417개의 "블랙아웃 (blackout)" 매장을 유지하여, 이를 수요가 0인 것이 아니라 공급 신호 (supply signals)로 올바르게 처리했습니다.
실제 운영 중인 앱을 stackkings.inusha.me에서 확인해 보세요.
우리는 과거에 투자하지 않습니다. 우리는 잠재력에 투자합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기