이탈 예측은 '누가 떠날까'를 묻는 문제다
스팸 메일 분류기에서는 메일 한 통을 보고 "스팸인가, 아닌가"를 판단했다. 이번에는 대상을 조금 바꾸어 보자. 이제 모델은 메일이 아니라 고객을 바라본다. 그리고 이렇게 묻는다.
"이 고객은 가까운 미래에 우리 서비스를 떠날 가능성이 높은가?"
이것이 고객 이탈 예측이다.
고객 이탈은 영어로 churn이라고 부른다. 구독 서비스를 해지하거나, 쇼핑몰에 더 이상 방문하지 않거나, 앱을 설치해 놓고 한동안 사용하지 않는 상황을 말한다. 통신사라면 다른 통신사로 번호를 옮기는 것이 이탈일 수 있고, 온라인 강의 서비스라면 다음 달 결제를 하지 않는 것이 이탈일 수 있다. 게임이라면 14일 동안 접속하지 않은 사용자를 이탈 고객으로 볼 수도 있다.
여기서 중요한 점은 이탈 예측이 단순한 기술 문제가 아니라는 것이다. 모델이 "이 고객은 위험합니다"라고 알려 주면 회사는 그 고객에게 쿠폰을 보낼 수도 있고, 상담원이 먼저 연락할 수도 있고, 서비스 불편 사항을 우선 확인할 수도 있다. 즉 예측 결과가 곧 행동으로 이어진다.
지금까지 우리가 배운 머신러닝 흐름은 그대로 유지된다.
데이터를 준비한다. 고객의 행동을 특징으로 만든다. 모델이 이탈 여부를 예측한다. 실제 이탈 여부와 비교한다. 오차를 줄인다. 그리고 새로운 고객에게 적용한다.
다만 고객 이탈 예측에는 실무에서 특히 조심해야 할 부분이 있다. 바로 "무엇을 이탈이라고 할 것인가"와 "언제 예측할 것인가"이다. 이 두 가지를 대충 정하면, 모델은 그럴듯한 점수를 내지만 실제 업무에는 거의 쓸모가 없어질 수 있다.

먼저 이탈의 기준을 정해야 한다
머신러닝 프로젝트를 시작할 때 많은 사람이 먼저 모델을 고르려고 한다. 로지스틱 회귀를 쓸까, 랜덤포레스트를 쓸까, 그래디언트 부스팅을 쓸까 고민한다. 하지만 고객 이탈 예측에서는 그보다 먼저 해야 할 일이 있다. 정답을 정의하는 일이다.
분류 문제에서는 라벨이 필요하다. 스팸 분류기에서는 스팸과 정상이 라벨이었다. 타이타닉 생존 예측에서는 생존과 사망이 라벨이었다. 고객 이탈 예측에서는 이탈과 유지가 라벨이 된다.
문제는 이탈이 생각보다 애매하다는 데 있다.
한 고객이 한 달 동안 접속하지 않았다. 이 고객은 이탈한 것일까? 만약 매일 쓰는 메신저 앱이라면 이탈에 가까울 것이다. 하지만 계절마다 한 번씩 쓰는 여행 예약 서비스라면 한 달 미접속만으로 이탈이라고 단정하기 어렵다.
한 고객이 이번 달 결제를 하지 않았다. 이탈일까? 구독 서비스라면 그렇다. 하지만 쇼핑몰에서는 매달 구매하지 않는 고객도 많다. 어떤 고객은 3개월에 한 번 고가 상품을 살 수도 있다.
그래서 프로젝트 초반에는 다음과 같은 질문을 반드시 던져야 한다.
어떤 행동을 하면 이탈로 볼 것인가?
며칠 또는 몇 주 동안 행동이 없으면 이탈로 볼 것인가?
해지, 미결제, 미접속, 구매 중단 중 무엇을 기준으로 삼을 것인가?
모든 고객에게 같은 기준을 적용해도 되는가?
예를 들어 월 구독형 음악 서비스라면 "다음 결제일에 결제하지 않은 고객"을 이탈로 정의할 수 있다. 모바일 게임이라면 "최근 14일 동안 접속하지 않은 고객"을 이탈로 정의할 수 있다. 온라인 쇼핑몰이라면 "최근 90일 동안 구매하지 않은 고객"을 이탈로 정의할 수 있다.
정답은 업종마다 다르다. 중요한 것은 하나의 명확한 기준을 정하고, 모델이 그 기준을 예측하도록 만드는 것이다. 이탈의 정의가 흐릿하면 라벨도 흐릿해진다. 라벨이 흐릿하면 모델은 무엇을 배워야 하는지 알 수 없다.
예측 시점을 정하지 않으면 미래를 훔쳐보게 된다
이탈 기준을 정했다면 다음으로 예측 시점을 정해야 한다. 이 부분은 데이터 누수와도 깊게 연결된다.
예를 들어 우리가 "앞으로 30일 안에 이탈할 고객"을 예측하고 싶다고 해 보자. 그렇다면 모델이 사용할 수 있는 정보는 예측하는 날 이전의 정보뿐이어야 한다. 오늘이 5월 1일이라면, 모델은 5월 1일까지의 접속 기록, 구매 기록, 문의 기록만 사용할 수 있다. 5월 10일에 해지 문의를 했다는 사실이나 5월 20일에 결제 실패가 발생했다는 사실을 특징으로 넣으면 안 된다. 그것은 예측 시점에서는 아직 알 수 없는 미래 정보다.
실무에서는 보통 시간을 두 구간으로 나누어 생각한다. 하나는 관찰 기간이고, 다른 하나는 예측 기간이다.
관찰 기간은 모델이 고객의 행동을 살펴보는 기간이다. 예를 들어 최근 90일 동안의 접속 횟수, 결제 금액, 고객 문의 횟수, 장바구니 사용 횟수 등을 본다. 예측 기간은 우리가 맞히고 싶은 미래 기간이다. 예를 들어 앞으로 30일 안에 이탈할지 여부를 라벨로 만든다.
이 구조를 문장으로 쓰면 다음과 같다.
"오늘을 기준으로 과거 90일 동안의 행동을 보고, 앞으로 30일 안에 이탈할 고객을 예측한다."
이 한 문장이 고객 이탈 예측 프로젝트의 뼈대다. 이 문장이 명확해야 데이터를 어떻게 자를지, 어떤 특징을 만들지, 어떤 라벨을 붙일지 결정할 수 있다.
예를 들어 2026년 5월 1일에 예측한다고 해 보자. 그러면 2026년 2월 1일부터 2026년 5월 1일까지를 관찰 기간으로 삼을 수 있다. 이 기간의 행동으로 특징을 만든다. 그리고 2026년 5월 2일부터 2026년 6월 1일까지 실제로 이탈했는지를 확인해 라벨을 만든다.
이렇게 하면 모델은 미래를 훔쳐보지 않는다. 예측 시점에 알 수 있었던 정보만 가지고 판단한다. 실무에서 믿을 수 있는 모델은 이렇게 시간의 경계를 지키는 모델이다.
고객 행동을 특징으로 바꾸기
모델은 고객을 사람처럼 직접 이해하지 못한다. 모델이 볼 수 있는 것은 숫자와 범주로 정리된 특징이다. 따라서 고객 이탈 예측의 핵심은 고객의 행동을 모델이 이해할 수 있는 형태로 바꾸는 데 있다.
가장 기본이 되는 특징은 이용 빈도다. 최근 30일 동안 몇 번 접속했는지, 최근 90일 동안 몇 번 구매했는지, 앱을 실행한 날짜가 며칠인지 같은 정보다. 자주 사용하는 고객은 보통 이탈 가능성이 낮고, 사용 빈도가 급격히 줄어든 고객은 이탈 가능성이 높을 수 있다.
다음으로 중요한 특징은 최근성이다. 최근성은 마지막 행동이 얼마나 가까운 과거에 있었는지를 뜻한다. 마지막 접속일이 어제인 고객과 마지막 접속일이 45일 전인 고객은 다르게 보아야 한다. 구매 횟수가 같더라도 최근에 활동한 고객과 오래전에 활동한 고객은 이탈 위험이 다를 수 있다.
결제 이력도 강력한 신호가 된다. 총 결제 금액, 최근 결제일, 결제 실패 횟수, 구독 등급, 할인 쿠폰 사용 여부, 환불 요청 여부는 고객의 상태를 보여 준다. 특히 구독 서비스에서는 결제 실패나 카드 만료 같은 정보가 이탈의 직접적인 전조가 되기도 한다.
문의 이력도 중요하다. 고객센터에 문의를 많이 한 고객은 서비스에 관심이 많은 고객일 수도 있지만, 불편을 많이 겪은 고객일 수도 있다. 단순 문의와 불만 문의를 구분할 수 있다면 더 좋다. 예를 들어 최근 30일 동안 불만성 문의가 3회 이상 발생했다면 이탈 위험이 높아질 수 있다.
고객 이탈 예측에서 자주 쓰는 특징을 정리하면 다음과 같다.
이용 행동: 접속 횟수, 사용 일수, 세션 길이, 주요 기능 사용 횟수
최근성: 마지막 접속 후 지난 일수, 마지막 구매 후 지난 일수, 마지막 문의 후 지난 일수
결제 정보: 총 결제 금액, 최근 결제 금액, 결제 실패 횟수, 구독 등급, 할인 사용 여부
변화량: 이전 30일 대비 최근 30일 접속 감소율, 구매 감소율, 사용 시간 변화
문의 이력: 문의 횟수, 불만 문의 횟수, 환불 요청 여부, 처리 지연 경험
고객 속성: 가입 기간, 유입 경로, 사용 기기, 지역, 선택한 요금제
여기서 특히 눈여겨볼 것은 변화량이다. 단순히 접속 횟수가 적은 고객보다, 원래 많이 쓰다가 갑자기 줄어든 고객이 더 위험할 수 있다. 예를 들어 한 고객은 원래부터 한 달에 두 번만 접속했다. 다른 고객은 매일 접속하다가 최근 2주 동안 한 번도 접속하지 않았다. 두 고객의 최근 접속 횟수만 보면 둘 다 낮아 보일 수 있지만, 두 번째 고객의 변화는 훨씬 더 강한 경고 신호다.
좋은 특징은 고객의 현재 상태뿐 아니라 흐름을 담는다. 고객이 우리 서비스와 가까워지고 있는지, 멀어지고 있는지 모델이 볼 수 있게 해 주는 것이다.
작은 데이터 표를 상상해 보자
고객 이탈 예측용 데이터는 결국 한 행이 한 고객을 나타내는 표로 만들 수 있다. 예를 들어 다음과 같은 형태다.
| customer_id | days_since_last_login | logins_30d | payment_failed_90d | complaints_30d | spend_90d | churn |
|---|---|---|---|---|---|---|
| C001 | 3 | 18 | 0 | 0 | 59000 | 0 |
| C002 | 42 | 1 | 1 | 2 | 9900 | 1 |
| C003 | 10 | 6 | 0 | 1 | 32000 | 0 |
| C004 | 28 | 2 | 0 | 3 | 12000 | 1 |
여기서 churn은 라벨이다. 1은 이탈, 0은 유지라고 하자. 나머지 열은 특징이다. 모델은 이 표를 보고 어떤 고객이 이탈하는 경향이 있는지 배운다.
예를 들어 days_since_last_login이 클수록, 즉 마지막 접속 후 오래 지났을수록 이탈 가능성이 높아질 수 있다. payment_failed_90d가 1이면 최근 90일 안에 결제 실패가 있었다는 뜻이므로 위험 신호일 수 있다. complaints_30d가 많으면 불만 경험이 누적되었을 가능성이 있다.
물론 현실의 데이터는 이보다 훨씬 지저분하다. 고객 ID가 중복되어 있을 수도 있고, 접속 로그와 결제 로그가 서로 다른 테이블에 있을 수도 있다. 어떤 고객은 결제 정보가 없고, 어떤 고객은 문의 이력이 없다. 그래서 실제 프로젝트에서는 여러 데이터를 고객 단위로 모으고, 예측 시점 기준으로 집계해야 한다.
하지만 겁먹을 필요는 없다. 원리는 단순하다. 모델이 한 고객을 한 줄로 볼 수 있게 정리하면 된다. 그 한 줄 안에 예측 시점까지 알 수 있는 행동의 흔적을 담으면 된다.
기준 모델부터 시작하자
고객 이탈 예측에 처음부터 복잡한 모델을 사용할 필요는 없다. 오히려 처음에는 단순한 기준 모델을 만드는 것이 좋다. 기준 모델은 "이 정도는 넘어야 한다"는 출발점이다.
예를 들어 아주 단순한 규칙을 만들 수 있다.
"마지막 접속 후 30일이 넘은 고객은 이탈 위험 고객으로 본다."
이 규칙은 머신러닝 모델은 아니지만 좋은 비교 대상이 된다. 만약 복잡한 모델을 만들었는데 이 단순 규칙보다 성능이 나쁘다면, 아직 데이터나 특징 또는 평가 방식에 문제가 있을 수 있다.
그다음에는 로지스틱 회귀처럼 해석하기 쉬운 모델을 시도할 수 있다. 로지스틱 회귀는 각 특징이 이탈 확률에 어떤 방향으로 영향을 주는지 비교적 이해하기 쉽다. 예를 들어 마지막 접속 후 지난 일수가 늘어날수록 이탈 확률이 높아지는지, 최근 접속 횟수가 늘어날수록 이탈 확률이 낮아지는지 확인할 수 있다.
이후 랜덤포레스트나 그래디언트 부스팅으로 넘어갈 수 있다. 이런 모델은 특징 사이의 복잡한 관계를 더 잘 잡아낼 수 있다. 예를 들어 "접속 횟수는 적지만 결제 금액이 높은 고객"과 "접속 횟수도 적고 결제 금액도 낮은 고객"을 다르게 판단할 수 있다.
실무에서의 흐름은 대개 다음과 같다.
단순 규칙으로 기준 성능을 만든다.
로지스틱 회귀처럼 해석하기 쉬운 모델로 첫 번째 머신러닝 모델을 만든다.
트리 기반 모델로 성능 개선 가능성을 확인한다.
검증 데이터에서 평가하고, 테스트 데이터는 마지막 확인용으로 남긴다.
성능뿐 아니라 실제 캠페인에 쓸 수 있는지 함께 판단한다.
좋은 프로젝트는 화려한 모델 이름에서 시작하지 않는다. 좋은 문제 정의, 깨끗한 데이터, 공정한 평가, 실행 가능한 의사결정에서 시작한다.
아주 간단한 학습 흐름
이제 코드 흐름을 간단히 떠올려 보자. 실제 데이터가 이미 고객 단위 표로 정리되어 있다고 가정하겠다. 여기서는 개념을 보여 주는 것이 목적이므로, 세부 전처리 코드는 줄이고 전체 흐름에 집중하자.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix
from sklearn.ensemble import RandomForestClassifier
# 고객 단위로 정리된 데이터라고 가정한다.
df = pd.read_csv("customer_churn.csv")
features = [
"days_since_last_login",
"logins_30d",
"spend_90d",
"payment_failed_90d",
"complaints_30d",
"account_age_days"
]
X = df[features]
y = df["churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42,
stratify=y
)
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(confusion_matrix(y_test, pred))
print("precision:", precision_score(y_test, pred))
print("recall:", recall_score(y_test, pred))
print("f1:", f1_score(y_test, pred))여기서 stratify=y는 학습 데이터와 테스트 데이터에 이탈 고객의 비율이 비슷하게 들어가도록 돕는다. 고객 이탈 데이터는 보통 이탈 고객이 유지 고객보다 훨씬 적기 때문에 이런 설정이 중요하다.
물론 실제 업무에서는 시간 순서를 고려해 데이터를 나누는 편이 더 적절한 경우가 많다. 예를 들어 1월부터 9월까지의 데이터를 학습에 쓰고, 10월 데이터를 검증에 쓰고, 11월 데이터를 테스트에 쓰는 식이다. 고객 행동 데이터는 시간의 흐름이 중요하기 때문이다. 무작위로 섞으면 미래와 과거가 뒤섞여 성능이 실제보다 좋아 보일 수 있다.
이 장에서 기억해야 할 것은 코드 한 줄 한 줄이 아니라 구조다. 특징 X를 만들고, 라벨 y를 만들고, 학습 데이터로 모델을 훈련시키고, 테스트 데이터에서 예측한 뒤, 평가지표로 확인한다. 지금까지 반복해서 본 머신러닝의 기본 흐름이 고객 이탈 문제에도 그대로 적용된다.
고객 이탈 데이터는 대개 불균형하다
고객 이탈 예측에서 가장 흔한 함정은 정확도만 보는 것이다.
예를 들어 고객 10,000명 중 실제로 이탈한 고객이 500명이라고 해 보자. 이탈률은 5%다. 이때 어떤 모델이 모든 고객을 "이탈하지 않음"으로 예측하면 어떻게 될까?
이 모델은 이탈 고객 500명을 전부 놓친다. 하지만 유지 고객 9,500명은 모두 맞힌다. 정확도는 95%다.
겉으로 보면 훌륭해 보인다. 하지만 실제로는 아무 쓸모가 없다. 이탈할 고객을 단 한 명도 찾아내지 못했기 때문이다. 고객 이탈 예측의 목적은 유지 고객을 맞히는 것이 아니라, 떠날 가능성이 높은 고객을 미리 발견하는 데 있다.
그래서 이탈 예측에서는 정확도와 함께 재현율, 정밀도, F1 점수를 봐야 한다.
재현율은 실제 이탈 고객 중에서 모델이 얼마나 많이 찾아냈는지를 나타낸다. 실제로 떠날 고객 100명 중 70명을 위험 고객으로 잡아냈다면 재현율은 70%다. 이 값이 낮으면 많은 이탈 고객을 놓치게 된다.
정밀도는 모델이 이탈 위험이라고 예측한 고객 중 실제 이탈 고객이 얼마나 되는지를 나타낸다. 모델이 100명을 위험 고객으로 골랐는데 그중 40명이 실제로 이탈했다면 정밀도는 40%다. 이 값이 낮으면 캠페인 대상에 유지 고객이 많이 섞인다.
F1 점수는 정밀도와 재현율을 함께 고려한 지표다. 어느 한쪽만 극단적으로 높은 모델보다 두 값을 균형 있게 보는 데 도움이 된다.
고객 이탈 예측에서는 상황에 따라 더 중요한 지표가 달라진다. 만약 이탈 고객을 놓치는 비용이 매우 크다면 재현율이 중요하다. 예를 들어 고액 구독 고객이 떠나면 손실이 크기 때문에, 다소 많은 고객에게 연락하더라도 위험 고객을 최대한 잡아내고 싶을 수 있다.
반대로 캠페인 비용이 비싸거나 상담 인력이 제한되어 있다면 정밀도가 중요해진다. 모델이 위험하다고 찍은 고객 중 실제 이탈 가능성이 높은 고객만 추려야 하기 때문이다. 할인 쿠폰을 너무 많이 뿌리면 비용이 커지고, 원래 이탈하지 않을 고객에게 불필요한 혜택을 주게 될 수도 있다.
따라서 고객 이탈 예측의 평가는 단순히 "점수가 몇 점인가"가 아니라 "우리의 행동 비용과 목적에 맞는가"를 함께 봐야 한다.
혼동 행렬로 캠페인 결과를 상상해 보기
혼동 행렬은 모델의 예측을 네 가지 경우로 나누어 보여 준다. 고객 이탈 예측에서는 다음과 같이 해석할 수 있다.
| 구분 | 의미 | 비즈니스 해석 |
|---|---|---|
| 진짜 양성 | 이탈한다고 예측했고 실제로 이탈함 | 잘 찾아낸 위험 고객 |
| 거짓 양성 | 이탈한다고 예측했지만 실제로는 유지함 | 불필요하게 캠페인 대상이 된 고객 |
| 거짓 음성 | 이탈하지 않는다고 예측했지만 실제로 이탈함 | 놓쳐 버린 이탈 고객 |
| 진짜 음성 | 이탈하지 않는다고 예측했고 실제로 유지함 | 잘 제외한 안정 고객 |
이 표를 보면 평가 지표가 갑자기 현실적인 의미를 갖기 시작한다.
거짓 음성이 많다는 것은 떠날 고객을 놓쳤다는 뜻이다. 이 고객들에게 아무 조치도 하지 못했으므로 매출 손실이 발생할 수 있다. 거짓 양성이 많다는 것은 떠나지 않을 고객에게도 쿠폰이나 상담 리소스를 썼다는 뜻이다. 비용이 낭비될 수 있다.
스팸 분류에서는 정상 메일을 스팸으로 잘못 분류하면 사용자가 중요한 메일을 못 볼 수 있었다. 고객 이탈 예측에서도 비슷하다. 어떤 종류의 실수가 더 비싼지 생각해야 한다. 이탈 고객을 놓치는 것이 더 비싼가, 아니면 유지 고객에게 불필요한 혜택을 주는 것이 더 비싼가?
이 질문에 따라 모델의 임계값도 달라진다.
임계값은 비즈니스 결정이다
분류 모델은 보통 확률을 출력할 수 있다. 예를 들어 어떤 고객의 이탈 확률이 0.82라고 예측될 수 있고, 다른 고객은 0.17이라고 예측될 수 있다. 최종적으로 이 고객을 위험 고객으로 볼지 말지는 임계값으로 결정한다.
기본 임계값은 흔히 0.5다. 이탈 확률이 0.5 이상이면 이탈 위험 고객, 0.5 미만이면 유지 고객으로 분류한다. 하지만 고객 이탈 예측에서 0.5가 항상 좋은 기준은 아니다.
이탈 고객이 전체의 5%뿐인 데이터에서는 모델이 0.5 이상의 확률을 주는 고객이 매우 적을 수 있다. 그러면 정밀도는 높아질 수 있지만 재현율이 낮아질 수 있다. 즉 정말 위험한 고객 중 일부만 잡아낸다.
반대로 임계값을 0.2로 낮추면 더 많은 고객을 위험 고객으로 분류한다. 재현율은 올라갈 가능성이 크지만, 정밀도는 낮아질 수 있다. 캠페인 대상이 늘어나고, 그 안에 실제로는 이탈하지 않을 고객도 많아질 수 있다.
그래서 임계값은 기술자가 혼자 정하는 숫자가 아니다. 비즈니스 상황과 함께 정해야 한다.
예를 들어 상담팀이 한 주에 1,000명에게만 연락할 수 있다면, 전체 고객을 확률순으로 정렬한 뒤 상위 1,000명을 캠페인 대상으로 삼을 수 있다. 이때 꼭 0.5라는 임계값을 고집할 필요는 없다. 예측 확률이 높은 고객부터 제한된 자원을 배분하는 것이 더 현실적이다.
할인 쿠폰 비용이 낮고 이탈 손실이 크다면 넓게 잡는 전략이 가능하다. 반대로 고가의 혜택을 제공해야 한다면 아주 위험한 고객만 좁게 잡아야 한다.
모델의 확률은 답안지가 아니라 우선순위표에 가깝다. 고객 이탈 예측의 진짜 가치는 "누구부터 대응할 것인가"를 정하는 데 있다.
예측 결과를 고객 유지 캠페인으로 연결하기
모델을 만들고 평가했다면 이제 가장 중요한 질문이 남는다.
"그래서 이 예측으로 무엇을 할 것인가?"
고객 이탈 예측은 예측 자체가 목적이 아니다. 예측을 바탕으로 고객 이탈을 줄이는 것이 목적이다. 따라서 모델 결과는 실제 행동으로 연결되어야 한다.
가장 단순한 활용 방법은 위험 고객 목록을 만드는 것이다. 모델이 예측한 이탈 확률을 기준으로 고객을 정렬하고, 상위 고객에게 유지 캠페인을 진행한다. 예를 들어 상위 5% 고객에게 맞춤 쿠폰을 보내거나, 상위 1% 고액 고객에게 상담원이 직접 연락할 수 있다.
조금 더 나아가면 위험 원인에 따라 대응을 다르게 할 수 있다. 결제 실패가 주요 신호인 고객에게는 결제 수단 업데이트 안내를 보내는 것이 좋다. 최근 사용량이 급감한 고객에게는 새 기능 소개나 사용 가이드를 제공할 수 있다. 불만 문의가 많았던 고객에게는 사과 메시지나 우선 지원을 제공하는 것이 더 적절할 수 있다.
고객 유지 전략은 보통 다음과 같이 나눌 수 있다.
저비용 자동 캠페인: 이메일, 앱 푸시, 문자, 쿠폰 알림
중간 수준 대응: 맞춤 혜택, 사용 가이드, 설문 요청, 결제 문제 안내
고비용 집중 대응: 상담원 연락, 전담 매니저 배정, 특별 할인, 불만 우선 처리
모든 고객에게 같은 혜택을 주는 것은 비효율적이다. 이탈 위험이 낮은 고객에게 큰 할인을 주면 비용만 늘어난다. 이탈 위험이 높은 고객에게 너무 약한 메시지를 보내면 효과가 없을 수 있다. 모델은 고객을 나누고, 자원을 배분하는 데 도움을 준다.
다만 주의할 점도 있다. 모델이 "이탈 위험이 높다"고 말한다고 해서 무조건 큰 할인을 주는 것이 정답은 아니다. 고객이 할인에 익숙해지면 정가로 결제하지 않으려 할 수 있다. 또한 어떤 고객은 가격 때문이 아니라 서비스 품질 때문에 떠나려는 것일 수 있다. 이런 고객에게 쿠폰만 보내면 문제를 해결하지 못한다.
그래서 예측 모델은 캠페인 실험과 함께 움직여야 한다. 위험 고객에게 어떤 조치를 했을 때 실제 이탈률이 줄어드는지 확인해야 한다. 모델은 "누가 위험한가"를 알려 주지만, "어떤 처방이 효과적인가"는 별도의 실험으로 검증해야 한다.
상위 위험 고객을 보는 방식
고객 이탈 예측 모델을 실무에 적용할 때는 전체 정확도보다 상위 위험군의 품질이 더 중요할 때가 많다. 예를 들어 고객이 100만 명인데 마케팅팀이 이번 주에 캠페인을 보낼 수 있는 대상이 5만 명이라면, 중요한 것은 전체 100만 명에 대한 평균 성능이 아니다. 예측 확률 상위 5만 명 안에 실제 이탈 고객이 얼마나 많이 들어 있는지가 중요하다.
이때 고객을 예측 확률순으로 정렬한 뒤 구간별로 볼 수 있다. 상위 10% 고객의 실제 이탈률이 전체 평균보다 얼마나 높은지 확인하는 식이다.
예를 들어 전체 고객의 이탈률이 5%인데, 모델이 뽑은 상위 10% 고객의 실제 이탈률이 22%라면 모델은 꽤 쓸모 있는 우선순위를 만든 것이다. 아무 고객이나 무작위로 고르면 100명 중 5명 정도가 이탈 고객이지만, 모델 상위군을 고르면 100명 중 22명이 이탈 고객인 셈이다.
이 관점은 실무자에게 이해시키기 쉽다. "우리 모델의 F1 점수가 0.43입니다"라고 말하면 낯설게 느낄 수 있다. 하지만 "이 모델이 위험하다고 고른 상위 10% 고객은 평균보다 이탈률이 4배 이상 높습니다"라고 말하면 훨씬 직관적이다.
머신러닝 프로젝트에서는 기술 지표와 비즈니스 언어를 함께 사용할 줄 알아야 한다. 정밀도, 재현율, F1 점수는 모델을 개선하는 데 필요하다. 상위 위험군의 실제 이탈률, 캠페인 전환율, 유지된 매출은 의사결정자를 설득하는 데 필요하다.
데이터 누수를 다시 조심하자
고객 이탈 예측은 데이터 누수가 발생하기 쉬운 프로젝트다. 특히 이탈 이후에 생긴 정보를 특징으로 넣는 실수가 자주 발생한다.
예를 들어 해지 요청 여부라는 특징이 있다고 해 보자. 우리가 예측하려는 것이 "앞으로 30일 안에 해지할 고객"인데, 관찰 기간 이후에 발생한 해지 요청을 특징으로 넣으면 안 된다. 그것은 사실상 정답을 미리 알려 주는 정보다. 모델은 매우 높은 성능을 보일 수 있지만, 실제 예측 시점에서는 사용할 수 없다.
마지막 결제 상태도 조심해야 한다. 예측 시점 이후의 결제 실패나 환불 정보를 포함하면 미래 정보가 섞일 수 있다. 고객센터 문의도 마찬가지다. 이탈 직전에 발생한 문의가 예측 시점 이후라면 특징으로 넣을 수 없다.
집계 특징을 만들 때도 주의해야 한다. 전체 데이터의 평균이나 순위를 사용해 특징을 만들면 테스트 데이터 정보가 학습 과정에 섞일 수 있다. 예를 들어 전체 기간을 기준으로 고객 등급을 다시 계산한 뒤 과거 시점 예측에 사용하면, 당시에는 알 수 없던 미래 행동이 반영될 수 있다.
고객 이탈 프로젝트에서 지켜야 할 기준은 단순하다.
"예측하는 그날 실제로 알 수 있었던 정보인가?"
이 질문에 "아니오"라고 답해야 한다면 그 특징은 사용할 수 없다. 모델이 미래를 훔쳐보게 두면 테스트 점수는 올라가지만 실제 성과는 무너진다.
해석 가능한 모델이 필요한 이유
고객 이탈 예측에서는 모델의 성능만큼 해석 가능성도 중요하다. 담당자는 단순히 "이 고객은 위험합니다"라는 결과만 받고 싶어 하지 않는다. 왜 위험한지도 알고 싶어 한다.
예를 들어 모델이 어떤 고객에게 이탈 확률 78%를 부여했다고 하자. 이때 이유가 "최근 30일 접속 횟수 급감", "결제 실패 2회", "불만 문의 1회"라면 대응 방향이 보인다. 결제 안내를 보내고, 불만 문의 처리 상태를 확인하고, 다시 사용할 만한 기능을 소개할 수 있다.
반대로 이유를 전혀 알 수 없다면 현업 담당자는 움직이기 어렵다. 고객에게 연락하더라도 어떤 이야기를 해야 할지 모른다.
그래서 처음에는 로지스틱 회귀나 결정트리처럼 이해하기 쉬운 모델을 함께 실험하는 것이 좋다. 그래디언트 부스팅처럼 성능이 좋은 모델을 쓰더라도, 특징 중요도나 개별 예측의 주요 원인을 확인하는 절차를 두는 편이 좋다.
해석 가능성은 단지 설명을 위한 장식이 아니다. 좋은 해석은 더 나은 행동으로 이어진다. 모델이 위험을 감지하고, 사람이 원인을 이해하고, 조직이 적절한 대응을 선택할 때 고객 이탈 예측은 비로소 비즈니스 도구가 된다.
모델을 운영하면 성능은 변한다
고객 이탈 예측 모델은 한 번 만들고 끝나는 물건이 아니다. 시간이 지나면 고객 행동이 바뀐다. 가격 정책이 바뀔 수 있고, 경쟁 서비스가 등장할 수 있고, 계절 효과가 생길 수 있다. 앱의 UI가 바뀌면 접속 패턴도 달라질 수 있다.
예를 들어 어느 달에 대규모 할인 이벤트를 진행했다고 해 보자. 그 기간에 가입한 고객은 평소 고객과 행동이 다를 수 있다. 처음에는 많이 들어오지만 할인 기간이 끝나면 빠르게 이탈할 수도 있다. 과거 데이터로 학습한 모델이 이런 새로운 고객군을 잘 예측하지 못할 수 있다.
또 고객 유지 캠페인을 시작하면 데이터 자체가 바뀐다. 모델이 위험 고객을 찾아 쿠폰을 보내고, 그 결과 일부 고객이 이탈하지 않았다면, 이후 데이터에는 캠페인의 효과가 섞인다. 모델이 예측한 위험도와 실제 이탈 여부의 관계가 이전과 달라질 수 있다.
따라서 운영 중인 이탈 예측 모델은 정기적으로 점검해야 한다. 최근 데이터에서 재현율과 정밀도가 유지되는지, 상위 위험군의 실제 이탈률이 낮아지지는 않았는지, 특정 고객군에서만 성능이 나빠지지는 않는지 확인해야 한다.
모델은 한 번 만든 보고서가 아니라 계속 관리해야 하는 시스템이다. 고객이 변하면 데이터가 변하고, 데이터가 변하면 모델도 다시 점검해야 한다.
프로젝트를 하나의 흐름으로 정리하기
이제 고객 이탈 예측 프로젝트 전체를 하나의 이야기로 다시 묶어 보자.
먼저 이탈을 정의한다. 구독 해지인지, 미결제인지, 장기 미접속인지 정한다. 그리고 예측 시점을 정한다. 과거 몇 일의 행동을 보고 앞으로 몇 일 안의 이탈을 맞힐 것인지 결정한다.
그다음 데이터를 준비한다. 접속 로그, 결제 이력, 문의 이력, 고객 속성을 모은다. 예측 시점 이전의 정보만 사용해 고객 단위 특징을 만든다. 이용 빈도, 최근 접속일, 결제 실패, 문의 횟수, 사용량 변화 같은 신호를 숫자로 바꾼다.
이제 모델을 학습시킨다. 처음에는 단순 규칙과 로지스틱 회귀로 시작할 수 있다. 이후 랜덤포레스트나 그래디언트 부스팅으로 성능을 비교한다. 데이터가 불균형하므로 정확도만 보지 않고 정밀도, 재현율, F1 점수를 함께 본다.
마지막으로 예측 결과를 행동으로 연결한다. 이탈 확률이 높은 고객을 우선순위로 정렬하고, 캠페인 대상 규모와 비용에 맞게 임계값을 정한다. 결제 문제 고객, 사용량 감소 고객, 불만 문의 고객에게 서로 다른 대응을 설계한다. 그리고 실제 캠페인 결과를 다시 측정한다.
고객 이탈 예측은 머신러닝이 비즈니스 의사결정과 만나는 대표적인 예다. 모델은 고객의 미래를 완벽히 맞히는 점쟁이가 아니다. 하지만 많은 고객 중에서 더 주의 깊게 봐야 할 고객을 알려 주는 조기 경보 장치가 될 수 있다.
중요한 것은 예측을 행동으로 바꾸는 것이다. 모델이 위험을 말해 주었는데 아무 일도 하지 않는다면, 좋은 점수는 의미가 없다. 반대로 모델의 예측을 바탕으로 적절한 고객에게 적절한 시점에 적절한 도움을 줄 수 있다면, 머신러닝은 숫자 놀이를 넘어 실제 가치를 만든다.
다음 장에서는 정답이 있는 예측에서 잠시 벗어나, 고객을 비슷한 행동 패턴끼리 묶어 보는 프로젝트를 진행한다. 이번 장에서는 "누가 이탈할 가능성이 높은가"를 예측했다면, 다음 장에서는 "우리 고객들은 어떤 유형으로 나뉘는가"를 살펴볼 것이다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.