数据分析 | 异常数据识别小结

1. 定义与使用场景

定义

异常检测,即发现一组数据点中和大多数数据不同的数据点。如果你要去网上搜索英文文献,可以用下面这几个关键字:outlier detection,deviation detection,exception mining或者anomly detecton。但最常用的英语叫法还是outlier detection和anomly detection。
异常检测的方法有很多,基于统计的方法,基于机器学习的方法,基于时间序列的方法等。所有这些方法都是基于一个异常点的稀有性或者与正常数据点的不一致性。异常点或者目标一般都比较稀有,即出现频率低。比如我们说一件事是“万里挑一”,说的就是稀有性。

使用场景

当前异常数据识别的使用场景主要有以下2方面:

  1. 数据分析和数据挖掘在正式分析前的数据处理,识别异常数据后,删除或者修正异常数据,避免异常数据影响分析结论;
  2. 数据去噪:一些异常数据可能会导致数据的期望或者方差等严重偏离正常,利用异常检测方法检测出数据中的噪声通常是数据预处理中很重要的一步。
  3. 风控业务,通过数据识别异常用户、异常访问、异常订单、异常支付等,避免黑产团队入侵。

数据异常的原因

  1. 来自不同类的数据
    一个个体不同于其他个体可能是因为他们的数据源不同,即来自不同的类型或者类别。比如一个盗刷别人的信用卡的用户,跟一个合法的信用卡用户属于两类人。一堆体检男性报告中夹杂着一份女性的体检报告,女性的这份报告的和其他男性报告的本来就是不同的性别。
  2. 自然变异
    很多数据集都满足正态分布,正态分布中,的确会有极其个别样本偏离均值。比如姚明的身高就比一个普通人的身高高几十公分。
  3. 度量和采集造成的异常
    好多数据都是靠仪器和人测量整理的,这难免会有纰漏,比如一个体重秤可能出问题了,那这个秤测量的数据就不靠谱了,或者测量员刚好心情不爽,记录测量数据的时候随便填了一个数。

https://zhuanlan.zhihu.com/p/26001674

2. 单变量数据异常识别

2.1 简单统计量分析

对变量做描述性统计,然后再基于业务考虑哪些数据是不合理的。常用的统计量是最大值和最小值,判断这个变量是否超过合理的范围。例如:用户的年龄为150岁,这就是异常的。

2.2 三倍标准差

定义:如果单变量数据服从正态分布,异常值被定义为与平均值偏差超过3倍标准差的值。
原因:是因为在正态分布的假设下,偏离均值3倍标准差出现的概率小于0.003,是一个小概率事件。
在实际分析中,我们也不一定要拘泥于3倍标准差,可以根据实际严格程度定义,如偏离均值的4倍标准差。

2.3 box-cox转化+3倍标准差

基本介绍

在这里插入图片描述

基本公式

如果原始数据的分布是有偏的,不满足正态分布时,可通过BOX-COX转化,在一定程度上修正分布的偏态。转换无需先验信息,但需要搜寻最优的参数λ。Box-Cox变换的一般形式为:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Box-Cox优势

https://wenku.baidu.com/view/96140c8376a20029bd642de3.html
在这里插入图片描述
在这里插入图片描述

python 实现

式中y(lambda)为经Box-Cox变换后得到的新变量,y为原始连续因变量,lambda为变换参数。
· 以上变换要求原始变量y取值为正,若取值为负时,可先对所有原始数据同加一个常数a,使其(y+a)为正值,然后再进行以上的变换。
· 常见的lambda取值为0,0.5,-1;
lambda = 0,时该变换为对数变换,
-1时为倒数变换,
0.5时为平方根变换。
Box-Cox的python实现如下,可直接通过函数boxcox找到最优的lambda和转化后的值:

2.4 箱线图

箱形图(Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况的统计图。
它能显示出一组数据的最大值、最小值、中位数及上下四分位数;

箱线图提供了一种数据识别的标准:异常值通常被定义为小于下边缘或者大于上边缘的数据为异常值。如下图所示:
上四分位数:1/4的样本值取值比他大
下四分位数:1/4的样本值取值比他小
上边缘=上四分位数+1.5*(上四分位数-下四分位数)
下边缘=下四分位数-1.5*(上四分位数-下四分位数)

箱线图识别异常数据的优势:

1)箱线图根据数据的真实分布绘制,他对数据不做任何限制性的要求,比如要服从正态分布等;
2)箱线图异常数据识别依赖于上四分数和下四分位数,因此异常值极其偏差不会影响异常值识别的上下边缘。这一点是优于3倍标准差方法的。

3. 时间序列数据异常识别

日常工作中还有一种场景,是需要对时间序列数据进行监控,如:订单量、广告访问量、广告点击量;我们需要从时间维度识别出是否异常刷单、刷广告点击的问题。像广告投放场景下,如果发现渠道刷量,会及时停止广告投放,减少损失。
对于时间序列数据异常识别,根据数据不同的特点,识别方法不同。

3.1 设置恒定阈值

如果时间序列呈现平稳分布状态,即时间序列数据围绕中心值小范围内波动;我们可以定义上下界的恒定阈值,如果超过上下阈值则定义为异常。

3.2 设置动态阈值-移动平均法

所谓动态阈值是指,当前时间的异常阈值是由过去n段时间的时序数据计算决定的;通常对于无周期,比较平稳的时间序列,设定动态阈值的方法是移动平均法。

所谓移动平均法是:
就是用过去n个时间点的时序数据的平均值作为下一个时间点的时序数据的预测,
异常数据识别即是:确定固定移动窗口n,以过去n个窗口的指标平均值作为下一个窗口的预测值;以过去n个窗口的指标的平均值加减3倍方差作为监控的上下界。

使用范围:数据无周期性,数据比较平稳。

3.3 STL数据拆解法

如果时间序列数据是周期性数据,可使用STL算法将时序数据拆解成趋势项、周期项和余项。即每个时刻的时序数据等于当前时序趋势项、周期项和余项的和(或者乘)。

趋势项(T_v):涵盖了这个时序数据的趋势变化;
周期项(S_v):涵盖了时序数据的周期变化;
余项(R_v):表示时序数据除去趋势项和周期项后的日常波动变化。

一般使用STL需要确定2个点:
1)确定数据周期,如外卖业务的一个常规周期为7天。
2)拆分规则,是选择加法方式还是乘法方式。

加法方式:原始数据 = 平均季节数据 + 趋势数据 + 余项这种方式,随着时间的推移季节数据不会有太大的变化,在以七天为一大周期的业务数据更适合这样的拆分方式。
乘法方式:原始数据 = 平均季节数据 * 趋势数据 * 余项这种方式,直观感受是随着时间的推移季节数据波动会非常明显。

至于如何要判断某事的时序数据是否异常,是根据STL分解后的余项来判断;一般情况下,余项部分的时序数据是平稳分布状态,我们可对余项设置恒定阈值或者动态阈值,如果某个时间节点的分解余项超过设定阈值,则是异常数据。

python可以用seasonal_decompose可以将时间序列数据拆解成三部分,具体函数代码如下:

import statsmodels.api as sm
from statsmodels.tsa.seasonal
import seasonal_decompose
import matplotlib.pyplot as plt
# Multiplicative Decomposition(乘法方式分解)
result_mul = seasonal_decompose(data1, model='multiplicative', extrapolate_trend='freq')
Actual_Values = result_mul.seasonal * result_mul.trend * result_mul.resid
# Additive Decomposition(加法方式分解)
result_add = seasonal_decompose(data1, model='additive', extrapolate_trend='freq')
Actual_Values = result_mul.seasonal + result_mul.trend + result_mul.resid

4. 多变量异常数据识别

所谓多变量数据异常识别是指:不只从一个特征去判读数据异常,而是在多个特征下来判断其是否异常。多变量异常数据识别的方法很多,比如聚类模型、孤立森林模型、one-class svm模型等。下面主要介绍简单高效,更容易使用的孤立森林模型。

4.1 孤立森林模型

孤立森林iForest (Isolation Forest) 是一个可扩散到多变量的快速异常检测方法。iForest 适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。
iForest属于非监督学习的方法,即不需要有标记的训练。

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值