Dixon 检验法判断正态分布离群值——原理和 Python 实现
文章目录
- Dixon 检验——单侧检验
- 原理步骤
- Python 实现
- Dixon 检验——双侧检验
- 小案例
本文主要根据 GB/T 4883-2008 的 7.3 条款写成。
记样本为 x1,x2,⋯,xnx_1, x_2, \cdots, x_nx1,x2,⋯,xn,n 为样本容量,按照升序排序,得到持续统计量为 x(1),x(2),⋯,x(n)x_{(1)}, x_{(2)}, \cdots, x_{(n)}x(1),x(2),⋯,x(n)
Dixon 检验——单侧检验
原理步骤
Dixon 检验一般是根据可能离群值,和离它最接近的值的距离,以及整个样本的跨度,来判断该值是否为离群值。这些可能离群值,需要接收判断的值,有时候也叫歧离值。
Dixon 检验一般用在 [3,30] 时,比较有效。因此,本文主要讨论 [3, 30] 的情况。
Dixon 检验的检验统计量为(DnD_nDn 为上侧检验时的统计量,Dn′D_n^\primeDn′ 为下侧检验时的统计量):
Dn=r10=x(n)−x(n−1)x(n)−x(1)3≤n≤7Dn′=r10′=x(2)−x(1)x(n)−x(1)3≤n≤7Dn=r11=x(n)−x(n−1)x(n)−x(2)8≤n≤10Dn′=r11′=x(2)−x(1)x(n−1)−x(1)8≤n≤10Dn=r21=x(n)−x(n−2)x(n)−x(2)11≤n≤13Dn′=r21′=x(3)−x(1)x(n−1)−x(1)11≤n≤13Dn=r22=x(n)−x(n−2)x(n)−x(3)14≤n≤30Dn′=r22′=x(3)−x(1)x(n−2)−x(1)14≤n≤30D_n = r_{10} = \frac{x_{(n)} - x_{(n-1)}} {x_{(n)} - x_{(1)}} \text{~~~~~~} 3 \leq n \leq 7 \\ \text{ }\\ D_n^\prime = r^\prime_{10} = \frac{x_{(2)} - x_{(1)}} {x_{(n)} - x_{(1)}} \text{~~~~~~} 3 \leq n \leq 7 \\ \text{ }\\ D_n = r_{11} = \frac{x_{(n)} - x_{(n-1)}} {x_{(n)} - x_{(2)}} \text{~~~~~~} 8 \leq n \leq10 \\ \text{ } \\ D_n^\prime = r^\prime_{11} = \frac{x_{(2)} - x_{(1)}} {x_{(n-1)} - x_{(1)}} \text{~~~~~~} 8 \leq n \leq 10 \\ \text{ }\\ D_n = r_{21} = \frac{x_{(n)} - x_{(n-2)}} {x_{(n)} - x_{(2)}} \text{~~~~~~} 11 \leq n \leq13 \\ \text{ } \\ D_n^\prime = r^\prime_{21} = \frac{x_{(3)} - x_{(1)}} {x_{(n-1)} - x_{(1)}} \text{~~~~~~} 11 \leq n \leq 13 \\ \text{ }\\ D_n = r_{22} = \frac{x_{(n)} - x_{(n-2)}} {x_{(n)} - x_{(3)}} \text{~~~~~~} 14 \leq n \leq30 \\ \text{ } \\ D_n^\prime = r^\prime_{22} = \frac{x_{(3)} - x_{(1)}} {x_{(n-2)} - x_{(1)}} \text{~~~~~~} 14 \leq n \leq 30 \\ Dn=r10=x(n)−x(1)x(n)−x(n−1) 3≤n≤7 Dn′=r10′=x(n)−x(1)x(2)−x(1) 3≤n≤7 Dn=r11=x(n)−x(2)x(n)−x(n−1) 8≤n≤10 Dn′=r11′=x(n−1)−x(1)x(2)−x(1) 8≤n≤10 Dn=r21=x(n)−x(2)x(n)−x(n−2) 11≤n≤13 Dn′=r21′=x(n−1)−x(1)x(3)−x(1) 11≤n≤13 Dn=r22=x(n)−x(3)x(n)−x(n−2) 14≤n≤30 Dn′=r22′=x(n−2)−x(1)x(3)−x(1) 14≤n≤30
对于单侧检验,若 suspected 的离群值是 x(1)x_{(1)}x(1),则计算 Dn′D_n^\primeDn′;若离群值可能是 x(n)x_{(n)}x(n),则计算 DnD_nDn,择定一个检测水平 α\alphaα,并根据 GB/T 4883-2008 的 A.3 表,查询检验统计量 D 的临界值,表格摘录如下:
记临界值为 DDD,若 Dnor Dn′>DD_n \text{ or }D_n^\prime > DDn or Dn′>D,则意味着 x(n)或 x(1)x_{(n)} \text{ 或 } x_{(1)}x(n) 或 x(1) 是歧离值(straggler)。之后,再择定一个更为严格的剔除水平,并找出临界值 D∗D^*D∗,若 Dnor Dn′>D∗D_n \text{ or }D_n^\prime > D^*Dn or Dn′>D∗,则意味着 x(n)或 x(1)x_{(n)} \text{ 或 } x_{(1)}x(n) 或 x(1) 是离群值(outlier)。
Python 实现
我们把表格保存为一个叫 dixon_critical_value.xlsx 的表格之中:
import numpy as np
import pandas as pddef perform_dixon_test_one_tailed(x, lower=True, alpha=0.95):if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):x = x.astype('float').valuesif isinstance(x, list):x = np.array(x)if alpha not in [0.95, 0.99, 0.90]:raise(Exception('置信水平可选择:[0.95, 0.99, 0.90]'))x_sort = np.sort(x)# 样本个数n = len(x)if n < 3 or n > 30:raise(Exception('Dixon 检验一般用在样本容量为 [3,30] 时才会比较准确'))if alpha == 0.95:dection_level = 0.95deletion_level = 0.99elif alpha == 0.90:dection_level = 0.90deletion_level = 0.95elif alpha == 0.99:dection_level = 0.99deletion_level = 0.995if n >= 3 and n <= 7:if lower:Q = (x[1] - x[0])/(x[-1] - x[0])else:Q = (x[-1] - x[-2])/(x[-1] - x[0])elif n >= 8 and n <= 10:if lower:Q = (x[1] - x[0])/(x[-2] - x[0])else:Q = (x[-1] - x[-2])/(x[-1] - x[1])elif n >= 11 and n <= 13:if lower:Q = (x[2] - x[0])/(x[-2] - x[0])else:Q = (x[-1] - x[-3])/(x[-1] - x[1])elif n >= 14 and n <= 30:if lower:Q = (x[2] - x[0])/(x[-3] - x[0])else:Q = (x[-1] - x[-3])/(x[-1] - x[2])path = r'./dixon_critical_value.xlsx'critical_values = pd.read_excel(path)critical_value = critical_values.loc[critical_values['n']==n][dection_level]critical_value = float(critical_value.values)if Q > critical_value:if lower:straggler = x[0]else:straggler = x[-1]else:print('无离群值')return xcritical_value = critical_values.loc[critical_values['n']==n][deletion_level]critical_value = float(critical_value.values)# 根据剔除水平,检测出离群值if Q > critical_value:outlier = stragglerprint('样本中带有离群值值: ', outlier)x = np.delete(x, np.where(x==outlier))return xelse:print('样本中带有歧离值: ', straggler)return x
(注意:GB/T 4883-2008)中的案例是错误的,其 D16′D_{16}^\primeD16′ 的值算错了,大家注意。
Dixon 检验——双侧检验
双侧检验其实也是一样的,计算出 DnD_nDn 和 Dn′D_n^\primeDn′,在从两者的最大值中,得到检验统计量 max(Dn,Dn′)\max(D_n, D_n^\prime)max(Dn,Dn′),当然,哪个大,就对应 x(1),x(n)x_{(1)}, x_{(n)}x(1),x(n) 哪个是可能的离群值。
之后,再从表 A.3′^\prime′ 中找出 DnD_nDn 的临界值 DDD。临界值表摘录如下:
我们将表格保存为: dixon_critical_value.xlsx 的工作簿 ‘two-tailed’ 中,实现代码如下:
if __name__ == '__main__':
def perform_dixon_test_two_tailed(x, alpha=0.95):if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):x = x.astype('float').valuesif isinstance(x, list):x = np.array(x)if alpha not in [0.95]:raise(Exception('置信水平可选择:[0.95]'))x_sort = np.sort(x)# 样本个数n = len(x)if n < 3 or n > 30:raise(Exception('Dixon 检验一般用在样本容量为 [3,30] 时才会比较准确'))dection_level = 0.95deletion_level = 0.99if n >= 3 and n <= 7:Q_lower = (x[1] - x[0])/(x[-1] - x[0])Q_upper = (x[-1] - x[-2])/(x[-1] - x[0])elif n >= 8 and n <= 10:Q_lower = (x[1] - x[0])/(x[-2] - x[0])Q_upper = (x[-1] - x[-2])/(x[-1] - x[1])elif n >= 11 and n <= 13:Q_lower = (x[2] - x[0])/(x[-2] - x[0])Q_upper = (x[-1] - x[-3])/(x[-1] - x[1])elif n >= 14 and n <= 30:Q_lower = (x[2] - x[0])/(x[-3] - x[0])Q_upper = (x[-1] - x[-3])/(x[-1] - x[2])Q = np.array([Q_lower, Q_upper])idx_max = np.argmax(Q)Q_max = Q[idx_max]path = r'./dixon_critical_value.xlsx'critical_values = pd.read_excel(path, sheet_name='two-tailed')critical_value = critical_values.loc[critical_values['n']==n][dection_level]critical_value = float(critical_value.values)if Q_max > critical_value:straggler = x[-idx_max]else:print('无离群值')return xcritical_value = critical_values.loc[critical_values['n']==n][deletion_level]critical_value = float(critical_value.values)# 根据剔除水平,检测出离群值if Q_max > critical_value:outlier = stragglerprint('样本中带有离群值值: ', outlier)x = np.delete(x, np.where(x==outlier))return xelse:print('样本中带有歧离值: ', straggler)return x
小案例
if __name__ == '__main__':# Dixon 检验案例x = np.array([1125, 1248, 1250, 1259, 1273, 1279, 1285, \1285, 1293, 1300, 1305, 1312, 1315, 1324, 1325, 1350])x_1 = perform_dixon_test_one_tailed(x, alpha=0.95, lower=True)x_2 = perform_dixon_test_two_tailed(x, alpha=0.95)
Dixon 检验法判断正态分布离群值——原理和 Python 实现相关推荐
- 机器学习笔记——2 简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)
简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观.函数最值问题的两大基本算法:梯度方法与迭代方法) 线性模型是什么? 线性模型是监督学习的各类学习 ...
- 单链表反转的原理和python代码实现
链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...
- 浅谈特征选择的原理和Python实现
0.引言 在现实世界中,我们总是倾向于收集尽可能多的特征来描述一个事物,以期能够更加全面准确的对其进行刻画.然而,我们了解事物的目的是变化着的,所以并非每一次对事物的刻画都需要所有特征.例如在机器学习 ...
- 回归分析---线性回归原理和Python实现
2019独角兽企业重金招聘Python工程师标准>>> 本文主要运用Python进行简单的线性回归,首先是介绍了线性回归的基本理论,然后是运用一些网络爬虫数据进行回归分析. 1 2 ...
- 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)
目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...
- EM算法原理和python简单实现
目录 第一章最大似然估计 1 第二章最大似然估计到EM 2 第三章 EM算法推导 3 第四章 EM例子和python代码 7 参考文献 8 最大似然估计 这篇文章主要是在 ...
- 高斯模糊原理和python实现
高斯模糊是一种常见的模糊技术,相关知识点有:高斯函数.二维卷积. 更多优质文章可以关注微信公众号[kelly学挖掘],欢迎访问 (一)一维高斯分布函数 一维(连续变量)高斯函数形式如下,高斯函数又称& ...
- 线性插值法的原理和python代码实现
假设我们已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值.根据图中所示,我们得到 由于 x 值已知,所以可以从公式得到 y 的值 已知 y ...
- python 隐马尔科夫_隐马尔可夫模型原理和python实现
隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数. 隐马尔可夫模型注意包含以下参数 ...
最新文章
- Linux(9)用户、组和权限管理
- 刚从阿里、头条面试回来,尚硅谷java数据结构与算法百度云
- java判断字符串是什么编码_java可供判断某字符串是什么编码的一行代码
- PIC32单片机harmony开发环境 - SPI例程和代码分析
- 【CodeForces - 1199C】MP3(思维,离散化)
- LVS学习笔记--DR模式部署
- 你是如何离编程越来越远的?
- OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
- 学51单片机需要专门把C语言学透吗
- ArcGIS 计算地块容积率
- android怎么执行命令,Android程序中执行adb命令
- SpringBoot集成Jsoup爬虫——三级列表
- 微信开发者工具调试H5项目报错:XXXXfail, the permission value is offline verifying解决方案
- k8s集群添加master节点
- Android开发者上手宝典(三)
- MYSQL5.7(64位)安装包及安装步骤
- ChinaSoft 论坛巡礼 | 优秀博士生论坛
- 从C快速入门C++ (命名空间、引用、函数重载)
- 关于数据库系统的学习
- LiveNVR配置拉转RTSP传统海康大华安防摄像机直播流输出RTSP/RTMP/HLS/HTTP-FLV如何获取直播流地址