电商流量数据化运营

渠道效果影响因素研究——选自《电商流量数据化运营》

Author
宋天龙
发布于 2022-01-26
3536 次阅读
0 次赞
0 次分享
渠道效果影响因素研究——选自《电商流量数据化运营》
AI 智能核心导读

精准定位转化影响因素是渠道效果分析的核心。通过引入Shapley Values(SHAP值)结合决策树模型,可科学量化各特征对转化目标的整体正负向影响及单样本贡献度。该方法能有效揭示影响转化的关键业务规则,直接赋能营销业务,实现精准的人群圈选、跨部门贡献价值评估以及渠道投放效果的全面优化提升。

渠道效果分析:如何精准定位转化影响因素与落地应用

在渠道效果分析中,找到影响效果转化的主要因素是重中之重。它能直接帮助营销人员更好地了解渠道转化的影响因素,以及如何进行渠道效果优化和提升。同时,还可以基于分析得到的业务规则,直接应用到营销投放和操作过程,因此落地性和价值度都非常高

该节内容可应用于任何带有转化目标的渠道中,且转化的定义可以包含任何目标场景,例如:

  • 动作场景:提交订单、按钮点击、线索填写、注册、登录、抽奖等事件。
  • 非动作场景:停留超过 30 秒、看过超过 10 个页面、浏览过特定页面等过程性行为。

渠道效果影响因素概述:引入 Shapley Values

在“4.1.4 基于 Lookalike 的人群规则实现投放人群管理”中,介绍了如何通过模型提取营销目标人群的列表,同时也通过“特征重要性”展示了哪些特征对于用户转化最为重要。

“特征重要性”的具体含义,对于一般业务人员来讲比较难以理解,这里介绍一种新的解释影响重要程度的度量值——Shapley Values

Shapley Values 来源于博弈论,它将整个模型训练作为一局博弈,每个特征当作一个博弈者,而预测结果则是最终的结果。Shapley Values 用来判断每个特征对预测结果做出了多大的贡献。 这里引用一则寓言故事来简单说明 Shapley Values 的计算逻辑:

Shapley Values 的寓言故事

约克和汤姆一起去旅游并准备吃午餐。约克带了 3 块饼,汤姆带了 5 块饼。这时,他们邀请一个路人一起吃饭。约克、汤姆和路人将 8 块饼全部吃完。路人送了 8 个金币来感谢他们的午餐。

约克和汤姆为这 8 个金币的分配发生了争执。汤姆认为自己带了 5 块饼,理应得 5 个金币,剩下 3 个金币给约克。约克则认为既然大家一起吃这 8 块饼,理应平分 8 个金币,即每人 4 个。

夏普里(Shapley)告诉约克,从公正的角度看,约克应当得到 1 个金币,而汤姆应当得到 7 个金币。原因是约克带了 3 块饼,汤姆带了 5 块,3 个人一起吃了 8 块饼。约克吃了其中的 1/3,即 8/3 块;路人吃了约克带的饼中的 3 - 8/3 = 1/3;汤姆也吃了 8/3,路人吃了他带的饼中的 5 - 8/3 = 7/3。这样,路人所吃的 8/3 块饼中,有约克的 1/3,汤姆的 7/3。路人所吃的饼中,属于汤姆的是属于约克的 7 倍。因此,对于这 8 个金币,公平的分法是:约克得 1 个金币,汤姆得 7 个金币。

我们从这个故事中看出,夏普里(Shapley)所提出的对金币的“公平的”分法,遵循的原则是:所得与自己的贡献相等。这就是 Shapley Values 的核心含义。

实战解析:分析特征对转化目标的正负向影响

本案例使用附件“第 4 章”-“4-1”数据,该数据与“4.1 基于 Lookalike 的投放人群管理”案例相同。

第一步:导入核心库

python
1import pandas as pd # ① 2from sklearn.tree import DecisionTreeClassifier # ② 3import shap # ③ 4shap.initjs() # ④
  • 代码 ①:导入的 pandas 库用来读取和处理数据。
  • 代码 ②:导入的 DecisionTreeClassifier 是决策树模型,用来做分类训练使用。
  • 代码 ③:导入 shap 用来解释模型信息,读者可使用 pip install shap 安装该库。
  • 代码 ④:在 Jupyter Notebook 环境下,加载用于 shap 可视化的 JS 代码。

第二步:准备与读取数据

python
1df = pd.read_excel('第4章.xlsx', sheet_name='4-1', comment='#', nrows=1000) # ① 2x = df[['newVisits', 'hits', 'pageviews', 'timeOnSite', 'hour']] # ② 3y = df['goalAchieve'] # ③
  • 代码 ①:使用 pandasread_excel 从附件第 4 章中读取名为 4-1 的工作簿,读取前 1000 行数据。
  • 代码 ② 和 ③:分别将要分析的字段获取出来,这里为了分析方便只选取少量的字段。

第三步:训练决策树模型

python
1clf = DecisionTreeClassifier(random_state=0) # ① 2clf.fit(x, y) # ②
  • 代码 ①:调用 DecisionTreeClassifier 创建一个决策树对象,random_state=0 表示固定初始化随机种子的值。
  • 代码 ②:调用该对象的 fit 方法,将 xy 传入模型中训练。

第四步:创建 Shapley 解释模型

python
1explainer = shap.TreeExplainer(clf) # ① 2shap_values = explainer.shap_values(x) # ②
  • 代码 ①:基于 shapTreeExplainer 方法,创建一个用于树模型的解析对象 explainer
  • 代码 ②:传入特征矩阵,计算 SHAP 值。

为了更好地了解 SHAP 值,通过如下代码构建数据框并做描述性统计分析:

python
1shap_df = pd.DataFrame(shap_values[1], columns=x.columns) # ① 2print(shap_df.head(3)) # ② 3print(shap_df.describe()) # ③
  • 代码 ①:构建了一个由 SHAP 值组成的数据框,列名与训练数据相同。由于 shap_values 返回的是一个包含了正负关系的列表,这里只保留正向预测结果 SHAP 数据,即列表中的第二组结果。
  • 代码 ②:打印数据的前 3 条记录如下,其中正数表示有正向贡献,负数表示负向贡献:
code
1 newVisits hits pageviews timeOnSite hour 20 0.0 -0.078217 0.009828 -0.093882 -0.024729 31 0.0 -0.250762 0.054761 0.258116 -0.249115 42 0.0 0.051621 -0.042187 -0.176401 -0.020033
  • 代码 ③:调用数据框的 describe 方法做描述性统计,并打印输出,结果如下:
code
1 newVisits hits pageviews timeOnSite hour 2count 1000.0 1000.000000 1000.000000 1000.000000 1000.000000 3mean 0.0 -0.008398 -0.009334 0.019369 -0.001636 4std 0.0 0.147385 0.114187 0.219804 0.087543 5min 0.0 -0.401172 -0.466117 -0.370827 -0.309737 625% 0.0 -0.081857 -0.038209 -0.136498 -0.026109 750% 0.0 -0.022047 -0.012394 -0.056446 -0.005865 875% 0.0 0.056337 0.022589 0.111852 0.021564 9max 0.0 0.521093 0.427002 0.772954 0.406068

第五步:可视化分析特征的正负向影响

python
1shap.summary_plot(shap_values, x, plot_type="bar") # ① 2print(shap_df.abs().mean(axis=0).to_frame().T) # ② 3print(pd.DataFrame([clf.feature_importances_], columns=x.columns)) # ③
  • 代码 ①:使用 summary_plot 来展示原始数据特征计算后的 SHAP 值,计算逻辑为每个特征原始 SHAP 值先取绝对值,然后求均值;plot_type="bar" 设置特征按 SHAP 计算结果展示条形图。

图 7-2 SHAP 特征重要程度柱形图

图 7-2 横坐标轴是特征的 SHAP 值的绝对值的均值,值越大代表越重要;纵坐标轴是特征,条形图越长表示越重要。图中 timeOnSite 最重要,其次是 hits,最不重要的特征是 newVisits

  • 代码 ②:对图 7-2 中的特征重要性进行还原。先对 shap_df 调用 abs 方法求出绝对值,然后调用 mean 方法并通过 axis=0 指定按列计算均值,使用 to_frame 方法转换为数据框,使用 T 方法做转换,从多行一列转换为一行多列,便于展示结果。结果可以与图 7-2 的 SHAP 重要性结合起来一起分析。
code
1newVisits hits pageviews timeOnSite hour 2 0.0 0.108243 0.070411 0.170209 0.053877
  • 代码 ③:输出原始决策树模型的特征重要性,便于与 SHAP 计算结果比较。通过 pd.DataFrame 创建一个数据框,值为通过 clf.feature_importances_ 属性取出的特征重要性结果,列名与训练集特征相同,结果如下:
code
1newVisits hits pageviews timeOnSite hour 2 0.0 0.285795 0.171114 0.391201 0.15189

通过代码 ② 和代码 ③ 的输出结果对比,虽然二者的值不同(原因是计算方法不同),但得到的结论趋势是一致的,特征间的大小排序为:timeOnSite > hits > pageviews > hour > newVisits

为了更详细地展示每个特征对最终结果的影响,可以通过如下代码输出图形:

python
1shap.summary_plot(shap_values[1], x)

如图 7-3,上述代码的功能与之前的 SHAP 特征重要性的条形图相同,但展示的结果是一个类似散点图 + 条形图的结果。图中横坐标轴是 SHAP 原始值,值从左到右增大;右侧纵轴是特征值分布,特征值越大时颜色越深;图中间的散点为样本点,样本越聚集,则形成的区块面积越大。

图 7-3 特征 SHAP 值排序

从图 7-3 可以看出,对所有渠道数据样本而言,各个特征对转化目标预测的影响如下:

  • SHAP 值会随着 timeOnSite 值的增加而增大,即二者具有较强的正向线性关系,因此更大的 timeOnSite 更利于对目标转化产生积极贡献
  • SHAP 值会随着 hits 值的增加而下降,二者具有较强的负向线性关系,因此更小的 hits 值更利于对目标转化产生积极贡献
  • SHAP 值总体上会随着 pageviews 的增加而增加,但在 SHAP = 0 的位置附近存在大量的样本点,说明这些点对于 SHAP 值的增加没有贡献。
  • SHAP 值总体上增加或下降与 hour 的变化关系较弱,当 hour 值很大时会对 SHAP 值有正向和负向不同的作用。
  • SHAP 值与 newVisits 分布无明显关系,所有的数据都集中在 SHAP = 0 的位置附近,即 newVisits 无论怎么变化都不影响预测结果。

深入微观:分析特征如何影响单个样本的预测结果

在某些场景下,我们可能需要单独分析特征对于单个样本的预测结果的影响,例如特征如何影响某次广告的转化、如何影响单个客户的转化等。本案例来实现对单个样本的特征影响的解释。

本案例的数据延续“7.2.2 分析特征对转化目标的正负向影响”的结果,假设这些数据是不同的广告波次下的效果数据,这里分析单次广告下的特征影响因素。

第六步:单样本预测结果解析

python
1print(explainer.expected_value) # ① 2print([1 - clf.predict(x).mean(0), clf.predict(x).mean(0)]) # ② 3shap.force_plot(explainer.expected_value[1], shap_values[1][0,:], x.iloc[0,:]) # ③ 4shap.force_plot(explainer.expected_value[1], shap_values[1][17,:], x.iloc[17,:]) # ④
  • 代码 ①:打印输出 shap 对象的预测值,结果为 [0.813 0.187]
  • 代码 ②:通过树模型的预测计算来还原 shap 对象的预测值。通过 clf.predict(x).mean(0) 来实现对 x 的预测,得到的值为预测结果的均值。本案例中的预测结果值是由 0 和 1 组成,因此值的含义为转化占比;通过 1 - clf.predict(x).mean(0) 得到另一半的概率占比(非转化占比),得到与代码 ① 相同的结果 [0.813, 0.187]
  • 代码 ③ 和 ④:通过 shapforce_plot 来显示特征对单个样本记录的影响。其中 explainer.expected_value 为通过 shap 对象预测得到的预期值,其中 1 代表第二个数据对象,表示预测为 1 的转化占比;shap_values[1] 表示预测结果为 1 对应的 SHAP 值,[0,:] 表示 shap 对象中的第 1 个数据行记录;x.iloc[0,:] 为原始训练样本的第 1 个样本值。同理,代码 ④ 表示第 18 个样本预测值与模型基准的对照结果。得到结果图 7-4。

图 7-4 特征对单个样本的影响

图 7-4 中,水平坐标轴是 SHAP 值分布。base value 是全体样本 SHAP 的平均值,它与树模型预测后的均值相等,输出结果都是 0.187,表示所有样本的预测结果(值域为 0 和 1)的平均值。f(x) 是当前样本的 SHAP 值,通过与 base value 的比较可以知道该条结果预测效果相对“标杆”的差距。

  • 在 f(x) 左侧的 higher 区域,为特征对 SHAP 值的正向影响区间,表示左侧的特征能增加预测的效果。图 ① 中的 pageviews=20 对于该样本预测起到积极贡献作用,但长度条很小表示贡献非常有限。
  • 在 f(x) 右侧的 lower 区域,表示特征对 SHAP 值的负向影响。图 ① 中的 timeOnSite=522 对 SHAP 值的负向影响最大,另外 hits=305hour=22 会显著降低模型预测效果。

图中所有样本的 base value 一致(全部样本的预测均值 0.187)。通过对比两个样本的结果,图 ① 预测结果 f(x) = 0,低于总体转化均值;而图 ② 预测结果为 1,则高于总体转化均值。二者预测结果的差异,主要是各自 higher 和 lower 区域的特征导致的。图 ② 中的 f(x) 显著正向贡献特征是 hits=245hour=6timeOnSite=861,这些特征显著地拉升了模型效果。

这种针对单个样本的预测解释,主要用在特定渠道、用户等焦点对象的预测结果的解读和分析,用于找到到底是什么因素导致预测结果更准(或不准)、产生转化(或不转化)

知识拓展:渠道效果影响因素的落地应用

在所有数据挖掘和机器学习算法中,综合业务可理解性、可解释性以及算法的简易实施性,以下两类模型比较适合应用到影响因素分析场景中:

  1. 树模型:包括 CART(Classification and Regression Trees)等单一树,以及 GBDT(Gradient Boosting Decision Tree)、XGB(eXtreme Gradient Boosting)等集成树。它可以提供类似于人类思考逻辑的决策树规则。
  2. 广义线性回归:包括简单线性回归、逻辑回归等。它可以提供在学校时期已经学过的数学公式。

通过本节以及“4.1 基于 Lookalike 的投放人群管理”知识,我们可以通过多种模式找到影响渠道效果的重要特征,以及不同特征对结果的影响规则。在后续业务落地中,主要应用场景包括:

  • 投放人群圈选:具体用法参考“4.1 基于 Lookalike 的投放人群管理”。
  • 贡献价值分析:营销转化会涉及站外广告投放、落地页设计、网站内部功能和体验优化、站内运营活动策划和执行等主要部门。各部门如何“分配”对转化的贡献,可考虑通过本节方法进行评估。
  • 效果优化提升:根据本节提供的方法,如果想要优化特定样本或总体预测结果(提高预测准确性或降低误差),则可以基于对预测结果 SHAP 值贡献最大的样本及其值的变化规律来优化结果。在营销执行过程中,通过素材和文案设计、渠道组合和投放触点、日期和时间等季节性控制、落地页选择、投放内容管理等方面,来思考各个因素对转化的贡献价值。
分享
最后修订: 2022-01-26