欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-06 22:22:20
...

点击上方“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

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

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

喜欢的话,请给我个好看吧用机器学习来提升你的用户增长:第七步,构建市场响应模型