카테고리 평균 주기로는 왜 부족한가

소진형 상품은 주기가 있는 것처럼 보이지만 그 주기는 사람마다 다릅니다. 같은 세제를 사도 4인 가구와 1인 가구의 소진 속도가 다르고, 같은 고객이라도 계절에 따라 사용량이 바뀝니다.

카테고리 단위 주기가 얼마나 갈리는지는 국내 민간 집계에서도 확인됩니다. 에이스카운터가 2020년 5월 25일부터 6월 21일까지 40여 개 사이트를 분석한 자료에서 식품·음료는 514일 이내 재구매 비중이 가장 높았고, 건강보조식품·뷰티·패션잡화는 13개월 이내, 생활용품은 3개월 이상이 가장 높았습니다. 표본이 특정 분석 솔루션 사용 사이트 40여 곳이고 2020년 데이터이므로 국내 공식 표준이 아니며, 우리 몰의 목표치가 아니라 카테고리별로 이만큼 갈린다는 참고로만 씁니다. 어느 카테고리에 속하는지만으로도 이렇게 갈린다면, 같은 카테고리 안에서 고객별 편차는 더 클 수밖에 없습니다.

무엇을 예측할지 먼저 정한다

설계 전에 예측 대상을 확정해야 합니다. 실무에서 갈리는 형태는 두 가지입니다.

하나는 분류 문제입니다. 각 고객에 대해 앞으로 30일 안에 해당 카테고리를 다시 살 것인지 아닌지를 맞히는 형태입니다. 출력이 확률이라 발송 대상 선정에 그대로 쓸 수 있고 구현이 쉽습니다. 다른 하나는 시점 예측입니다. 다음 구매까지 남은 일수 자체를 추정하는 형태로, 고객 이탈 예측에 쓰이는 생존분석 계열이 여기에 해당합니다. 고객 계약정보, 인구통계 정보, 접점·방문 이력 같은 상호작용 데이터를 통합해 고객별 이탈 시기를 예측하는 모델을 구성하는 방식이며, 한 국내 실증 연구에서는 ExtraSurvivalTrees 모델이 c-index 기준 약 75%의 예측 성능을 보였다고 보고됐습니다. 이 성능치는 해당 연구의 데이터셋 기준이라 다른 업종·데이터에서 그대로 재현되지 않습니다.

먼저 분류 형태로 시작해 운영에 붙이고, 발송 시점을 더 정밀하게 잡을 필요가 생겼을 때 시점 예측으로 넘어가는 순서가 실패 비용이 적습니다.

학습 데이터는 어떻게 만드나

필요한 원본은 고객 식별자, 주문 일시, 주문 상품과 그 카테고리, 수량·용량, 주문 금액입니다. 여기서 고객별 연속 주문 간격을 계산해 카테고리별 분포를 만듭니다. 이때 평균이 아니라 중앙값과 사분위수로 봐야 합니다. 아주 오래 뒤에 돌아온 소수 때문에 평균은 위로 밀립니다.

가장 흔한 오류는 관측 절단 처리입니다. 아직 재구매하지 않은 고객은 간격을 계산할 수 없다는 이유로 분모에서 빠지기 쉬운데, 그러면 남는 것은 재구매한 사람들뿐이라 주기가 실제보다 짧게 나오고 모델은 모두가 곧 돌아온다고 배웁니다. 관측 기간을 고정하고, 그 기간 안에 재구매 기회가 충분히 있었던 코호트만으로 학습 집합을 구성해야 합니다.

정답 라벨은 시점 기준으로 만듭니다. 기준일을 정해 그 이전 데이터로만 피처를 만들고, 기준일 이후 관찰 창에서 재구매가 있었는지를 라벨로 씁니다. 기준일 이후 정보가 피처에 섞이면 검증 성능은 좋아지고 운영 성능은 무너집니다.

어떤 피처를 넣나

출발점은 RFM입니다. 마지막 구매로부터 경과일, 기간 내 구매 빈도, 누적 구매액을 점수 또는 원시값으로 넣습니다. 소진형 카테고리에서는 여기에 소진 관점의 피처를 더합니다. 마지막 구매의 용량·수량, 직전 간격 대비 현재 경과일의 비율, 카테고리별 개인 중앙값 대비 경과일 비율이 대표적입니다. 마지막 값은 같은 30일이라도 평소 20일에 사는 고객과 90일에 사는 고객을 구분해 줍니다.

모델은 로지스틱 회귀, 랜덤포레스트, XGBoost가 흔히 쓰입니다. 어느 것이 항상 낫다고 말할 수 없고 데이터셋마다 결과가 달라지므로, 해석이 쉬운 로지스틱 회귀를 기준선으로 두고 트리 계열이 그보다 얼마나 나은지 비교하는 방식이 안전합니다.

성능은 무엇으로 평가하나

재구매하지 않는 고객이 다수인 불균형 데이터이므로 정확도만 보면 안 됩니다. 아무도 재구매하지 않는다고 예측하는 모델이 높은 정확도를 받을 수 있습니다. 실무 표준은 정밀도, 재현율, F1, ROC-AUC를 함께 보는 것입니다. 불균형이 심하면 SMOTE 같은 오버샘플링을 함께 적용합니다. 이때 오버샘플링은 학습 집합에만 적용하고 검증 집합에는 적용하지 않아야 성능이 부풀지 않습니다.

지표를 고르는 기준은 개입 비용입니다. 발송 비용이 낮고 놓치는 손실이 크면 재현율 쪽에 무게를 두고, 과발송이 수신거부와 채널 피로로 돌아오는 구조라면 정밀도 쪽으로 임계값을 올립니다. 확률 임계값은 모델과 별개로 운영에서 조정하는 값이므로 문서에 기록해 둡니다.

예측을 발송으로 연결할 때 무엇을 지켜야 하나

모델이 대상자를 뽑았더라도 발송 규칙은 별도입니다. 수신거부자, 동의 철회자, 이미 목적을 달성한 고객은 세그먼트 조건보다 먼저 평가되는 억제 조건으로 걸러야 하고, 동의 상태는 세그먼트 계산 시점이 아니라 발송 직전에 다시 조회해야 합니다.

메시지 성격도 확인합니다. 카카오 알림톡 심사 가이드는 정보성 메시지를 영리목적의 광고성 정보가 아닌 정보로 정의하고, 계약이나 거래 관계로 반드시 전달할 필요가 있는 정보를 예외로 봅니다. 소진 시점 안내는 정보성으로 설계할 여지가 있지만 할인 문구가 붙으면 광고성 판단으로 넘어갑니다. 광고성이라면 정보통신망법 제50조 제1항의 사전 동의와 제3항의 야간 별도 동의가 함께 걸립니다.

모델이 쓸모 있었는지 어떻게 확인하나

c-index나 ROC-AUC가 올랐다는 것은 모델이 나아졌다는 뜻이지 매출이 늘었다는 뜻이 아닙니다. 예측 기반 발송 대상 중 일부를 무작위로 떼어 발송하지 않는 홀드아웃을 두고, 같은 기간 두 군의 재구매율과 구매액을 비교해야 증분이 확인됩니다. 기존 규칙 기반 발송을 대조군으로 두고 모델 기반 발송과 비교하는 구성도 유효합니다.

재학습 주기도 미리 정합니다. 상품 구성이 바뀌거나 대용량 상품을 추가하면 소진 속도 자체가 달라져 이전 주기가 맞지 않게 됩니다. 분기마다 카테고리별 간격 분포를 다시 뽑아 모델이 학습한 분포와 비교하고, 차이가 크면 재학습하는 기준을 운영 문서에 적어 둡니다.