1편에서 CRM(Customer Relationship Management) 마케터들을 위해 개발하는 ‘차세대 All-in-One 메시지 솔루션’의 범용 인공지능 모델 제작을 위한 저희 블럭스(Blux) 개발자들의 고민에 대해 간단히 설명했습니다.
지난 글에서 저희는 차세대 CRM 마케팅 솔루션에 탑재하기 위한 범용적인 ‘고객 이탈 위험 예측 모델’에 대해 오래 분석한 끝에 ‘클라이언트마다 다른 이탈 고객 정의에 구속 받지 않기 위해 사용자가 서비스에 다시 돌아올 확률을 모델링 하자’와 ‘매우 동적으로 나타나는 사용자 행동 정보를 유연하게 표현할 수 있고, 비정형 데이터를 활용하기 쉬운 딥러닝(Deep Learning)을 사용해 보자’라는 두 가지 결론을 내렸습니다.
이번 글에서는 이 결론을 바탕으로 저희가 어떤 개념을 구체적으로 사용하여 실험을 진행했는지 설명해 보겠습니다.
지수분포로 충분한가?
고객이 서비스에 다시 돌아올 확률을 인공지능 모델로 분석하기 위해 먼저 ‘이를 어떻게 확률 용어로 바꿀 수 있을까?’에 대해 고민했습니다. ‘고객이 서비스에서 상호 작용을 시작하는 것(=재방문)’을사건으로 정의하면, 이 돌아오는 시간차를 확률 변수로 정의할 수 있습니다. 즉, 다음 사건이 발생하기까지의 대기 시간을 분포로 표현할 수 있으면 고객이 서비스에 다시 돌아올 확률을 구할 수 있다고 판단했습니다. 이를 확률식으로 표현하면 다음과 같습니다.
여기서 ‘T’는 확률 변수로 사건 사이의 대기 시간을 나타냅니다. 또한 ‘s’는 고객의 마지막 상호 작용이 발생한 시점부터 현지 시점까지 흐른 시간을 의미합니다. 이를 풀어 설명하면, 고객이 마지막 상호 작용을 한 지 s 시간이 지났을 때, t 시간 뒤인 t+s가 고객이 다시 상호 작용을 진행할 확률이 됩니다.
일반적으로 다음 사건이 일어날 때까지의 대시 시간에 대한 분포는 ‘지수분포(Exponential Distribution)’를 사용합니다. 지수분포를 사용하기 위해서는 일정 시간 동안 발생하는 사건의 횟수가 ‘포아송 분포(Poisson Distribution, 확률론에서 단위 시간 안에 어떤 사건이 몇 번 발생할 것인지를 표현하는 이산 확률 분포)’를 따라야 합니다.
사건의 횟수를 포아송 분포를 통해 표현할 경우, 단위 구간(일주일, 한 달 등)을 정의한 후 해당 구간 동안 사건이 발생한 횟수를 관측하여 사건이 발생하는 비율(rate)을 통해 분포를 표현합니다. 예를 들어 1주일 동안 7번의 재방문이 발생했으면 ‘rate는 7’이 됩니다.
이때 포아송 분포를 따른다는 것은 사건이 다음과 같은 특성이라는 것을 가정합니다.
(1) 사건은 독립적으로 발생한다. 즉, 이전의 상호작용이 다음 상호작용에 영향을 미치지 않는다.
(2) 단위 구간을 더 작은 구간으로 쪼개어도 사건이 발생하는 비율 일정하다. 예를 들어 10일 동안 10번의 사건이 관측되었다면, 1일 동안 1번의 사건이 관측될 것이다.
그렇지만 저희는 위 두 가지 가정으로는 지수분포로 매우 동적으로 나타나는 고객의 행동 정보를 유연하게 표현할 수 없을 것이라 판단했습니다. 그 근거는 다음과 같습니다.
(1) 사용자는 과거의 행동에 영향을 받는다.
예를 들어 어떤 고객이 특정 상품이 마음에 들어 해당 제품을 장바구니에 넣은 다음 며칠 뒤 다시 접속해서 구매했다고 가정해 보겠습니다. 이때 해당 고객의 재접속을 이전 사건과 독립적으로 이야기할 수 없을 것입니다. 즉, 고객이 과거에 한 행동은 다음 행동에 충분히 영향을 줄 수 있습니다.
(2) 사용자의 상호작용은 시간에 따라 일정하게 나타나지 않는다.
이커머스 도메인을 기준으로 생각했을 때 고객들은 매일 일정 시간대에 서비스에 반복적으로 접속하여 상호작용을 진행하지 않습니다. 그보다는 무언가 필요할 때 집중적으로 서비스에서 탐색하는 경우가 더 많습니다. 예를 들어, 10일 동안 10번의 상호작용이 발생했을 때, 1일에 1번의 상호작용이 발생했다기보다는 특정 일자에 상호작용이 더 집중적으로 발생했을 경우가 보편적입니다.
결국, 지수분포의 가정만으로는 웹/앱 기반의 서비스 고객들을 표현하기에 부적합하다고 판단했습니다. 대신 고객이 서비스에서 상호 작용을 시작하는 것=사건이 발생하는 비율을 더 유연하게 보여줄 수 있는 다른 방법을 찾기로 결정했습니다.
‘생존분석’으로 사용자의 생존확률을 구해보자
‘생존분석(Survival Analysis)’은 시간에 따른 사건 발생까지의 기간을 분석하는 통계 방법입니다. 주로 의학, 생물학, 공학, 경제학 등 다양한 분야에서 사용되며, 사망, 재발, 고장, 이직 등 특정 사건의 발생까지 걸리는 시간을 연구하는 데 사용됩니다. 지수분포와 다른 점은 시간에 따라 사건이 발생하는 비율을 달리 표현할 수 있고, 그에 영향을 미치는 요소를 함께 고려할 수 있다는 장점이 있습니다. 생존분석의 관점에서 다음 사건이 발생하기까지의 시간을 확률식으로 표현한다면 다음과 같이 표현할 수 있습니다.
확률변수 ‘T’는 사건 사이의 대기 시간을 나타냅니다. ‘u’는 사용자의 정보를 나타냅니다. 예를 들어, 과거에 상호작용을 한 시간, 상호작용한 상품, 구매 이력 등이 포함될 수 있습니다. 전반적인 식의 구조는 지수분포와 비슷합니다. 하지만, 지수분포에서 사건이 발생하는 비율인 ‘rate’가 상수인 것에 반해 생존분석에서는 특정 변수에 대한 함수로 표현됩니다. 특히 시간에 대한 함수로 많이 표현됩니다.
이를 ‘인텐시티(Intensity, 강도)’ 혹은 ‘해저드(Hazard, 위험)’라고 정의하며, 항상 0보다 크고 0부터 무한대 구간에서 적분하였을 때 무한대 값이 도출되는 성질을 만족해야 합니다. Intensity 혹은 Hazard는 의미 그대로 해당 시간(t)에 사건이 발생할 강도 혹은 위험을 나타냅니다. 그 값이 클수록 해당 시간에 사건이 발생할 확률은 높아지게 됩니다.
Intensity의 정의를 기반으로 하여 T에 대한 확률밀도함수와 누적확률밀도함수를 구하면 다음과 같습니다.
[누적 확률 밀도 함수]
[확률 밀도 함수]
따라서 구하고자 하는 확률인 P(T>t|u)는 다음과 같이 표현됩니다.
저희는 이 모형이 지수분포를 이용한 것과 달리 고객의 다양한 행동패턴을 모델링 할 수 있다고 생각했습니다.
서비스에 대한 관심도는 어떤 모습을 보일까?
앞서 설명한 식에서 알 수 있듯이 확률밀도함수에서 가장 핵심적인 역할을 하는 부분은 ‘Intensity’를 표현하는 항입니다. Intensity는 직관적으로 ‘고객이 서비스에 보이는 관심도’로 생존 분석 모형에 적용할 수 있다고 판단했고, 시간에 따라 관심도가 어떤 양상으로 변화하는지 함수로서 표현할 필요가 있었습니다.
즉, ‘인텐시티 함수(Intensity Function)’를 정의하는 것이 매우 중요했습니다. 이를 위해 각 클라이언트의 행동 데이터를 기준으로 고객 재방문에 대한 시간차를 분포로 그려보았습니다. 놀랍게도 각 클라이언트마다 아래와 같은 형태의 분포가 추출되었습니다.
위 표를 보면 언뜻 보기에는 지수분포의 형태를 띠는 것 같지만, 중간중간 봉우리지는 부분이 나타나는 것을 확인할 수 있었습니다. 고객의 행동 패턴을 ‘ShortTerm Effect(고객이 서비스를 집중적으로 사용하는 구간으로 짧은 시간차가 집중적으로 나타난다)’와 ‘LifeTime Effect(고객이 다시 서비스에 관심을 가지는 구간으로 긴 시간차로 듬성듬성 나타난다)’로 구분할 수 있을 것으로 생각했습니다.
저희는 고객마다, 그리고 서비스마다 두 Effect가 각기 다른 형태로 섞여 표현될 것이라 판단했습니다. 어떤 서비스는 고객들이 주기적으로 이용하여 ‘LifeTime Effect’ 구간이 우세하게 나타날 수 있고, 나아가 같은 서비스 내에서도 고객에 따라 구간이 다르게 나타날 것이기 때문입니다. 따라서 가설에 대응되는 ‘Intensity Function’은 다음 조건을 만족해야 했습니다.
‘ShortTerm Effect’와 ‘LifeTime Effect’를 표현할 수 있어야 한다.
두 Effect는 시간(t)에 대한 함수이며, 쉽게 적분이 가능해야 한다.
서비스마다, 고객마다 다르게 나타나는 두 구간의 가중치를 유연하게 조절할 수 있어야 한다.
저희는 세 조건을 모두 만족하는 Intensity Function을 정의하기 위해 고민한 끝에, ShortTerm Effect를 지수분포로, LifeTime Effect를 정규분포로 표현하여 두 분포를 혼합해 표현하기로 결정했습니다. 그 이유는 아래와 같습니다.
첫째, 생존분석 모형의 확률을 구하기 위해서는 Intensity Function이 적분이 가능해야하고, 그값을 쉽게 계산할 수 있어야 합니다. 이 관점에서 Intensity Function이 확률분포일 경우 적분이 용이하기 때문에 이를 이용하여 표현했습니다.
둘째, ShortTerm Effect는 짧은 시간 내에 집중적으로 나타나고, 서비스 이용이 끝나면 빠르게 감소할 것이라 생각해서 지수 분포를 선택했습니다. 반면, LifeTime Effect는 일정 시간이 지난 후에 다시 서비스나 제품에 관심을 가지는 패턴을 나타내므로 정규 분포로 표현할 수 있다고 판단했습니다.
마지막으로, 두 Effect가 고객마다 다르게 나타날 것이기에 이를 유연하게 조절하기 위해 '가중치(Weight Term)'를 추가해 Intensity Function을 '혼합 분포(Mixture Distribution)'로 표현했습니다. 이때 '가중치'는 고객별로 다르게 설정되어야 하므로 u에 대한 함수로 정의하였습니다. 이를 통해 두 분포의 매개변수도 고객별로 달라지게 하여 개인화된 분포를 추론할 수 있도록 설계했습니다. 이를 수식으로 나타내면 다음과 같습니다.
인공지능 모델을 위한 최선의 선택
이번 글에서는 고객이 서비스에 다시 돌아올 확률을 모델링하기 위해 생존분석의 논리를 차용한 이유를 설명했습니다. 블럭스 개발팀은 고객의 이탈을 분석하기 위해 ‘Intensity Function’ 정의하기 위해 노력했고, 그 과정에 대해 자세히 설명했습니다.
그렇지만 이게 끝이 아닙니다. 모델에 적용할 방법을 정의했으니, 이제는 이를 학습시키기 위해 몇 가지 작업을 더 진행해야 합니다. 다음 글에서는 저희가 최종적으로 모델을 어떻게 학습시켰는지, 그리고 성능을 측정하기 위해 어떤 실험을 진행했는지 설명하겠습니다.
글쓴이 김회인(Simon) Machine Learning Engineer 새로운 미션에 거침 없이 도전하고, 폭풍처럼 성장하는 미래가 목표인 블럭스의 ML 엔지니어로, AI 시대로 급변하는 마케팅 시장의 문제를 구성원들과 함께 고민하고 해결하며 나아가고 있습니다. |