사쿠의 데이터 블로그

LTV 예측하기2 - 개선사항 적용 본문

카테고리 없음

LTV 예측하기2 - 개선사항 적용

토스트먹어 2020. 6. 7. 15:30

이전 포스팅 LTV 예측하기 에서는 간략하게 LTV에 대한 개념예측이 필요한 이유에 대해 다뤄보았습니다. 참고한 사례 NCSOFT & DEVSISTERS는 데이터 분석을 잘 활용하는 기업으로, 서비스 중인 게임의 특성에 맞게 활용하는 모습을 볼 수 있었습니다. 이 방법은 단기간 LTV 예측에서 좋은 성과를 보이고, 실험을 진행해본 결과 만족할 만한 수준이었습니다.  이번 포스팅에서는 제가 두 사례를 참고하여 장기간 예측에 어떻게 활용을 하였는지 이야기 해보려 합니다.

 

글의 순서 입니다

LTV 예측하기 - 유리함수 fitting
ARPU - Feature Engineering
Summary

 

LTV 예측하기 - 유리함수 fitting

LTV는 Life Time Value의 약자로 쉽게 말해, 고객이 일생동안 회사에 안겨주는 가치로 생각할 수 있습니다. 하지만 이전에서 살펴본봐와 같이 유저 개개인의 LTV를 구하기엔 현실적으로 어려움이 많아, 가입일자가 같은 유저끼리 묶어 계산을 하곤 합니다. 수식으로 표현을 해보면 아래와 같습니다.

가입일자가 동일한 유저를 대상으로 LTV 계산하는 방법

이전 포스팅에서는 Retention을 sGB방식으로 예측했었습니다. 자사 게임 기준으로 이 방법은 론칭 초반 예측은 꽤나 준수했지만 론칭 후반으로 갈수록, 예측 정확도가 매우 떨어지는 경향이 있었습니다. 이에 보완책으로 유리함수 fitting과 ARPU에 Feature Engineering을 진행했고 그 방법을 자세히 소개하려 합니다.

주요 용어 소개

ARPU: 여기서는 ARPDAU와 같은 의미로 일 평균 결제금액을 뜻함
NRU: 신규 가입 유저 수
Retention_i : 가입후 i일이 지난 뒤, 들어온 NRU의 비율
(ex: 100명의 NRU중 3일뒤 50명이 접속했다면 Retention_3은 50%가 된다)

 

X축: 가입 후 경과한 일자, Y축: i일자에 들어론 NRU의 비율

Retention fitting 과정 Python 코드로 확인

from scipy.optimize import curve_fit

# Ratio Function 정의
def func(x, b, c):
    return 1 / (b * x + c)

yn = 현재 가지고 있는 Retention 데이터
x = 크기가 yn인 벡터 (ex: 0 ~ yn)

## curve_fit을 하고 best fit model의 결과를 출력
popt, pcov = curve_fit(func, x, yn)
 # popt: array([0.5, 1.1])와 같은 계수 출력

## 예측 일자 지정
x_predict_range = np.arange(0, predict_date) # 30일 예측 시, predict_date = 30 지정
y_predict = func(x_predict_range, * popt)

위 방식으로 Retention을 추정하게 된다면 유리 함수 뿐만 아니라 다양한 함수 fitting이 가능합니다. 

다양한 함수 fitting이 가능하다

 

ARPU - Feature Engineering

 다음으로 ARPU에 대한 내용입니다. ARPU는 Retention과 달리, 예측이 힘들기 때문에 이동 평균값으로 대체하여 사용하곤 했습니다. 하지만 이 방법은 심각한 단점이 존재 합니다. 90, 120일 등 장기간 예측 시에도 변하지 않고 고정된 값을 계속 사용한다는 점 입니다. 실제 데이터를 살펴보면 ARPU는 Retention처럼은 아니지만 시간이 지날 수록 감소하는 모습을 볼 수 있습니다. 왜냐하면 Retention이 낮아질 수록(=방문하는 유저수가 줄었다) 평균 결제 금액도 줄어들기 마련입니다. 

 이에, ARPU에 Discount factor를 도입하기로 했습니다. 시간이 지날 수록 ARPU가 자연스레 낮아질 수 있도록 하기 위해서 입니다. Discount factor는 시간이 경과한 만큼 지수배 만큼 감소하게 만들어 적용했으며 아래 그림 처럼 만약, ARPU가 3,000원 이었다면 기존에는 이 값이 계속해서 같은 값이었다면 이제는 서서히 감소하게끔 만들었습니다.

ARPU에 discount factor 적용

추가로, ARPU는 평균 결제금액 입니다. 역산을 해본다면 총 매출액이 나올 수 있는데요, 그런데 이 가격이 현재 판매중인 상품 중 가장 저렴한 상품보다 낮다면 ARPU를 0으로 치환해주는 작업도 추가 했습니다.

 

이제 결과를 확인해 보겠습니다. 

Y: LTV,  X: 일자

위 그림은 실제 데이터에 noise를 곱했습니다. 

데이터가 있는 실제 값은 파란색으로, 급격히 0으로 떨어지는 부분은 관측 데이터가 없는 상황입니다.

주황색은 기존 ARPU값을 유지 했을 때이며, 하강하지 않고 상승하는 모습을 확인 할 수 있습니다. 이는 Retention은 감소 했지만 ARPU는 계속해서 그 값을 유지 했기 때문으로 적절한 discount factor가 필요함을 알 수 있습니다. 다음으로 real값이 0인 부분을 보면 주황색은 어떤 경향을 보이지 않고 마지막에 예측했던 그 값을 그대로 유지하는 것으로 보입니다.

초록색은 ARPU에 discount factor와 최소 물품 가격비교를 적용한 그림입니다. 주황색 보다는 경향을 잘 따라가는 것 처럼 보이며, real값이 0인 부분에서도 주황색 보다는 합리적으로 예측을 잘 했다고 볼 수 있을 것 같습니다. 

 

Summary

Discount factor별, fitting 함수별 구체적인 성능비교를 하기에는 LTV관련 데이터라 말씀드리기 어렵지만, 비교적 간단한 방법을 이용해 LTV 예측에 도움이 될 수 있었습니다. 

궁금하신 내용이 있다면 질문 부탁드립니다.