[메타코드] 파이썬 입문 데이터분석 - 마케팅 데이터분석 및 지표정의 (2) Conversion Window
오늘도 조용히 공부하는 타닥타닥 모닥불🔥
요번 시간에는 conversion window를 정의할 것이다.
이미지를 클릭하면 강의 사이트로 이동한다.
* 가입 시 5천원 주는 추천인 코드: EQQW-36EH-JY4P 추가해주시면 감사합니다.
🔥 강의 목차
오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기
🔥 Conversion Window란?
이번에 배울 마케팅 개념은 conversion window이다. conversion은 전환이라는 뜻이고 window는 창이라는 의미이다. 전환창? 이게 도대체 무슨 뜻일까? conversion window의 정의는 '전환 과정 시작 후 구매/전환까지 걸린 시간을 측정하기 위해 설정한 기간'을 말한다. 사용자의 행동과 전환율 분석에 사용된다.
예시를 살펴보면 조금 더 이해가 될 것이다.
- 온라인 쇼핑을 예로 들면 제품을 처음 본 순간부터 구매 완료까지의 시간을 추적하는 경우
- 앱 사용의 경우, 다운로드 후 첫 사용 또는 특정 기능을 사용하기까지의 시간을 분석하는 경우
- 서비스 가입의 경우, 가입 후 실제 사용 시작까지 걸리는 시간을 측정하는 경우
- 온라인 광고는 광고 클릭 후 실제 구매 또는 목표로 설정한 전환 행동까지 걸리는 시간을 분석하는 경우
완전성과 적시성이라는 개념이 나오는데, 이들은 약간 반비례관계처럼 움직인다.
완전성(Completeness): 수집된 데이터가 전체 사용자의 행동을 얼마나 잘 대표하는지
적시성(Timeliness): 분석된 정보가 얼마나 신속하게 사용 가능한지
즉, 짧은 conversion window를 설정하면 빠르게 데이터를 분석할 수 있지만(적시성 up), 전체 행동 패턴을 반영하기 어렵고(완전성 down)
긴 conversion window를 설정하면 완전성은 높아지지만, 분석의 적시성이 저하될 수 있다.
길이의 설정은 비즈니스 목표와 제품의 특성에 따라 다르게 정하게 된다.
🔥 Conversion Window 실습
이번에는 위 개념을 바탕으로 실습을 해볼 것이다. 데이터는 강의에서 주어진 데이터를 사용했는데, 심플하게 신청 날짜와 결제 날짜, 트랜잭션 id만 있는 데이터이다. pay_at이 비어 있는 경우는 구매 전환이 일어나지 않은 것으로 간주한다.
일단은 apply_at(신청 날짜)와 pay_at(구매 날짜)가 날짜/시간 데이터이기 때문에 info()를 통해 데이터 타입을 확인한다.
pay_at과 apply_at이 object형이기 때문에 datetime 형태로 변경해준다.
df['pay_at'] = pd.to_datetime(df.pay_at)
df['apply_at'] = pd.to_datetime(df.apply_at)
df.info()
필요한 라이브러리를 추가한다.
import pandas as pd
import numpy as np
import plotly.express as px
from datetime import datetime, timedelta
신청(apply)와 결제(pay) 시간차이를 계산하면, 전환이 하루인 경우도, 3일인 경우도, 10일인 경우도, 한달인 경우도 있다.
df['td'] = (df.pay_at - df.apply_at).dt.total_seconds()/(3600*24)
df.head()
히스토그램 분포를 그려서 살펴보면 아래와 같은 분포가 된다.
fig = px.histogram(
df,
x = 'td'
)
fig.show()
위 그래프에서 10일 이내에 구매 전환이 일어난 것(컨버전 윈도우 설정) 만 보겠다고 했을 때 선으로 표시하였다.
fig = px.histogram(
df,
x = 'td'
)
fig.add_vrect(x0 = -0.5, x1 = 10, fillcolor = 'red', opacity = .2)
# 10일 이내에 구매 전환된 경우만 표시(컨버전 윈도우)
fig.show()
10일 이내 구매 전환이 일어난 경우가 전체 전환에서 얼마나 큰 비율을 차지하는지 계산해보자.
전체 행의 수는 2170개이고, 구매전환이 발생한 경우는 pay_at이 NaN이 아닌 경우로, 총 1062건이다.
이 중에서 10일 이내 즉, 위에서 구한 시간 차이(td)가 10 이하인 경우를 계산하면 742가 나온다.
전체 전환 중, 10일 이내 전환된 부분을 비율로 나타내면 69.9%가 된다.
thread = 10
df.shape[0] # 전체 행의 수 2170
a = df[~df.pay_at.isna()].shape[0] # 구매전환이 발생한 행 1062
b = df[df.td <= 10].shape[0] # 10일 이내인 행 742
ratio = (b/a)*100
ratio
아까 그렸던 히스토그램에 해당 내용을 문구로 추가할 수도 있다.
fig = px.histogram(
df,
x = 'td'
)
fig.add_vrect(x0 = -0.5, x1 = 10, fillcolor = 'red', opacity = .2)
fig.add_annotation(
x = thread, text = f'CW:{thread}일 -> 전환의 {ratio:.2f}% 설명'
)
fig.show()
이제 최종 코드셋을 완성하여, 기준 conversion window 값만 바꾸면서, 이에 따라 값이 어떻게 변화하는지 바로바로 확인할 수 있다. thread의 숫자를 늘려 갔을 때 50일 정도가 되면 전환의 100%를 포함한다는 것을 그래프로 확인할 수 있다.
thread = 50 # 50일
df.shape[0] # 전체 행의 수 2170
a = df[~df.pay_at.isna()].shape[0] # 구매전환이 발생한 행
b = df[df.td <= thread].shape[0] # thread일 이내인 행
ratio = (b/a)*100
ratio
fig = px.histogram(
df,
x = 'td'
)
fig.add_vrect(x0 = -0.5, x1 = thread, fillcolor = 'red', opacity = .2)
fig.add_annotation(
x = thread, text = f'CW:{thread}일 -> 전환의 {ratio:.2f}% 설명'
)
fig.show()