일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 시각화
- n8n
- 분석한스푼
- data-analysis
- pandasai
- aha-moment
- 인과추론
- 야구
- 트위먼의법칙
- 데이터분석
- 프롬프트엔지니어링
- 데이터디스커버리플랫폼
- retentioneering
- PyGWalker
- 데이터분석가
- 글또
- 신기효과
- 프롬프트
- 전환분석
- data
- 아하모먼트
- 성장
- 주가데이터
- DataAnalysis
- 벅슨의역설
- DataAnalyst
- EDA
- 데이터
- gapminder
- productanalysis
데이터 생존 로그
pandas dataframe으로 퍼널 확인해보기 본문
pandas dataframe으로 퍼널을 만들어서 확인해봅시다.
예시 데이터는 kaggle에서 가져오도록 하겠습니다.
https://www.kaggle.com/datasets/aerodinamicc/ecommerce-website-funnel-analysis?resource=download
E-commerce website
Funnel analysis
www.kaggle.com
데이터셋 불러오기
필요한 라이브러리를 import하고, 데이터셋을 불러옵니다.
import pandas as pd
import plotly
import plotly.express as px
home = pd.read_csv('./home_page_table.csv')
payment_conf = pd.read_csv('./payment_confirmation_table.csv')
payment_page = pd.read_csv('./payment_page_table.csv')
search = pd.read_csv('./search_page_table.csv')
user = pd.read_csv('./user_table.csv')
총 5개의 csv로 이루어져있네요.
각 파일은 액션을 한 유저의 list가 들어있습니다.
실제 이커머스 행동 데이터는 하나의 record가 하나의 action을 담고 있는 경우가 많은데, 정제된 데이터 인 것 같네요.
각 파일명에서 알 수 있듯이, 각 액션은 다음을 의미하는 것으로 추론할 수 있습니다.
- user: 유저 목록
- home: 홈 화면에 방문
- search: 상품 검색
- payment_page: 결제 화면
- payment_conf: 결제 완료
즉, 퍼널을 만든다면 user > home > search > payment_page > payment_conf 순서로 설계하면 되겠네요.
전처리
이제 위 다섯 개 테이블을 합쳐보겠습니다.
각 퍼널이 하나의 행(column)을 갖도록 만들면 될 것 같아요.
df = pd.merge(user, home, how='left', left_on='user_id', right_on='user_id')
df = pd.merge(df, search, how='left', left_on='user_id', right_on='user_id')
df = pd.merge(df, payment_page, how='left', left_on='user_id', right_on='user_id')
df = pd.merge(df, payment_conf, how='left', left_on='user_id', right_on='user_id')
df.columns = ['user_id', 'date', 'device', 'sex', 'home', 'search', 'payment_page', 'payment_conf']
df
이제 df는 유저별 퍼널 통과 여부를 나타내는 테이블이 되었습니다.
df의 device라는 컬럼은 유저의 디바이스를 의미하고, 디바이스별 ux는 다를테니 퍼널에도 차이가 있을 것 같아요.
device별 퍼널을 확인해보면 다음과 같습니다.
pages = ['home','search','payment_page','payment_conf']
device = df.groupby('device')[pages].agg('count').reset_index()
device
가설이 어느 정도 맞는 것으로 보입니다.
홈화면에 도달한 유저는 Desktop이 Mobile보다 많지만, 실제 결제완료까지 도달한 유저는 Mobile이 더 많네요.
특히, search > payment_page 퍼널에서 Desktop은 10%의 전환율을 보여주지만, Mobile은 20%의 전환율을 보여주고 있습니다.
이제 퍼널을 간단히 시각화 해 볼까요?
시각화 하기 전에 간단히 전처리 작업을 해줘야 합니다.
df_melted = device.melt(id_vars=['device'], var_name='action', value_name='value')
df_melted
이제 전처리 된 데이터로 시각화 해 봅시다.
시각화
디바이스별 퍼널을 비교하기 위해 하나의 퍼널 차트에 모두 담도록 할게요.
다만, 비교의 편의성을 위해 색깔을 구분지어 줍시다.
fig = px.funnel(df_melted, y='action', x='value', color='device', width=800, height=400)
fig.show()
우리가 확인한 가설을 퍼널 차트로 그려놓으니 더 잘 보이네요!
search > payment_page 경로에서 Desktop의 이탈이 더 많아졌고,
이로 인해 최종 결제 완료까지 Mobile에서 더 많은 유저가 도달한 것을 볼 수 있습니다.
마무리
이번 게시글에서는 간단한 캐글 데이터셋을 통해 퍼널을 확인해보고 시각화까지 해보았습니다.
정제된 데이터를 활용했지만, 더 복잡하고 많은 실제 데이터를 확인한다면 고려해야할 사항이 많을 것 같습니다.
의미있는 피처(위 예시에서는 디바이스가 되겠네요)를 선정해서 피처별 퍼널 분석을 통해 서비스 개선 아이디어를 얻어내면 좋겠습니다 !