우리 유저들은 서비스를 어떻게 쓰고 있지?
딜라이트룸에 합류한지 얼마 되지 않은 시점에 DAU 분석글을 보고, 팀과 이야기하다 이런 궁금증이 생겼었습니다. 유저들이 우리 서비스를 얼마나 사용하는지를 넘어서 ‘어떻게’ 사용하는지를 알아볼 수 있을까? 알라미의 미션은 유저들을 잘 깨우기 위함인데, 과연 우리 유저들은 어떻게 일어나고 있을까? 그리고, 어떻게 일어나냐에 따라서 잔존율에 차이가 생길까?
우리 유저들이 서비스를 어떻게 사용하는지는 데이터분석가 뿐만 아니라 제품을 다루는 사람이라면 한번쯤을 알고 싶고, 고민해보는 주제입니다. 그동안 해왔던 유저 인터뷰나 경험적인 데이터를 가지고 누구나 가슴속에 품고 있는 유저의 모습은 있지만, 유저 데이터를 사용해서 보다 전체적인 뷰를 만들어본 경험을 짧게나마 공유해보려합니다. 물론, 정답이 없는 주제이긴 하지만 좋은 시작점이 될 수 있는 내용이라고 생각합니다.
사용 패턴이 어디서 달라질까?
유저의 사용 패턴을 분석하기에 앞서, 선행적으로 필요한건 당연히 유저의 사용 패턴에 대한 요소적 정의입니다. 소위 말하는 Feature Engineering과 같이 어떤 요소들이 유저의 사용 패턴을 정의할 수 있을지에 대한 고민을 먼저 시작했었습니다.
서비스의 기능을 따라 개별 알람에 추가되는 미션 여부와 개수, 알람이 울릴때 사용되는 스누즈 횟수 등을 기본적으로 추가하되, 기상이라는 도메인의 특성을 살려 단순히 개별 알람에 포함되는 기능 이외에도 총 알람 개수, 전체 기상 시간, 알람간 인터벌, 알람의 평균 시간 등 유저 단위에 Feature들을 추가적으로 발굴하고 정의하였습니다.
또한, 매일 사용하는 서비스인 만큼, 주중/주말간의 cyclical한 데이터의 노이즈를 제거하기 위해 정의된 Feature들을 주중/주말로 구분하고, 기간 평균을 사용하여 outlier를 최대한 눌러줄수 있도록 설계했습니다.
구관이 명관
잘 준비된 유저별 Feature들을 어떻게 나눠볼지는 또 다른 고민 포인트였습니다. 단순하게는 각 피쳐당 분포를 살펴보며, 유저들이 각 요소들에 대해 어떤 값을 가지고 있을지 파악해볼수도 있었고, 딥러닝 또는 Prediction 모델을 통해 리텐션이 높게 나오는 요소들을 분리해 유저를 구분해볼수도 있지만, 여러 방식이 머리에 떠오르던 중 채택했던 방식은 KMeans를 통한 클러스터링이였습니다.
별도의 Label에 대한 Bias가 없이 전체적인 유저의 사용패턴을 살펴보고 싶었고, 한가지 요소가 아닌 전체 요소의 조합에 따라 유저의 패턴을 나눌수 있을까에 대한 고민에 가장 알맞다고 판단했는데요. 그 밖에도, LLM이 각광 받는 시대에서 개인적으로 전통적인 모델들이 충분히 강력하다는걸 스스로에게 한번 더 보여주고 싶었던 마음도 없지 않아 있었습니다. LLM은 강력하지만, 아직 Machine Learning도 죽지 않았다…!
KMeans Clustering
알고리즘은 Python Scikit-Learn의 KMeans 알고리즘을 사용했고, cluster 개수 선택 방식은 inertia를 활용한 기존 elbow method를 사용했습니다.
사실 Elbow Method를 활용한 클러스터 개수 선정은 개인의 판단이 들어갈 수 밖에 없는 부분인데요. 저는 Andrew Ng이 Machine Learning 강의에서 이야기했던, “클러스터 개수는 개인 또는 팀이 감당할수 있을 만큼의 개수를 가져가라” 라는 말을 항상 따르고 있습니다. Inertia를 참고하되, 아무리 10개 이상의 클러스터가 낮은 Inertia를 보여도, 한 개인이 10개의 클러스터를 모두 이해하고 관리하기 어렵다면 개수를 줄이는게 낮다는 의미였는데요. 이를 참고해서 내부적인 커뮤니케이션과 제 이해도를 높히기 위해 저 또한 4개의 클러스터로 개수를 제한하여 모델은 훈련시켰습니다.
Machine Learning에 포장 한스푼
Perplexity CEO가 최근 팟캐스트에서 “결국 모든 서비스는 또 다른 서비스의 Wrapper다”. OpenAI도 Nvidia의 Wrapper고, Nvidia도 반도체칩의 Wrapper기 때문에 가치를 만들어내는 Application Layer가 중요하다는 내용이였는데요. KMeans를 통해 얻은 클러스터링 결과도 결국엔 어떤 해석과 인사이트가 붙혀지느냐에 따라 가치가 달라지게 됩니다.
KMeans의 결과를 가지고 있는 모델에 ._centers_ 를 사용하면 각 클러스터의 중심값을 확인할 수 있고, 직접 피쳐를 만들고 모델을 고민한 데이터 분석가나 과학자에게는 그 자체로도 충분한 인사이트가 될지도 모릅니다. 다만, 만약 다른 이해관계자들이 있다면 단순히 숫자를 보여주는것은 그저 떠다니는 숫자들 중 하나가 되기 쉽습니다.
한가지 방법은 나의 이해도를 직관적으로 나타내줄수 있는 이름을 각 클러스터에 붙혀주는 방식입니다(마치 유저 페르소나를 정하는것 처럼 말이죠). 조금은 쑥쓰럽고, 낯간지러울수도 있지만 많은 사람들을 숫자보단 글을 더 쉽게 이해하고 상상력을 펼치기 때문에 보다 효과적으로 내가 찾아낸 결과를 전달하는 방식임은 분명합니다.
좋은 예시라고 단언하진 못하겠지만, 단순히 0번 클러스터가 알람 평균이 2개면서, 인터벌은 5분 간격이고 해제 시간이 5분정도 됩니다~ 라고 말하는것보단 훨씬 직관적인것은 확실합니다.
한단계 더 나아가보기
이제 유저의 Feature를 정해보고, 의미있는 클러스터링을 통해 유저 페르소나와 유사한 네이밍도 붙혀보았다면, 남은 영역은 보다 무궁무진 합니다. 각 클러스터별로 서비스에 해당하는 핵심 지표들의 현황을 파악해보고, 현재 우리 서비스에 더 도움이 되고 있는 유저 패턴을 정의해볼수 있으며, 각 유저들의 기간별 클러스터 변화에 따른 지표 변화를 보며 자연스러운 유저의 사용 여정을 그려 볼 수도 있습니다.
알라미의 경우 리텐션이 DAU와 직결되는 지표로, 각 클러스터에 대한 기간별 리텐션을 파악해보고, 클러스터별 자세한 미션 사용패턴, 상태 변화에 따른 리텐션 변화 등을 파악해보며 더 많은 인사이트들을 뽑아볼수 있었습니다.
추가적인 분석을 위해 모델 자체를 .pkl과 같은 파일로 저장해두고, load()를 사용해서 모델의 일관성을 가져가는것과 각 유저에 Feature와 Cluster Label 또한 별도 저장해두는것을 추천 드립니다.
적절한 방식 잘 찾아보기…!
현업에서 ChatGPT, Claude, Cursor 등 여러 AI 툴들의 도움을 많이 받으며 생산성을 올리고 있는 데이터 실무자로써, LLM이 주는 breakthrough가 굉장히 신나고 흥미롭습니다. 가까운 미래가 될지 먼 미래가 될지 모르겠지만, 그래도 꼭 LLM이 아닌 전통적인 Machine Learning 방식이나 통계적 분석 방식도 충분히 유의한 분야가 아직있다 생각이 많이 들었던 작업이였습니다. (물론 코드 짤때는 당연히 Claude와 함께함)
비슷한 고민을 하시는 분이라면 한번쯤 시도해보시길 추천합니다!
⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다 🙌