【小沐学NLP】Python进行统计假设检验

news2024/9/23 12:25:23

文章目录

  • 1、简介
    • 1.1 假设检验的定义
    • 1.2 假设检验的基本步骤
  • 2、测试数据
    • 2.1 鸢尾花(Iris plants dataset)
  • 3、正态分布检验
    • 3.1 直方图判断
    • 3.2 KS检验(scipy.stats.kstest)
    • 3.3 Shapiro-Wilk test(scipy.stats.shapiro)
    • 3.4 Anderson-Darling test(scipy.stats.anderson)
    • 3.5 D’Agostino and Pearson’s test (scipy.stats.normaltest)
  • 4、假设检验
    • 4.1 z 检验
    • 4.2 t 检验
  • 结语

1、简介

1.1 假设检验的定义

  • 什么是假设检验?
    统计学有两个推断统计方法,一个是参数估计,另一个是假设检验。

  • 参数估计用样本统计量来推断总体参数的方法
    假设检验是基于某一假设的前提下,同样利用样本统计量去检验这个假设是否成立。

1.2 假设检验的基本步骤

假设检验是一种统计推断方法,用于判断一个统计样本中的观察结果是否与预期的理论分布相符。下面是假设检验的基本步骤:

  • (1)建立原假设(H0)和备择假设(H1):原假设(H0)是我们想要进行假设检验的观察结果的预期结果。 备择假设(H1)是与原假设相反的假设,即观察结果与预期结果不符。

  • (2)选择合适的统计检验方法:根据问题的性质和数据类型,选择适当的统计检验方法。例如,t检验适用于比较样本均值,卡方检验适用于比较分类变量等。

  • (3)收集和整理数据:收集和整理与问题相关的样本数据,确保数据的质量和完整性。

  • (4)计算统计量:使用所选择的统计检验方法,计算适当的统计量。例如,t检验中的t值,卡方检验中的卡方值等。

  • (5)获取p值:根据计算的统计量和观察样本数据,计算得到一个p值(或显著性水平)。p值表示给定观察结果出现的概率,如果p值小于预设的显著性水平(通常为0.05),则拒绝原假设。

  • (6)进行假设判断:根据得到的p值和预设显著性水平,做出假设判断:
    如果p值小于显著性水平,拒绝原假设,接受备择假设,认为观察结果与预期结果不一致。
    如果p值大于或等于显著性水平,接受原假设,认为观察结果与预期结果一致。

  • (7)解释结果: 根据假设判断的结果,解释分析的结果,得出结论。

2、测试数据

  • Toy datasets
    • load_iris(*[, return_X_y, as_frame]): Load and return the iris dataset (classification).
    • load_diabetes(*[, return_X_y, as_frame, scaled]): Load and return the diabetes dataset (regression).
    • load_digits(*[, n_class, return_X_y, as_frame]): Load and return the digits dataset (classification).
    • load_linnerud(*[, return_X_y, as_frame]): Load and return the physical exercise Linnerud dataset.
    • load_wine(*[, return_X_y, as_frame]):Load and return the wine dataset (classification).
    • load_breast_cancer(*[, return_X_y, as_frame]):Load and return the breast cancer wisconsin dataset (classification).
  • Real world datasets
  • Generated datasets
  • Loading other datasets

2.1 鸢尾花(Iris plants dataset)

https://scikit-learn.org/stable/datasets/toy_dataset.html#iris-dataset

Iris数据集在模式识别研究领域应该是最知名的数据集了,有很多文章都用到这个数据集。这个数据集里一共包括150行记录,其中前四列为花萼长度,花萼宽度,花瓣长度,花瓣宽度等4个用于识别鸢尾花的属性,第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)。也即通过判定花萼长度,花萼宽度,花瓣长度,花瓣宽度的尺寸大小来识别鸢尾花的类别。
在这里插入图片描述

# pip install scikit-learn
from sklearn.datasets import load_iris

iris = load_iris()
data = iris.data
target= iris.target
print(data)
print(target)

这里data为训练所需的数据集,target为数据集对应的分类标签,属于监督学习。
在这里插入图片描述

在这里插入图片描述

from sklearn.datasets import load_iris

iris = load_iris()
data = iris.data
target= iris.target
# print(data)
# print(target)
# print('DESCR: ', iris['DESCR'])
print('data_module: ', iris['data_module'])
print('filename: ', iris['filename'])
print('frame: ', iris['frame'])
print('feature_names: ', iris['feature_names'])
print('target_names: ', iris['target_names'])
print('target: ', iris['target'])

在这里插入图片描述

data数据集中的数据一共有4个属性,分别为:

'sepal length (cm)', 
'sepal width (cm)', 
'petal length (cm)', 
'petal width (cm)'

3、正态分布检验

通过样本数据来判断总体是否服从正态分布的检验称为正态性检验。正态分布是很多连续型数据比较分析的大前提,比如t检验、方差分析、相关分析以及线性回归等,均要求数据服从正态分布或近似正态分布。

在统计学中,正态检验主要用于检验一个数据集是否服从正态分布。常用的t检验、方差分析等参数检验都有一个共同的前提条件:样本数据必须服从正态分布,即样本数据必须来源于一个正态分布的总体,若样本数据不服从正态分布,就不能用以上参数检验对数据进行分析,而应该使用非参数检验(如卡方检验、置换检验等)。因此在对数据进行统计分析之前,第一步就需要对数据进行正态性检验,以检验该数据来自正态分布总体的概率有多大,再选择对应的参数或非参数检验方法进行分析。

https://jse.amstat.org/v4n2/datasets.shoemaker.html

3.1 直方图判断

通过直方图初步判断样本数据是否符合正态分布。

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

fig = plt.figure(figsize = (10,6))
ax2 = fig.add_subplot(1,1,1)
iris_data.hist(bins=50,ax = ax2)
iris_data.plot(kind = 'kde', secondary_y=True,ax = ax2)
plt.grid()
plt.show()

在这里插入图片描述

3.2 KS检验(scipy.stats.kstest)

Kolmogorov–Smirnov test (K-S test) 是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法。以样本数据的累计频数分布与特定的理论分布比较(比如正态分布),如果两者之间差距小,则推论样本分布取自某特定分布。

kstest 是一个很强大的检验模块,除了正态性检验,还能检验 scipy.stats 中的其他数据分布类型,仅适用于连续分布的检验,

原假设:数据符合正态分布
方法:scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative =‘two-sided’, mode =‘approx’)
参数:rvs - 待检验数据,可以是字符串、数组;cdf - 需要设置的检验,这里设置为 norm,也就是正态性检验;alternative - 设置单双尾检验,默认为 two-sided
返回:W - 统计数;p-value - p值

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

# data = pd.read_table(r'D:\normal_test\data.txt', encoding='utf-8',names = ['Temperature'])
# df = pd.DataFrame(data, columns =['Temperature'])

u = iris_data['sepal_length'].mean()  # 计算均值
std = iris_data['sepal_length'].std()  # 计算标准差
# 当p值大于0.05,说明待检验的数据符合为正态分布
result = stats.kstest(iris_data['sepal_length'], 'norm', (u, std))
print(result)

KstestResult(statistic=0.08865361377316228, pvalue=0.17813737848592026, statistic_location=5.1, statistic_sign=1)

从输出结果来看pvalue为0.17813737848592026,大于0.05,因此可以接受体温符合正态分布的假设。

3.3 Shapiro-Wilk test(scipy.stats.shapiro)

W检验

方法:scipy.stats.shapiro(x)
参数:x - 待检验数据
返回:W - 统计数;p-value - p值
# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

res = stats.shapiro(iris_data['sepal_length'])
print(res)
res = stats.shapiro(iris_data['sepal_width'])
print(res)
res = stats.shapiro(iris_data['petal_legth'])
print(res)
res = stats.shapiro(iris_data['petal_width'])
print(res)

在这里插入图片描述

3.4 Anderson-Darling test(scipy.stats.anderson)

该方法是由 scipy.stats.kstest 改进而来的,可以做正态分布、指数分布、Logistic 分布、Gumbel 分布等多种分布检验。默认参数为 norm,即正态性检验。

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

res = stats.anderson(iris_data['sepal_length'], dist='norm')
print(res)
res = stats.anderson(iris_data['sepal_width'], dist='norm')
print(res)
res = stats.anderson(iris_data['petal_legth'], dist='norm')
print(res)
res = stats.anderson(iris_data['petal_width'], dist='norm')
print(res)

在这里插入图片描述

3.5 D’Agostino and Pearson’s test (scipy.stats.normaltest)

方法:scipy.stats.normaltest (a, axis=0)
normaltest 也是专门做正态性检验的模块,原理是基于数据的skewness和kurtosis

scipy.stats.normaltest(a, axis=0, nan_policy=‘propagate’)

a:待检验的数据

axis:默认为0,表示在0轴上检验,即对数据的每一行做正态性检验,我们可以设置为 axis=None 来对整个数据做检验

nan_policy:当输入的数据中有空值时的处理办法。默认为 ‘propagate’,返回空值;设置为 ‘raise’ 时,抛出错误;设置为 ‘omit’ 时,在计算中忽略空值。

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

res = stats.normaltest(iris_data['sepal_length'])
print(res)
res = stats.normaltest(iris_data['sepal_width'])
print(res)
res = stats.normaltest(iris_data['petal_legth'])
print(res)
res = stats.normaltest(iris_data['petal_width'])
print(res)

在这里插入图片描述
注:p值大于显著性水平0.05,认为样本数据符合正态分布)

4、假设检验

Python 中的假设检验一般用到 scipy 或 statsmodels 包。

4.1 z 检验

对于大样本数据(样本量 ≥ \geq≥ 30),或者即使是小样本,但是知道其服从正态分布,并且知道总体分布的方差时,需要用 z 检验。在 python 中,由于 scipy 包没有 z 检验,我们只能用 statsmodels 包中的 ztest 函数。

# pip install scikit-learn
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw

# 导入IRIS数据集
iris = load_iris()
# print(iris.data)
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])
print(iris_data['sepal_width'])

result = sw.ztest(iris_data['sepal_width'], value=1)
print('1: ', result)
result = sw.ztest(iris_data['sepal_width'], value=2)
print('2: ', result)
result = sw.ztest(iris_data['sepal_width'], value=3)
print('3: ', result)
result = sw.ztest(iris_data['sepal_width'], value=4)
print('4: ', result)
result = sw.ztest(iris_data['sepal_width'], value=5)
print('5: ', result)

在这里插入图片描述
条件设为该样本的均值3时,从 ztest 的运行结果可以看出,统计量值为 1.6110148544749883,而 p 值是 0.10717648482938881,在置信度 α = 0.05 时,由于 p 值大于 α,接受原假设,认为该样本的均值是 3。

# 若要检测该样本均值是否大于 3,即原假设 H0:μ ≥ 3,备选假设为:μ < 3,则我们需要在代码中增加一个参数 alternative=``smaller”
sw.ztest(arr, value=3, alternative="smaller")

# 检测两个样本的均值是否相等,因为两个样本都是大样本,使用 z 检验
sw.ztest(arr, arr2, value=0)

4.2 t 检验

小样本(样本量小于30个),一般用 t 检验。对于 t 检验,可以根据样本特点,用 scipy 包中的 ttest_1sample(单样本 t检验函数),ttest_ind(两个独立样本的 t 检验),ttest_rel (两个匹配样本的 t 检验)。但这些函数得到都是双侧 t 检验的 p 值。如果是单侧检验,我们还要进行一些换算,得到单侧检验的 p 值。

# pip install scikit-learn
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw

# 导入IRIS数据集
iris = load_iris()
# print(iris.data)
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])
print(iris_data['sepal_width'])

result = stats.ttest_1samp(iris_data['sepal_width'], 1)
print('1: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 2)
print('2: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 3)
print('3: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 4)
print('4: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 5)
print('5: ', result)

在这里插入图片描述
从结果可以看出,双侧检验的 p 值为 0.10929285667458065, 大于置信度 0.05,因此接受原假设,认为样本的均值是3。若是单侧检验中的左侧检验,则 p 值为 0.10929285667458065 / 2 = 0.054646428337290325,若是右侧检验,则 p 值为 1 − 0.10929285667458065 / 2 = 0.9453535716627097。

# 假设两个样本的方差不同,则独立双样本的 t 检验
st.ttest_ind(a, b, equal_var = False)

# 若两个样本是匹配样本,使用函数 ttest_rel
st.ttest_rel(a, b)

# 结果显示,p 值小于置信度 0.05,拒绝原假设,认为这两个匹配样本的均值不同。

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 练习2 安装MySQL

一、实验要求 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。具体要求如下&#xff1a; &#xff08;1&#xff09…

网上购物系统的设计与实现/在线商城/基于spring boot的电商平台/基于Java的商品销售系统

摘 要 本毕业设计的内容是设计并且实现一个基于Springboot的网上购物系统。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。网上购物系统的功能已基本实现&#xff0c;主要包括用户管理、数码分类管理、数码产品管理、服…

如何快速制作解决方案PPT

如何快速制作解决方案PPT 理解客户的需求 在开始制作解决方案PPT之前&#xff0c;需要对客户的需求进行深入了解和分析。这包括客户需要解决的问题、目标、预算和时间限制等。 需求分析 客户需要解决的问题客户的目标预算限制时间限制 确定解决方案 基于客户的需求&#x…

LeetCode——二叉树篇(五)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 404. 左叶子之和 513. 找树左下角的值 递归 迭代 112. 路径总和 113. 路径总和 II 404. 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 /**…

【数据结构】如何用队列实现栈?图文详解(LeetCode)

LeetCode链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 本文默认读者已经掌握栈与队列的基本知识 或者先看我的另一篇博客&#xff1a;【数据结构】栈与队列_字节连结的博客-CSDN博客 做题思路 由于我们使用的是C语言&#xff0c;不能直接使用队…

前端 -- 基础 网页、HTML、 WEB标准 扫盲详解

什么是网页 : 网页是构成网站的基本元素&#xff0c;它通常由 图片、链接、文字、声音、视频等元素组成。 通常我们看到的网页 &#xff0c;常见以 .html 或 .htm 后缀结尾的文件&#xff0c; 因此俗称 HTML 文件 什么是 HTML : HTML 指的是 超文本标记语言&#xff0c…

基于单片机DHT11温湿度NRF2401无线通信控制系统

一、系统方案 本设计采用STC89C5单片机作为主控制器&#xff0c;从机采用DHT11传感器采集温湿度、按键设置报警阀值&#xff0c;液晶1602显示&#xff0c;蜂鸣器报警&#xff0c;无线NRF2401模块。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统…

SQL-每日一题【1527. 患某种疾病的患者】

题目 患者信息表&#xff1a; Patients 查询患有 I 类糖尿病的患者 ID &#xff08;patient_id&#xff09;、患者姓名&#xff08;patient_name&#xff09;以及其患有的所有疾病代码&#xff08;conditions&#xff09;。I 类糖尿病的代码总是包含前缀 DIAB1 。 按 任意顺序…

aardio开发语言Excel数据表读取修改保存实例练习

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom479) winform.add( buttonEnd{cls"button";text"末页";left572;top442;right643;bottom473;z6}; buttonExcelRead{cls"button";text"读取Exce…

基于Java/springboot铁路物流数据平台的设计与实现

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;铁路物流数据平台当然也不能排除在外&#xff0c;从文档信息、铁路设计的统计和分析&#xff0c;在过程中会产生大量的、各…

云原生反模式

通过了解这些反模式并遵循云原生最佳实践&#xff0c;您可以设计、构建和运营更加强大、可扩展和成本效益高的云原生应用程序。 1.单体架构&#xff1a;在云上运行一个大而紧密耦合的应用程序&#xff0c;妨碍了可扩展性和敏捷性。2.忽略成本优化&#xff1a;云服务可能昂贵&am…

攻防世界-Training-WWW-Robots

原题 解题思路 robots.txt是网站的爬虫声明&#xff0c;说明允许哪些部分被爬取&#xff0c;进robots.txt看看。 f1.g.php不让看&#xff0c;进去看看。

AWS复制EC2文件到S3,g4dn.2xlarge没有NVIDIA GPU 驱动问题

1、给instances权限 action > Security > modify IAM role 把提前创建好的role给这个instance即可 2、复制到bucket aws s3 cp gogo.tar.gz s3://ee547finalbucket不需要手动安装GPU驱动 如果要自己安装&#xff0c;参考https://docs.aws.amazon.com/AWSEC2/latest/U…

snpEff变异注释的一点感想

snpEff变异注释整成人生思考 1.介绍2.安装过程以及构建物种参考数据库3.坑货来了4.结果文件判读5.小tips 1.介绍 &nbsp SnpEff&#xff08;Snp Effect&#xff09;是一个用于预测基因组变异&#xff08;例如单核苷酸变异、插入、缺失等&#xff09;对基因功能的影响的生物…

嵌入式开发之configure

1 前述 在Linux的应用或者驱动开发过程中&#xff0c;编写makefile是无法避免的问题&#xff0c;但是由于makefile的各种规则&#xff0c;或显式&#xff0c;或隐式&#xff0c;非常多&#xff0c;不经常写的话&#xff0c;很难写出一个可用的makefile文件。为了“偷懒”&…

07_缓存预热缓存雪崩缓存击穿缓存穿透

缓存预热&缓存雪崩&缓存击穿&缓存穿透 一、缓存预热 提前将数据从数据库同步到redis。 在程序启动的时候&#xff0c;直接将数据刷新到redis懒加载&#xff0c;用户访问的时候&#xff0c;第一次查询数据库&#xff0c;然后将数据写入redis 二、缓存雪崩 发生情…

Python 的下一代 HTTP 客户端

迷途小书童 读完需要 9分钟 速读仅需 3 分钟 1 环境 windows 10 64bitpython 3.8httpx 0.23.0 2 简介 之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作&#xff0c;本篇介绍另一个功能非常类似的第三方库 httpx&…

深入探索JavaScript中的5种经典算法

在本文中&#xff0c;您将了解到&#xff1a; 冒泡排序、快速排序等常见排序算法原理及其在 JavaScript 中的实现&#xff1b; 经典算法示例 1. 冒泡排序算法 冒泡排序算法&#xff1a;冒泡排序是一种简单但效率较低的排序算法。它通过多次遍历数组&#xff0c;比较相邻元素并…

JVM前世今生之JVM内存模型

JVM内存模型所指的是JVM运行时区域&#xff0c;该区域分为两大块 线程共享区域 堆内存、方法区&#xff0c;即所有线程都能访问该区域&#xff0c;随着虚拟机和GC创建和销毁 线程独占区域 虚拟机栈、本地方法栈、程序计数器&#xff0c;即每个线程都有自己独立的区域&#…

生成式AI系列 —— DCGAN生成手写数字

1、模型构建 1.1 构建生成器 # 导入软件包 import torch import torch.nn as nnclass Generator(nn.Module):def __init__(self, z_dim20, image_size256):super(Generator, self).__init__()self.layer1 nn.Sequential(nn.ConvTranspose2d(z_dim, image_size * 32,kernel_s…