You need to enable JavaScript to run this app.
导航
指标归因-算法
最近更新时间:2024.10.11 16:57:57首次发布时间:2024.02.22 14:46:45

1.乘法公式

1.1 简介

乘法公式计算每个因子对整体变动的贡献度,即将变动分解到因子 。它基于这样一种假设:每个接触点(如广告展示、点击等)对最终转化结果的影响是相乘的关系,即根指标是若干因子指标的乘积。

1.2 原理解析

某个指标m,和若干指标相乘相等,即关系如下
图片
那么在基期和对比期都满足这个关系,即:
图片
其中上标是0的代表基期,上标是1的代表对比期,我们要做的是对基期( m^0 ) 变到对比期( m^1 ) 进行归因,实际上就是将变化分到各个因子指标m1,m2,...mn。方法如下:
对基期和对比期的公式两侧同时取对数:
图片
然后用下面的公式减去上面的公式,可得:
图片
稍作整理:
图片
通过上式,显然我们将基期( m^0 )到对比期( m^1 )的变化分到了各个因子指标的变化上去。
例如,因子m1的贡献值就是:
图片
贡献率就是:
图片

1.3 举例说明

当一个根指标可以表示为若干个因子指标相乘,如:

  • 成单率 = 渲染成功率 * 提交订单率 * 生单成功率 * 支付成功率
  • 成单率波动差值 = 本期成单率 - 上期成单率

我们希望将成单率波动差值分解到每个因子指标上,使每个指标因子的贡献率可加和为100%。由于成单率和因子指标之间是乘法关系,我们无法直接计算出可加和的贡献率,因此需要先把乘法关系转为加法关系。

对数乘法公式:ln(a*b) = ln(a)+ln(b),可以把乘法关系转换为加法关系:
ln(成单率) = ln(渲染成功率) + ln(提交订单率) + ln(生单成功率) +ln(支付成功率)

成单率对数波动差值 = ln(本期成单率) - ln(上期成单率),右边的两项又分别可表示为:

  • ln(本期成单率) = ln(本期渲染成功率) + ln(本期提交订单率) + ln(本期生单成功率) + ln(本期支付成功率)
  • ln(上期成单率) = ln(上期渲染成功率) + ln(上期提交订单率) + ln(上期生单成功率) + ln(上期支付成功率)

这时我们对上面两个等式左右两边的对应项分别做差,就可以将成单率对数波动差值分解到每个因子指标上:
[ln(本期成单率) - ln(上期成单率)] =
[ln(本期渲染成功率) - ln(上期渲染成功率)]
+[ln(本期提交订单率) - ln(上期提交订单率)]
+[ln(本期生单成功率) - ln(上期生单成功率)]
+[ln(本期支付成功率) - ln(上期支付成功率)]

因子的对数波动差值占成单率对数波动差值的比例,就是因子的贡献率,因子贡献率加和为100%:

  • 渲染成功率贡献率 = [ln(本期渲染成功率) - ln(上期渲染成功率)]/[ln(本期成单率) - ln(上期成单率)]
  • 提交订单率贡献率 = [ln(本期提交订单率) - ln(上期提交订单率)]/[ln(本期成单率) - ln(上期成单率)]
  • 生单成功率贡献率 = [ln(本期生单成功率) - ln(上期生单成功率)]/[ln(本期成单率) - ln(上期成单率)]
  • 支付成功率贡献率 = [ln(本期支付成功率) - ln(上期支付成功率)]/[ln(本期成单率) - ln(上期成单率)]

2.非乘法公式

2.1 简介

对于非乘法公式,一般指标之间没有严格的公式关系。例如,房价和位置,楼层,面积的关系,并无严格的数学公式,但是又存在一些相关性。对于这种指标关系归因,采用的方式是根据提供的数据,使用机器学习算法建立一个函数关系,比如对于房价数据,我们可以用数据拟合一个回归模型,输入位置,楼层,面积即可计算出来房价。
如果我们建立的模型很简单,比如线性模型,我们可以很容易的计算出来各个特征的贡献。但是简单的模型往往拟合能力较差,在很多情况下不能很好的拟合。为此,我们采用了拟合能力更强的xgboost算法进行建模。
而使用xgboost模型就会带来另一个问题,那就是xgboost模型很复杂,我们怎么计算各个特征的贡献,为此,我们引入了shap方法,shap方法是一个解决模型可解释性的方法,可以计算出来复杂模型下各个特征的贡献。
最终,我们采用了xgboost+shap的方法来解决相关指标归因的问题。

2.2 原理解析

我们通过举例来说明整个流程:
当我们假设一个指标可以表示为若干个相关指标的函数模型f,如:
渲染成功率 = f(首屏请求失败pv, 渲染环节回退pv)
我们首先要检验这个函数模型本身是否具有良好的预测效果,如:
给定首屏请求失败pv和渲染环节回退pv,该模型是否能预测出接近真实值的渲染成功率

出于精确度和计算效率的考虑,我们使用XGBoost进行建模。把可用的历史数据切分为训练集和测试集,如果训练模型能够在测试集上表现良好,我们认为模型具有良好的预测效果,能够得到有效的归因结论。否则我们会提示用户优化模型,具体可以通过增添与预测指标相关性更强的因子指标,或增加数据量来优化。对于上面的渲染成功率模型,我们使用100天左右的数据获得了良好的预测效果,下一步就可以相关指标的计算贡献值和贡献率了。

渲染成功率波动差值 = 本期渲染成功率 - 上期渲染成功率
我们希望将渲染成功率波动差值分解到每个相关指标上,使每个相关指标的贡献值可加和为渲染成功率波动差值。由于渲染成功率和相关指标之间是一个xgboost模型,我们无法直接计算出可加和的贡献值,所以需要先为黑盒模型找到一个具备可加性的解释方法,因此我们选用SHAP回归值来解释。

SHAP回归值的计算是一个复杂的问题,具体可参考:https://towardsdatascience.com/using-shap-values-to-explain-how-your-machine-learning-model-works-732b3f40e137

分别对本期和上期渲染成功率进行建模,再分别得到本期和上期相关指标的SHAP回归值,可得:

  • 本期渲染成功率 - 渲染成功率均值 = 本期首屏请求失败pv的SHAP回归值 + 本期渲染环节回退pv的SHAP回归值
  • 上期渲染成功率 - 渲染成功率均值 = 上期首屏请求失败pv的SHAP回归值 + 上期渲染环节回退pv的SHAP回归值

将上面两个等式左右两边的对应项分别做差,就可以将渲染成功率波动差值分解到每个相关指标上:
(本期渲染成功率 - 上期渲染成功率) =
(本期首屏请求失败pv的SHAP回归值 - 上期首屏请求失败pv的SHAP回归值)
+(本期渲染环节回退pv的SHAP回归值 - 上期渲染环节回退pv的SHAP回归值)

相关指标的两期SHAP回归值之差,就是相关指标的贡献值,相关指标贡献值加和为渲染成功率波动差值:

  • 首屏请求失败pv贡献值 = 本期首屏请求失败pv的SHAP回归值 - 上期首屏请求失败pv的SHAP回归值
  • 渲染环节回退pv贡献值 = 本期渲染环节回退pv的SHAP回归值 - 上期渲染环节回退pv的SHAP回归值

相关指标贡献值占渲染成功率波动差值的比例,就是相关指标的贡献率,相关指标贡献率加和为100%:

  • 首屏请求失败pv贡献率 = 首屏请求失败pv贡献值 / (本期渲染成功率 - 上期渲染成功率)
  • 渲染环节回退pv贡献率 = 渲染环节回退pv贡献值 / (本期渲染成功率 - 上期渲染成功率)