检验样本正态性

简介

在统计学中很多推论与正态分布有关,并且很多统计量构造为满足正态分布的形式,很多分布在特定条件近似于正态分布。因此,在统计推断中经常需要判断样本的正态性。本文介绍一些常用的方法。

环境和数据准备:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from statsmodels.stats import diagnostic# check out https://github.com/Paradiseeee/Heaven
from Heaven import mpl_tools
mpl_tools.Begin().setting()# 正态分布样本与二项分布样本(两者方差均值一致)
n_sample = stats.norm.rvs(2, np.sqrt(1.6), 100)
b_sample = stats.binom.rvs(10, 0.2, size=100)plt.hist(n_sample, bins=20)
plt.title('Normal sampling distribution')
plt.xlabel('observations'); plt.ylabel('frequency'); plt.show()plt.hist(b_sample, bins=20)
plt.title('Binomial sampling distribution')
plt.xlabel('observations'); plt.ylabel('frequency'); plt.show()

请添加图片描述

一、通过绘图直观判断

频数(分布密度)图

通过图像对比判断样本是否服从理论总体的分布,需要总体分布已知(或假设拟合相应分布)

# 模拟总体
pop = stats.norm.rvs(2, np.sqrt(1.6), 10000)# 绘制常见的分布图形
def plot_dist(rv, title):axes = mpl_tools.Func().get_subplots('AABC')# 频数密度图axes['A'].hist(rv, bins=20, density=True)# 箱形图axes['B'].boxplot(rv)# 小提琴图(竖起来的 KDE 图)axes['C'].violinplot(rv)plt.title(title, loc='left')plt.show()plot_dist(n_sample, 'Normal Sampling Distribution')
plot_dist(b_sample, 'Binomial Sampling Distribution')
plot_dist(pop, 'Normal Population Distribution')

请添加图片描述
请添加图片描述
请添加图片描述

Q-Q 图

通过抽样和总体的分位数进行对比

# stats.probplot 严格来说是“概率图”,坐标轴未缩放的 Q-Q 图
stats.probplot(n_sample, dist='norm', plot=plt)
plt.title('Q-Q plot of normal samples \n(good fitting!)', loc='left')
plt.show()stats.probplot(b_sample, dist='norm', plot=plt)
plt.title('Q-Q plot of binomial samples \n(bad fitting~)', loc='left')
plt.show()

请添加图片描述

二、通过参数量化比较

绘图方法优点在于直观,但是得出结论只能是粗略的,只是“看起来像”,缺乏可信度。通过统计参数对比可以更准确的量化样本的正态性。

Shapiro-Wilk test

results = pd.DataFrame({'normal':[None]*4, 'binomial':[None]*4}, index=['Shapiro', 'KS', 'Anderson', 'Lilliefors']
)# 构造了一个统计量,该统计量越高,表示样本越有可能是正态分布
ntest = stats.shapiro(n_sample)
btest = stats.shapiro(b_sample)
results.loc['Shapiro', 'normal'] = (ntest.statistic, ntest.pvalue)
results.loc['Shapiro', 'binomial'] = (btest.statistic, btest.pvalue)

Kolmogorov-Smirnov test

ntest = stats.kstest(n_sample, stats.norm.cdf, args=(2, np.sqrt(1.6)))
btest = stats.kstest(b_sample, stats.norm.cdf, args=(2, np.sqrt(1.6)))
results.loc['KS', 'normal'] = (ntest.statistic, ntest.pvalue)
results.loc['KS', 'binomial'] = (btest.statistic, btest.pvalue)

Anderson-Darling test

ntest = stats.anderson(n_sample, dist='norm')
btest = stats.anderson(b_sample, dist='norm')
# 不提供连续的 p 值,取显著性水平为 1% 时的临界值
results.loc['Anderson', 'normal'] = (ntest.statistic, ntest.critical_values[ntest.significance_level == 1][0])
results.loc['Anderson', 'binomial'] = (btest.statistic, btest.critical_values[ntest.significance_level == 1][0])

Lilliefors’ test

ntest = diagnostic.lilliefors(n_sample, dist='norm')
btest = diagnostic.lilliefors(b_sample, dist='norm')
results.loc['Lilliefors', 'normal'] = ntest
results.loc['Lilliefors', 'binomial'] = btestresults = results.applymap(lambda x: tuple([round(i, 5) for i in x]))
print(results.to_markdown())
normalbinomial
Shapiro (0.99032, 0.6905)(0.93856, 0.00016)
KS (0.07716, 0.56435)(0.23, 4e-05)
Anderson (0.3403, 1.053)(2.65129, 1.053)
Lilliefors(0.06062, 0.48814)(0.17224, 0.001)

所有结果如上表,其中每个元组的第一位是对应的统计量,第二位是 p 值或者临界值,具体解释如下:

  • 对于 Shapiro 测试,统计量越大越接近正态分布(用于支撑原假设),p 值越小越拒绝原假设。从统计量来看,两个分布的样本都接近于正态分布,但是二项分布样本的 p 值明显小,在一般的显著性水平下(5%)可以拒绝原假设,即不服从正态分布。

  • 对于 KS 测试,正态样本的 p 值大于显著性水平,二项分布样本的 p 值小于显著性水平,拒绝原假设。

  • 对于 Anderson 测试,第一项是统计量,第二项是对应显著性水平为 1% 时的临界值(对于正态测试可选的有 15%、10%、5%、2.5%、1%,对于其他分布测试有不同的序列)。可以看到对于正态样本,统计量小于临界值,在 1% 的显著性水平下不能拒绝原假设;对于二项分布样本,拒绝原假设,样本不服从正态分布(2.65 > 1.05)。

  • 对于 Lilliefors 测试,根据第二项的 p 值进行判断,可以看到二项分布样本的 p 值为 0.001,可以拒绝原假设,不服从正态分布。

相关阅读 | 使用 fitter 拟合数据分布
阅读原文 | Paradise’s Blog


END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/17760.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Go】Go 语言教程--GO语言数组(十一)

往期回顾: Go 语言教程–介绍(一)Go 语言教程–语言结构(二)Go 语言教程–语言结构(三)Go 语言教程–数据类型(四)Go 语言教程–语言变量(五)Go …

Echarts使用,大数据量时,折线图曲线Y轴取值刻度不正确

如下图,当数据量过大时,会出现数值对应Y轴刻度显示不正确问题。 ​​​​​​​ 可检查配置项是否存在sampling字段 option {series: [{data: [...],type: line,smooth: true,symbolSize: 0,sampling: "average", // 注意此行}] }; samplin…

fpga下载程序到flash后无法在重新上电后自动加载程序

是器件的约束配置问题,这是正点原子artix7用的器件配置,如果不用就有问题 # 器件 set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property CONFIG_MODE SPIx4 [current_design] set_property BITST…

WH5097D有源矩阵驱动的Mini LED背光应用方案

Miniled技术为lcd的全面升级版,Miniled的背光层在单位面积内可以容纳更多LED,从而大大提高背光源数量,因此可以进行区域亮度调节的设计,从而在个别区域实现关闭led从而达到完全的黑色,不仅减小了功耗,而且由…

Mac 和 Win,到底用哪个系统学编程?

今天来聊一个老生常谈的问题,学编程时到底选择什么操作系统?Mac、Windows,还是别的什么。。 作为一个每种操作系统都用过很多年的程序员,我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…

人体扫描新技术:手机扫描生成3D人体模型

人体扫描是一种新兴的技术,它可以通过数字化的方式,再现人体的内部结构。这种模型的应用范围广泛,不仅可以应用于医学领域,还可以用于虚拟现实、游戏开发等各个领域。通过人体扫描生成模型,我们可以实时地观察人体内部…

Trimble RealWorks处理点云数据(九)之点云分类后将地面导入Arcgis生成DEM

效果 步骤 1、las导入Trimble RealWorks 2、对点云数据预处理 可以参考这篇文章 TrimbleRealWorks点云数据预处理 我这边是把点云做了分类,而后将地面数据导出las 点云做为三维数据,后续步骤在arcscene中操作,能实时显示出来 3、arcscene创建las数据集

❤ Vue2+vue-cli+vue-router+vuex +elementUI/vant完整项目搭建 项目和配置(一)

Vue2vue-clivue-routervuex elementUI/vant项目搭建和配置webpack(一) 项目整套:Vue2vue-clivue-routervuex elementUI/vant 进一步配置完善已迁移到(二)部分 1、环境检测: node 环境 git --version git…

【youcans动手学模型】SENet 模型及 PyTorch 实现

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】SENet 模型 【经典模型】SENet 模型-Cifar10图像分类1. SENet 卷积神经网络模型1.1 模型简介1.2 论文介绍1.3 分析与讨论 2. 在 PyTorch 中定义 SENet 模型类2.1 定义 SE Block…

【leetcode】61. 旋转链表 (python)

题目链接:61.旋转链表 写法一:暴力 class Solution(object):def rotateRight(self, head, k):""":type head: ListNode:type k: int:rtype: ListNode"""# 暴力:每次移动一个,时间复杂度 O(N^2)&am…

Duplicate keys detected: ‘0‘. This may cause an update error.

问题 vue报错 Duplicate keys detected: ‘0‘. This may cause an update error. 原因 <div v-for“(item,id) in items” :key"id”>{{item.name}} </div><div v-for“(item,id) in items” :key"id”>{{item.address}} </div>:key重…

word绘制横向表格

最近写小论文&#xff0c;表格太宽需要绘制横向表格&#xff0c;找了半天教程说的都不是很详细&#xff0c;我学习了一下决定自己写个教程。 我要在一和二之间创建一个横向表格。首先在一后面添加一个分节符号。布局->分隔符->分节负下一页。 再在二之前添加一个分节符号…