指标异动检验与归因分析

1、背景描述

在某业务场景中,需要每天观测收入这个指标,并根据实际业务动作、各个维度的变动情况、数据变化趋势等信息来判断当日的数据是否属于异常。如果数据异常,那么相应的,需要找到造成异常的主要因素。

2、数据介绍与指标拆解

当前可用的收入指标数据仅可回溯两年半,约870条,业务人员依据人工规则为最近半年的数据打上了标签,即打标数据约140条,其中异常标签数据11个。

如果判定了当天的收入指标属于异常,那么需要进行异动归因.在本业务场景中,收入指标可以划分到三个维度上进行观测,例如城市、产品和渠道。而三个维度又可以下钻到更多的二级指标,如城市下可以拆解到北京、上海、深圳等;产品可以拆解到美食、家电、数码等;渠道可以拆解到线上、线下、省区等。也就是说,我们从任何一个维度上看,将所有二级指标对应的收入值进行汇总求和,得到的值是一致的,都等于当天的总收入。

综上所述,我们可以得到这样的一个分析层次:首先判断当天的收入指标是否异常,如果异常,那么看在哪个维度上表现比较明显,找到明显异动的维度之后继续下钻,查看造成异常波动的主要二级指标值,至此达到指标拆解的最细粒度,分析结束。

注: 某些业务中的最细粒度可能到用户级别,就可以做更加细致地分析和运营。

3、异常检验

通常,我们倾向于使用二分类模型来判断一个数据是否属于异常;如果异常数据的比例较小,无法训练出一个高可信度的二分类模型,那么我们会使用一些专门用于做异常检验的方法,如isolate forest和lof等;在特殊场景下,例如时间序列数据,我们还会采用时间序列的方法进行建模分析。此外,除了使用模型,我们还会基于统计学方法或业务经验建立一些人工规则辅助决策。下面介绍我们在业务中使用的一些方法,以及在使用这些方法时遇到的一些问题和解决方式

3.1 方法介绍

前面提到,我们数据中有140条是有人工标签的,而其中11条属于异常,其余129条属于正常,首先我们考虑使用lightgbm建立一个二分类模型;那么我们就要基于收入和收入的归属日期这两个字段信息构建一系列的特征,最终得到的特征集如下(已经预先对缺失值进行处理):

3.1.1 特征工程

历史特征:

  • 日维度:1天前收入,2天前收入,3天前收入,4天前收入;
  • 周维度:1周前同比日收入,2周前同比日收入,3周前同比日收入,4周前同比日收入;
  • 月维度:1月前同比日收入,2月前同比日收入,3月前同比日收入,4月前同比日收入;
  • 年维度:1年前同比日收入,2年前同比日收入

节假日特征:

  • 日维度:当天节假日类型,1天前节假日类型,2天前节假日类型,3天前节假日类型,4天前节假日类型;
  • 周维度:1周前同比日节假日类型,2周前同比日节假日类型,3周前同比日节假日类型,4周前同比日节假日类型;
  • 月维度:1月前同比日节假日类型,2月前同比日节假日类型,3月前同比日节假日类型,4月前同比日节假日类型;
  • 年维度:1年前同比日节假日类型,2年前同比日节假日类型

统计特征

  • 3日统计(不含当日):最近3日收入均值,最近3日收入标准差,最近3日收入最大值,最近3日收入最小值,最近3日收入变异系数,最近3日收入自相关系数
  • 7日统计(不含当日):最近7日收入均值,最近7日收入标准差,最近7日收入最大值,最近7日收入最小值,最近7日收入变异系数,最近7日收入自相关系数
  • 30日统计(不含当日):最近30日收入均值,最近30日收入标准差,最近30日收入最大值,最近30日收入最小值,最近30日收入变异系数,最近30日收入自相关系数

差分特征

  • 二阶差分

增长率特征

  • 日维度:2天前与1天前收入的增长率,3天前与2天前收入的增长率
  • 周维度:2周前同比日与1周前同比日收入的增长率,3周前同比日与2周前同比日收入的增长率
  • 月维度:2月前同比日与1月前同比日收入的增长率,3月前同比日与2月前同比日收入的增长率
  • 年维度:2年前同比日与1年前同比日收入的增长率

交叉特征(交叉收入时,不计算与当前日期收入的交叉特征,防止特征穿越)

  • 节假日特征 ×\times 收入
  • 节假日特征 ×\times 增长率
  • 节假日特征 ×\times 增长率 ×\times 收入

然后,基于以上的特征集,我们可以进行建模处理。

3.1.2 Lightgbm建模分析

建模前对数据进行训练集与测试集划分、数据采样操作,具体操作如下:
① 首先将数据集按照数据所属的日期进行排序;
② 依照顺序,取前70%为训练集,后30%为测试集;
③ 分别在训练集和测试集上进行smote上采样;

  • 注:① 必须要按照时间顺序划分数据集,因为我们的特征用到了历史数据,如果划分数据集时,划分的时间点不按照时间顺序,那么就会导致特征穿越,特征穿越会导致模型训练结果不准确。例如最新一天的数据如果被划分到了训练集,而最早一天的数据被划分到了测试集,由于最新一天的数据的特征有可能已经将最早一天的收入指标泄露给了模型(因为特征是包含了前xx天/xx月/xx年的收入),那么此时模型的预测结果就会不准确。
    ② somte采样必须要在划分数据集之后进行,原因同上。

3.1.3 ARIMA建模分析

  • 优势:

    • ARIMA 模型能够处理多种类型的时间序列数据,包括单变量和多变量、季节性和非季节性数据;
    • 通过差分处理,能够将非平稳时间序列转换为平稳序列。
  • 缺点:

    • ARIMA 模型假设时间序列数据的线性关系,对于非线性数据,模型可能表现不佳;
    • 模型的准确性依赖于长时间序列数据,对于短时间序列数据,模型的预测能力可能有限;
    • 对于具有明显季节性特征的时间序列,标准的 ARIMA 模型可能不足,需要扩展为 SARIMA(季节性 ARIMA)模型。

注:对于多维度的时间序列数据,需要拓展为VARIMA/SVARIMA

3.1.4 Prophet建模

Prophet 模型的核心思想是将时间序列分解为以下几个主要成分: 趋势、季节性、节假日;也就是说他额外考虑了节假日这个因素,因而能够利用更多的信息。

成分介绍

  • 趋势成分:Prophet 提供了两种趋势模型

    • 线性趋势: g(t)=(k+a(t))t+(m+b(t))g(t) = (k + a(t)) t + (m + b(t)), 其中 kk 是增长率, mm 是截距, a(t)a(t)b(t)b(t) 是随时间变化的调整项。
    • 分段线性趋势:允许趋势在特定时间点发生变化,通过引入变化点(changepoints)来实现。
  • 季节性成分:Prophet 使用傅里叶级数来建模季节性成分,s(t)=n=1N(ancos(2πntP)+bnsin(2πntP))s(t) = \sum\limits_{n=1}^{N} (a_{n} cos(\frac{2 \pi n t}{P}) + b_{n} sin(\frac{2 \pi n t}{P})), 其中,PP 是季节周期,ana_{n}bnb_{n} 是傅立叶系数。

  • 节假日效应成分: 通过引入二进制变量来表示节假日效应, h(t)=n=1mαiDi(t)h(t) = \sum\limits_{n=1}^{m} \alpha_{i} D_{i}(t),其中,Di(t)D_{i}(t) 是指示函数,表示第 ii 个节假日在时间 tt 是否发生,αi\alpha_{i} 是该节假日的影响系数。

优缺点

  • 优势:
    • 能够自动处理时间序列中的缺失值和异常值;
    • 支持多种趋势和季节性模型,能够处理复杂的时间序列模式;
    • 模型的各个成分(趋势、季节性、节假日效应)可以独立解释;
  • 缺点:
    • 假设时间序列的成分是加性的,可能不适用于所有情况;
    • 节假日效应需手动指定;
    • 对极端异常值敏感。

注:实际使用中,我们将周六、周日以及其他法定节假日均视为节假日,我们在构建特征是,区分了节假日的类型,但是在输入prophet模型时,只需要判别“是否"二义即可。

3.1.5 Holt-Winters

Holt-Winters 方法主要用于处理具有趋势和季节性成分的时间序列数据。它通过指数平滑技术来捕捉时间序列中的趋势和季节性变化。Holt-Winters 方法有两种主要形式:加法模型和乘法模型,分别适用于加性季节性和乘性季节性的时间序列。

Holt-Winters 方法将时间序列分解为三个主要成分:水平(Level),时间序列的基准值;趋势(Trend),时间序列的长期增长或衰退趋势;季节性(Seasonality),时间序列的周期性波动。

  • 优势:能够同时捕捉时间序列中的趋势和季节性成分。
  • 缺点:
    • 模型的性能高度依赖于平滑参数的选择;
    • 假设时间序列中的成分是加性的或乘性的,可能不适用于所有时间序列数据;

3.1.6 Isolate Forest

Isolation Forest(孤立森林)通过构建多棵随机树来隔离数据点,从而识别出异常点。其基本思想是,异常点更容易被孤立,因为它们与正常点相比更稀疏、更偏离群体。

  • 异常检验步骤:

    • 随机选择特征和切分点:对于每棵树,在每个节点上随机选择一个特征,并在该特征的取值范围内随机选择一个切分点;
    • 构建树结构:根据随机选择的特征和切分点,将数据集递归地划分为两个子集,直到每个数据点被单独隔离或达到树的最大深度;
    • 计算路径长度:对于每个数据点,计算其在树中的路径长度,即从根节点到叶节点的距离;
    • 异常分数:根据路径长度计算异常分数。异常点通常具有较短的路径长度,因为它们更容易被孤立。
  • 异常分数计算:
    对于构建的 tt 棵树,计算每个数据点在每棵树中的路径长度 h(x)h(x),异常分数 s(x,n)s(x,n) 通过路径长度 h(x)h(x) 计算,公式为:s(x,n)=2E(h(x))c(n)s(x,n) = 2^{\frac{E(h(x))}{c(n)}},其中,E(h(x))E(h(x)) 是数据点 xx 在所有树中的平均路径长度,c(n)c(n) 是数据集大小 nn 的调整常数,通常可以近似为 c(n)=2H(n1)2(n1)nc(n) = 2 H(n-1) - \frac{2 (n-1)}{n},其中,H(i)H(i) 是第 ii 个调和数,近似为 ln(i)+0.577215ln(i) + 0.577215(欧拉-马歇罗尼常数)。

  • 判定异常点:异常分数接近 1 的数据点被认为是异常点,分数接近 0 的数据点被认为是正常点。

  • 优点:

    • 高效:Isolation Forest 的训练和预测速度都很快,适合大规模数据集;
    • 无需假设数据分布:不需要对数据的分布做任何假设,适用于各种类型的数据;
    • 处理高维数据:能够有效处理高维数据,因为它通过随机选择特征和切分点来隔离数据点;
    • 鲁棒性:对噪声和异常值具有鲁棒性,因为异常点更容易被孤立。
  • 缺点:

    • 对密集簇的异常检测效果有限:在密集簇中,异常点可能不容易被孤立,从而降低检测效;
    • 解释性较差:由于算法的随机性,结果的解释性较差,不容易理解每个异常点被检测为异常的具体原因;

注:异常判定标准是通过设置一个阈值,如果异常分数大于这个阈值,则视为异常点。

3.1.7Local Outlier Factor

局部异常因子(Local Outlier Factor,LOF)是一种基于密度的异常检测方法。它通过比较一个数据点的局部密度与其邻居的局部密度来检测异常点。LOF 算法的核心思想是,异常点相对于其邻居来说,通常具有显著不同的密度。

  • 优点:

    • 局部检测:LOF 能够检测局部异常点,即在局部区域内显著不同于其邻居的点,这使得它在处理具有不同密度的簇时表现良好;
    • 无参数化:LOF 不需要对数据的分布做任何假设,适用于各种类型的数据;
    • 灵活性:可以通过调整参数 kk 来控制邻居数量,从而影响异常检测的敏感度。
  • 缺点:

    • 计算复杂度高:LOF 需要计算每个点的邻居和密度,计算复杂度较高,尤其是在大规模数据集上;
    • 参数敏感性:LOF 对参数 kk 比较敏感,不同的 kk 值可能导致不同的检测结果。
  • LOF 值的取值:

    • LOF 值为 1:如果一个数据点的 LOF 值接近 1,表示该点的局部密度与其邻居的局部密度相似,因此该点被认为是正常点;
    • LOF 值大于 1:如果一个数据点的 LOF 值显著大于 1,表示该点的局部密度明显低于其邻居的局部密度,因此该点被认为是异常点;
    • LOF 值小于 1:在某些情况下,LOF 值可能小于 1,这表示该点的局部密度高于其邻居的局部密度,通常这类点被认为是比邻居更密集的点,可能是局部的密集簇中心。

注:该方法的输出是每个数据的LOF值,在用于异常检验时,需要设定一个判断阈值,数据点的 LOF 值若超过该阈值则被认为是异常点

3.1.8 knn

使用 K 近邻(K-Nearest Neighbors, KNN)进行异常检测的基本原理是基于数据点的邻近性。KNN 异常检测方法通过计算每个数据点与其最近的 kk 个邻居之间的距离来判断该点是否异常。

  • 在 KNN 异常检测中,常见的判定标准包括:
    • 阈值法:设定一个距离阈值,如果一个点的异常得分(如平均距离或最大距离)超过这个阈值,则判定它为异常点。
    • 百分位法:计算所有点的异常得分的某个百分位数(如 95%),得分超过这个百分位数的点被判定为异常点。

3.1.9 人工规则

  • z-score:如果当天收入指标的值超出了 均值加减 k 个标准差区间 [mean - k * std, mean + k * std],则判定为异常;
  • 如果同比日的近两年增长趋势不一致,则标记为异常;
  • 如果最近两天的增长趋势与近两天的上周同比日的增长趋势不一致,或增长趋势一致,但变化率超过某一阈值,则标记为异常;
  • 其他规则

3.2 评估

对于二分类问题,业务上可能会关注如下几个指标:准确率(Accuracy)、正确率(Precision)、召回率(Recall)、F1 值(F1-score)、假阳性率(FPR,False Positive Rate)、真阳性率(TPR,True Positive Rate)、AUC(Area Under the Curve)。

3.2.1 混淆矩阵

为了更好地解释 AUC、Accuracy、Precision、Recall、FPR、TPR 和 F1 这些指标,我们可以先通过一个简单的二分类问题示例来说明。假设我们有以下混淆矩阵

预测为正例 预测为负例
真正例 TP (True Positive) FN (False Negative)
真负例 FP (False Positive) TN (True Negative)
  • TP:真正例中被预测为正例的样本个数,或被预测为正例的样本中是真的正例的样本个数;
  • FP:真负例中被预测为负例的样本个数,或被预测为正例的样本中实际上是真负例的样本个数;
  • FN:真正例中被预测为负例的样本个数,或被预测为负例的样本中实际上是真正例的样本个数;
  • TN:真负例中被预测为负例的样本个数,或被预测为负例的样本中是真负例的样本个数。

假设在一个二分类数据集上进行建模预测后,我们得到了如下结果:

  • TP = 50
  • FN = 10
  • FP = 5
  • TN = 35

3.2.2 评价指标

  • 1、Accuracy(准确率):模型预测正确的样本数(正例被正确预测的样本数和负例被正确预测的样本数之和)占总样本数的比例。计算公式为:

Accuracy=TP+TNTP+TN+FP+FNAccuracy = \frac{TP + TN}{ TP + TN + FP + FN }

在以上实例中,Accuracy的值为 50+3550+10+5+35=0.85\frac{50 + 35}{ 50 + 10 + 5 + 35} = 0.85

  • 2、Precision(精确率): 在所有被预测为正类的样本中,实际为正类的样本占所有被预测为正类的样本的比例。计算公式为:

Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}

在以上实例中,Precision的值为 5050+50.909\frac{50}{ 50 + 5} \approx 0.909

  • 3、Recall(召回率):在所有实际为正类的样本中,被正确预测为正类的比例。即被预测为正例的样本中,实际为正例的样本数,占所有实际为正例的样本数的比例。计算公式为:

Recall=TPTP+FNRecall = \frac{TP}{TP + FN}

在以上实例中,Recall的值为 5050+100.833\frac{50}{ 50 + 10} \approx 0.833

  • 4、F1 score:F1-score 综合考虑了 Precision 和 Recall,是 Precision 和 Recall 的调和平均数。计算公式为:

F1score=2×Precision×RecallPrecision+RecallF1 score = 2 \times \frac{ Precision \times Recall}{ Precision + Recall }

在以上实例中,F1 score的值为 2×0.909×0.8330.909+0.8330.8692 \times \frac{ 0.909 \times 0.833 }{ 0.909 + 0.833 } \approx 0.869

  • 5、FPR(False Positive Rate):在所有被预测为负类的样本中,实际为正类的样本占所有被预测为负类的样本的比例。计算公式为:

FPR=FPFP+TNFPR = \frac{FP}{FP + TN}

在以上实例中,FPR的值为 FPR=55+35=0.125FPR = \frac{5}{5 + 35} = 0.125

  • 6、TPR(True Positive Rate):在所有实际为正类的样本中,被正确预测为正类的比例。TPR 也就是 Recall。。计算公式为:

TPR=TPTP+FNTPR = \frac{TP}{TP + FN}

在以上实例中,TPR的值为 TPR=5050+10=0.833TPR = \frac{50}{50 + 10} = 0.833

  • 7、AUC(Area Under the ROC Curve):ROC 曲线下面的面积。ROC 曲线是以 FPR 为横坐标,TPR 为纵坐标的曲线。AUC 值越大,模型的区分能力越强。

3.2.3 指标之间的关系

  • Precision 和 Recall:Precision 和 Recall 之间往往存在权衡关系。提高 Precision 可能会降低 Recall,反之亦然。F1 Score 综合考虑了 Precision 和 Recall。
  • TPR 和 FPR:TPR 和 FPR 是 ROC 曲线的两个重要参数。TPR 越高,模型对正类的识别能力越强;FPR 越低,模型对负类的误判率越低。
  • AUC:AUC 是通过 ROC 曲线计算得出的综合指标,能够反映模型整体的分类性能。

3.3 决策

多模型决策有以下方式,

  • 1、投票法:将多个模型的预测结果进行投票,得到最终的预测结果。
  • 2、加权法:根据每个模型的预测结果的准确程度,给每个模型赋予不同的权重,然后将各个模型的预测结果进行加权求和,得到最终的预测结果。
  • 3、模型法:将各个模型输出的二元结果作为特征,输入到一个新的二分类模型中(如 XGBoost),得到最终的预测结果。

4、指标拆解与归因

通过以上的方法确定当日指标是否异动之后,就要分析异动的来源,即进行异动归因。

4.1 指标拆解

指标拆解是指将一个指标拆解为多个子指标的过程。通过拆解,我们可以更清晰地了解指标的构成和变化趋势。
在前面我们提到收入指标可以被分解到城市,产品和渠道三个维度。于是,我们可以得到一个简单的指标树结构如下:

flowchart TD
    A[收入]
    A --> B[城市维度]
    A --> C[产品维度]
    A --> D[渠道维度]
    B --> B1[城市A]
    B --> B2[城市B]
    B --> B3[城市C]
    C --> C1[产品X]
    C --> C2[产品Y]
    C --> C3[产品Z]
    D --> D1[渠道1]
    D --> D2[渠道2]
    D --> D3[渠道3]

4.2 二级指标归因(维度下的类别)

在进行归因分析的诊断时,通常我们从指标树的叶子节点到根节点这个方向进行,也就是说,我们需要先计算每个维度下的各个类比对总波动的贡献度(explanatory power)。贡献度的定义如下

4.2.1 解释度(Explanatory Power)

Explanatory Power:即某个类别的波动值占整体波动值的比例,计算如下

ExplanatoryPower=某个类比的波动总波动Explanatory Power = \frac{某个类比的波动}{总波动}

注意1:如果使用以上方式进行计算时,就会出现一个问题。例如总波动为收入增长100,某个维度下有三个类别,类别1降低了500,类别2增长了200,类别三增长了400,于是按照上面贡献度的计算方式,三个类的贡献度的值分别是-5,2,4,虽然贡献度之和为1,但是每个类别的贡献度的绝对值都超过了1,着显然是不合理的;而且通常选择主要的波动因素是,是直接选择贡献度最大的那个类别,这样就会直接选择到类别三,但显然是类别一的波动最大。

注意2:另外一个问题是,以上的计算方式其实只考虑了波动数值的绝对量,而忽略了每个类的基数的绝对量;例如类别一的基数为1000,类别二的基数为100,这样,虽然类别一变动了500的绝对量,但实际上波动幅度只有50%,而对于类别二,虽然只波动了200的绝对量,但是波动幅度高达200%。

4.2.2 改进的解释度(REP,Relative Explanatory Power)

基于以上提到的两个问题,我们提出如下改善的解释都计算方式:

  • 1、计算各个类别的波动绝对量,记xi(t)x_{i}(t)为第ii个类别的当期值,xi(t1)x_{i}(t-1)为第ii个类别的上一期的值,则δi=xi(t)xi(t1)\delta_{i} = x_{i}(t) - x_{i}(t-1).
  • 2、计算每个类别的相对波动量的绝对值(波动幅度),ri=δixi(t1)r_{i}= \vert \frac{\delta_{i}}{x_{i}(t-1)} \vert.
  • 3、归一化波动幅度,repi=rii=1nri=xi(t)xi(t1)xit1inxi(t)xi(t1)xit1rep_{i} = \frac{r_{i}}{\sum\limits_{i=1}^{n} r_{i}} = \frac{\vert \frac{x_{i}(t) - x_{i}(t-1)}{x_{i}^{t-1}} \vert}{\sum\limits_{i}^{n} \vert \frac{x_{i}(t) - x_{i}(t-1)}{x_{i}^{t-1}} \vert}

4.3 一级指标归因(维度)

要进行归因,就要确定一个或几个评价指标来评估哪个维度是主要的异动来源,然后对这个异动来源进行下钻,继续挖掘更深更细的影响因素。在探索一级指标的重要度时,通常使用gini系数或js散度,但二者存在一些不足,因此我们会同时介绍一些相关的改进方案。

4.3.1 gini系数

定义: Gini 系数主要用于衡量不均匀性或不平等性。它的计算公式是:

gini=1i=1npi2gini = 1 - \sum\limits_{i=1}^{n}p_{i}^{2}

其中,pip_{i} 是第 ii 个群体在总收入中所占的比例。Gini 系数的值介于 0 和 1 之间,值越大表示分布越不均匀,值越小表示分布越均匀。

注意1:需要注意的是,在使用gini系数时有一个理解误区,即在确定异动源时,是使用gini系数较大的维度还是使用gini系数较小的维度;下面我们针对这个问题进行一些讨论。

  • 使用gini系数较大的维度作为异动源的场景:如果我们希望找到的异动源是维度下的多个类别都对波动做出较大的贡献,那么应该使用gini系数较大的维度作为异动源。因为如果多个类别的贡献都比较大,那么显然这几个类比的贡献度应该差别都不大。

  • 使用gini系数较小的维度作为移动源的场景:如果我们希望找到的异动源是只有少数类别造成了主要波动的维度,那么应该使用gini系数较小的维度作为异动源。

在归因分析中,通常会选择 Gini 系数最大的维度作为异动源的理由可能如下:

  • 均匀贡献:Gini 系数较大的维度表示收入差值分布较为均匀,意味着该维度下的多个类别都对收入波动有贡献。
  • 整体影响:如果一个维度的收入差值分布均匀,说明这个维度整体上对收入波动有较大的影响,而不是由少数几个类别主导。

**注意2:在异动归因分析的场景中使用gini系数时,会面临一个问题,即通过gini系数计算公式得到的值的取值范围通常是(,1-\infin, 1),原因是我们我们计算是使用的维度下每个类比的贡献度的取值并不是(0,1)的,且所有类比的贡献度之和并不是1。**关于改进的gini系数的计算方式,我们在下面会进行介绍。

4.3.2 js散度

首先计算各个维度下每个类别的收入占总收入的比值,例如当期收入为100,某个维度下三个类别的当期收入为30、30、40,得到当期的收入分布向量为(0.3,0.3,0.4);同比期的总收入为200,各个类别收入分别为20,40,140,得到同比期的收入分布向量为(0.1,0.2,0.7)。

要计算JS散度,需要首先了解KL散度,二者的计算方式分别如下:

  • Kullback-Leibler Divergence:记当期的收入分布向量为 P=(p1,p2,,pn)P=(p_{1}, p_{2},\cdots, p_{n}),同比期的收入分布向量为 Q=(q1,q2,,qn)Q=(q_{1}, q_{2},\cdots, q_{n})。KL散度计算公式如下:

KL(PQ)=inpilogpiqiKL(P \| Q)=\sum\limits_{i}^{n} p_{i}log\frac{p_{i}}{q_{i}}

  • Jensen-Shannon Divergence:KL散度并不是对称的,因此JS是对KL散度的改进。令 M=12(P+Q)M = \frac{1}{2}(P+Q),则JS散度的计算公式如下:

JS(PQ)=12KL(PM)+12KL(QM)JS(P\|Q)=\frac{1}{2} KL(P\|M) + \frac{1}{2} KL(Q\|M)

JS散度的取值范围是[0,1],其中 0 表示两个分布完全相同,1 表示两个分布完全不同。

在归因分析中,一个维度的js散度值越大,那么说明他的当期分布同比期的分布差异很大,很有可能就是主要的异动源。

4.3.3 改进的gini系数

实际上,如果我们使用在4.2.2中定义的改进的解释度来计算gini系数,那么得到的gini系数是直接可用。如果在一些场景下,确实需要基于原始定义的解释度来计算gini系数,那么可以使用如下定义的改进的gini系数(火山引擎使用)。

通过一个例子来说明,我们取某一个特定维度,假定该维度下有两个类别,其现期值和基期值以及相关的数据如下表所示:

类别 基期 现期 差异值 影响因子x 权重w 贡献值 基尼系数
类别1 100 80 20 20/50=40% 100/300=33% 40% 0.07
类别2 200 170 30 30/50=60% 200/300=67% 60% 0.07
总计 300 250 50 100% 100% 0.07

具体的,当维度下有 nn 个类别时,记他们的影响因子分别为 x1,x2,,xnx_{1}, x_{2},\cdots,x_{n},权重分别为 w1,w2,,wnw_{1}, w_{2}, \cdots, w_{n},其计算公式如下:

GiniCoefficient=i=1nj=1nwiwjxiwixjwj2i=1nxi=i=1nj=1nxiwjxjwi2i=1nxiGiniCoefficient = \frac{\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} w_{i} w_{j} \vert \frac{x_{i}}{w_{i}} - \frac{x_{j}}{w_{j}} \vert }{2 \sum\limits_{i=1}^{n} \vert x_{i} \vert} = \frac{\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} \vert x_{i} w_{j} - x_{j} w_{i} \vert }{2 \sum\limits_{i=1}^{n} \vert x_{i} \vert}

4.3.4 变异系数(Coefficient of Variation, CV)

变异系数可以反映维度内部各个类别之间波动的差异性,如果各个类别的波动差异较大,那么变异系数的值就大,反之亦然。在归因时,可以将变异系数较大的维度或类别,作为主要的异动源

变异系数的公式为:

CV=σμCV = \frac{\sigma}{\mu}

其中σ\sigma是维度下各类别波动值的标准差,μ\mu是维度下各类别波动值的均值。

变异系数的优点在于,它不同于直接使用标准差,因为它消除了量纲的影响,是一个相对量,使得它衡量离散程度时更加公平。
但缺点在于,变异系数主要适用于正值数据,不适用于负值或零值数据,即如果波动量是一个负值,那么衡量的结果可能不准确。

4.4 归因分析

在实际进行归因时,首先判断当日数据是否产出,如果没有产出,则结束;如果已经产出,则判断是否异常;如果没有异常,那么结束;如果有异常,则通过gini系数、js散度、变异系数中的一个或多个进行维度归因;确定主要维度之后,再依据贡献度确定主要的波动因素。

flowchart LR
    A[判断当日数据是否产出] -->|没有产出| B[结束]
    A -->|已经产出| C[判断是否异常]
    C -->|没有异常| B[结束]
    C -->|有异常| D[进行维度归因]
    D --> E[依据贡献度确定主要的波动因素]
    E --> B[结束]

指标异动检验与归因分析
https://www.lihaibao.cn/2024/05/31/指标异动检验与归因分析/
Author
Seal Li
Posted on
May 31, 2024
Licensed under