异常值检验,又称为离群点分析或者孤立点挖掘。在人们对数据进行分析处理的过程中,经常会遇到少量这样的数据,它们与数据一般模式不一致,或者说与大多数样相比有些不一样,我们称这样的数据为异常数据。
异常数据挖掘涉及两个基本问题。其一,在对一个给定的数据集分析之前必须事先约定满足什么样的数据才是异常数据,也就是异常数据定义的问题。其二,用什么方法来从给定的数据集中将异常数据提取出来。
二、异常数据的定义
张德然在吸收归纳前人的研究基础上,将异常值从内涵上分为广义异常值和狭义异常值。广义异常值是指:所获统计数据与真实数据相对误差较大的数据,统指一切失真数据;狭义异常值是指:所获统计数据中部分数据与其余主体数据相比明显不一致的数据,也称离群值。
为了从数据集中识别异常数据,就必须有一个明确的标准。这需要找到数据的内在规律,在一个可接受的误差范围内,满足内在规律的数据就是正常数据,而不满足内在规律的数据就是异常数据。这种数据间的内在规律可以根据数据本身的特点从位置关系、函数关系、规则关系、序列关系等方面来考查。
(1)位置关系
位置关系是数据间的最常见的一种关系,大多数正常数据具有很大的相似性而符合一个共同模式,在空间上表现在一起的趋势,团结在一个或者多个核心的周围,而那些异常数据则表现得离群,他们总是离所有的核心都很远。
(2)函数关系
函数关系也是一种常见的数据关系,即大多数数据都符合某个函数模型,因此数据点大多分布在函数曲线附近,而那些异常数据则距离曲线比较远。
(3)规则关系
如果数据集中某些符合某个规则条件,则称这些数据具有规则关系。具有同一规则关系的正常数据一般会使该规则的结论成立,而如果某个数据具有该规则关系但不能使该结论成立,那么他就是异常数据。
(4)序列关系
序列关系是指数据集中的某些数据满足某种序列模式,而那些相同条件下不满足序列模式的数据就是异常数据。
三、SPSS中异常值的识别过程
(1)采用数据探索过程探测异常值
SPSS菜单实现程序为:主菜单-->“Analyze”-->“DescriptiveStatistics”-->“Explore……”选项-->“Statistics”按钮-->选中“Outliers”复选框。输出结果中将列出5个最大值和5个最小值作为异常的嫌疑值。
(2)采用箱线图(boxplot)探测异常值
盒式图'或叫'盒须图''箱形图'boxplot(也称箱须图(Box-whiskerPlot)须图又称为箱形图,其绘制须使用常用的统计量,能提供有关数据位置和分散情况的关键信息,尤其在比较不同的母体数据时更可表现其差异。如下图所示,标示了图中每条线表示的含义,其中应用到了分位值(数)的概念。主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘,上四分位数Q3,中位数,下四分位数Q1,下边缘,还有异常值。
Spss中箱线图绘制有两种方法:一种是利用上述的数据探测过程,在“Explore”对话框中单击“Plots”,通过“Boxplots”方框可以确定箱线图的生成方式。“Factorlevelstogether”复选框表示将要为每个因变量创建一个箱线图,“Dependenttogether”复选框表示将为每个分组变量水平创建箱线图,“None”复选框表示不创建箱线图。二是直接利用SPSS中的画图功能实现箱线图,SPSS给出了两种箱线图,一种是基本箱线图,另一种是交互式箱线图。基本箱线图的SPSS菜单实现为:点击主菜单中的“Graphs”选项,在弹出的一级菜单中选择“Boxplot……”选项。交互式箱形图的SPSS菜单实现为:点击主菜单中的“Graphs”选项,在弹出的一级菜单中点击“Interactive”选项,在弹出的二级菜单中选择“Boxplot……”选项。箱线图中的“○”表示可疑的异常值,此处异常值的确定采用的是“五数概括法”,即:变量值超过第75百分位点和25百分位点上变量值之差的1.5倍(箱体上方)或变量值小于第75百分位点和25百分位点上变量值之差的1.5倍(箱体下方)的点对应的值。
(3)采用Z分标准化法(3σ法):±3σ以外的数据为高度异常值,应予剔除。
(4)SPSS中异常值的剔除
发现异常值后,把大于等于最小异常值或小于等于最大异常值的值用Data主菜单里的CasesSelect子菜单里的条件设置按钮,就可以自动剔除异常值。
四、R语言中异常值得识别过程
(1)单变量异常检测
本部分展示了一个单变量异常检测的例子,并且演示了如何将这种方法应用在多元数据上。在该例中,单变量异常检测通过boxplot.stats()函数实现,并且返回产生箱线图的统计量。在返回的结果中,有一个部分是out,它结出了异常值的列表。更明确点,它列出了位于极值之外的胡须。参数coef可以控制胡须延伸到箱线图外的远近。在R中,运行boxplot.stats可获取更详细的信息。
如图呈现了一个箱线图,其中有四个圈是异常值
如上的单变量异常检测可以用来发现多元数据中的异常值,通过简单搭配的方式。在下例中,我们首先产生一个数据框df,它有两列x和y。之后,异常值分别从x和y检测出来。然后,我们获取两列都是异常值的数据作为异常数据。
在下图中,异常值用红色标记为'+'
类似的,我们也可以将x或y为异常值的数据标记为异常值。下图,异常值用'x'标记为蓝色。
当有三个以上的变量时,最终的异常值需要考虑单变量异常检测结果的多数表决。当选择最佳方式在真实应用中进行搭配时,需要涉及领域知识。
(2)使用LOF(localoutlierfactor,局部异常因子)进行异常检测
LOF(局部异常因子)是用于识别基于密度的局部异常值的算法。使用LOF,一个点的局部密度会与它的邻居进行比较。如果前者明显低于后者(有一个大于1的LOF值),该点位于一个稀疏区域,对于它的邻居而言,这就表明,该点是一个异常值。LOF的缺点就是它只对数值数据有效。lofactor()函数使用LOF算法计算局部异常因子,并且它在DMwR和dprep包中是可用的。下面将介绍一个使用LOF进行异常检测的例子,k是用于计算局部异常因子的邻居数量。下图呈现了一个异常值得分的密度图。
接着,我们结合前两个主成份的双标图呈现异常值。在如上代码中,prcomp()执行了一个主成分分析,并且biplot()使用前两个主成分画出了这些数据。在上图中,x和y轴分别代表第一和第二个主成份,箭头表示了变量,5个异常值用它们的行号标记出来了。我们也可以如下使用pairsPlot显示异常值,这里的异常值用'+'标记为红色。
Rlof包,对LOF算法的并行实现。它的用法与lofactor()相似,但是lof()有两个附加的特性,即支持k的多元值和距离度量的几种选择。如下是lof()的一个例子。在计算异常值得分后,异常值可以通过选择前几个检测出来。注意,目前包Rlof的版本在MacOSX和Linux环境下工作,但并不在windows环境下工作,因为它要依赖multicore包用于并行计算。
(3)通过聚类进行异常检测
另外一种异常检测的方法是聚类。通过把数据聚成类,将那些不属于任务一类的数据作为异常值。比如,使用基于密度的聚类DBSCAN,如果对象在稠密区域紧密相连,它们将被分组到一类。因此,那些不会被分到任何一类的对象就是异常值。我们也可以使用k-means算法来检测异常。使用k-means算法,数据被分成k组,通过把它们分配到最近的聚类中心。然后,我们能够计算每个对象到聚类中心的距离(或相似性),并且选择最大的距离作为异常值。
如下是一个基于k-means算法在iris数据上实现在异常检测。
在上图中,聚类中心被标记为星号,异常值标记为'+'
备注:
LOF算法擅长检测局部异常值,但是它只对数值数据有效。Rlof包依赖multicore包,在Windows环境下失效。对于分类数据的一个快速稳定的异常检测的策略是AVF(AttributeValueFrequency)算法。