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

数据分析系列:归因分析原理、案例和python代码

程序员文章站 2022-03-09 20:31:02
...

本文主要对以下指标的计算和解释进行阐述,并使用案例说明,最后利用python编写代码进行计算:

  • risk ratios and rate ratios(风险比率和比率比率,RR)
  • risk difference and rate difference(风险差异和利率差异, RD)
  • attributable proportion (attributable risk percent) for the exposed(风险承担的可占比例(可归属风险百分比), AP)
  • population attributable risk(人口归因风险,PAF)
  • odds ratio(比率, OR)

我们使用的案例如下,假设一种产品来源于两个营销渠道,我们记录了每个渠道的转化人数和未转化人数(转化可以定义为点击、充值等)

营销渠道 转化 未转化 求和 转化率
渠道A 159 2841 3000 159/3000=5.30%
渠道B 46 3454 3500 46/3500=1.31%
总计 205 6295 6500 205/6500=3.15%

归因分析指标计算

1:计算Risk Ratio(风险比率)、Rate Ratio(比率)

Risk Ratio(风险比率)通常也称为Rate Ratio(比率),表示一个相对于一个因素B,另一个因素A条件下转化率相对于因素B的转化率的倍数(A,B可以理解为实验组和对照组)。
数据分析系列:归因分析原理、案例和python代码
其中CIeCI_e是渠道A的转化率,CIuCI_u是渠道B的转化率。

营销渠道 转化 未转化 求和 转化率
渠道A 159 2841 3000 159/3000=5.30%
渠道B 46 3454 3500 46/3500=1.31%
总计 205 6295 6500 205/6500=3.15%

Risk Ration(RR) = 5.30%/1.31% = 4.04
解释:渠道A的转化率是渠道B的转化率的4.04倍(Risk Ration(RR)=4.04),同时认为渠道A的转化率相比于比渠道B的转化率提升了了404%-100%=304%(此处含义是以B为基准,相对的含义)

结论:

  • 相对渠道B的转化率而言,渠道A的转化率是渠道B的4.04倍
  • 相比于渠道B而言,渠道A的转化率相对于B的转化率提升了304%(并不转化率是真的提升304%,而是在B的基础上提升了304%的B的转转化率)

若我们有多组实验,可以用同样的方法计算

2:计算Risk Difference(风险差异)、Rate Difference(比率差异)

Risk Difference(风险差异)也被称为Rate Difference(比率差异)
数据分析系列:归因分析原理、案例和python代码
其中CIeCI_e是渠道A的转化率,CIuCI_u是渠道B的转化率。Risk Difference(风险差异)的理解非常直观。就是直观的两个渠道转化率的差异。
由RR与RD的公式可知两者的转换关系为:
RD/CIu=RR1RD/CI_u=RR-1
利用上面例子的数据,计算出RD = 5.30%-1.31%=3.99%。代表了渠道A去渠道B的转化率差异为3.99%。

Risk Ratio与Risk Difference的出发角度不同,Risk Ratio衡量的是
渠道A相对于渠道B提升了多少,可用于衡量改进的效果,而Risk Difference直接衡量了转化率(收益)提升了多少。Risk Ratio是相对的,Risk Difference是绝对的

3:计算Attribution Proportion

Attribution Proportion(归因分数)表示了该渠道人群中有多少是因为该渠道发生转化的。
数据分析系列:归因分析原理、案例和python代码
利用上面数据。计算出
AP=5.30%1.31%5.30%=75.28%AP = \frac{5.30\%-1.31\%}{5.30\%} = 75.28\%

如果B代表是未参加渠道展示,则对于计算出的归因分数(Attribution Proportion),可以解释如下:渠道A展示的用户中,有75.28%的用户是因为渠道A的展示而发生了转化。

如果我们对Attribution Proportion的分子、分母同时除以CIuCI_u,则Attribution Proportion公式变为如下形式:
AP=RR1RRAP = \frac{RR-1}{RR}

我们再利用新公式计算一次,利用上面计算的RR= 4.04,计算出
AP=4.0414.04=75.28%AP = \frac{4.04-1}{4.04} = 75.28\%

4:计算人口归因分数(PAF)

人口归因分数(PAF) Population Attributable Fraction也称为人群归因危险度PAR(Population Attributable Risk)。表示的是,所有转化人群中,有多少因为一个因素而进行转化的。

最直接的计算方式就是:渠道A转化人群占总转化人群比例*渠道A的AP,在上面例子中,转化人群中,有77.5%的人来自渠道A。因此,我们可以认为总人群中有77.5%*75.28%=58.38%的人是因为渠道A的展示发生了转化。

同时,我们也可以通过如下方式进行计算PAF
数据分析系列:归因分析原理、案例和python代码
其中,PpopP_{pop} =渠道A人数占总人数比例。

我们利用上面公式进行计算,先计算渠道A人数占总人数比例=3000/6500=0.4615,之后计算PAF:
PAF=0.4615(4.041)0.4615(4.041)+1=58.38%PAF = \frac{0.4615*(4.04-1)}{0.4615*(4.04-1)+1} = 58.38\%
计算出的PAF与上面采用直接结算得到结果是相同的。代表了,所有转化人数中,有58.38%的人是因为渠道A的展示发生了转化。

在应用中,因为转化率通常都比较低,因此,我们还可以用几率(Odds Ratio)近似代替RR,来计算每个因子的归因分数。

5:计算几率(Odds Ratio)

上面说到了,可以利用几率(Odds Ratio)近似代替RR,作为RR的估计。Odds Ratio(OR)的计算公式如下:
OR=Y1A/Y1BY2A/Y2BOR= \frac{Y1_A/Y1_B}{Y2_A/Y2_B}

其中Y1_A是渠道A的转化人数,Y1_B是渠道B的转化人数,Y2_A是渠道A的未转化人数, Y2_B是渠道B的未转化人数。

我们将上面例子数据代入计算得到:
OR=159/462841/3500=4.258OR= \frac{159/46}{2841/3500} =4.258

上面已经计算出RR=4.04。对比计算结果,OR与RR的结果近似。

当用OR代替RR后,AP和PAF的估计如下:
AP=OR1ORAP = \frac{OR-1}{OR}
PAF=Ppop(OR1)Ppop(OR1)+1PAF = \frac{P_{pop}*(OR-1)}{P_{pop}*(OR-1)+1}

我们带入数据进行计算:
AP=4.25814.258=76.51%AP = \frac{4.258-1}{4.258} =76.51\%
PAF=0.4615(4.2581)0.4615(4.2581)+1=60.05%PAF = \frac{0.4615*(4.258-1)}{0.4615*(4.258-1)+1} = 60.05\%

其中AP=76.51%代表渠道A的转化用户中有76.51%是因为渠道A展示发生了转化,PAF=60.05%代表了,所有转化用户中,有60.05%是因为渠道A发生了转化。

为什么要利用OR作为RR的近似估计去计算AP和PAF?这主要是因为,在转化率比较低的情况下(现实中转化率通常比较低),OR约等于RR。还有一个原因是,在实际中,有一些未转化人群我们是统计不到的,此时渠道A的转化率和渠道B的转化率就无法计算,就无法准确计算RR,此时可用OR近似代替。而且在一些归隐分析模型中,例如逻辑回归等,只能通过系数ββ计算出OR,不能直接计算出RR。

归因分析python代码

我们使用上面案例数据,数据有三列,第一列为user_id(主键),第二列为对应的营销渠道,第三列为是否转化。
导入数据后,对数据观察如下:

import pandas as pd
import numpy as np

AD_data = pd.read_csv("D:/data/Attribution_test/AD_data.csv")
print(AD_data.head(20))

数据分析系列:归因分析原理、案例和python代码
接下来编写Attribution_Analysis类来进行归因分析(未完,明天完成上传代码,现在只写了大致结构):

class Attribution_Analysis:
    def __init(self, data):
        self.AD_data = data
        
    #计算RR    
    def _RR_cul(self):
        pass
    
    #计算RD
    def _RD_cul(self):
        pass
    
    #计算OR
    def _OR_cul(self):
        pass
    
    #计算AP
    def _AP_cul(self):
        pass
    
    #计算PAF
    def _PAF_cul(self):
        pass
    
    #进行归因分析
    def attribution_analysis(self):
        self._RR_cul()
        self._RD_cul()
        self._OR_cul()
        self._AP_cul()
        self._PAF_cul()