AI 매출 예측 프로젝트에서 흔히 빠지는 함정이 있다. 처음부터 완벽한 모델을 만들려는 것.
현실에서 첫 모델이 90%를 넘기는 경우는 드물다. 데이터가 지저분하고, 변수 선택이 틀리고, 모델 구조가 안 맞는다. 중요한 건 첫 모델의 정확도가 아니라, 반복 개선의 속도와 방향이다.
이전 글에서 소개한 프랜차이즈 매출 예측 프로젝트의 최종 적중률은 97.7%였다. 하지만 첫 모델은 **81.4%**였다. 이 글에서는 81%에서 97%로 올라간 6번의 과정을 기록한다.
6번의 반복
| 버전 | 적중률 | 오차율 | 무엇을 바꿨나 |
|---|---|---|---|
| 1차 | 81.4% | 18.6% | 과거 거래 실적만으로 예측 |
| 2차 | 91.1% | 8.9% | 검색 트렌드 + 프로필 정보 추가 |
| 3차 | 91.6% | 8.4% | 검색 트렌드 데이터 품질 개선 |
| 4차 | 92.3% | 7.7% | 예측 방법론 고도화 |
| 5차 | 96.1% | 3.9% | 두 모델 앙상블 |
| 최종 | 97.7% | 2.3% | 6개 데이터 소스 통합 + 최적화 |
1차 → 2차: 가장 큰 점프 (81% → 91%)
첫 모델은 단순했다. 과거 거래 실적만 넣었다. "이 파트너가 과거에 평균 얼마를 팔았으니, 다음에도 비슷할 것이다." 이것만으로 81.4%.
나쁘지 않은 출발이지만, 18.6%의 오차는 수천만 원 규모의 의사결정에 쓰기에는 부족하다.
2차에서 바꾼 것: 검색 트렌드와 파트너 프로필 정보를 추가했다. 성별·연령대별 검색량, 직업 유형, 소속사, 활동 기간 등.
이 한 번의 변경으로 적중률이 **81.4% → 91.1%**로 뛰었다. 오차율 기준으로 18.6% → 8.9%, 절반 이상 감소.
교훈: 외부 데이터의 위력. 내부 거래 데이터만으로는 "왜 이번에 더 팔렸는지"를 설명할 수 없다. 검색 트렌드는 "지금 이 파트너에 대한 시장의 관심이 어느 정도인가"를 반영하는 실시간 신호다. 이걸 넣자마자 정확도가 확 뛰었다.
2차 → 4차: 점진적 개선 (91% → 92%)
솔직히 말하면, 이 구간은 극적이지 않다. 3차에서 검색 트렌드 데이터의 수집 주기를 바꾸고, 4차에서 예측 파이프라인을 조정했다. 각각 0.5%p, 0.7%p 개선.
이 단계에서 시도했지만 효과가 없었던 것도 있다:
- 소셜 미디어 팔로워 수 → 거의 효과 없음 (검색 트렌드가 이미 반영)
- 과거 6개월 이상 오래된 거래 데이터 → 오히려 노이즈
- 더 복잡한 신경망 모델 → 그래디언트 부스팅 대비 개선 없음, 해석 불가
교훈: 데이터 품질 > 모델 복잡도. 이 구간에서 깨달은 것은, 새로운 변수를 추가하는 것보다 기존 변수의 품질을 높이는 것이 더 효과적이었다는 점이다. 검색 트렌드의 시간 윈도우를 9~16주로 최적화한 것이 대표적이다.
4차 → 5차: 앙상블의 위력 (92% → 96%)
여기서 두 번째 큰 점프가 나왔다. 92.3% → 96.1%.
바꾼 것은 모델 구조다. 기존에는 XGBoost 단일 모델이었는데, LightGBM을 별도로 학습시킨 뒤 두 모델의 예측값을 가중 평균했다.
같은 데이터를 넣어도 두 모델은 다른 패턴을 잡는다. XGBoost는 깊은 트리로 복잡한 상호작용을 포착하고, LightGBM은 잎 단위 성장(leaf-wise)으로 다른 분할 전략을 쓴다. 둘의 예측을 조합하면 개별 모델의 약점이 상쇄된다.
최적 가중치: LightGBM 65%, XGBoost 35%.
교훈: 앙상블은 '공짜 점심'에 가깝다. 데이터를 더 모으지 않아도, 변수를 더 만들지 않아도, 모델 두 개를 섞는 것만으로 4%p가 올랐다. 물론 아무 모델이나 섞는다고 되는 건 아니다. 서로 다른 방식으로 패턴을 잡는 모델이어야 앙상블 효과가 나온다.
5차 → 최종: 마지막 1.6%p (96% → 97.7%)
마지막 구간이 가장 어려웠다. 96%에서 97%로 가는 1%p는, 81%에서 91%로 가는 10%p보다 훨씬 힘들다.
최종 버전에서 추가한 34개의 새 변수:
- 공휴일/시즌 효과 — 연말, 방학 등 시기별 매출 변동 패턴
- 협업 간격 — 전 협업 종료 후 얼마나 지났는가 (간격이 길수록 매출 패턴 변화)
- 성별·연령대 집계 — 검색 트렌드를 젊은층/중년층/시니어로 묶어서 패턴 단순화
- 인기도 종합 점수 — 여러 신호를 하나의 인기도 지수로 통합
- 변동성 지표 — 과거 매출의 안정성/불안정성을 변수화 (불안정한 대상은 예측이 어렵다는 것을 모델에 알려줌)
이 34개 변수 중 가장 효과가 컸던 것은 변동성 지표였다. "이 대상은 과거 매출이 들쭉날쭉했다"는 정보를 모델에 넣어주면, 모델이 불확실한 대상에 대해 보수적으로 예측하게 된다. 이것만으로 극단적 오차가 줄었다.
전체 과정에서 배운 것
1. 첫 모델에 목숨 걸지 말 것. 81%로 시작해도 된다. 중요한 건 반복 개선의 구조가 있느냐다.
2. 가장 큰 정확도 점프는 "데이터 추가"와 "앙상블"에서 나왔다. 모델을 복잡하게 만드는 것, 하이퍼파라미터를 미세 조정하는 것은 기대만큼 효과가 크지 않았다.
3. 96% 이후의 1%p는 변수 엔지니어링에서 나왔다. 새로운 데이터 소스가 아니라, 기존 데이터를 더 정교하게 가공하는 것. 검색 트렌드를 성별·연령대별로 묶는다든지, 변동성을 변수화한다든지.
4. 시도했지만 효과 없었던 것을 기록하는 게 중요하다. 딥러닝, 소셜 팔로워 수, 오래된 이력 데이터 — 직관적으로는 도움이 될 것 같지만, 실제로는 아니었다. 이런 기록이 쌓여야 다음 프로젝트에서 같은 시행착오를 반복하지 않는다.
이 시스템이 예측을 틀리는 경우도 있다. 462개 중 4%는 오차 10%를 넘겼다. 다음 글에서 그 원인을 솔직하게 분석한다.