文章目录

  • 偏度检验法——用于单侧检验
    • Python 实现
  • 峰度检验法——用于双侧检验
    • Python 实现

本文主要参考 GB/T 4883-2008 的 8.2.2 和 8.2.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)​

偏度检验法——用于单侧检验

  1. 计算偏度统计量 bsb_sbs​ 的值为:
    bs=n∑i=1n(xi−xˉ)3[∑i=1n(xi−xˉ)2]3/2b_s = \frac{\sqrt{n} \sum_{i=1}^{n} (x_i - \bar{x}) ^3} {[\sum_{i=1}^n (x_i - \bar{x})^2]^{3/2}} bs​=[∑i=1n​(xi​−xˉ)2]3/2n​∑i=1n​(xi​−xˉ)3​
  2. 择定一个检验水平 α\alphaα,在表中 A.4 查出临界值 bs(n)b_s(n)bs​(n),表 A.4 收录如下:

    如果样本数 n 不在临界值表中,则采用 spline 三次插值法,用插值法求取临界值。
  3. 对于上侧检验,当 bs>bs(n)b_s > b_s(n)bs​>bs​(n) 时,则判断 x(n)x_{(n)}x(n)​ 为歧离值,所谓歧离值,就是有概率会成为离群值的数。之后,再择定一个更为严格的剔除水平,再次根据表或插值法,找出临界值,再另行判断。若依旧满足 bs>bs(n)b_s > b_s(n)bs​>bs​(n),则 x(n)x_{(n)}x(n)​ 为离群值。
  4. 对于下侧检验,则用 −bs>bs(n)-b_s > b_s(n)−bs​>bs​(n) 来判断,其他照旧。

Python 实现

将上述表格存储于一个叫 dixon_critical_value.xlsx 的 Excel 表的,一个叫 “偏度检验” 的工作簿中:

import numpy as np
import pandas as pd
from scipy import interpolate
def perform_skewness_test(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 != 0.95:raise(Exception('置信水平可选择:0.95'))# 样本个数n = len(x)if n < 8:raise(Exception('偏度检验的要求样本数必须大于 8'))dection_level = 0.95deletion_level = 0.99numerator = np.sqrt(n)*sum((x-np.mean(x))**3)dominator = np.power(sum((x-np.mean(x))**2), 3/2)bs = numerator/dominatorpath = r'./dixon_critical_value.xlsx'critical_values = pd.read_excel(path, sheet_name='偏度检验')if n <= 12:n_interpolate = np.arange(8, 13)n_list = critical_values['n'].iloc[:4].valuesvalues_dect = critical_values[dection_level].iloc[:4].valuesvalues_dele = critical_values[deletion_level].iloc[:4].valuesf_dect = interpolate.interp1d(n_list, values_dect, kind='cubic')f_dele = interpolate.interp1d(n_list, values_dele, kind='cubic')elif n <= 50:n_interpolate = np.arange(8, 51)n_list = critical_values['n'].iloc[:12].valuesvalues_dect = critical_values[dection_level].iloc[:12].valuesvalues_dele = critical_values[deletion_level].iloc[:12].valuesf_dect = interpolate.interp1d(n_list, values_dect, kind='cubic')f_dele = interpolate.interp1d(n_list, values_dele, kind='cubic')elif n <= 100:n_interpolate = np.arange(8, 100)n_list = critical_values['n'].iloc[:17].valuesvalues_dect = critical_values[dection_level].valuesvalues_dele = critical_values[deletion_level].valuesf_dect = interpolate.interp1d(n_list, values_dect, kind='cubic')f_dele = interpolate.interp1d(n_list, values_dele, kind='cubic')values_dect = f_dect(n_interpolate)values_dele = f_dele(n_interpolate)critical_value = values_dect[n-8]if -bs > critical_value and lower:straggler = x[0]elif bs > critical_value and lower==False:straggler = x[-1]else:print('无离群值')return xcritical_value = values_dele[n-8]# 根据剔除水平,检测出离群值if np.abs(bs) > critical_value:outlier = stragglerprint('样本中带有离群值值: ', outlier)x = np.delete(x, np.where(x==outlier))return xelse:print('样本中带有歧离值: ', straggler)return xif __name__ == '__main__':#检验案例x = np.array([1125, 1248, 1250, 1259, 1273, 1279, 1285, \1285, 1293, 1300, 1305, 1312, 1315, 1324, 1325, 1350])x_1 = perform_skewness_test(x, alpha=0.95, lower=True)

峰度检验法——用于双侧检验

  1. 计算峰度统计量 bkb_kbk​ 的值为:
    bk=n∑i=1n(xi−xˉ)4[∑i=1n(xi−xˉ)2]2b_k = \frac{n \sum_{i=1}^n (x_i - \bar{x})^4} {[\sum_{i=1}^n (x_i - \bar{x})^2]^2} bk​=[∑i=1n​(xi​−xˉ)2]2n∑i=1n​(xi​−xˉ)4​
  2. 根据表 A.5,和择定的检验水平 α\alphaα,择定一个临界值 bk(n)b_k(n)bk​(n),表 A.5 收录如下。若无对应的临界值,则需要根据一元三次插值法,用插值替代临界值
  3. 当 bk>bk(n)b_k > b_k(n)bk​>bk​(n) 时,则认为离均值 xˉ\bar{x}xˉ 最远的数为歧离值。
  4. 再次择定一个更为严格的剔除水平,根据表 A.5,找出临界值,再次比较。若依旧满足 bk>bk(n)b_k > b_k(n)bk​>bk​(n),则意味着离均值 xˉ\bar{x}xˉ 最远的数为离群值。

Python 实现

将上述表格存储于一个叫 dixon_critical_value.xlsx 的 Excel 表的,一个叫 “峰度检验” 的工作簿中:

import numpy as np
import pandas as pd
from scipy import interpolatedef perform_peakness_test(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 != 0.95:raise(Exception('置信水平可选择:0.95'))# 样本个数n = len(x)if n < 8:raise(Exception('偏度检验的要求样本数必须大于 8'))dection_level = 0.95deletion_level = 0.99numerator = n*sum((x-np.mean(x))**4)dominator = np.power(sum((x-np.mean(x))**2), 2)bk = numerator/dominatorpath = r'./dixon_critical_value.xlsx'critical_values = pd.read_excel(path, sheet_name='峰度检验')if n <= 12:n_interpolate = np.arange(8, 13)n_list = critical_values['n'].iloc[:4].valuesvalues_dect = critical_values[dection_level].iloc[:4].valuesvalues_dele = critical_values[deletion_level].iloc[:4].valuesf_dect = interpolate.interp1d(n_list, values_dect, kind='cubic')f_dele = interpolate.interp1d(n_list, values_dele, kind='cubic')elif n <= 50:n_interpolate = np.arange(8, 51)n_list = critical_values['n'].iloc[:12].valuesvalues_dect = critical_values[dection_level].iloc[:12].valuesvalues_dele = critical_values[deletion_level].iloc[:12].valuesf_dect = interpolate.interp1d(n_list, values_dect, kind='cubic')f_dele = interpolate.interp1d(n_list, values_dele, kind='cubic')elif n <= 100:n_interpolate = np.arange(8, 100)n_list = critical_values['n'].iloc[:17].valuesvalues_dect = critical_values[dection_level].valuesvalues_dele = critical_values[deletion_level].valuesf_dect = interpolate.interp1d(n_list, values_dect, kind='cubic')f_dele = interpolate.interp1d(n_list, values_dele, kind='cubic')values_dect = f_dect(n_interpolate)values_dele = f_dele(n_interpolate)critical_value = values_dect[n-8]if bk > critical_value:# 离均值最远的点作为离群值diff = np.abs(x-np.mean(x))diff_idx_max = np.argmax(diff)straggler = x[diff_idx_max]else:print('无离群值')return xcritical_value = values_dele[n-8]# 根据剔除水平,检测出离群值if bk > critical_value:outlier = stragglerprint('样本中带有离群值值: ', outlier)x = np.delete(x, np.where(x==outlier))return xelse:print('样本中带有歧离值: ', straggler)return x
if __name__ == '__main__':# 案例数据x = np.array([-1.4, -0.44, -0.3, -0.24, -0.22, -0.13, -0.05, \0.06, 0.1, 0.18, 0.2, 0.39, 0.48, 0.63, 1.01])perform_peakness_test(x)

正态分布离群值检验——偏度与峰度方法相关推荐

  1. matlab 偏度峰度检验,正态分布数据检验-偏度峰度检验法

    正态分布数据检验-偏度峰度检验法 正态数据偏度峰度检验法 置信度:1-alpha 数据样本数:n sig1=sqrt(6.0*(n-2)/(n+1)/(n+3)); sig2=sqrt(24.0*n* ...

  2. R语言使用moments包计算偏度(Skewness)和峰度(Kurtosis)实战:计算偏度(Skewness)和峰度(Kurtosis)、确定样本数据是否具有与正态分布匹配的偏度和峰度(假设检验)

    R语言使用moments包计算偏度(Skewness)和峰度(Kurtosis)实战:计算偏度(Skewness)和峰度(Kurtosis).确定样本数据是否具有与正态分布匹配的偏度和峰度(假设检验) ...

  3. EXCEL描述统计输出详解:标准误、置信度、偏度、峰度和JB检验

    本文介绍EXCEL描述统计输出的各个细节,主要围绕标准差相关指标展开.包括: 解释标准差.标准误差.置信度之间的关系 介绍各指标在EXCEL中如何单独计算 介绍各指标的统计学公式 重点强调一下峰度和偏 ...

  4. 统计推断——正态性检验(图形方法、偏度和峰度、统计(拟合优度)检验)

    正态分布是很多计量数据比较分析的假设前提,因此在做比较分析之前要首先验证样本数据所代表的总体是否服从正态分布.当然对于比率数据的比较也需要满足分布前提,通常是二项分布和泊松分布,对于二项分布的比率比较 ...

  5. 偏度与峰度的正态性分布判断

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器学习算法那些事  偏度与峰度的正态性分布判断 当我们 ...

  6. ks检验与s-w 检验_简单的方法教会你,利用SPSS对数据进行正态性检验

    导读 当我们应用统计方法对数据进行分析时,会发现很多方法都要求数据服从正态分布或近似服从正态分布,例如t检验.方差分析.线性回归等,所以对数据进行正态性检验是很有必要的,这节就介绍一下如何用SPSS对 ...

  7. 正态检验 (Normality Test)——常见方法汇总与简述

    前 言 在科学研究中,往往需要对数据进行差异性检验,而常用的参数检验需要数据服从正态分布,因此在决定是否采用参数检验之前需要先对数据进行正态性检验.这一步在任何统计学软件中(如SPSS.SAS.Ori ...

  8. 统计基础:1.1_正态分布及其检验

    Normal distribution 一.正态分布(Normal distribution)的基本原理 二.正态分布检验(Test of Normality) 2.1.正态分布直方图.核密度图.P- ...

  9. 用 Python 讲解偏度和峰度

    之前笔者在做一个金融数据项目时,有朋友问我,衡量股票收益率有没有什么好的方法.这个问题让笔者也思索了好久,其实股票的收益率如果我们从本质来看不就是数据吗,无非就是收益率我们就想让其越高越好,也就是让这 ...

最新文章

  1. JDK容器学习之ArrayList:底层存储和动态扩容
  2. log4net 存储到oracle 调试 Could not load type [log4net.Appender.OracleAppender]
  3. linux中make的用法
  4. 空间谱专题06:宽带信号处理思路
  5. InfluxDB(官方使用说明)
  6. Linux系统isosize指令用法
  7. Spark源码走读1——RDD
  8. 忠言多少有些逆耳,创业的九条真经
  9. 以太坊上DeFi协议总锁仓量环比上升4.37%
  10. switch 语句编译报错Constant expression required
  11. [FFmpeg] 在 ffplay 源码中嵌入 YOLO 算法实现实时物体检测
  12. 虚拟机危险!一个存在11年的缓冲区溢出漏洞--毒液
  13. 17995 Stupid thief 组合数学
  14. 贝塞尔方程与贝塞尔函数学习笔记
  15. 计算机专业职业规划范文800字,计算机专业学生职业生涯规划书
  16. java 风能玫瑰图,施用java awt画风向玫瑰图及风能玫瑰图程序
  17. 第一节课 opencv图像处理,对图片进行叠加处理
  18. Tomcat后台管理
  19. 火影忍者之~静音 (优先队列)
  20. linux组raid的工具,Linux下MegaRAID命令行使用工具

热门文章

  1. java的“看门狗”锁续期可以用php redis这样实现【php锁续期、分布式锁、无锁请求队列超卖】解决【商家超卖(商品库存控制)、用户超买(秒杀订单控制)】问题。非demo 线上一直在用
  2. 奖补不要错过!2022年四川省18地市高新技术企业奖励补贴政策及申报条件汇编!
  3. 2022西藏最新特种工(施工升降机)模拟试题题库及答案
  4. Real-ESRGAN
  5. [JavaScript学习-01]JavaScript实现九宫格抽奖
  6. LT8618SX 是龙迅的低功耗版本 HDMI 发射器,其基于 ClearEdgeTM 技术
  7. python的转义字符,以及字符串输出转义字符
  8. webstorm 2018 激活破解方法亲测可用
  9. 结束拒绝访问的进程 cmd下结束进程 强行结束进程
  10. 数据结构<1>时空复杂度详解