python 卡方分布值_使用Python进行机器学习的假设检验(附代码)

3b95ed63cfd146b9a5294762b83cbd1c.png

大数据文摘授权转载自数据派THU

来源:medium

编译:张睿毅、张一豪

也许所有机器学习的初学者,或者中级水平的学生,或者统计专业的学生,都听说过这个术语,假设检验。

我将简要介绍一下这个当我学习时给我带来了麻烦的主题。我把所有这些概念放在一起,并使用python进行示例。

在我寻求更广泛的事情之前要考虑一些问题 ——什么是假设检验?我们为什么用它?什么是假设的基本条件?什么是假设检验的重要参数?

让我们一个个地开始吧!

什么是假设检验?

假设检验是一种统计方法,用于使用实验数据进行统计决策。假设检验基本上是我们对人口参数做出的假设。

例如:你说班里的学生平均年龄是40岁,或者一个男生要比女生高。

我们假设所有这些例子都需要一些统计方法来证明这些。无论我们假设什么是真的,我们都需要一些数学结论。

我们为什么要用它?

假设检验是统计学中必不可少的过程。假设检验评估关于总体的两个相互排斥的陈述,以确定样本数据最佳支持哪个陈述。当我们说一个发现具有统计学意义时,这要归功于一个假设检验。

什么是假设的基本条件?

160b1bbd1800cf65f91fc84bb50da4b8.png

 不同均值和方差下的正态分布

假设的基础是规范化和标准规范化。我们所有的假设都围绕这两个术语的基础。

6ae9890cf994ef5fddf88860840f5600.png

标准化的正态曲线图像和数据分布及每个部分的百分比

你一定想知道这两个图像之间有什么区别,有人可能会说我找不到,而其他人看到的图像会比较平坦,而不是陡峭的。好吧伙计这不是我想要表达的,首先你可以看到有不同的正态曲线所有那些正态曲线可以有不同的均值和方差,如第二张图像,如果你注意到图形是合理分布的,总是均值= 0和方差= 1。当我们使用标准化的正态数据时,z—score的概念就出现了。

正态分布

如果变量的分布具有正态曲线的形状——一个特殊的钟形曲线,则该变量被称为正态分布或具有正态分布。正态分布图称为正态曲线,它具有以下所有属性:1.均值,中位数和众数是相等。

147b698e45770f7f7f4749b010f3fa0e.png

正态分布方程

66792380954748bf12d2ea2a333af9e1.png

标准化正态分布

标准正态分布是平均值为0,标准差为1的正态分布。

哪些是假设检验的重要参数?

零假设

在推论统计中,零假设是一种普遍的说法或默认的观点,即两个测量现象之间没有关系,或者分组间没有关联,换句话说,它是一个基本假设,或基于领域或问题知识。

示例:公司的生产力=50个单位/天。

备择假设

另一种假设是假设检验中使用的假设与零假设相反。通常认为观察是真实效果的结果(叠加了一定量的偶然的变化)。

10fade212b0ee8b7ba23f513978143e7.png

零假设与备择假设

示例:公司生产≠50单位/每天。

重要程度:指我们接受或拒绝无效假设的重要程度。接受或拒绝假设不可能100%准确,因此我们选择通常为5%的重要程度。

这通常用alpha(数学符号)表示,通常为0.05或5%,这意味着您的输出应该有95%的信心在每个样本中给出类似的结果。

I型错误:当我们拒绝零假设时,尽管该假设是正确的。类型I错误由alpha表示。在假设检验中,显示关键区域的正常曲线称为α区域;

II型错误:当我们接受零假设但它是错误的。II型错误用beta表示。在假设检验中,显示接受区域的正常曲线称为β区域。

单尾测试:统计假设的测试,其中拒绝区域仅在采样分布的一侧,称为单尾测试。

示例:一所大学有≥4000名学生或数据科学≤80%采用的组织。

双尾测试:双尾测试是一种统计测试,其中分布的关键区域是双侧的,并测试样本是否大于或小于某个值范围。如果被测试的样本属于任一关键区域,则接受替代假设而不是零假设。

示例:一所大学!= 4000名学生或数据科学!= 80%的组织采用。

3fd2919808774f88d0536927bc21499f.png

单尾和双尾图像

P值:P值或计算概率是当研究问题的零假设(H 0)为真时,找到观察到的或更极端的结果的概率 —— “极端”程度的定义取决于假设如何被检测。

如果您的P值小于选定的显着性水平,那么就拒绝原假设,即接受样本提供合理的证据来支持备选假设。它并不意味着“有意义”或“重要”的差异;这是在考虑结果的真实相关性时决定的。

示例:你有一枚硬币而你不知道这是否公平或棘手所以让我们决定零和备择假设。

H0:硬币是一个公平的硬币。

H1:硬币是一个狡猾的硬币。并且alpha = 5%或0.05

现在让我们掷硬币并计算p值(概率值)。

  • 第一次投掷硬币,结果是尾部P值= 50%(头部和尾部的概率相等);

  • 第二次抛硬币,结果是尾巴,现在p值= 50/2 = 25%。

同样地,我们连续6次投掷并得到P值= 1.5%的结果,但是我们将显着性水平设置为95%表示我们允许的5%错误率,在这里我们看到我们超出了那个水平,即我们的零假设不成立,所以我们需要拒绝并提出这个硬币实际上是一个狡猾的硬币。

自由度:  现在想象你对期望值没有兴趣,你对数据分析感兴趣。您有一个包含10个值的数据集。如果你没有估算任何东西,每个值都可以取任何数字,对吧?每个值都可以完全自由变化。但是假设您想使用单样本t检验来测试10个值的样本的总体平均值。你现在有一个约束——平均值的估计。究竟是什么约束?通过定义均值,必须保持以下关系:数据中所有值的总和必须等于n x mean,其中n是数据集中的值的数量。

因此,如果数据集有10个值,则10个值的总和必须等于平均值x 10.如果10个值的平均值为3.5(您可以选择任何数字),则此约束要求10个值的总和必须等于10 x 3.5 = 35。

使用该约束,数据集中的第一个值可以自由变化。无论它是什么价值,所有10个数字的总和仍然可以具有35的值。第二个值也可以自由变化,因为无论你选择什么值,它仍然允许所有值的总和的可能性是35岁。

现在让我们看一些广泛使用的假设检验类型: 

  • T校验(学生T校验)

  • Z校验

  • ANOVA校验

  • 卡方检验

T—检验 : t检验是一种推论统计量,用于确定在某些特征中可能与两组的均值之间是否存在显着差异。 它主要用于数据集,如通过翻转硬币100次记录为结果的数据集,将遵循正态分布并且可能具有未知的方差 。 T检验用作假设检验工具 ,其允许测试适用于群体的假设。 T检验有两种类型:
  • 单样本t检验

  • 双样本t检验

单样本t检验 : 单样本t检验确定样本均值是否与已知或假设的总体均值具有统计学差异。 单样本t检验是参数检验。 示例: 你有10个年龄,你正在检查平均年龄是否为30岁。  (使用python查看下面的代码)。
from scipy.stats import ttest_1sampimport numpy as npages = np.genfromtxt(“ages.csv”)print(ages)ages_mean = np.mean(ages)print(ages_mean)tset, pval = ttest_1samp(ages, 30)print(“p-values”,pval)if pval < 0.05:    # alpha value is 0.05 or 5%   print(" we are rejecting null hypothesis")else:  print("we are accepting null hypothesis”)
上面代码的结果如下:   4d00a9b457824ef137114d8fb36803ab.png

单样本t测试结果

双样本t检验 : 独立样本t检验或双样本t检验比较两个独立组的平均值,以确定是否有统计证据表明相关的人口均值存在显着差异。 独立样本t检验是参数检验。 该测试也称为: 独立t检验。 示例 : 在week1和week2之间是否存在任何关联(代码在下面的python中给出)。
from scipy.stats import ttest_indimport numpy as npweek1 = np.genfromtxt("week1.csv",  delimiter=",")week2 = np.genfromtxt("week2.csv",  delimiter=",")print(week1)print("week2 data :-\n")print(week2)week1_mean = np.mean(week1)week2_mean = np.mean(week2)print("week1 mean value:",week1_mean)print("week2 mean value:",week2_mean)week1_std = np.std(week1)week2_std = np.std(week2)print("week1 std value:",week1_std)print("week2 std value:",week2_std)ttest,pval = ttest_ind(week1,week2)print("p-value",pval)if pval <0.05:  print("we reject null hypothesis")else:  print("we accept null hypothesis”)
74bd515d097272e0211f96829aaadcd2.png

双样本t校验结果

配对样本t检 : 配对样本t检验也称为依赖样本t检验。 这是一个单变量测试,测试2个相关变量之间的显着差异。 这方面的一个例子是,如果您在某些治疗,病症或时间点之前和之后收集个人的血压。 H0 : 表示两个样本之间的差异为0。 H1 : 两个样本之间的平均差异不是0。 执行下面的代码可以得到同样的结果。
import pandas as pdfrom scipy import statsdf = pd.read_csv("blood_pressure.csv")df[['bp_before','bp_after']].describe()ttest,pval = stats.ttest_rel(df['bp_before'], df['bp_after'])print(pval)if pval<0.05:    print("reject null hypothesis")else:    print("accept null hypothesis")
什么时候可以运行Z校验。 在统计学中使用几种不同类型的校验(即f检验,卡方检验,t检验) 。 在下列情况下,您将使用Z测试:
  • 样本量大于30。否则,请使用t检验。数据点应彼此独立。换句话说,一个数据点不相关或不影响另一个数据点。
  • 数据应该是正常分布的。但是,对于大样本量(超过30个),这并不总是重要的。
  • 数据应从人口中随机选择,每个项目都有相同的选择机会。
  • 如果可能的话,样本量应该相等。
再举一个例子,我们使用z-test进行血压测量,如156个单样本Z检验。
import pandas as pdfrom scipy import statsfrom statsmodels.stats import weightstats as stestsztest ,pval = stests.ztest(df['bp_before'], x2=None, value=156)print(float(pval))if pval<0.05:    print("reject null hypothesis")else:    print("accept null hypothesis")
双样本Z检验 :在两个样本z检验中,类似于t检验,我们检查两个独立的数据组并确定两个组的样本均值是否相等。 H0 : 两组的平均值为0 H1 : 两组的平均值不为0 示例 : 我们检查血液之后和血 液数据之前的血液数据。 (下面是python代码)
ztest ,pval1 = stests.ztest(df['bp_before'],x2=df['bp_after'],value=0,alternative='two-sided')print(float(pval1))if pval<0.05:    print("reject null hypothesis")else:    print("accept null hypothesis")
ANOVA(F-检验) : t检验在处理两组时效果很好,但有时我们想要同时比较两组以上。 例如,如果我们想根据种族等某些分类变量来测试选民年龄是否不同,我们必须比较每个级别的平均值或对变量进行分组。 我们可以为每对组进行单独的t检验,但是当你进行多次检测时,你会增加误报的可能性。 方差分析或ANOVA 是一种统计推断测试,可让您同时比较多个组。 d39fae02151839643ea0a51b4e931d5b.png

F校验或ANOVA实例图

与z和t分布不同,F分布没有任何负值,因为由于每个偏差的平方,组内变异和组内变异总是正的。 单向F检验(ANOVA) : 根据它们的平均相似度和f分数来判断两个或更多个组是否相似。 示例 : 有3种不同的植物类别及其重量,需要检查所有3组是否相似(下面是python代码)。
df_anova = pd.read_csv('PlantGrowth.csv')df_anova = df_anova[['weight','group']]grps = pd.unique(df_anova.group.values)d_data = {grp:df_anova['weight'][df_anova.group == grp] for grp in grps} F, p = stats.f_oneway(d_data['ctrl'], d_data['trt1'], d_data['trt2'])print("p-value for significance is: ", p)if p<0.05:    print("reject null hypothesis")else:    print("accept null hypothesis")
双向F检验 :  双向F检验是单向检验的扩展 ,当我们有2个自变量和2个以上的组时使用它。 双向F检验并不能说明哪个变量占主导地位。 如果我们需要检查个体意义,则需要进行事后测试。 现在让我们来看看平均作物产量(不是任何小组的平均作物产量),以及每个因子的平均作物产量,以及组合在一起的因子。
import statsmodels.api as smfrom statsmodels.formula.api import olsdf_anova2 = pd.read_csv("https://raw.githubusercontent.com/Opensourcefordatascience/Data-sets/master/crop_yield.csv")model = ols('Yield ~ C(Fert)*C(Water)', df_anova2).fit()print(f"Overall model F({model.df_model: .0f},{model.df_resid: .0f}) = {model.fvalue: .3f}, p = {model.f_pvalue: .4f}")res = sm.stats.anova_lm(model, typ= 2)res
卡方检验 :  当您从单个总体中获得两个分类变量时 ,将应用此测试。 它用于确定两个变量之间是否存在显着关联。 例如,在选举调查中,选民可能按性别(男性或女性)和投票偏好(民主党,共和党或独立团体)进行分类。 我们可以使用卡方检验来确定独立性,以确定性别是否与投票偏好相关。 以下为python代码。
df_chi = pd.read_csv('chi-test.csv')contingency_table=pd.crosstab(df_chi["Gender"],df_chi["Shopping?"])print('contingency_table :-\n',contingency_table)#Observed ValuesObserved_Values = contingency_table.values print("Observed Values :\n",Observed_Values)b=stats.chi2_contingency(contingency_table)Expected_Values = b[3]print("Expected Values :-\n",Expected_Values)no_of_rows=len(contingency_table.iloc[0:2,0])no_of_columns=len(contingency_table.iloc[0,0:2])ddof=(no_of_rows-1)*(no_of_columns-1)print("Degree of Freedom:-",ddof)alpha = 0.05from scipy.stats import chi2chi_square=sum([(o-e)**2./e for o,e in zip(Observed_Values,Expected_Values)])chi_square_statistic=chi_square[0]+chi_square[1]print("chi-square statistic:-",chi_square_statistic)critical_value=chi2.ppf(q=1-alpha,df=ddof)print('critical_value:',critical_value)#p-valuep_value=1-chi2.cdf(x=chi_square_statistic,df=ddof)print('p-value:',p_value)print('Significance level: ',alpha)print('Degree of Freedom: ',ddof)print('chi-square statistic:',chi_square_statistic)print('critical_value:',critical_value)print('p-value:',p_value)if chi_square_statistic>=critical_value:    print("Reject H0,There is a relationship between 2 categorical variables")else:    print("Retain H0,There is no relationship between 2 categorical variables")    if p_value<=alpha:    print("Reject H0,There is a relationship between 2 categorical variables")else:    print("Retain H0,There is no relationship between 2 categorical variables")
原文链接:

https://towardsdatascience.com/hypothesis-testing-in-machine-learning-using-python-a0dc89e169ce

实习/全职编辑记者招聘ing

加入我们,亲身体验一家专业科技媒体采写的每个细节,在最有前景的行业,和一群遍布全球最优秀的人一起成长。坐标北京·清华东门,在大数据文摘主页对话页回复“招聘”了解详情。简历请直接发送至zz@bigdatadigest.cn

124dacb4f5f9db6fc78ebf939518f71f.png dcacbb0880d7c6dba99a8065348f5032.png 点「在看」的人都变好看了哦!
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种非常流行的编程语言,它拥有许多强大的库和工具,以支持数据分析、科学计算和机器学习等任务。Scipy是Python中一个重要的科学计算库,提供了许多用于数计算、优化、插、统计分析等功能的函数和工具。 要开始学习Python使用Scipy,首先需要确保已经安装了Python和Scipy库。可以通过在终端或命令提示符下运行命令来检查是否安装了Scipy:`import scipy`。如果没有报错,则表示Scipy安装成功。 在学习Scipy之前,最好对Python的基本语法和数据类型有一定的了解。可以通过阅读相关的Python教程来学习这些基础知识。 一旦对Python有了基本的了解,可以开始学习Scipy。Scipy提供了许多模块,每个模块都针对不同的应用领域。一些常用的模块包括: 1. scipy.stats:提供了各种统计分布和统计函数,如正态分布、t分布分布等,以及对应的概率密度函数、累积分布函数等。 2. scipy.optimize:提供了优化和根查找的函数,如最小化函数、求解非线性方程组等。 3. scipy.interpolate:提供了插函数,用于在已知数据点之间进行计算。 4. scipy.linalg:提供了线性代数的函数,如矩阵求逆、特征计算等。 5. scipy.signal:提供了信号处理的函数,如滤波、傅里叶变换等。 学习Scipy可以通过阅读官方文档、参考在线教程和案例,以及通过实践编写代码进行。可以从简单的例子开始,逐渐深入学习和掌握Scipy库的各种功能。 总的来说,Python使用Scipy可以进行各种科学计算和数据分析的任务。通过学习Scipy,可以更高效地处理数计算、优化问题、插计算、统计分析等。希望通过本教程的学习,能够让你更好地掌握Python和Scipy的使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值