Python机器学习:假设检验

news2024/9/21 18:41:54

方差分析这部分内容还不是很理解,在这里先做一个笔记,以后有时间再回过头来改一改。
用到的数据集 → \rightarrow Iris

什么是假设检验?
假设检验就是利用样本数据对某个事先做出的统计假设,再按照某种方法去检验,最后判断此假设是否正确。

怎么去假设检验?
假设检验的目的是为了推断总体。首先对总体的未知参数或分布做出某种假设 H 0 H_{0} H0,然后在 H 0 H_0 H0成立的条件下,若通过抽样分析发现“小概率事件”竟然在一次实验中发生了(在这里我们是不希望小概率事件发生的),则表明 H 0 H_0 H0很可能不成立,从而拒绝 H 0 H_0 H0;相反,若这个“小概率事件”没有发生,则没有理由拒绝 H 0 H_0 H0,从而接收 H 0 H_0 H0

⭐️ 检验的显著性水平( α \alpha α):要求“小概率事件”发生的概率小于等于某一给定的临界概率。通常 α \alpha α的取值为较小的数0.05、0.01、0.001。
⭐️ P值:假定原假设 H 0 H_0 H0为真时,“拒绝原假设 H 0 H_0 H0”这件事犯错的可能性。当P值 < α <\alpha <α时,表示“拒绝原假设 H 0 H_0 H0”这件事犯错误的可能性很小,即可以认为原假设 H 0 H_0 H0是错误的,从而拒绝 H 0 H_0 H0;否则,应接收原假设 H 0 H_0 H0

🌕 数据分布检验

数据分布的假设检验是重要的非参数检验,它不是针对具体的参数,而是根据样本值来判断总体是否服从某种指定的分布

🌗 数据准备

# 导入相关的库
import numpy as np
from matplotlib import pyplot as plt
from scipy import stats
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

np.random.seed(123)			# 设置随机数种子
X1 = stats.norm.rvs(loc = 0,scale = 1,size = 500)		# X1为服从均值为0方差为1的标准正态分布数据
X2 = stats.norm.rvs(loc = 0,scale = 5,size = 500)		# X2为服从均值为0方差为5的正态分布数据
X3 = stats.f.rvs(15,30,size = 500)						# X3为服从均值为15方差为30的非正态分布数据
plt.figure(figsize = (15,6))
plt.subplot(1,3,1)							# 将画布分为一行三列(三部分),现在对从左至右从上至下第一个子图操作
plt.hist(X1,bins = 50,density = True)		# X1的频率直方图(density=True表示频率,False表示频数。默认为频数)
plt.grid()
plt.ylabel("频率")
plt.title("标准正态分布")
plt.subplot(1,3,2)							# 对第二个子图操作
plt.hist(X2,bins = 50,density = True)
plt.grid()
plt.ylabel("频率")
plt.title("正态分布")
plt.subplot(1,3,3)							# 对第三个子图操作
plt.hist(X3,bins = 50,density = True)
plt.grid()
plt.ylabel("频率")
plt.title("F分布")
plt.tight_layout()							# 防止子图间轴域的标签叠在一起
plt.show()

在这里插入图片描述

🌗 利用Q-Q图检验数据是否符合正态分布

什么是Q-Q图?
Q-Q中的两个Q都是quantile(分位数)的缩写,也就是说Q-Q是横纵坐标都关于分位数的一个图。那么说到这里,

什么又是分位数?
分位数也称分位点,是指将一个随机变量的概率分布范围分为几个等份的点,常用的有中位数(二分位数)、四分位数、百分位数等。

Q-Q图的作用即标题,是用来检验数据是否符合正态分布的,它就是先将两列数据的分位点画成散点图,然后比较两列数据的分位点是否分布在y=x的直线上,若是,则接收数据来自正态总体的假设,否则就拒绝原假设。

在这里我们可以使用statsmodels.api模块中的qqplot()函数来绘制Q-Q图。

import numpy as np
from matplotlib import pyplot as plt
from scipy import stats
import statsmodels.api as sm		# 导入Q-Q图要用的模块

import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

np.random.seed(123)
X1 = stats.norm.rvs(loc = 0,scale = 1,size = 500)
X2 = stats.norm.rvs(loc = 0,scale = 5,size = 500)
X3 = stats.f.rvs(15,30,size = 500)

fig = plt.figure(figsize = (15,5))
ax = fig.add_subplot(1,3,1)			# add_subplt与subplot是一个东西,没有太大的区别,只是调用的方式不一样
sm.qqplot(X1,line = "45",ax = ax)	# 绘制X1的Q-Q图,line=45是绘制45°斜直线
plt.grid()
plt.title("X1正态检验Q-Q图")
ax = fig.add_subplot(1,3,2)
sm.qqplot(X2,loc = 0,scale = 5,line = "45",ax = ax)	# 绘制X2的Q-Q图
plt.grid()
plt.title("X2正态检验Q-Q图")
ax = fig.add_subplot(1,3,3)
sm.qqplot(X3,line = "45",ax = ax)	# 绘制X3的Q-Q图
plt.grid()
plt.title("X3正态检验Q-Q图")
fig.tight_layout()
plt.show()

在这里插入图片描述
可以发现,前两个图的散点图都能很好地拟合参考线,表示X1和X2是正态分布,而第三个图的散点图没有在参考线上,表示X3不是正态分布。

🌗 利用K-S拟合优度检验来检验数据是否符合正态分布

K-S检验可以使用stats.kstest()函数完成,默认情况下会验证数据是否符合标准正态分布,同时可以指定cdf参数所要验证的分布类型,还可以利用args参数指定符合参数的特定分布。

# 这里还是用随机数种子“123”
print(stats.kstest(X1,cdf = "norm"))				# X1的标准正态分布检验
print(stats.kstest(X2,cdf = "norm"))				# X2的标准正态分布检验
print(stats.kstest(X2,cdf = "norm",args = (0,5)))	# X2的正态分布检验
print(stats.kstest(X3,cdf = "norm"))				# X3的标准正态分布检验
print(stats.kstest(X3,cdf = "f",args = (15,30)))	# X3的非正态分布检验

在这里插入图片描述
从结果中我们可以看到,在对X1的标准正态分布检验中,P值大于0.05(在前面回顾一下P值的概念),就说明了“拒绝原假设”这件事犯错误的可能性比较大了,也就是说拒绝原假设会犯错误,那么我们就应该接收原假设,即X1是服从标准正态分布的。(0.05是检验的显著性水平,是人为取值的)

又如在X2的标准正态分布检验中,它的P值为0,但本质上是不为0的,因为这个P值很小很小(5.2306133517677304 × 1 0 − 48 \times10^{-48} ×1048),所以程序就直接省略了。那就是这个P值它是小于0.05,说明“拒绝原假设”这件事犯错误的可能性比较小,那么我们就应该拒绝原假设,即X2不服从标准正态分布。

后面几个结果也是同样的分析。

K-S检验还可以用stats.ks_2samp()函数检验两个随机变量的分布是否相同

print(stats.ks_2samp(X1,X2))
print(stats.ks_2samp(X2,X3))
print(stats.ks_2samp(X3,X1))

在这里插入图片描述
同样,也是根据P值来判断它们是否具有相同的分布。

🌕 t检验

t检验分为单样本t检验两独立样本t检验

⭐️ 单样本t检验:检验来自正态分布的样本的期望值(均值)是否为某一实数。
⭐️ 两独立样本t检验:判断两个来自正态分布(方差相同)的独立样本的期望值之差是否为某一实数。

两种检验的原假设都是差等于指定值

🌗 单样本t检验

import numpy as np
from scipy import stats

np.random.seed(123)
X1 = stats.norm.rvs(loc = 0,scale = 1,size = 500)	# 标准正态分布随机数X1
X2 = stats.norm.rvs(loc = 0,scale = 5,size = 500)	# 正态分布随机数X2
X3 = stats.norm.rvs(loc = 5,scale = 5,size = 500)	# 正态分布随机数X3
print(stats.ttest_1samp(X1,0))		# 检验X1的均值是否为0
print(stats.ttest_1samp(X2,5))		# 检验X2的均值是否为5
print(stats.ttest_1samp(X3,5))		# 检验X3的均值是否为5

在这里插入图片描述
从第一组的检验结果可以发现,它的P值大于0.05,也就是说“拒绝原假设”这件事犯错误的可能性比较大,所以应该接受原假设,即X1的均值为0,剩下两组的判断也是如此。

🌗 两独立样本的检验

print(stats.ttest_ind(X1,X2))	# 检验X1和X2的均值之差是否等于0
print(stats.ttest_ind(X2,X3))	# 检验X2和X3的均值是否相等
print(stats.ttest_ind(X3,X1))	# 检验X3和X1的均值是否相等

在这里插入图片描述
从结果分析,我们可以知道X1和X2的均值相等,X2和X3的均值不相等,X3和X1的均值也不相等。

🌕 方差分析

方差分析是分析实验数据的一种方法。

对于抽样测得的实验数据,由于观测条件不同随机因素的干扰造成的差异使得实验结果不同,将前者造成的差异称为系统差异偶然差异

方差分析的目的:从实验数据中分析出各个因素及它们之间产生的影响,确定各个因素作用的大小,进而把两种差异区分开来,以确定在实验中有没有系统的因素在起作用。

方差分析根据因素数量,可分为单因素方差分析双因素方差分析等。

🌗 单因素方差分析

使用sm.stats.anova_lm()函数完成方差分析(l是小写L),使用pairwise_tukeyhsd()函数对数据方差分析结果进行多重检验。

import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/Iris.csv")	# 读取数据
model = smf.ols("SepalLengthCm~Species",data = a).fit() 
b = sm.stats.anova_lm(model,typ = 2)	# 方差分析
print(b)

在这里插入图片描述最后一个PR是P值,远小于0.05,则应该拒绝原假设,说明不用类别的SepalLengthCm特征均值不完全相同。那么我们可以使用多重比较对比哪些类别之间的均值不同。

import pandas as pd
from statsmodels.stats.multicomp import pairwise_tukeyhsd

a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/Iris.csv")
b = pairwise_tukeyhsd(endog = a.SepalLengthCm,groups = a.Species,alpha = 0.05)
print(b)

在这里插入图片描述
针对于获得的多重比较的结果,可以使用plot_simultaneous()函数可视化出多重比较的图像。

b.plot_simultaneous()
plt.grid()
plt.show()

在这里插入图片描述
可以直观的看出,三个类别的均值都不相同或,且setosa的均值最小,virginica的均值最大。

🌗 双因素方差分析

双因素方差分析分为两种情况,分别是不考虑交互作用和考虑交互作用的情况。

import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/Iris.csv")

np.random.seed(123)
a["Group"] = np.random.choice(["A","B"],size = 150)		# 生成新的分类因素Group
model = smf.ols("SepalLengthCm~Species * Group",data = a).fit()
b = sm.stats.anova_lm(model,typ = 2)
print(b)

在这里插入图片描述
从结果可以看出,Species因素下差异是显著的。Group因素和Species:Group(Species和Group的交互作用)因素下差异是不显著的。

针对双因素影响的数据,可以使用sns.catplot()函数将其可视化。

import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
from matplotlib import pyplot as plt
import seaborn as sns

import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

a = pd.read_csv("D:/Pycharm/机器学习数据/program/data/chap2/Iris.csv")
np.random.seed(123)
a["Group"] = np.random.choice(["A","B"],size = 150)
model = smf.ols("SepalLengthCm~Species * Group",data = a).fit()
b = sm.stats.anova_lm(model,typ = 2)
sns.catplot(x = "Species",y = "SepalLengthCm",hue = "Group",markers = ["s","o"],linestyles = ["-","--"],data = a,kind = "point",aspect = 1.4)
plt.grid()
plt.title("多因素方差分析")
plt.show()

在这里插入图片描述

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

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

相关文章

CSS样式基础内容2

目录 Emmet语法 快速格式化代码 CSS的复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 链接伪类选择器 focus伪类选择器 CSS元素显示模式 块元素 行内元素 行内块元素 元素显示模式转换 案例-简洁版侧边栏 单行文字垂直居中 CSS的背景 背景图片 方位名词…

【蓝桥云课】最大公约数与最小公倍数

一、最大公约数gcd(a,b) 引例&#xff1a; a24&#xff0c;其因子有1、2、3、4、6、8、12、24 b15&#xff0c;其因子有1、3、5、15 最大公约数gcd(a,b)gcd(24,15)3 欧几里得辗转算法&#xff1a; a max(a,b); b min(a,b); while(b>0){t a%b;a b;b t; }运算过程&…

postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数

一、 table_relation_vacuum函数 1. 函数定义 前篇最后&#xff08;https://blog.csdn.net/Hehuyi_In/article/details/128749517&#xff09;&#xff0c;我们提到了table_relation_vacuum函数&#xff08;tableam.h文件&#xff09;&#xff0c;本篇继续学习。 如前面所说&a…

人大金仓数据库对象访问权限

数据库的表、索引、视图等&#xff0c;在数据库中的一切都可以称为数据库对象。 对象分为以下两类 模式&#xff08;SCHEMA&#xff09;对象&#xff1a;可视为一个表的集合&#xff0c;可以理解为一个存储目录&#xff0c;包含视图、索引、数据类型、函数和操作符等。非模式…

AcWing1229.日期问题——学习笔记

目录 题目 代码 AC结果 思路&#xff1a; 一、获取数据 二、验证日期合法性 三、去重 四、排序 五、主方法中调用&输出 题目 1229. 日期问题 - AcWing题库https://www.acwing.com/problem/content/description/1231/ 代码 import java.util.Scanner;public class…

XILINX FPGA OV5640 摄像头驱动(一)

影像行业是一个值得深耕的方向&#xff0c;废话不多说 先看输入和输出 输入是光照&#xff0c;输出是光照的数字信号 image area&#xff1a;说的是感光矩阵&#xff0c;CMOS图像传感器的最核心部分&#xff0c;接收光照产生电信号的部分。决定了图像质量的好坏 矩阵就会行列…

MyBatisPlus笔记

一、MyBatisPlus概述 MyBatisPlus&#xff08;简称 MP&#xff09;是一个MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 MyBatis-Plus可以节省我们大量工作时间&#xff0c;所有的CRUD代码它都可以自动化完成&…

leetcode1143 最长公共子序列

题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;…

因果诊断原理

因果分析在近十来年逐渐倍受关注&#xff0c;其提供了解释因子间因果性的定量分析工具&#xff0c;广泛用于数据分析领域&#xff0c;同时也就用决策分析、作用预估等反事实因果推理中。本文首先对比了因果性和相关性的关系&#xff0c;之后确定因果关系的基本方法&#xff0c;…

博客搭建教程1-Archlinux环境配置

文章目录1 前言2 archlinux镜像下载3 archlinux安装1 前言 这个教程主要讲解linux环境下博客的搭建&#xff0c;这里的linux系统选择archlinux&#xff0c;博客的框架基于hexo框架。 参考博客&#xff1a; 1、ArchLinux安装教程 2、Archlinux2022年7月镜像 手把手安装教程 UE…

MySQL进阶——存储过程

MySQL 存储过程 1、简介 大多数 SQL 语句都是针对一个或多个表的单条语句。并非所有的操作都那么简单。经常会有一个完整的操作需要多条语句才能完成。 存储过程简单来说&#xff0c;就是为以后的使用而保存的一条或多条 MySQL 语句的集合。可将其视为批处理文件。虽然他们的…

【Spring(八)】带你打通Spring的注解开发

文章目录注解开发注解开发定义bean纯注解开发注解开发bean作用范围与生命周期管理注解开发依赖注入注解开发管理第三方bean注解开发实现为第三方bean注入资源总结注解开发 Spring的配置我们已经告一段落了&#xff0c;那接下来我们就要发挥Spring的强项了&#xff1a;简化开发&…

MySQL —— 数据库基础

目录 一、数据库的基本概念 1. 什么是数据库 2. 主流的数据库 二、基本使用 1. 连接服务器 2. 服务器管理 3. 服务器、数据库、表关系 4. 使用案例 5. 数据库的存储逻辑 三、MySQL架构 四、SQL分类 五、存储引擎 1. 存储引擎 2. 查看存储引擎 3. 存储引擎对比 …

Elasticsearch 这篇还不够吗

系列文章目录 文章目录系列文章目录一、概述1. ES 的基本概念2. ES 和关系型数据库的对比二、环境准备1. linux 下单机安装三、入门操作1. 创建索引2. 写入文档3. 根据id搜索文档4. 根据一般字段搜索文档5. 根据文本字段搜索文档四、ES 客户端实战1. Spring Data Elasticsearch…

学习shell与shell编程 vi与vim

Linux配置文件都是以ASCII的纯文本形式存在。 为什么学习vi 1)UnixLike系统都会内置vi文本编辑器&#xff0c;其他的文本编辑器则不一定存在 2)许多软件的编辑接口都会主动调用vi 3)vi具有程序编辑的能力&#xff0c;可以主动以字体颜色辨别语法的正确性 4)程序简单&#…

webgl纹理贴图机制

文章目录前言纹理图片大小规范纹理坐标系统贴图流程JavaScript部分齐次坐标—uv坐标数据准备加载外部纹理图像纹理配置加载着色器部分顶点着色器片元着色器完整示例使用多张纹理着色器接受两个纹理单元封装纹理配置赋值函数完整示例总结前言 在计算机图形学中&#xff0c;为了…

HTML+CSS+JS制作炫酷【烟花特效】

文章目录制作炫酷烟花特效一、普通烟花(分散形)HTML代码CSS代码JS代码二、圆形烟花HTML代码CSS代码JS代码三、爱心形烟花HTML代码CSS代码JS代码四、源码获取在线下载制作炫酷烟花特效 &#x1f4a1;本篇内容使用htmlcssjs制作鼠标点击出现烟花效果&#xff0c;分别介绍了分散型…

python-测试代码

1. 测试函数get_name.pydef combination(first, last):将姓名组合在一起name first lastreturn name.title()hello_world.pyfrom get_name import combinationprint("Enter q to quit!") while True:first input(Please input your first name: )if first q:b…

理光Aficio MP C2500扫描到文件夹设置方法

首先在需要接收扫描文件的电脑上设置共享文件夹。 注&#xff1a; &#xff08;1&#xff09;文件夹的名字最好简单一点&#xff0c;比如&#xff1a;scan、123等等&#xff1b; &#xff08;2&#xff09;文件夹的共享权限最好能设置为最大&#xff08;WindowsXP、Windows200…

Future、CompletableFuture概述

1.同步和异步 &#xff08;1&#xff09;同步&#xff1a;需要等待结果返回&#xff0c;才能继续运行 &#xff08;2&#xff09;异步&#xff1a;不需要等待结果返回&#xff0c;就能继续运行 &#xff08;3&#xff09;异步设计&#xff1a;多线程可以让方法执行变为异步(比…