测试中的异常数据剔除用啥方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试中的异常数据剔除用啥方法?相关的知识,希望对你有一定的参考价值。

测试中的异常数据剔除用什么方法?如题,常用方法,便于使用的方法!

统计学中剔除异常数据的方法很多,但在检测和测试中经常用的方法有2种:

1- 拉依达准则(也称之为3σ准则):

很简单,就是首先求得n次独立检测结果的实验标准差s和残差,│残差│大于3s的测量值即为异常值删去,然后重新反复计算,将所有异常值剔除。

但这个方法有局限,数据样本必须大于10,一般要求大于50。所以,这个方法现在不常用了,国标里面已经剔除该方法!

2- 格拉布斯准则(Grubbs):

这个方法比较常用,尤其是我们检测领域。

方法也很简单,还是首先求得n次独立检测结果的实验标准差s和残差,│残差│/s的值大于  g(n)的测量值即为异常值,可删去;同样重新反复计算之,将所有异常值剔除。

g(n)指 临界系数,可直接查表获得. 95%的系数可参见下表:

参考技术A

处理异常值

异常值的定义是与均值的偏差超过两倍标准,但是在脏数据中,异常值的情况不止这一种:

1)比如一列数据你打开看全部是数字,当你把它当数值型处理,它会报错;那就得仔细查找原因,遇到比较多的情况是一列数字中夹杂了几个奇怪的字符串或者符号等元素,如果几万条数据中只有一两个这种字符,即使认真从前到后仔细查看也很难发现还浪费大量时间,效率极低。


还有一种情况比较常见,就是看起来是数字,实际上都是字符串的形式,但是以表格查看的时候是看不到字符串的引号;这两种情况可以通过查看特征类型来提前发现,在python中用type()或者dtypes()函数,两者使用对象有差别,可自行了解;


2)几种常用异常值检测方法:


    3σ探测方法

    3σ探测方法的思想其实就是来源于切比雪夫不等式。

    对于任意ε>0,有:

    当时,如果总体为一般总体的时候,统计数据与平均值的离散程度可以由其标准差反映,因此有:

    一般所有数据中,至少有3/4(或75%)的数据位于平均2个标准差范围内。

    所有数据中,至少有8/9(或88.9%)的数据位于平均数3个标准差范围内。

    所有数据中,至少有24/25(或96%)的数据位于平均数5个标准差范围内。

    所以如果我们一般是把超过三个离散值的数据称之为异常值。这个方法在实际应用中很方便的使用,但是他只有在单个属性的情况下才适用。

    z-score

    Z-score是一维或低维特征空中的参数异常检测方法。该技术假定数据是高斯分,异常值是分布尾部的数据点,因此远离数据的平均值。距离的远近取决于使用公式计算的归一化数点z i的设定阈值Zthr:

    其中xi是一个数据点,μ是所有点xi的平均值,δ是所有点xi的标准偏。
    然后经过标准化处理后,异常值也进行标准化处理,其绝对值大于Zthr:

    Zthr值一般设置为2.5、3.0和3.5。该技术是使用KNIME工作流中的行过滤器节点实现的。

    这种异常值处理需要结合最终需求来决定怎么处理,常见的是不处理或者按缺失值的方法处理,但是在实际场景中,异常值有时候会有非常突出的表现,比如在现金贷业务中,异常值中的坏账率远高于整体坏账水平或其他区间坏账水平,这时候异常值就得保留并作为决策阈值的参考值。

    IQR

    观察箱型图,或者通过IQR(InterQuartile Range)计算可以得到数据分布的第一和第四分位数,异常值是位于四分位数范围之外的数据点。

    这个方法真的很简单,因为只需要给数据排个序就行了,显然过于笼统,但在实际场景中,观察箱型图仍然是一个很好的探索数据分布的方法。

    毕竟,所有复杂的探索,都是从最开始简单的探索一步步得来的嘛!

数据分析系列 之3σ规则/依据拉依达准则来剔除异常值

1 相关原理
3σ原则为
数值分布在(μ-σ,μ+σ)中的概率为0.6827
数值分布在(μ-2σ,μ+2σ)中的概率为0.9545
数值分布在(μ-3σ,μ+3σ)中的概率为0.9973
可以认为,Y 的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性仅占不到0.3%.

2 代码实现

public class Pauta //创建拉依达类
	private double arr[]; //接受原始数组
	public Pauta(double temp[])  //利用构造方法来得的原始数组
		this.arr=temp;
		System.out.print("原始数组:");
		for(double x:arr) 
			System.out.print(x+"、");
	
System.out.println();


	public double average()  //原始数组的算数平均值方法
		double sum=0;
		for(int x=0;x<arr.length;x++)
			sum+=arr[x];
			
	return sum/arr.length;


	public double[] residualError() //原始数组的剩余误差方法
		double rE[]=new double[] ;
			for(int x=0;x<arr.length;x++) 
			rE[x]=arr[x]-average();
		
	return rE;
	

	public double standardVariance() //原始数组的标准方差值计算方法
		double sum=0;
		for(int int x=0;x<arr.length;x++) 
			sum+=Math.pow(arr[x]-average(),2);
		
		return Math.sqrt(sum/(arr.length-1));
	

	public void judge()  //判断异常值方法,若异常,则输出
		for(int int x=0;x<arr.length;x++) 
			if(Math.abs(arr[x]-average())>(3*standardVariance())) 
			System.out.println("该数组中的第"+(x+1)+"个元素属于异常值");
			
		
	


public class client
	public static void main(String args[]) 
		double data[]=new double[] 1,2,8,10,8,5,2,4,6,11,15;//原始数组
		Pauta pau=new Pauta(data);//原始数组封装后输出
		System.out.println("算数平均值:"+pau.average());//算数平均值
		/*此处的剩余误差输出略*/
		System.out.println("标准方差:"+pau.standardVariance());//标准方差
		pau.judge();//判断异常值方法
	

参考资料:
https://wenku.baidu.com/view/cce8bacc142ded630b1c59eef8c75fbfc77d9407.html JAVA使用:3σ规则、依据拉依达准则来剔除异常值程序

以上是关于测试中的异常数据剔除用啥方法?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库用啥连接池好

如何判别测量数据中是不是有异常值

如何判别测量数据中是不是有异常ŀ

剔除“异常值”的一般原则是什么?

用啥可以直接测试天线功率

c# winform里用啥存放这种数据最好?