데이터 생존 로그

Retentioneering: 그 복잡한 product data를 간단하고 자유도 높게 다룰 수 있다고? 본문

생존 도구🏹

Retentioneering: 그 복잡한 product data를 간단하고 자유도 높게 다룰 수 있다고?

분석가 베어그릴스 2023. 12. 17. 23:59

Retentioneering은 python의 제품 분석(product analysis) 라이브러리입니다.

Retentioneering을 통해 1) 행동 데이터 전처리 2) 사용자 경로 분석 3) 유저 세분화(군집화)등을 비교적 간단한 코드로 해낼 수 있습니다.

 

해당 게시글은 Retentioneering 공식문서 Tutorial의 참고하여 작성했습니다.


Retentioneering 활용 준비

라이브러리를 설치해주고

!pip install retentioneering

 

import만 해주면 활용 준비 끝!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import retentioneering
from retentioneering.eventstream import Eventstream

 

 

실습에 활용할 샘플 데이터셋도 로딩해줍니다.

# First download the dataset
data_link_id = '11fBfp7-SEPKJ7hNihfk5nF3ilN4Wfu2w'
data_link = f'https://drive.google.com/u/0/uc?id={data_link_id}&export=download&confirm=t'

data = pd.read_csv(data_link, compression='gzip', parse_dates=['timestamp'])

 

 

데이터셋에 대한 자세한 정보가 궁금하시다면 해당 링크를 참고하세요.

 

pandas dataframe 형태인 데이터를 Eventstream이라는 형태로 바꿔줍니다. (Retentioneering으로 다루기 위해)

단, 데이터의 양이 너무 많으니 10%(0.1)만 랜덤으로 뽑고, 랜덤 시드를 고정해줍니다.

그리고 대략적 정보를 확인해보면

stream = Eventstream(data, user_sample_size=0.1, user_sample_seed=42)

stream.describe()

 

 

33,882명의 유저가 37개의 이벤트를 발생시켰고,

대부분의 유저(상위 50%, path_length_steps의 median)는 하나의 경로만 거쳤네요🥲

 

조금 더 자세히 데이터를 살펴볼까요?


Step Matrix

Retentioneering 라이브러리의 Step Matrix라는 기능을 활용해 분석해봅시다. (threshold의 의미는 뒤에서 알아보아요.)

stream.step_matrix(threshold=0.02)

 

 

언뜻보면 간단한 테이블 같지만(아래 그림 참고), 좋은 정보를 제공해주네요.

Step Matrix

각 행은 하나의 이벤트를 나타냅니다.

또한, 각 열은 경로의 몇 번째 단계인지를 나타냅니다.

 

즉, 모든 경로 중 59%는 첫 단계에서 landing이라는 이벤트를 발생시켰음을 의미합니다.

 

위 Matrix에서 ENDED와 THRESHOLDED_28만 대문자로 표시되어 있네요.

 

그 중 ENDED는 각 단계에서 이탈한 유저의 비중을 의미합니다.

즉, 53%의 유저는 1단계만 경험하고 2단계를 겪기 전에 이탈한 것으로 볼 수 있어요.

 

또한 자세히 표를 들여다보면, 모든 이벤트의 단계별 최댓값이 0.2보다 낮은 값이 없네요.

이는 threshold=0.2로 주어졌기 때문에 최댓값이 0.2보다 낮은 이벤트는 THRESHOLD_28이라는 이벤트에 포함되어 집계되고 있습니다.

 

경로 단계별 이벤트의 비중을 살펴보았는데요,

더 깊은 정보를 알기 위해 우리는 여러 단계를 거친 경로들의 데이터만을 살펴볼 필요가 있습니다.

여러 단계의 적당한 기준을 잡고 기준에 해당하지 않은 경로를 제거해보도록 해요.


Data Processing

Retentioneering은 다양한 데이터 전처리 기능도 제공합니다.

세션 단위로 분류, 시작/종료 데이터 추가 등 다양한(정말 유용한) 기능이 많지만,

당장 필요한 한 가지 기능만 다뤄보고자 합니다. (다른 기능이 궁금하다면 해당 링크를 참고하세요.)

 

일단 '여러 단계'의 적당한 기준을 잡기 위해

각 단계별로 전체 경로 수 대비 몇 개의 경로가 이탈하는지를 시각화해보겠습니다.

sm = stream.step_matrix(threshold=0.05, targets=['ENDED'])

ended_on_step = sm.values[1].loc["ENDED"]
users_on_step = 1 - sm.values[0].loc["ENDED"].shift(1)
ended_share = ended_on_step / users_on_step.dropna()

plt.title('Share of leaving platform relative to users at a given step')
plt.xlabel('Step')
plt.ylabel('Share of users')
plt.plot(ended_share)
plt.show()

단계별 이탈 비율

이탈 비중은 6단계 이후로 안정화 되는 것으로 확인되네요.

따라서 6단계 이전에 이탈한 경로를 제거한 후 분석을 진행해봅시다.

 

drop_paths라는 기능의 min_steps라는 인자에 6을 주고 전처리된 데이터를 확인해보면

stream = stream.drop_paths(min_steps=6)
stream.describe()

최소 경로 길이가 6(path_length_steps의 min)으로 보입니다.

우리가 의도한대로 데이터 처리가 잘 이루어졌네요!🎉


Sankey Diagram

이제 보고하는 경로만 담았으니 Sankey Diagram을 활용해서 시각화를 진행해보겠습니다.

stream.step_sankey(
    threshold=0.1,
    width = 2000,
    max_steps=5
)

Sankey Diagram

최상단의 landing 액션이 가장 눈에 띄네요.

landing 액션만 주구장창하는 경로가 꽤나 많은 것으로 추정되어요.

 

서비스의 다른 기능을 활용하지 않고 landing만 하는 것은 제품의 의도와 맞지 않을 수 있어요.

따라서 "주구장창 landing만 하는 경로"가 얼마나 많은지 확인해볼 필요가 있겠죠?

 

landing만 하다가 이탈하는 유저의 비중을 보기 위해 [landing vs 이외의 액션]으로 나누어서 다시 살펴봅시다.

collapsed_stream = stream.collapse_loops(suffix=None).add_start_end_events()
collapsed_stream.step_sankey(
    max_steps=3,
    threshold=1.,
    targets=['landing', 'path_start']
)

 

27.5%의 유저가 landing 액션만 하다가 이탈합니다.

(실제 코드 실행 후, 마우스를 올려보면 비중과 숫자 등의 정보를 볼 수 있어요.)

 

우리는 landing 액션만 하는 유저에 대해서도 궁금하지 않으니, 제거해보도록 합시다.

def not_only_landing(df, schema):
    visiting_something_else = df[df.event != 'landing'].user_id
    return df.user_id.isin(visiting_something_else)

stream = stream.filter_events(func=not_only_landing)
실제로 이런 값이 관찰되었다면?
여러가지 가설을 세워서 개발/기획 단과 소통해봐야할 것 같아요.
(데이터 수집 오류, landing 액션만 하도록 의도된 기획이 있는지, 개발 오류 등..)

Funnel Chart

자 이제 마지막 단계로 시나리오를 설정하고, 그 시나리오 경로의 Funnel을 살펴볼게요.

시나리오는 다음과 같이 설정했어요.

  • 플랫폼(서비스) 진입: landing, home
  • 가입, 로그인: login, registration
  • 로그인 후 메인(계좌 정보, 잔액표시 등): main, open_account_main, account
  • 뱅킹 정보, 한정혜택 확인: account_details, special_offers

 

이를 코드로 구현하면 다음과 같습니다.

stream.funnel(
    stages=[
            ['landing', 'home'],
            ['login', 'registration'],
            ['main', 'open_account_main', 'account'],
            ['account_details', 'special_offers']
    ],
    funnel_type='closed'
)

 

서비스 진입 후, 46%의 경로가 우리가 보고자하는 시나리오의 끝에 도달했습니다.

(단, 이전 단계에서 제외된 경로도 인지하고 있어야 해요!)

 

절반 정도의 경로가 위 시나리오를 따르고, 어떤 관련성이 존재한다고 볼 수 있습니다. (혹은 서비스적 의도된 부분?)

이외에 다른 시나리오의 경로에는 어떤 것들이 있는지, 시나리오 로직에 허점은 없는지 등도 살펴보면 좋을 것 같아요.


맺음말

  • product analysis 환경이 조성되지 않은 경우, 혹은 기존 product analysis tool로 해결할 수 없는 경우 용이할 것 같아요.
  • 자유도 높고 빠르게 활용 가능해요.
  • 위 소개한 기능 이외의 기능도 추후에 꼭 공부해봐야겠어요.
  • 툴을 알아보고 싶어서 튜토리얼을 쭉 읽어보다가 스토리탤링에 매료되어 끝까지 보았습니다...
    • (스토리탤링 한 수 배워갑니다...) 

 

참고자료

https://doc.retentioneering.com/stable/doc/index.html 

- https://colab.research.google.com/drive/1WwVI5oQF81xp9DJ6rP5HyM_UjuNPjUk0?usp=sharing#scrollTo=inhs3NeTI5ue

- https://github.com/retentioneering/retentioneering-tools

 

반응형
Comments