이탈위험 유저 예측모델
안녕하세요, Blux ML Research Engineer Simon입니다.
1편에서 솔루션에 탑재하기 위한 범용적인 이탈위험 유저 예측 모델을 제작하기 위해 어떤 부분을 고려하였는지 설명드렸다면, 이번 글에서는 구체적으로 어떤 개념을 사용하여 실험을 진행하였는지 공유드리려 합니다.
빠르게 지난글을 요약하면 다음과 같습니다.
✅ 고객사마다 다른 이탈유저 정의에 구속 받지 않기 위해 사용자가 서비스에 다시 돌아올 확률을 모델링 하자
✅ 매우 동적으로 나타나는 사용자의 행동 정보를 유연하게 표현할 수 있고, 비정형 데이터를 활용하기 쉬운 Deep Learning을 사용해보자
우선 주어진 상황을 확률모델로 표현하기 위해 이를 어떻게 확률의 용어로 표현할 수 있을지 고민해보았습니다. 사용자가 서비스 상에서 상호작용을 시작하는 것(재방문)을 사건(Event)으로 정의한다면, 사용자가 서비스에 다시 돌아오는 시간차를 확률변수로 정의할 수 있습니다. 즉, 다음 사건이 발생하기까지의 대기시간을 분포로 표현하면 사용자가 서비스에 다시 돌아올 확률을 구할 수 있게 됩니다. 이를 확률식으로 표현하면 다음과 같습니다.
확률변수 T는 사건 사이의 대기시간을 나타냅니다.
s는 사용자의 마지막 상호작용이 발생한 시점부터 현재시점까지 흐른 시간을 의미합니다.
이를 풀어 설명하면, 사용자가 마지막 상호작용을 한지 s시간이 지났을 때, t시간 뒤인 t+s에 사용자가 다시 상호작용을 진행할 확률이 됩니다.
일반적으로 다음 사건이 일어날 때까지의 대기시간에 대한 분포는 지수분포(Exponential Distribution)를 사용합니다. 이때, 지수분포를 사용하기 위해서는 일정 시간 동안 발생하는 사건의 횟수가 포아송 분포(Poisson Distribution)를 따라야합니다.
사건의 횟수를 포아송 분포를 통해 표현할 경우 단위구간(일주일, 한달 등)을 정의하고, 해당 구간 동안 사건이 발생한 횟수를 관측하여 사건이 발생하는 비율(rate)을 통해 분포를 표현합니다. 예를 들어 1주일 동안 7번의 재방문이 발생했다면 rate는 7이 됩니다.
이때, 포아송 분포를 따른다는 것은 사건이 다음과 같은 특성을 가질 것을 가정합니다.[1]
1. 사건은 독립적으로 발생한다. 즉, 이전의 상호작용이 다음 상호작용에 영향을 미치지 않는다.
2. 단위구간을 더 작은 구간으로 쪼개어도 사건이 발생하는 비율은 일정하다. 예를 들어 10일 동안 10번의 사건이 관측되었다면, 1일 동안 1번의 사건이 관측될 것이다.
저는 위 두 가정이 지수분포가 매우 동적으로 나타나는 사용자의 행동정보를 유연하게 표현할 수 없을 것이라 판단하였습니다. 그 근거는 다음과 같습니다.
1. 사용자는 과거의 행동에 영향을 받는다.
예를 들어 어떤 사용자가 특정 상품이 마음에 들어 해당 상품을 장바구니 넣은 다음 며칠 뒤 다시 접속하여 해당 상품을 구매했다고 가정한다면, 해당 사용자의 재접속은 이전 사건과 독립적으로 이야기 할 수 없을 것입니다. 즉, 사용자가 이전에 어떤 행동을 취했느냐는 다음 행동에 충분히 영향을 줄 수 있습니다.
2. 사용자의 상호작용은 시간에 따라 일정하게 나타나지 않는다.
이커머스 도메인을 기준으로 생각하였을 때, 사용자들은 매일 일정시간대에 반복적으로 접속하여 상호작용을 진행하기보다는 무언가 필요할 때 집중적으로 서비스에서 탐색을 진행하는 경우가 더 많습니다. 다시말해 10일 동안 10번의 상호작용이 발생하였다면 이는 1일에 한번 발생하였기 보다는 2일 동안 집중적으로 상호작용이 발생했을 경우가 더 보편적임을 의미합니다.
정리하자면 지수분포의 가정은 웹앱을 기반으로 하는 서비스의 사용자들을 표현하기에는 부적합하다고 판단하였고, 사건이 발생하는 비율을 더 유연하게 표현할 수 있는 기법들을 찾기로 결정하였습니다.
생존분석(Survival Analysis)는 시간에 따른 사건 발생까지의 기간을 분석하는 통계적 방법입니다. 주로 의학, 생물학, 공학, 경제학 등 다양한 분야에서 사용되며, 사망, 재발, 고장, 이직 등 특정 사건의 발생까지 걸리는 시간을 연구하는 데 사용됩니다. 지수분포와 다른 점은 시간에 따라 사건이 발생하는 비율을 달리 표현할 수 있고, 그에 영향을 미치는 요소를 함께 고려할 수 있다는 장점이 있습니다. 생존분석의 관점에서 다음 사건이 발생하기까지의 시간을 확률식으로 표현한다면 다음과 같이 표현할 수 있습니다.
확률변수 T는 사건 사이의 대기시간을 나타냅니다.
u는 사용자의 정보를 나타냅니다. 예를 들어, 과거에 상호작용한 시간, 상호작용한 상품, 구매이력 등이 포함될 수 있습니다.
전반적인의 식의 구조는 지수분포와 흡사하지만 지수분포에서 사건이 발생하는 비율인 rate는 상수인 것에 반해 생존분석에서는 특정 변수에 대한 함수로 표현됩니다. 특히 시간에 대한 함수로 많이 표현됩니다.
그리고 이를 Intensity 혹은 Hazard라고 정의하며, 항상 0보다 크고 0부터 무한대 구간에서 적분하였을 때 무한대값이 도출되여하는 성질을 만족하여야 합니다. Intensity 혹은 Hazard는 의미그대로 해당 시간(t)에 사건이 발생할 강도 혹은 위험을 나타냅니다. 그 값이 클수록 해당 시간에 사건이 발생할 확률은 높아지게 됩니다.
Intensity의 정의를 기반으로 하여 T에 대한 확률밀도함수와 누적확률밀도함수를 구하면 다음과 같습니다. (자세한 증명은 생략하였습니다.)
[누적 확률 밀도 함수]
[확률 밀도 함수]
따라서 구하고자 하는 확률인 P(T>t|u)는 다음과 같이 표현됩니다.
위 식에서 알 수 있듯, 확률 밀도 함수에서 가장 핵심적인 역할을 하는 부분은 Intensity를 표현하는 항이 됩니다. 저는 Intensity Function의 직관적인 의미를 해석하였을 때, 특정 시점(t)에 사용자가 서비스에 보이는 관심도라고 해석하였습니다. 그리고 Intensity Function을 잘 정의하기 위해서는 시점에 따른 사용자의 관심도가 어떤 패턴을 보이는지에 대한 적절한 가설과 분석이 필요하다고 판단하였습니다. 이를 위해 우선 전체 사용자를 대상으로 10일 이내 재접속 사건에 대한 시간차 분포로 추출해보았습니다.
언뜻보기에는 지수분포의 형태를 띄는 것 같지만 중간중간 봉우리지는 부분이 나타나는 것을 확인할 수 있었습니다. 이에 대한 가설로써 Chenyang Wang[2]의 표현을 빌려 사용자의 행동패턴을 “ShortTerm Effect”와 “LifeTime Effect”로 구분할 수 있을 것이라 생각하였습니다.
ShortTerm Effect: 사용자가 서비스를 집중적으로 사용하고 있는 구간으로 짧은 시간차가 집중적으로 나타나며, 위 분포에서 앞 구간을 표현한다.
LifeTime Effect : 사용자가 다시 서비스에 관심을 가지는 구간으로 긴 시간차로 듬성듬성 나타난다. 위 분포에서는 봉우리 구간을 나타낸다.
저는 사용자마다, 서비스마다 두 Effect가 각기 다른 형태로 섞여 표현될 것이라 생각하였습니다. 어떤 서비스는 사용자들이 주기적으로 이용하여 LifeTime Effect 구간이 우세하게 나타날 수도 있고, 나아가 같은 서비스 내에서도 사용자에 따라 각 구간이 다르게 나타날 것이기 때문입니다. 따라서 가설에 대응되는 Intensity Function은 다음 조건을 만족해야 했습니다.
ShortTerm Effect과 LifeTime Effect을 표현할 수 있어야 한다.
두 Effect는 시간(t)에 대한 함수이며, 쉽게 적분이 가능해야한다.
서비스마다, 유저마다 다르게 나타나는 두 구간의 가중치를 유연하게 조절할 수 있어야 한다.
세 조건을 모두 만족하는 Intensity Function을 정의하기 위해 고민하였고, ShortTerm Effect의 경우에는 지수분포로써, LifeTime Effect은 정규분포로써 모델링하기로 결정하였습니다. 우선 확률분포로써 함수 정의를 접근한 이유는 적분값을 비교적 쉽게 구할 수 있기 때문입니다.
또한 ShortTerm Effect의 경우 짧은 시간 차가 집중적으로 나타나고 서비스에서 원하는 목표를 달성할 경우(혹은 그렇지 못하더라도) Intensity가 빠르게 감소할 것이므로 지수분포를 따를 것이라 판단하였습니다. 반면 LifeTime Effect의 경우 일정 시간이 흐른 후 서비스에 다시 관심을 가지므로 정규분포를 따를 것이라 생각하였습니다.
마지막으로 두 분포를 유연하게 조절하기 위해 Weight Term을 추가해 Intensity Function을 일종의 혼합분포(Mixture Distribution)로 표현하였고, Weight를 사용자에 대한 함수로 표현하여 사용자마다 유연하게 나타낼 수 있도록 설계하였습니다. 또한 두 분포의 모수 역시 사용자의 함수로 표현하여 개인화된 분포를 추론할 수 있도록 하였습니다.
이번 글에서는 사용자가 서비스에 다시 돌아올 확률을 모델링하기 위해 생존분석의 논리를 차용한 이유를 설명드렸고, 이를 위해 Intensity Function을 어떻게 정의하였는지 설명드렸습니다. 하지만 이를 학습시키기 위해서는 아직 몇가지 작업을 더 진행해야합니다. 다음 글에서는 최종적으로 모델을 어떻게 학습시켰는지, 성능을 측정하기 위해 어떤식의 실험을 진행했는지 설명드리도록 하겠습니다.
긴 글 읽어주셔서 감사합니다!
[1] https://en.wikipedia.org/wiki/Poisson_distribution
[2] Modeling Item-Specific Temporal Dynamics of Repeat Consumption for Recommender System, Chenyang Wang, 2019 (WWW)