urban数据集_转行数据分析--6. 如何评价项目收益

2a887cfa0e47e226aeabc66e42218b1b.png

jinzhao:用户增长手册--1. 数据指标体系

jinzhao:用户增长手册--2. 用户分群

jinzhao:用户增长手册--4. 用户流失预测

jinzhao:用户增长手册--3.用户生命周期价值预测

jinzhao: 用户增长手册--5. 预测下一个购买日

jinzhao: 用户增长手册--6. 策略综合收益建模

jinzhao:用户增长手册--7.销量预测

jinzhao: 用户增长手册--8. 预测促销活动的增量收益

第8部分:综合收益建模

Growth Hacker最为关键的工作之一就是尽可能地提高效率。 首先,您需要节省时间。这意味着您必须快速进行构思,实验,学习和迭代。 其次,您需要具有成本概念。这意味着在给定的预算/时间/努力下带来最大的回报。

用户分群有助于成长型黑客提高转化率,从而提高成本效益。但是,设想一下您即将发起促销活动并且知道要定位哪个用户分群的情况。您需要将优惠卷发送给所有人吗?

答案是:不。在您当前的目标群体中,总会有一些客户要购买。您会过度促销影响营销成本。我们可以根据以下方法总结用户分群:

  • 策略响应者:仅在收到优惠卷后才购买的客户
  • 不响应策略者:无论如何都不会购买的客户
  • 控制响应者:无需优惠卷即可购买的客户
  • 控制无响应者:如果没有收到要约就不会购买的客户

逻辑上非常明显。您需要定位策略响应者(TR)和控制非响应者(CN)。由于除非您提供优惠卷,否则他们不会购买,因此这些群体正在促进您在促销活动中的参与度。另一方面,您需要避免定位策略无反应者(TN)和控制反应者(CR)。您将无法从定位TN中受益,CN会让您提升过多成本。

以上逻辑已经讨论清楚,最后一件简单的事情要做。我们需要确定哪些客户属于哪个类别。 答案是提升模型。它有两个简单步骤:

  1. 预测所有客户在每个组中的概率:我们将为此建立一个多分类模型。
  2. 我们将计算提升分数。提升分数公式为:

7df315669d39647107e47173594f8910.png

我们将求和为TR和CN的概率相加,然后减去掉入其他分组的概率。分数越高意味着提升度越高。 好吧,让我们看一下如何通过一个示例来实现它。在上一篇文章中,我们将使用相同的数据集,您可以在此处找到。 我们从导入所需的库和函数开始:

from datetime import datetime, timedelta,date
import pandas as pd
%matplotlib inline
from sklearn.metrics import classification_report,confusion_matrix
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from __future__ import division
from sklearn.cluster import KMeans

import plotly.plotly as py
import plotly.offline as pyoff
import plotly.graph_objs as go

import sklearn
import xgboost as xgb
from sklearn.model_selection import KFold, cross_val_score, train_test_split
import warnings
warnings.filterwarnings("ignore")

#initiate plotly
pyoff.init_notebook_mode()

#function to order clusters
def order_cluster(cluster_field_name, target_field_name,df,ascending):
    new_cluster_field_name = 'new_' + cluster_field_name
    df_new = df.groupby(cluster_field_name)[target_field_name].mean().reset_index()
    df_new = df_new.sort_values(by=target_field_name,ascending=ascending).reset_index(drop=True)
    df_new['index'] = df_new.index
    df_final = pd.merge(df,df_new[[cluster_field_name,'index']], on=cluster_field_name)
    df_final = df_final.drop([cluster_field_name],axis=1)
    df_final = df_final.rename(columns={"index":cluster_field_name})
 return df_final


#function for calculating the uplift
def calc_uplift(df):
    avg_order_value = 25
 #calculate conversions for each offer type
    base_conv = df[df.offer == 'No Offer']['conversion'].mean()
    disc_conv = df[df.offer == 'Discount']['conversion'].mean()
    bogo_conv = df[df.offer == 'Buy One Get One']['conversion'].mean()

 #calculate conversion uplift for discount and bogo
    disc_conv_uplift = disc_conv - base_conv
    bogo_conv_uplift = bogo_conv - base_conv

 #calculate order uplift
    disc_order_uplift = disc_conv_uplift * len(df[df.offer == 'Discount']['conversion'])
    bogo_order_uplift = bogo_conv_uplift * len(df[df.offer == 'Buy One Get One']['conversion'])

 #calculate revenue uplift
    disc_rev_uplift = disc_order_uplift * avg_order_value
    bogo_rev_uplift = bogo_order_uplift * avg_order_value


 print('Discount Conversion Uplift: {0}%'.format(np.round(disc_conv_uplift*100,2)))
 print('Discount Order Uplift: {0}'.format(np.round(disc_order_uplift,2)))
 print('Discount Revenue Uplift: ${0}n'.format(np.round(disc_rev_uplift,2)))

 if len(df[df.offer == 'Buy One Get One']['conversion']) > 0:

 print('-------------- n')
 print('BOGO Conversion Uplift: {0}%'.format(np.round(bogo_conv_uplift*100,2)))
 print('BOGO Order Uplift: {0}'.format(np.round(bogo_order_uplift,2)))
 print('BOGO Revenue Uplift: ${0}'.format(np.round(bogo_rev_uplift,2))) 

然后,我们将导入数据:

df_data = pd.read_csv('response_data.csv')
df_data.head(10)

464f0639c11bf9de375f52b67eca06cc.png

您可以从上一篇文章中回忆到,我们拥有收到"折扣"和“买一送一”优惠的客户数据以及他们的反应。我们还有一个对照组,什么也没收到。

列描述如下:

  • 新近度:自上次购买以来的几个月
  • 历史记录:历史购买的价值$
  • useddiscount / usedbogo:指示客户是使用折扣还是之前买一送一
  • zip_code:邮政编码的类别,如Suburban / Urban / Rural
  • is_referral:指示是否从推荐渠道获得了客户
  • 渠道:客户使用的渠道,电话/网络/多渠道
  • 优惠:发送给客户的优惠,折扣/一赠一/无优惠 在构建模型之前,让我们应用calc_uplift函数以将该广告系列的当前提升作为基准:

calcuplift(dfdata)

70c4c8365f400fdb18153e8fbd1ca24d.png

转换提升为折让7.66%,买一赠一(BOGO)为4.52%。

接下来,我们将开始构建模型。

预测提升分数的多分类模型: 目前,我们的标签是客户是否转换(1或0)。我们需要为TR,TN,CR和CN创建四个类。我们知道收到折扣和优惠的客户是Treatment,剩下的就是控制。让我们创建一个campaign_group列,使此信息可见:

df_data['target_class'] = 0 #CN
df_data.loc[(df_data.campaign_group == 'control') & (df_data.conversion > 0),'target_class'] = 1 #CR
df_data.loc[(df_data.campaign_group == 'treatment') & (df_data.conversion == 0),'target_class'] = 2 #TN
df_data.loc[(df_data.campaign_group == 'treatment') & (df_data.conversion > 0),'target_class'] = 3 #TR

在此示例中,类的映射如下:

  • 0->控制无响应
  • 1->控制响应者
  • 2->策略无反应
  • 3->策略响应者

在训练我们的模型之前,有一个小特征工程步骤。我们将从历史列创建聚类,并应用get_dummies将分类列转换为数值列:

#creating the clusters
kmeans = KMeans(n_clusters=5)
kmeans.fit(df_data[['history']])
df_data['history_cluster'] = kmeans.predict(df_data[['history']])
#order the clusters
df_data = order_cluster('history_cluster', 'history',df_data,True)
#creating a new dataframe as model and dropping columns that defines the label
df_model = df_data.drop(['offer','campaign_group','conversion'],axis=1)
#convert categorical columns
df_model = pd.get_dummies(df_model)

让我们拟合模型并获取每个类的概率:

#create feature set and labels
X = df_model.drop(['target_class'],axis=1)
y = df_model.target_class
#splitting train and test groups
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=56)
#fitting the model and predicting the probabilities
xgb_model = xgb.XGBClassifier().fit(X_train, y_train)
class_probs = xgb_model.predict_proba(X_test)

变量class_probs具有每个客户的概率。让我们看一个例子:

9871d9d717ce39d958be20b9bf3da44e.png

对于此特定客户,我们可以将概率映射如下: CN:32% CR:2% TN:58.9% TR:6.9%

因此,此客户的提升分数为: 0.32 + 0.069- 0.02- 0.589 = -0.22 让我们将其应用于所有用户并计算提升分数: 所有客户的

#probabilities for all customers
overall_proba = xgb_model.predict_proba(df_model.drop(['target_class'],axis=1))
#assign probabilities to 4 different columns
df_model['proba_CN'] = overall_proba[:,0] 
df_model['proba_CR'] = overall_proba[:,1] 
df_model['proba_TN'] = overall_proba[:,2] 
df_model['proba_TR'] = overall_proba[:,3]
#calculate uplift score for all customers
df_model['uplift_score'] = df_model.eval('proba_CN + proba_TR - proba_TN - proba_CR')
#assign it back to main dataframe
df_data['uplift_score'] = df_model['uplift_score']

通过运行上面的代码,我们在主数据框中添加了一个uplift_score列,如下所示:

54eaf3661c914869fc1dc692666f37a4.png

现在该检查具有此模型的最关键部分了。该模型真的有效吗?评价升力建模的真实性能有些困难。 我们将检查提升度在各个得分分数之间的变化情况,以了解我们是否可以在现实生活中使用该模型。

模型评估

为了评估我们的模型,我们将创建两个不同的组并将它们与我们的基准进行比较。组是:

  1. 高提升分数:客户的提升分数 > 第三分位数
  2. 低提升分数:客户的提升分数 < 第二分位数

我们将进行比较: 转换提升 提升每个目标客户的收入,看看我们的模型是否可以使我们的行动更有效率。 这是折扣活动的基准。

目标客户总数:21307 折扣转化提升:7.66% 折扣订单提升:1631.89 折扣收入提升:$ 40797.35 每个目标客户收入提升:$ 1.91 让我们创建第一个组数字:

df_data_lift = df_data.copy()
uplift_q_75 = df_data_lift.uplift_score.quantile(0.75)
df_data_lift = df_data_lift[(df_data_lift.offer != 'Buy One Get One') & (df_data_lift.uplift_score > uplift_q_75)].reset_index(drop=True)

计算上升 results:

User Count: 5282

Discount Conversion Uplift: 12.18%

Discount Order Uplift: 643.57

Discount Revenue Uplift: $16089.36

Revenue Uplift Per Targeted Customer: $3.04

不出所料,每位目标客户的收入提高到1.4美元。而且,该分组为目标客户的50%贡献了37%的收入提升。 通过使用此模型,我们可以通过以下方式轻松提高广告系列的效率:

  • 根据提升得分定位特定用户分群受众群
  • 根据客户的提升分数尝试不同的优惠

jinzhao:用户增长手册--1. 数据指标体系

jinzhao:用户增长手册--2. 用户分群

jinzhao:用户增长手册--4. 用户流失预测

jinzhao:用户增长手册--3.用户生命周期价值预测

jinzhao: 用户增长手册--5. 预测下一个购买日

jinzhao: 用户增长手册--6. 策略综合收益建模

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值