본문 바로가기
빅데이터분석

[메타코드] 파이썬 입문 데이터분석 - 마케팅 데이터분석 및 지표정의 (2) Conversion Window 2

by 모닥불🔥 2024. 7. 31.

 

오늘도 조용히 공부하는 타닥타닥 모닥불🔥

conversion window 두 번째 시간이다. 지난 글에서 그렸던 그래프에서 조금 더 발전시킬 예정이므로,지난 글을 먼저 보고 오는 것이 좋다.

 

이미지를 클릭하면 강의 사이트로 이동한다.

* 가입 시 5천원 주는 추천인 코드: EQQW-36EH-JY4P 추가해주시면 감사합니다.


🔥 강의 목차

오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기

🔥 Conversion window 활용

앞서 아래 코드로 특정 conversion window 기준에서 전환의 몇 %를 설명할 수 있는지에 대한 히스토그램을 그렸었다.

thread = 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()

 

활용하는 부분을 설명하기 앞서, percentile 계산법을 알아보자.

percentile은 상위 N%에 속하는 값을 찾는 것이다. 먼저 시리즈 형태의 리스트가 하나 필요하고, 해당 리스트에서 np.percentile(list, N)을 하면 상위 N%인 값이 무엇인지 알려준다.

lis = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # array, 시리즈 형태여야 퍼센타일 사용가능
np.percentile(list, 10 )  # 상위 10% 값을 묻는 것
np.percentile(list, 50 )  # 상위 50% 값을 묻는 것
np.percentile(list, 100 )  # 상위 100% 값을 묻는 것

np.percentile(list, 50) # 중앙값

 

위 내용을 바탕으로 아까 만들었던 히스토그램 그래프에, 퍼센타일 상위 10, 20, 50, 100을 찍어보려 한다.

for 문과 위에서 배운 percentile 공식, 그리고 히스토그램 코드를 합쳐 그래프에 퍼센타일을 표시하였다.

thread = 4
a = df[~df.pay_at.isna()].shape[0]
b = df[df.td <= thread].shape[0]

ratio = (b/a)*100

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}% 설명'
)
lis = df[~df.td.isna()].td
# perc = 50
y1 = 100
for perc in [10, 20, 30, 40, 50, 60, 70, 80, 90]:
  dates = np.percentile (lis, perc)
  fig.add_vline(x = dates)
  fig.add_annotation(x = dates, y = y1, text = f'precentile: {perc}% -> {dates}일'),
  y1 -= 10

fig.show()

🔥 전환율 계산하기

다음으로는 전환율을 계산해 볼 것이다. 아까 썼던 데이터에서, 1일 이내, 10일 이내에 발생한 전환 수를 그룹바이로 구한다. 아래와 같이 apply_cnt, conv1_cnt, conv10_cnt라는 세 개의 데이터셋이 생성된다.

apply_cnt = df.groupby(by = 'apply_at').size().reset_index() # 전체 행 숫자 반환
apply_cnt
# 1월 1일에 72개 행(날짜별 신청 수)

# 1일 이내 발생한 전환 숫자
conv1_cnt = df[df.td <= 1].groupby(by = 'apply_at').size().reset_index()
conv1_cnt

# 10일 이내 발생한 전환 숫자
conv10_cnt = df[df.td <= 10].groupby(by = 'apply_at').size().reset_index()
conv10_cnt

 

기존 apply_cnt에 conv1_cnt 테이블을 left join으로 합친다.

pd.merge(apply_cnt, conv1_cnt, how = 'left', left_on = 'apply_at', right_on = 'apply_at').rename(
    columns = {
        '0_x': 'apply_cnt',
        '0_y': 'conv1_cnt'
    }
)

 

conv10_cnt도 그 옆에 left join으로 합쳐준다.

df = pd.merge(df, conv10_cnt, how = 'left', left_on = 'apply_at', right_on = 'apply_at').rename(
    columns = {
        0: 'conv10_cnt' # 여기서 0은 index라서 '' 안넣음
    }
)

 

합쳐진 그래프에서, apply_cnt 전체에서 conv1_cnt와 conv10_cnt가 차지하는 비율을 구하여 새로운 ratio 컬럼으로 추가한다.

df['conv10_ratio'] = df.conv10_cnt / df.apply_cnt
df['conv1_ratio'] = df.conv1_cnt / df.apply_cnt

 

선 그래프로 전환율 추적 데이터를 시각화 해보자.

fig = px.line(
    df
    , x = 'apply_at'
    , y = ['conv1_ratio', 'conv10_ratio']
)

fig.add_vline( x = '2023-01-27')

# conversion window에 따라 음영 구간 표시
fig.add_vrect (x1='2023-01-27', x0 = '2023-01-17', fillcolor = 'red', opacity = .2)
fig.add_vrect (x1='2023-01-27', x0 = '2023-01-26', fillcolor = 'blue', opacity = .2)

fig.show()

 

이 그래프를 해석해보면,

  • conv_10_ratio 데이터를 봤을 때 19일 이후 계속 하락 추세를 보인다. 특정 문제가 발생했을 가능성이 있으므로 염두에 두고 원인을 파악한다.
  • 뒤로 갈수록 전환이 발생할 수 있는 기간이 짧다. 예를 들어, 측정 기간이 30일인데 27일을 시작일로 지정하면 구간이 3일밖에 안되는 식이다. 그래서 정상적인 전환을 보이는 경우에도 트랜드가 떨어져 보일 수 있다.
  • conversion window가 10일이면 현재 시점 기준으로 last 10일은 신뢰하지 말아야 한다.
  • conv_1_ratio는 전체의 20% 데이터만 포함하고 있기 때문에 전체 데이터를 반영(완전성)하고 있다고 보기 어렵다. 기간이 짧아서 이렇게 나올 수밖에 없다!

두 개의 글에 걸쳐 conversion window의 개념과 그래프 표현, 전환율 계산 등에 대해 알아보았다.

마케팅 용어들 하나하나도 이렇게 자세히 분석할 수 있다니... 사실 100% 이해한 것도 아닌데, 앞으로 공부할 게 무궁무진하다는 생각이 든다. 언젠가 나도 자신만의 데이터를 가지고 완전히 파악하고 분석할 날이 올까...? 오겠찌! 열심히 하면!

 

오늘은 서울에 면접을 보러 다녀 왔다. 근데 서포터즈 활동 마감일이라 블로그를 쓰고 있다. 오늘만 부산 - 서울 - 대구 세 도시를 거쳤다. 피곤! 좋은 결과가 있길 바라면서도 또 실무를 하기엔 아직 두려운 모닥불🔥 언젠간 대형 화재가 되길..(?)