【2.4】异常值(离异值)检测

在处理实验数据的时候,我们常常会遇到个别数据值偏离预期或大量统计数据值结果的情况,如果我们把这些数据值和正常数据值放在一起进行统计,可能会影响实验结果的正确性,如果把这些数据值简单地剔除,又可能忽略了重要的实验信息。这里重要的问题是如何判断异常值,然后将其剔除。判断和剔除异常值是数据处理中的一项重要任务,目前的一些方法还不是十分完善,有待进一步研究和探索。

一、什么叫异常值

异常值outlier:指样本中的个别值,其数值明显偏离它(或他们)所属样本的其余观测值,也称异常数据,离群值。目前人们对异常值的判别与剔除主要采用物理判别法和统计判别法两种方法。

所谓物理判别法就是根据人们对客观事物已有的认识,判别由于外界干扰、人为误差等原因造成实测数据值偏离正常结果,在实验过程中随时判断,随时剔除。

统计判别法是给定一个置信概率,并确定一个置信限,凡超过此限的误差,就认为它不属于随机误差范围,将其视为异常值剔除。当物理识别不易判断时,一般采用统计识别法。

对于多次重复测定的数据值,异常值常用的统计识别与剔除法有:

拉依达准则法(3δ):简单,无需查表。测量次数较多或要求不高时用。是最常用的异常值判定与剔除准则。但当测量次数《=10次时,该准则失效。

如果实验数据值的总体x是服从正态分布的,则

	P(|x-u|>3σ)<0.003

式中,μ与σ分别表示正态总体的数学期望和标准差。此时,在实验数据值中出现大于μ+3σ或小于μ—3σ数据值的概率是很小的。因此,根据上式对于大于μ+3σ或小于μ—3σ的实验数据值作为异常值,予以剔除。具体计算方法参见http://202.121.199.249/foundrymate/lessons/data-analysis/13/131.htm

在这种情况下,异常值是指一组测定值中与平均值的偏差超过两倍标准差的测定值。与平均值的偏差超过三倍标准差的测定值,称为高度异常的异常值。在处理数据时,应剔除高度异常的异常值。异常值是否剔除,视具体情况而定。在统计检验时,指定为检出异常值的显著性水平α=0.05,称为检出水平;指定为检出高度异常的异常值的显著性水平α=0.01,称为舍弃水平,又称剔除水平(reject level)。

二、异常值检验

1)数值型变量异常值检测

数值型的变量异常值检测可以通过PROC UNIVARIATE过程来完成 代码如下:

	PROC UNIVARIATE DATA=IREAD.DA_FIN_200909;
	 VAR _NUMERIC_;
	RUN;

然后查看每个变量的分位数表,分析哪些变量可能存在异常的情况。

2)字符型变量异常值检测 字符型的变量异常值检测可以通过PROC FREQ过程来完成 代码如下:

	PROC FREQ DATA=IREAD.DA_FIN_200909;
	 TABLE 变量1 变量2.../MISSING;
	RUN;

查看每个字符型变量的频数分布,发现异常的值。

注:本标准已经被《数据的统计处理和解释 正态样本离群值的判断和处理》GB/T 4883-2008替代,见:http://blog.sina.com.cn/s/blog_462c63480100brna.html

2.步骤:

1. 根据实际情况,选定适宜的异常值检验规则 (见后);


2. 指定为检出异常值的统计检验的显著性水平a,简称检出水平,


3. 根据a和观测值个数n确定统计量的临界值;


4. 将各观测值代入检验规则中给出的统计量,所得值若超过临界值,则判断事先确定待查的极端观测值为异常值;否则就判断 “没有异常值”。


5. 检出水平a的宜取值是5%,1% (或10%)。


6. 多个异常值可以连续采用判断单个异常值得检验规则进行。


7. 处理异常值:保留;剔除;剔除并追加观测值;修正。


8. 指定为判断异常值是否高度异常的统计检验的显著性水平a*,简称剔除水平,其值小于检出水平a;除特殊情况外,剔除水平一般采用1%或更小。

检验的方法: http://202.121.199.249/foundrymate/lessons/data-analysis/13/13.HTM

3.Nair检验法

用于已知标准差情况下。

  1. 格拉布斯准则法(Grubbs):

和狄克逊法均给出了严格的结果,但存在狄克逊法同样的缺陷。朱宏等人采用数据值的中位数取代平均值,改进得到了更为稳健的处理方法。有效消除了同侧异常值的屏蔽效应。国际上常推荐采用格拉布斯准则法。 http://blog.sina.com.cn/s/blog_5cdaabb80100d31z.html(赞) 用于未知标准差情形下 检验统计量=(样本均值-极值)/标准差

	(1)计算统计量
	μ=(X1+X2+…+Xn)/n
	s=(∑(Xi-μ)/(n-1))½(i=1,2…n)
	Gn=(X(n)-μ)/s
	式中μ——样本平均值;
	s——样本标准差;
	Gn——格拉布斯检验统计量。
	(2)确定检出水平α,查表(见GB4883)得出对应n,α的格拉布斯检验临界值G1-α(n)。
	(3)当Gn>G1-α(n),则判断Xn为异常值,否则无异常值。
	(4)给出剔除水平α’的G1-α’(n),当当Gn>G1-α’(n)时,Xn为高度异常值,应剔除。
  1. 狄克逊准则法(Dixon):

对数据值中只存在一个异常值时,效果良好。担当异常值不止一个且出现在同侧时,检验效果不好。尤其同侧的异常值较接近时效果更差,易遭受到屏蔽效应。

用于未知标准差情形下

6.偏度检测法

未知标准差情形下,检出异常值的个数上限大于1。

单侧情形:

7.峰度检测法

未知标准差情形下,检出异常值的个数上限大于1。

双侧情形:

罗马诺夫斯基(t检验)准则法:计算较为复杂。

标准化数值(Z-score)

可用来帮助识别异常值。Z分数标准化后的数据服从正态分布。因此,应用Z分数可识别异常值。我们建议将Z分数低于-3或高于3的数据看成是异常值。这些数据的准确性要复查,以决定它是否属于该数据集。

肖维勒准则法(Chauvenet):经典方法,改善了拉依达准则,过去应用较多,但它没有固定的概率意义,特别是当测量数据值n无穷大时失效。

三、Spss中异常值检查方法:

检查异常值方法1:

最常用的方法就是对变量进行排序,这也是最简单的方法。排序后对照最大值和最小值、全距等统计量可以看出数据的离群状况。

检查异常值方法2:

散点图的优势就在于直观的呈现两两变量间的关系,尤其在两变量间的线性关联比较强的时候,如果有离群值,图形侦察的结果会很明显,不过(也包括矩阵散点等图形)其局限在于,其本质还是变量间的两两间的关系,更多的多维信息的提供还是需要经验去判断。

检查异常值方法3:

箱体图为我们提供了数据百分位数的概念,例如四分位数(25%和75%)是将该变量分成约4个部分,分别提供了数据不同分位点附件的离散性,而且同时提供描述数据集中性的中位数,这样在中间50%的数据上提供的信息将是异常丰富的。

检查异常值方法4:

在主要统计建模过程中大多会提供异常值或极端值的诊断,例如距离的测算:cook距离、杠杆值等;影响统计量:DfBeta、协方差比率等。它们均有相应的经验上的判断标准,如果有些指标没有相应的判断异常值的标准,则可以通过排序的方式,找到其相对大小。

检查异常值方法5:

标识异常个案,这里提供的是统计建模的方式侦查异常个案(注意它的结果有可能和我们其他方式侦查的结果有出处),这种方法主要通过两步聚类的思想,找到不同个案间的相似性,通过对所在类别的评价计算出异常索引,然后找到对应的ID号,则该个案可能为异常值,至于对这些异常个案怎么处理,分析人员作出何种决定,这个最好结合专业背景综合判断后续的处理方法。

检查异常值方法6:

如果涉及的是时序数据,控制图是不错的选择,在控制规则里提供了异常丰富的侦查异常个案的选项。

当然其他过程里也有一些细节的处理,例如,排列图、误差条形图、可视离散化、缺失值诊断、数据验证过程等。

四、案例

data1 = read.table("simulation.txt")
boxplot(data1)
out1 <- boxplot.stats(data1$V1)
out <- boxplot.stats(data1$V1)$out
箱线图的离异值的定义就是 大于(75% Q -25%Q)*1.5+75%Q或小于25%Q -(75% Q -25%Q)*1.5
stripchart(out, vertical = TRUE, method = "jitter", pch = 21, col = "maroon", bg = "bisque", add = TRUE)
#求两列数的非交集
 a <- data[!is.element(data,out)]

##参考资料:

http://blog.sina.com.cn/s/blog_462c6348010007gp.html

http://blog.sina.com.cn/s/blog_7dc56e6e0100qwts.html

http://bbs.pinggu.org/thread-2113679-1-1.html

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn