用机器学习来提升你的用户增长:第七步,构建市场响应模型
点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”
作者:Barış KaramanFollow
编译:ronghuaiyang
正文共:7820 字 17 图
预计阅读时间:23 分钟
导读
前面做了那么多的分析,当落实到具体的行动的时候,我们需要最大化我们的营销行为带来的转化率,这个可以通过A/B测试以及营销响应模型来实现。
前文回顾:
用机器学习来提升你的用户增长:第五步,预测客户的下一个购买日
第七部分: 市场响应模型
利用我们在之前的文章中构建的模型,我们可以很容易的进行客户的分群,预测客户的终生价值。另外,我们还知道我们未来的销售数字是什么。但是我们怎样才能增加销售量呢?如果我们今天打折,我们应该期望多少的增量交易?
客户细分和做A/B测试使我们能够尝试许多不同的想法来产生增量销售。这是增长黑客的基石之一。你需要不断地构思和试验,以找到成长的机会。
将我们要发送折扣的客户分成测试组和对照组,可以帮助我们计算增量收益。
让我们看看下面的例子:
在这个设置中,目标组被分为三组,用以找到以下问题的答案:
提供折扣会增加转化率吗?
如果是,什么样的报价表现最好?
假设结果在统计上是显著的,折扣(A组)看起来是最好的,因为与对照组相比,它增加了3%的转换,相比买一送一,增加了1%的转换。
当然,在现实世界中,情况要复杂得多。有些打折方法在特定领域表现更好。因此,你需要为选定的细分市场创建一个折扣组合。此外,你不能指望转换是成功的唯一标准。成本总是要权衡的。一般来说,当转化率上升时,成本也会上升。这就是为什么有时你需要选择一个成本低廉但转化率较低的折扣。
现在我们通过实验知道了哪些方案比其他方案表现得更好。但如何进行预测呢?如果我们预测折扣的效果,我们可以很容易地最大化我们的交易,并预测成本。市场响应模型帮助我们建立这个框架。但要做到这一点,方法不止一种。我们可以把它们分成两类:
如果你没有一个对照组(想象你对每个人做了一个公开的推广,并在社交媒体上宣布),那么你就无法计算增量。对于这种情况,最好建立一个预测整体销售量的回归模型。之前的假设是,该模型可以得到更高的销售数字的促销日。要构建这种模型,你的数据集应该包括促销日和非促销日的销售数字,以便机器学习模型可以计算增量。
如果你有一个对照组,你可以建立基于客户分群或每个人的响应模型。对他们来说,前提假设是一样的。提供折扣应该会增加转化率。个体转换概率的增加将带来总体转换的增加。
让我们开始编码,看看如何构建个人级别的响应模型。在本例中,我们将使用营销数据集:https://blog.minethatdata.com/2008/03/minethatdata-e-mail-analytics-anddata.html。但是我做了一些修改,使它更符合我们的案例:https://gist.github.com/karamanbk/ef1a118592e2f7954e5bb582e09bdde3。
我们导入需要的库并导入我们的数据:
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 #must if you use python 2
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
#initate plotly
pyoff.init_notebook_mode()
#function for ordering cluster numbers for given criteria
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
#import the data
df_data = pd.read_csv('response_data.csv')
#print first 10 rows
df_data.head(10)
我们的数据的前10行:
我们的前8列提供个人级别的数据,conversion列是我们要预测的标签:
recency:几个月前购买
history:历史购买的$值
used_discount/used_bogo:表示客户是否使用折扣或买一送一
zip_code:邮政编码,类别为郊区/城市/农村
is_reference:表示客户是否从reference渠道获得
channel:客户使用的渠道,电话/网络/多渠道
offer:发送给客户的优惠方式,打折/买一送一/无优惠
我们将构建一个二分类模型,为所有客户的转换概率打分。为此,我们将遵循以下步骤:
建立uplift 公式
探索性数据分析(EDA)和特征工程
计算转换概率
观察测试集的结果
Uplift公式
首先,我们需要构建一个计算uplift的函数。为了简单起见,我们假设每个转换意味着一个订单,平均订单值为25美元。
我们将计算三种类型的uplift:
转化率Uplift:试验组转化率 - 对照组转化率
订单uplift:转化率uplift * 试验组转化的客户的人数
收入uplift:订单uplift * 平均订单$值
我们构建calc_uplift函数:
def calc_uplift(df):
#assigning 25$ to the average order value
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)))
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)))
我们把这个函数用到dataframe上,可以得到下面的结果:
如果我们想获得更多的转化率,折扣似乎是一个更好的选择。与没有收到任何优惠的客户相比,它带来了7.6%的增长。BOGO(买一送一)也上涨了4.5%。
让我们开始探索是哪些因素驱动了这种增量的变化。
探索性数据分析 & 特征工程
我们逐个检查每个特征,以找出它们对转化率的影响。
1- Recency
理想情况下,当recency变大的时候,转化率应该下降,因为不活跃的客户不太可能再次购买:
df_plot = df_data.groupby('recency').conversion.mean().reset_index()
plot_data = [
go.Bar(
x=df_plot['recency'],
y=df_plot['conversion'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Recency vs Conversion',
plot_bgcolor = 'rgb(243,243,243)',
paper_bgcolor = 'rgb(243,243,243)',
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
一切正常,直到11个月后,开始增加。这可能是由于许多原因,比如这个群体的客户变少了,或者因为给的优惠起了效果。
2- History
我们将构建一个history聚类并观察它的影响。我们应用k-means聚类来定义history上的重要群体:
kmeans = KMeans(n_clusters=5)
kmeans.fit(df_data[['history']])
df_data['history_cluster'] = kmeans.predict(df_data[['history']])
#order the cluster numbers
df_data = order_cluster('history_cluster', 'history',df_data,True)
#print how the clusters look like
df_data.groupby('history_cluster').agg({'history':['mean','min','max'], 'conversion':['count', 'mean']})
#plot the conversion by each cluster
df_plot = df_data.groupby('history_cluster').conversion.mean().reset_index()
plot_data = [
go.Bar(
x=df_plot['history_cluster'],
y=df_plot['conversion'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='History vs Conversion',
plot_bgcolor = 'rgb(243,243,243)',
paper_bgcolor = 'rgb(243,243,243)',
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
聚类的总体情况以及转化率的图:
拥有较高history值的客户更有可能转化3- Used Discount & BOGO
我们用下面的代码检查这两个函数:
df_data.groupby(['used_discount','used_bogo','offer']).agg({'conversion':'mean'})
输出:
这两种优惠都使用过的客户具有最高的转化率4- Zip Code
与其他地区相比,农村地区的转化率更好:
df_plot = df_data.groupby('zip_code').conversion.mean().reset_index()
plot_data = [
go.Bar(
x=df_plot['zip_code'],
y=df_plot['conversion'],
marker=dict(
color=['green', 'blue', 'orange'])
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Zip Code vs Conversion',
plot_bgcolor = 'rgb(243,243,243)',
paper_bgcolor = 'rgb(243,243,243)',
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
5- Referral
如下图所示,来自referral渠道的客户转化率较低:
它们的转化率几乎降低了5%。
6- Channel
正如我们所预期的,多渠道具有更高的转化率。使用多个渠道是高参与度的标志。
7- Offer Type
享受折扣优惠的顾客的转化率约为18%,而BOGO的转化率约为15%。如果客户没有收到优惠,他们的转化率会下降约4%。
该数据的特征工程非常简单。我们使用.get_dummies()将类别列转换成数字列:
df_model = df_data.copy()
df_model = pd.get_dummies(df_model)
现在可以建立我们的机器学习模型来评估转换概率了。
转化概率打分
要构建我们的模型,我们需要遵循我们在前面的文章中提到的步骤。
我们对特征和标签进行划分:
#create feature set and labels
X = df_model.drop(['conversion'],axis=1)
y = df_model.conversion
构建训练集合测试集:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=56)
我们拟合模型并得到转换概率。我们用模型的**predit_proba()**函数为每一行计算一个概率:
xgb_model = xgb.XGBClassifier().fit(X_train, y_train)
X_test['proba'] = xgb_model.predict_proba(X_test)[:,1]
让我们看看我们的概率列是怎样的:
从上面可以看出,我们的模型为每个客户分配了从0到1的转化概率。
最后,我们需要了解我们的模型是否工作良好。
测试集上的结果
现在我们假设,打折和买一送一的概率上的差异,应该类似于他们之间的转化率的差异。
我们需要用我们的测试集来找出答案。
让我们计算一下对于打折,预测和实际订单的增量:
real_disc_uptick = len(X_test)*(X_test[X_test['offer_Discount'] == 1].conversion.mean() - X_test[X_test['offer_No Offer'] == 1].conversion.mean())
pred_disc_uptick = len(X_test)*(X_test[X_test['offer_Discount'] == 1].proba.mean() - X_test[X_test['offer_No Offer'] == 1].proba.mean())
对于实际的增量计算,我们使用conversion列。对于预测的,我们用proba代替它。
结果非常好。实际订单增量为966,模型预测为948(1.8%误差).
收入增量预测比较:24150 vs 23700.
我们需要检查的结果是否对BOGO也是一样好呢:
real_bogo_uptick = len(X_test)*(X_test[X_test['offer_Buy One Get One'] == 1].conversion.mean() - X_test[X_test['offer_No Offer'] == 1].conversion.mean())
pred_bogo_uptick = len(X_test)*(X_test[X_test['offer_Buy One Get One'] == 1].proba.mean() - X_test[X_test['offer_No Offer'] == 1].proba.mean())
BOGO的结果:
订单增量 — 实际vs预测:563 vs 595
收入增量 — 实际vs预测:14075 vs 14875
错误率约为5.6%。该模型可以有效地提高BOGO优惠类型的预测得分。
计算转化概率对我们在不同的领域也有很大的帮助。我们已经预测了不同类型的优惠的响应,它可以帮助我们找到发放优惠的目标,以最大限度地提高我们的增量。在下一篇文章中,我们将构建我们自己的uplift模型。
—END—
英文原文:https://towardsdatascience.com/market-response-models-baf9f9913298
请长按或扫描二维码关注本公众号
喜欢的话,请给我个好看吧!