구독 플랫폼의 LTV(CLV)를 계산해 보자
LTV(Lifetime Value) 혹은 CLV(Customer Lifetime Value)는 이미 많은 마케터분들께서 활용하고 계실 것입니다. 대부분 CAC와 비교를 통해 마케팅 비용 측정 등에 사용하실 텐데요.
사실 유저가 생애동안 우리에게 지출할 금액은 마케터에게만 중요한 것은 아닙니다. 제가 속한 제품팀에서도 전환율 감소에 따른 손해액을 산정하거나, 예상되는 유저 증가에 따른 이익을 계산해 보려면 정량화된 유저의 가치가 필요한 법입니다.
그리고 유저의 가치를 가장 쉽게 나타내는 방법이 CLV입니다.(여기서는 LTV와 동일하게 사용하겠습니다) 유저의 가치는 유저가 지불할 돈 그 이상이겠지만, 가장 직관적이고 빠르게 가치 계산이 된다는 장점이 있겠습니다.
그렇다면 제가 CLV를 구했던 과정을 말씀드려 보도록 하겠습니다.
기업 형태에 따라 다르겠지만, 구독 플랫폼에서는 일반적으로 기대되는 CLV의 값(Expectaion of CLV, 줄여서 E(CLV))을 다음과 같이 측정할 수 있습니다.
처음 보는 수식이라 당황하실 수도 있지만 전혀 어려운 식이 아닙니다. 천천히 하나씩 볼까요?
먼저 m은 구독 시 평균적으로 지불하는 금액입니다. 월 구독료가 9,000원이라고 가정한다면, 프로모션 등을 통한 할인을 제외하고 쉽게 9,000원으로 가정해 볼 수 있습니다.
S(t)는 생존 함수입니다. 생존율은 시간이 지나며 깎이기 마련인데요, 그 생존율이 깎여나가는 제품마다의 패턴이라고 간단하게 이해하시면 됩니다.
d는 화폐가치 하락률입니다. 어제 들어온 유저가 얼마나 사용할지는 모르기 때문에 생존율은 예측을 할 수밖에 없는데요, 미래의 화폐가치는 지금과 다르기 때문에 시간이 갈수록 줄어드는 화폐하락률을 계산에 넣은 것입니다.
t는 시간입니다. 월간 구독을 한다면 t개월일 수도 있고, 연간 구독이라면 t년이라고 할 수 있습니다.
자, 아직도 많이 헷갈릴 수 있을 텐데요. 더 쉬운 이해를 위해 예시를 들어보겠습니다. 화폐가치 하락은 편의상 빼고 진행하도록 하겠습니다.
위와 같은 생존 그래프를 가진 제품이 있다고 가정해 봅시다. 시간이 갈수록 생존율이 줄고 있습니다. 초반에는 빠르게 감소하지만 시간이 갈수록 충성유저가 남아 이탈이 감소하는 형태를 보이고 있네요. 그리고 이 점들을 이으면 어떠한 선을 만들 수 있을 것 같습니다. 이를 우리는 '패턴이 있다'고 말하는 것입니다.
어떤 패턴이냐고요? 그건 아직 알 수 없습니다. 그래서 S(t)라고 표현할 뿐입니다. t가 지날수록 어떠한 값을 보일 텐데 아직은 모릅니다. 이를 우선 S(t)라고 하기로 한 것입니다.
위 그래프에서 M+0인 경우의 생존율은 당연히 100%, M+1인 경우에는 78%, M+2는 60%, M+3는 48%...로 감소하고 있습니다.
M+0일 때 모든 유저는 9,000원을 지불할 것입니다. M+1인 경우엔 어떨까요? 78%의 유저는 9,000원을 지불할 것이고, 나머지 22%는 지불하지 않겠지요? 즉, 평균적인 유저 1명의 지불 금액은 9,000원 X 0.78이 될 것입니다. 그렇게 9,000원 X 0.60...0.48 곱해나갈 것입니다. 언제까지? 평생 가치니깐 무한히 말입니다!
그렇다면, 유저가 평생 지불할 금액을 추측해 보자면
이렇게 표현해 볼 수 있을 것 같습니다. 그리고 이를 정리하자면
이렇게 정리할 수 있습니다. 즉, 유저가 지불할 평생 금액의 기댓값은 (평균적인 구독권 금액 X t시점의 생존율)을 t가 1~무한대까지 갔을 때까지 모두 더하면 되는 것입니다. 물론 t가 커질수록(시간이 지날수록) 생존율은 0에 수렴할 것이기 때문에 매우 작아지겠죠?
자 우리가 드디어 CLV를 구할 수 있을 것 같습니다. 하지만 문제가 하나가 남아있죠. 생존 함수 S(t)는 결국 예측을 해야 한다는 것입니다.
이제 예측을 해보도록 합시다.
(아래부터의 과정을 파이썬으로 구현하는 예시는 깃허브를 참고해 주세요.)
그렇다면 고객의 생존율을 어떻게 예측하면 될까요?
고객의 생존율을 예측하는 것은 곧, '우리의 고객이 어떤 패턴을 가지고 생존을 해나가는 것입니다.' 질문과 같습니다. 그리고 대부분의 제품에서 생존율은 시간이 갈수록 떨어지는 형태일 것입니다. 하지만 초반에 빠르게 이탈하는 유저가 있는 반면에, 오래 제품에 머무는 충성 유저도 있을 것입니다. 이 때문에 초반엔 가파르게 생존율이 떨어지고, 갈수록 생존율은 완만하게 떨어지는 형태를 보일 가능성이 큽니다.
위와 같은 패턴은 구독 플랫폼에서 주로 보이는 패턴입니다. 이를 Discrete-Contractual Relationship이라고 하는데요. 아래와 같은 조건을 가지고 있습니다.
고객인 일정한 주기를 가지고 결제를 하며, 이를 플랫폼에서 확인할 수 있다.
고객의 인입과 이탈이 명확하고, 이를 플랫폼에서 확인할 수 있다.
보통은 구독 환경에서 볼 수 있는 고객 관계이지만, 꼭 구독이 아니더라도 보이는 패턴이 위의 그래프와 같은 생존율을 보이고 있다면 크게 문제없이 사용하는 경우도 존재하는 것 같습니다. 결국에 중요한 것은 예측의 정확도이니까요.(이 부분은 저도 정확한 기준을 확인하지는 못했습니다.)
그렇다면 이를 이를 간단한 함수를 통해 쉽게 적합해보도록 하겠습니다.
보시다시피 현재를 설명하는 데에는 큰 무리가 없어 보입니다.
하지만 우리가 관심 있어하는 것은 현재가 아닌 미래입니다. 적합한 결과를 토대로 미래를 예측해 보면 어떨까요?
보시다시피 미래에 있어서는 큰 오차를 보이고 있습니다. (물론 신뢰 구간은 고려하지 않은 결과이긴 하지만요.) 지수함수는 생존율이 0으로 수렴하지 않고 과도하게 평생 가치를 측정하게 됩니다.
이에 반해 n차식의 경우는 음수가 나오네요. 생존율은 음수가 나올 수 없으므로 이 또한 현실에 반영하기 힘들 것입니다.
이때 많이 활용하는 모델이 sBG(shifted beta geometric) 모델입니다. 이 모델을 자세히 설명할 순 없지만 기하분포라는 것을 보시면 대략적으로 이해가 쉬울 것입니다.
자, 위가 '기하분포'라는 것의 형태입니다. 기하분포라는 것은 특정한 확률이 있는 어떠한 사건이 처음 발생할 경우 보이는 패턴이라고 보시면 됩니다.
더 쉽게 예를 들자면, 강화 확률이 80%인 게임이 있다고 봅시다. 성공확률이 80%로 매우 높기 때문에 1트만에 강화에 성공한 유저가 가장 많겠죠? 2번째 성공한 유저도 있긴 할 것입니다. 그렇게 100트가 돼서야 강화에 드디어 성공할 확률은? 가능성이 0%는 아니겠지만 거의 0%에 수렴하는 매우 작은 수치일 것입니다.
여기서 강화 확률을 이탈확률이라고 봅시다. 이탈이 처음엔 많이 발생하겠지만, 갈수록 점점 작아지는 형태가 꼭 위에서 보았던 구독 플랫폼의 생존 확률과 상당히 흡사하다는 것을 볼 수 있습니다.
이 기하분포를 사용하는 것은 아니지만, 이와 비슷한 과정을 통해 예측해 나간다고 이해하시면 되겠습니다.
그렇다면 sBG모델을 사용하여 예측을 해보겠습니다.
파이썬을 통해 sBG를 사용하는 코드는 여기에서 확인하실 수 있습니다.
이전에 사용했던 함수처럼 아주 현재를 잘 반영하고 있는 것 같습니다. 미래는 어떨까요?
이전에 사용했던 함수와 다르게 음수가 나오지 않고, func1에 비해 0에 더 수렴하여 시간이 지날수록 생존율이 0에 수렴하는 모습을 보이고 있습니다.
우리가 원했던 형태가 드디어 나왔네요!
위에서 예측을 했지만, 아직 우리가 해결하지 못한 문제가 있습니다.
우리가 예측에 사용했던 데이터를 봅시다. M+12까지의 데이터를 사용했는데요, 즉, 우리는 12개월(M+0와 집계가 끝나지 않은 이번 달을 포함하면 14개월) 전 데이터로 예측을 한 것입니다!
당연히 12개월 전의 데이터는 현재와 트렌드가 많이 다르겠죠? 최근에 결제한 고객 그룹의 생존율과 같이 확인해 보겠습니다.
우리가 그동안 사용했던 23년 4월 결제 그룹과 23년 11월 결제 그룹의 생존율을 비교해 봅시다.
아쉽게도 시간이 지나며 11월 결제 그룹의 생존율이 더 떨어진 것이 확연히 보이네요.
만약에 4월 결제 그룹의 결과를 토대로 현재 사용한다면 잘못된 의사결정을 내릴 수도 있었겠습니다.
하지만, 11월의 데이터만 가지고 학습을 하면 위험할 수 있습니다. 데이터가 아직은 너무 적기 때문입니다. 위 그래프에서 차이를 더 벌릴지, 좁힐지는 아무도 모르는 일입니다. 따라서, 아래와 같은 문제점이 생기게 됩니다.
1. 과거의 코호트: 데이터는 많지만 최근의 트렌트를 반영하지 못함
2. 최근의 코호트: 데이터는 적지만 최근의 트렌드를 반영함
이 문제를 해결할 수 있는 정답이라는 것은 없습니다. 하지만 둘의 정보를 모두 사용하는 쪽이 좋겠군요. 최근의 트렌드도 반영하되, 과거의 방향성을 가지고 예측을 시키는 것이 좋겠습니다.
미래에 아예 새로운 패턴으로 생존율이 변화하는 것보다는, 과거의 패턴을 얼추 따라간다고 가정을 하는 것이 더 타당하겠지요?
그렇다면 이를 어떻게 반영할까요? 이는 본인의 프로덕트 전망에 따라 다를 것 같습니다. 최근의 지표가 더 중요하다고 생각한다면 최근의 지표에 가중평균을 두어 예측값을 혼용할 수도 있고, 최근 함수를 유리함수 등으로 적합시킨 결과를 과거 데이터에 섞어서 적합시킬 수도 있을 것입니다.
여기서는 가장 기본인 과거 데이터를 기반으로 한 예측과 최근 데이터를 기반으로 한 예측의 평균을 사용하여 둘의 정보를 모두 활용해 보겠습니다.
이를 수식으로 표현하면 다음과 같이 표현할 수 있겠습니다.
어려운 식 같지만 위의 E(CLV) 공식을 살짝 변형한 것뿐입니다. 각 10개의 코호트를 모두 예측시킨 다음에, t시점의 예측값을 총 코호트 개수인 10으로 나누면 되는 간단한 방법입니다.
이를 시각화해 보면 다음과 같습니다.
이렇게 과거와 최근 데이터를 각각 예측시킨 다음 그 평균을 사용하는 것입니다.
그렇다면 좀 더 많이 4월부터 12월까지의 코호트를 모두 반영해 보도록 할까요?
우리가 사용할 데이터입니다. 방향성은 비슷해 보이지만 코호트별로 조금씩의 편차는 있는 편입니다.
각 코호트별로 적합을 시켜보았습니다. 잘 반영이 된 것 같네요!
우리가 CLV를 추정하기 위해서는 t가 1부터 무한인 경우를 더해야 하지만, 편의상 200까지를 무한으로 가정하고 예측을 해보겠습니다.
M+25부터는 사실상 0에 수렴하는 생존율이 보이네요. 현실적인 형태로 모델링이 나오고 있는 것 같습니다.
그렇다면 각 코호트의 평균적인 생존함수를 구해보도록 하겠습니다.
이 생존함수를 사용하여 CLV 추정에 사용하면 끝입니다!
저는 위 방법을 기본으로 하여 CLV 추정에 활용하고 있는데요, 당연히 완벽한 것은 없습니다. 제가 활용하며 아쉬웠던 점들을 말씀드리겠습니다.
첫 번째로, sBG 모델만으로는 적합시키기 어려운 데이터들이 많습니다. 위 데이터는 이상적인 상황일 뿐, 많은 데이터에서 바로 사용하기는 어려운 경우가 꽤 많을 겁니다. sBG모델을 활용하되, 다양한 모델을 혼용하여 본인의 프로덕트에 맞는 생존 함수를 도출하는 것을 추천드립니다.
두 번째로, '평생' 가치이기 때문에 실제로 고객이 지불하는 수익보다 적을 확률이 큽니다. 위에서 M+200까지 구했습니다. 물론 미래의 데이터일수록 0에 수렴하는 값이 나오겠지만, 결국 확실치 않은 미래의 가치도 모두 합산된 값을 도출하게 됩니다. 따라서, 평생가치를 활용하는 것보다 자금 회수 기간 등을 고려하여 6개월, 1년 가치 등으로 일부 사용하는 것을 권장드립니다.
세 번째로, 점추정을 하였다는 것입니다. 예측 그래프를 그렸지만 사실 뒤로 갈수록 예측은 부정확할 가능성이 매우 큽니다. 적절한 신뢰구간 안에서 구간추정을 통한 CLV 추정을 하는 것을 권장드립니다.
마지막으로, 다양한 코호트를 반영해야 하는 것이 있습니다. 위에서는 결제 일자에 따른 코호트 분석을 진행하였지만, 실제로는 부활 유저, 구독을 여러 개 하는 유저 등 다양한 코호트별로 생존율이 다를 것입니다. 이를 더 고도화하여 사용하시길 바랍니다.
위 4가지가 주요하게 아쉬웠던 점이지만 이외에 더 유의해서 사용하는 것을 추천드립니다. CLV는 직접 매출과 관련된 의사결정을 하는데에 사용하기 때문에 신중한 추정은 필수입니다.
그럼 여기서 마치도록 하겠습니다.
감사합니다 :)
Github
지금까지의 과정을 파이썬으로 구현하는 과정은 깃허브(링크)에서 보실 수 있습니다.
Reference