上图中的横轴表示变量的不同取值,中间的取值μ是变量的均值。而σ西格玛是变量的标准差。图中的纵轴表示变量不同取值出现的概率值。我们可以看到正态曲线呈钟型,两头低,中间高,左右对称。正态分布的均值和标准差具有代表性,只要知道其均值和标准差,这个变量的分布情况就完全知道了。在正态分布中,均值=中位数=众数。
正态分布的分布函数如下:
对于正态分布来讲(请记住这几个数字,有可能面试会出现!):
- 数值分布在(μ-σ,μ σ)中的概率为0.6826
- 数值分布在(μ-2σ,μ 2σ)中的概率为0.9544
- 数值分布在(μ-3σ,μ 3σ)中的概率为0.9974
可以认为,正态分布的取值几乎全部集中在(μ-3σ,μ 3σ)区间内,超出这个范围的可能性仅占不到0.3%。这就是说,如果一个变量(可以理解为一组数字)服从正态分布,其中有一个数字,过大或者过小,其数值超过了变量的μ 3σ或者不足变量的μ-3σ,那么这个数字出现的概率非常小,可以视为这组变量中的异常值。
那么根据这样的法则,我们可以构建一套异常值发现的机制。一旦某一个变量或指标在某一天的数值超出这个指标前一段时间数据的均值加或减k倍标准差的范围,我们就认为这一天的数值是一个异常值。反之,如果一个变量中的某一天的数值落在均值加或减k倍标准差范围内,我们则认为是正常情况。
k是标准差倍数,如果k越大,我们判定异常值的阈值更高,对异常值的判定会更加严格,出现异常值的情形也会越少。在这种情况下,我们的异常值判定机制就更加不敏感。反之,如果k较小,则会有更多的数值会被判定为异常值,我们的异常值判定机制则更加敏感。
我们用上文的“倒钟图”辅助理解,如果我们令k=3,则正常值出现的比例为99.7%,异常值出现的比例仅为不到0.3%;而如果我们令k=1,则正常值出现的比例为68.7%,此时我们的异常值判定机制会将31.8%的数值都判定为异常值。因此,k越小,判定机制对异常值就更敏感,就能发现更多的异常值(但误判可能性会越高)。
但是,在我们正常的业务分析中,真正需要关注的异常情况不多,仅仅只有少数情况我们需要当做异常值处理,所以实操中,构建这套异常值发现机制的时候,我们通常取k=2或者k=3。
其具体步骤详述如下:
第一步 获取历史数据
从数据库中获取我们所需要预警的指标在过去较长一段时间的数据。我们如果需要对今天ARPU值是否为异常值进行判断,我们就需要获取过去较长一段时间的ARPU值(如过去30天ARPU值或过去50天ARPU值)。大家也可以根据自己业务实际情况来取数据。
第二步 构建区间
计算过去某一段时间(比如前1天到前30天)的ARPU值的样本均值、样本标准差。根据我们所需要的预警敏感程度,求出阈值。
假设 Xt表示某指标当天的数值, Xt-1表示该指标前1天的数值,Xt-2 表示该指标前2天的数值,……以此类推。
过去n天的样本均值为:
过去n天的样本标准差为: