用机器学习来提升你的用户增长:第七步,构建市场响应模型

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Barış KaramanFollow

编译:ronghuaiyang

正文共:7820 字 17 图

预计阅读时间:23 分钟

导读

前面做了那么多的分析,当落实到具体的行动的时候,我们需要最大化我们的营销行为带来的转化率,这个可以通过A/B测试以及营销响应模型来实现。

前文回顾:

用机器学习来提升你的用户增长:第一步,了解你的目标

用机器学习来提升你的用户增长:第二步,客户分群

用机器学习来提升你的用户增长:第三步,预测客户的终生价值

用机器学习来提升你的用户增长:第四步,客户流失预测

用机器学习来提升你的用户增长:第五步,预测客户的下一个购买日

用机器学习来提升你的用户增长:第六步,预测销量

第七部分: 市场响应模型

利用我们在之前的文章中构建的模型,我们可以很容易的进行客户的分群,预测客户的终生价值。另外,我们还知道我们未来的销售数字是什么。但是我们怎样才能增加销售量呢?如果我们今天打折,我们应该期望多少的增量交易?

客户细分和做A/B测试使我们能够尝试许多不同的想法来产生增量销售。这是增长黑客的基石之一。你需要不断地构思和试验,以找到成长的机会。

将我们要发送折扣的客户分成测试组和对照组,可以帮助我们计算增量收益。

让我们看看下面的例子:

在这个设置中,目标组被分为三组,用以找到以下问题的答案:

  1. 提供折扣会增加转化率吗?

  2. 如果是,什么样的报价表现最好?

假设结果在统计上是显著的,折扣(A组)看起来是最好的,因为与对照组相比,它增加了3%的转换,相比买一送一,增加了1%的转换。

当然,在现实世界中,情况要复杂得多。有些打折方法在特定领域表现更好。因此,你需要为选定的细分市场创建一个折扣组合。此外,你不能指望转换是成功的唯一标准。成本总是要权衡的。一般来说,当转化率上升时,成本也会上升。这就是为什么有时你需要选择一个成本低廉但转化率较低的折扣。

现在我们通过实验知道了哪些方案比其他方案表现得更好。但如何进行预测呢?如果我们预测折扣的效果,我们可以很容易地最大化我们的交易,并预测成本。市场响应模型帮助我们建立这个框架。但要做到这一点,方法不止一种。我们可以把它们分成两类:

  1. 如果你没有一个对照组(想象你对每个人做了一个公开的推广,并在社交媒体上宣布),那么你就无法计算增量。对于这种情况,最好建立一个预测整体销售量的回归模型。之前的假设是,该模型可以得到更高的销售数字的促销日。要构建这种模型,你的数据集应该包括促销日和非促销日的销售数字,以便机器学习模型可以计算增量。

  2. 如果你有一个对照组,你可以建立基于客户分群或每个人的响应模型。对他们来说,前提假设是一样的。提供折扣应该会增加转化率。个体转换概率的增加将带来总体转换的增加。

让我们开始编码,看看如何构建个人级别的响应模型。在本例中,我们将使用营销数据集: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

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值