지금 고민은 5가지 이다.
0. 가중치는 어떻게 설계할지
1. 배치 점수와 실시간 점수를 어떻게 함께 운영할지
이탈률 요소
이탈률 등급
| 점수 기준 | |
|---|---|
| HIGH | 80~100 |
| MEDIUM | 50~80 |
| LOW | 0~50 |
**<배치로 결정=""> -> 상태 기반 **배치로>
- 요금제 3개월 동안 변경 이력 개수
- 약정 종료 남은 기간 ( 주단위) 0~52
- 가입 기간 (0~ )
- 요금제 제공량 대비 데이터 사용률 ( 모바일만)
- 상담 만족도 평균 평가 점수
**<실시간> -> 행동 기반 **실시간>
- 실시간 로그 :요금제 비교 횟수 , 해지 위약금 클릭
{
"event_id": 1000000000003,
"timestamp": "2026-03-05T12:03:00.000Z",
"event": "click",
"event_name": "click_compare",
"event_properties": {
"page_url": "<https://api.holliverse.site/api/v1/customer/compare>",
"target_id": 10,
"target_tags": ["영상OTT", "가성비", "가족결합"]
}
}
{
"event_id": 1000000000007,
"timestamp": "2026-03-05T12:07:00.000Z",
"event": "click",
"event_name": "click_penalty",
"event_properties": {
"page_url": "<https://api.holliverse.site/api/v1/customer/mypage/penalty>"
}
}
- 상담 중 부정 감정 + 해지 키워드 검출
가중치 설계 원칙
- 상태 기반 feature < 행동 기반 feature
행동이 실제 이탈의도에 더 가까움
- 행동 중에도,
비교 -> 위약금 조회 -> 해지 진입 순서로 강도가 올라감
-
상담 기반 signal은 감정 + 키워드 결합시 강한 신호
-
배치 feature는 기본 점수 + 실시간 점수는 가산 점수 이다.
2. 최종 점수
추천 구조
final_score = min(100, base_score + realtime_score)
- base_score : 배치 점수
- realtime_score : 실시간 가산 점수
- 100 초과 시 cap
배치 기반 Feature 가중치
행동보다 약하고, base score는 최대 55점이 되게 한다.
이유는 실시간 행동이 들어오면 High로 올라갈 수 있게 최대치를 정해둔다.
base_score max = 55
1) 계약기반 feature
- 약정 종료 남은 기간
| 남은 주 | 점수 |
|---|---|
| 0~2주 | +20 |
| 3~4주 | +16 |
| 5~8주 | +12 |
| 9~12주 | +8 |
| 13주 이상 | 0 |
이유 약정 종료는 telecom churn 연구에서 가장 강한 구조적 변수입니다.
- 가입 기간
| 가입 기간 | 점수 |
|---|---|
| 0~4주 | +10 |
| 1~3개월 | +6 |
| 3개월 이상 | 0 |
이유 초기 churn 구간.
2) 행동 feature
- 요금제 변경 이력 (3개월)
| 횟수 | 점수 |
|---|---|
| 0 | 0 |
| 1 | +5 |
| 2 | +8 |
| 3 이상 | +15 |
이유 요금제 변경은 가격 민감도 signal
3) 가격 대비 사용량 기반 feature
usage_ratio = 실제 사용 / 제공 데이터
| usage_ratio | 점수 |
|---|---|
| 0~10% | +15 |
| 10~30% | +12 |
| 30~50% | +8 |
| 50% 이상 | 0 |
이유 고객이 요금제를 과지불(overpay)하는 상태
4) 상담 만족도 feature
| 평균 점수 | 점수 |
|---|---|
| 1.0~1.9 | +15 |
| 2.0~2.9 | +10 |
| 3.0~3.9 | +5 |
| 4.0 이상 | 0 |
이유 CS dissatisfaction은 churn driver.
배치 점수 최대
20 + 10 + 15 + 15 + 15
≈ 75점
실시간 기반 Feature 가중치
실시간은 intent signal이라 점수를 더 부여를 한다. 추천 realtime_score max는 60으로 한다.
요금제 비교 (Click_compare)
문제 -> 클릭을 많이 눌렀을때의 제한 ?
정제 규칙: 같은 세션 30초 내 클릭 = 1회로 본다.
| 비교 세션 수 | 점수 |
|---|---|
| 1 | +8 |
| 2 | +12 |
| 3 이상 | +15 |
해지 위약금 조회
강한 signal
| 조회 횟수 | 점수 |
|---|---|
| 1 | +25 |
| 2 이상 | +35 |
상담이벤트 -> 키워드 + 감정 분석 점수
해지 프로세스 진입
여기가 retention trigger이다.
점수는 +40으로 두고 점수보다, 액션 트리거로서
조건을 final_score >=80이고, cance 하고 + 쿠폰 발급 이력이 없으면, => retention model 작동 -> 쿠폰 발급
| | | — |
최종 score
base_score ≈ 75
realtime_score ≈ 60
final_score = min(100, base + realtime)
그리고 위약금 조회, 해지 프로세스, 상담 + 키워드 이 세개가 강한 churn signal이다.
1) 배치 점수 = 기본 위험도
주 1회 계산을 해서 base_score를 만듭니다. 여기에 들어가는 것은 상태형 신호 입니다.
2) 실시간 점수
실시간 점수는 즉시 반응해야 하는 신호로, 이벤트 발생 시 delta_score를 만든다.
여기에 들어가는 것은 행동형 신호이다.
- 요금제 비교
- 요금제 변경 시도
- 위약금 조회
- 해지 프로세스 진입
- 상담 중 부정 감정 + 해지 키워드 검출
3) 최종 점수
erd에 들어가는 점수는 final_score = min(100, base_score + realtime_delta_score)로 한다.
내부 계산은 많이 하더라도, 0-100으로 cap 자르는 과정이 되어야한다.
상담 점수는 50% 감소, 60일후 제거
- 정적 base 점수 -> 이거는 고정
-> decay 정책
-
상담 점수
-
실시간 로그 점수
2. 클릭 로그를 어떻게 정제해서 무의미한 반복 클릭을 걸러낼지
이탈률 정제 원칙
1) 동일 이벤트의 짧은 시간 중복 클릭 제거