02-4 KPI를 계산하고 비주얼화하기
마케팅 캠페인¶
- 마케팅 캠페인을 벌이고 나면 마케팅이 얼마나 효과가 있었는지 평가해야한다.
- 더 나아가 캠페인의 장점과 단점을 파악하는일 역시 중요하다.
이때 성과 평가를 위해 KPI, Key Performance Indicator를 사용한다.
KPI
- CPA, cost per acquisition
- digital marketing KPIs
- site tracffic
이번 장에서는 bank marketing dataset을 사용한다. 모든 마케팅은 비용이 든다. 그렇기 때문에 마케팅의 성과를 비용 대비로 보는 게 중요하다. 따라서 ROI, Return on Investments를 측정해야 한다.
Sales Revenue¶
ROI를 측정하기 위해서는 먼저 Sales Revenue를 측정해야 한다. 그러나 이 수익이 E-mail 마케팅에서 왔는지, 광고에서 왔는지, 심지어는 마케팅 없이 발생한 결과인지 등을 정확히 정의해야 한다. 이를 위해서 마케팅 캠페인을 하기 전에 정확한 규칙을 정해놓아야 한다. 예를 들어, E-mail과 TV 광고를 함께 진행하는 경우 각각 다른 URL을 사용해야 한다. 이렇게 함으로써 정확히 어디에서 세일즈가 창출되었는지 구분할 수 있다.
Cost Per Acquisition¶
CPA는 고객 한 명을 확보하는 데 드는 비용을 나타낸다. CPA가 높으면 고객 한 명을 확보하는 데 비용이 많이 든다는 것을 의미한다. CPA는 어떤 비즈니스를 하는지에 따라 크게 달라질 수 있다. 예를 들어 럭셔리 명품을 판매하는 경우, 더 높은 CPA가 있어도 괜찮다. 왜냐하면, 비록 CPA가 높지만 고객 한 명이 매우 비싼 제품을 구매하기 때문에, 마케팅 비용을 제외하더라도 수익이 많이 발생하기 때문이다.
Digital Marketing KPIs¶
요즘은 소셜 네트워크나 블로그 등을 통한 디지털 마케팅이 굉장히 중요하다. 그 중요도는 점점 더 높아지고 있다. 앞서 설명한 sales revenue와 CPA도 디지털 마케팅에 사용해야 하는 개념이다.
click-through rate(CTR)¶
CTR은 온라인상에서 광고를 본 사람 중 몇명이 실제 광고를 클릭했는가를 측정한다. 공식은 (광고 클릭 숫자를 / 사이트에서 광고를 본 사람 수로 나눈다.) CTR은 얼마나 많은 트래픽을 사이트로 유입시킬 수 있는지 알려주는 굉장히 중요한 숫자이다.
lead ratio¶
이제 광고를 보고 들어온 사람들 중에서 Lead ratio를 구할 수 있다. Lead ratio는 얼마나 많은 사람이 실제로 고객이 될 수 있는 사람인지를 나타내는 숫자이다. 보통 Product이나 사이트를 방문한 사람들이 모두 고객이 될 profile을 가지고 있는 것은 아니다. 고객이 될 만한 profile을 가질만한 사람을 Lead 라고 부른다. 이들을 중심으로 마케팅 시 세일즈로 연결될 가능성이 높다. MQL, Marketing Qualified Leads는 리드 중에서 고객이 될 가능성이 높은 사람들이다. 이름 그대로 마케팅을 할 충분한 이유가 있는 사람들이다.
conversion rate¶
Lead가 실제로 돈을 지불하고 서비스나 상품을 사는 비율 = 고객이 되는 비율
- conversion rate : 돈을 지불하는 고객의 수를 Lead의 수로 나눈다.
- lead를 가입시키는게 목적일 때 : 가입하는 사람의 수를 Lead의 수로 나눈다.
KPIs 프로그래밍¶
- UCI Machine learning 사이트에 있는 bank marketing data 사용
- 포르투갈에 있는 은행의 phone call 마케팅
- bank-addtional_full.csv : 41,188명의 고객, 20개의 인풋
- bank-addtional.csv : 전체 데이터에서 약 10%의 데이터를 랜덤하게 고른 데이터 셋
여러 아웃풋을 한 셀 안에서 볼 수 있도록 조건 지정하기¶
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import pandas as pd # 판다스 불러오기
df = pd.read_csv('data/bank-additional.csv', sep = ';') # 데이터 읽어오기
df # 맨 오른쪽 y컬럼에 target 값이 들어가있다. 이 값들을 숫자로 바꿔야한다.
age | job | marital | education | default | housing | loan | contact | month | day_of_week | ... | campaign | pdays | previous | poutcome | emp.var.rate | cons.price.idx | cons.conf.idx | euribor3m | nr.employed | y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 30 | blue-collar | married | basic.9y | no | yes | no | cellular | may | fri | ... | 2 | 999 | 0 | nonexistent | -1.8 | 92.893 | -46.2 | 1.313 | 5099.1 | no |
1 | 39 | services | single | high.school | no | no | no | telephone | may | fri | ... | 4 | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.855 | 5191.0 | no |
2 | 25 | services | married | high.school | no | yes | no | telephone | jun | wed | ... | 1 | 999 | 0 | nonexistent | 1.4 | 94.465 | -41.8 | 4.962 | 5228.1 | no |
3 | 38 | services | married | basic.9y | no | unknown | unknown | telephone | jun | fri | ... | 3 | 999 | 0 | nonexistent | 1.4 | 94.465 | -41.8 | 4.959 | 5228.1 | no |
4 | 47 | admin. | married | university.degree | no | yes | no | cellular | nov | mon | ... | 1 | 999 | 0 | nonexistent | -0.1 | 93.200 | -42.0 | 4.191 | 5195.8 | no |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
4114 | 30 | admin. | married | basic.6y | no | yes | yes | cellular | jul | thu | ... | 1 | 999 | 0 | nonexistent | 1.4 | 93.918 | -42.7 | 4.958 | 5228.1 | no |
4115 | 39 | admin. | married | high.school | no | yes | no | telephone | jul | fri | ... | 1 | 999 | 0 | nonexistent | 1.4 | 93.918 | -42.7 | 4.959 | 5228.1 | no |
4116 | 27 | student | single | high.school | no | no | no | cellular | may | mon | ... | 2 | 999 | 1 | failure | -1.8 | 92.893 | -46.2 | 1.354 | 5099.1 | no |
4117 | 58 | admin. | married | high.school | no | no | no | cellular | aug | fri | ... | 1 | 999 | 0 | nonexistent | 1.4 | 93.444 | -36.1 | 4.966 | 5228.1 | no |
4118 | 34 | management | single | high.school | no | yes | no | cellular | nov | wed | ... | 1 | 999 | 0 | nonexistent | -0.1 | 93.200 | -42.0 | 4.120 | 5195.8 | no |
4119 rows × 21 columns
conversion 계산하기¶
df 대괄호 안에 만들고 싶은 열 conversion을 쓰고, 이 열에 들어갈 데이터를 등호 다음에 정의한다. df에 y열을 만약 안에 있는 값이 yes이면 1, 아니면 0으로 바꾼다. apply 함수 안에는 적용하고 싶은 함수를 넣으면 앞의 시리즈에 적용된다.
df['conversion'] = df['y'].apply(lambda x: 1if x =='yes' else 0)
df.head() # 마지막 열에 conversion 열이 생성된 결과를 볼 수 있다.
age | job | marital | education | default | housing | loan | contact | month | day_of_week | ... | pdays | previous | poutcome | emp.var.rate | cons.price.idx | cons.conf.idx | euribor3m | nr.employed | y | conversion | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 30 | blue-collar | married | basic.9y | no | yes | no | cellular | may | fri | ... | 999 | 0 | nonexistent | -1.8 | 92.893 | -46.2 | 1.313 | 5099.1 | no | 0 |
1 | 39 | services | single | high.school | no | no | no | telephone | may | fri | ... | 999 | 0 | nonexistent | 1.1 | 93.994 | -36.4 | 4.855 | 5191.0 | no | 0 |
2 | 25 | services | married | high.school | no | yes | no | telephone | jun | wed | ... | 999 | 0 | nonexistent | 1.4 | 94.465 | -41.8 | 4.962 | 5228.1 | no | 0 |
3 | 38 | services | married | basic.9y | no | unknown | unknown | telephone | jun | fri | ... | 999 | 0 | nonexistent | 1.4 | 94.465 | -41.8 | 4.959 | 5228.1 | no | 0 |
4 | 47 | admin. | married | university.degree | no | yes | no | cellular | nov | mon | ... | 999 | 0 | nonexistent | -0.1 | 93.200 | -42.0 | 4.191 | 5195.8 | no | 0 |
5 rows × 22 columns
# conversion 비율 구하기. 451을 4119로 나누면 10.94%가 나온다.
df.conversion.sum()
df.shape[0]
df.conversion.sum()/df.shape[0]
451
4119
0.10949259529011895
- conversion 비율은 전체적으로 마케팅 캠페인이 얼마나 효과가 있었는지를 보여준다.
- 더 나아가 커스터머를 그룹별로 나누는 segment를 하고 각 segment에서 다시 KPI를 계산한다.
각 나이대별로 conversion 비율 구하기¶
conversion_by_age = df.groupby(
by = 'age'
)['conversion'].sum()/ df.groupby(
by = 'age'
)['conversion'].count() * 100.0
conversion_by_age
age 18 33.333333 19 0.000000 20 0.000000 21 42.857143 22 20.000000 ... 81 66.666667 82 100.000000 85 0.000000 86 100.000000 88 0.000000 Name: conversion, Length: 67, dtype: float64
각 나이대별로 conversion 비율을 그래프로 그리기¶
ax = conversion_by_age.plot(
grid = True,
figsize = (10, 7),
title = 'Conversion Rates by Age'
)
ax.set_xlabel('age')
ax.set_ylabel('conversion rate (%)')
Text(0.5, 0, 'age')
Text(0, 0.5, 'conversion rate (%)')
연령대로 묶기¶
df['age_group']=df['age'].apply(
lambda x: '[18, 30)'if x < 30 else '[30, 40)' if x < 40 \
else '[40, 50)' if x < 50 else'[50, 60)' if x < 60 \
else '[60, 70)' if x < 70 else '70+'
)
연령대별로 Conversion 비율 구하기¶
conversions_by_age_group = df.groupby(
by ='age_group'
)['conversion'].sum() / df.groupby(
by ='age_group'
)['conversion'].count() * 100.0
conversions_by_age_group
age_group 70+ 48.717949 [18, 30) 12.159710 [30, 40) 10.248815 [40, 50) 7.919847 [50, 60) 12.049861 [60, 70) 30.985915 Name: conversion, dtype: float64
연령대별로 conversion 비율 그래프 그리기¶
ax = conversion_by_age_group.loc[
['[18, 30)', '[30, 40)', '[50, 60)', '[60, 70)', '70+']
].plot(
kind = 'bar',
color = 'skyblue',
grid = True,
figsize = (10,7),
title = 'Conversion Rates by Age Groups'
)
ax.set_xlabel('age')
ax.set_ylabel('conversion rate (%)')
Text(0.5, 0, 'age')
Text(0, 0.5, 'conversion rate (%)')
결혼 여부에 따라 conversion이 어떻게 다른지 살펴보기¶
conversion_by_marital_status_df = pd.pivot_table(df, values='y', index='marital', columns ='conversion', aggfunc=len)
conversion_by_marital_status_df
conversion | 0 | 1 |
---|---|---|
marital | ||
divorced | 403 | 43 |
married | 2257 | 252 |
single | 998 | 155 |
unknown | 10 | 1 |
결혼 여부에 따라 conversion 결과를 파이차트로 그리기¶
conversion_by_marital_status_df.plot(
kind = 'pie', #파이차트 지정
figsize = (15,7),
startangle = 90, #시계 반대 방향
subplots = True, #데이터 열을 따로 plot으로 그림
autopct = '%0.1f%%' #파이차트 안에 표시되는 숫자, 소수저 한 자리까지 표시
)
array([<AxesSubplot:ylabel='0'>, <AxesSubplot:ylabel='1'>], dtype=object)
출처 : udemy
'Python > Marketing Data Science' 카테고리의 다른 글
<마케팅 데이터 사이언스> Chapter 01-3 모델과 모델링 이해하기 (0) | 2023.05.07 |
---|---|
<마케팅 데이터 사이언스> Chapter 01-2 마케팅 데이터 분석을 위한 가장 중요한 첫걸음 (0) | 2023.05.03 |
<마케팅 데이터 사이언스> Chapter 01-1 Marketing Analytics 이해하기 (0) | 2023.05.02 |