大数据文摘授权转载自数据派THU
来源:medium
编译:张睿毅、张一豪
也许所有机器学习的初学者,或者中级水平的学生,或者统计专业的学生,都听说过这个术语,假设检验。
我将简要介绍一下这个当我学习时给我带来了麻烦的主题。我把所有这些概念放在一起,并使用python进行示例。
在我寻求更广泛的事情之前要考虑一些问题 ——什么是假设检验?我们为什么用它?什么是假设的基本条件?什么是假设检验的重要参数?
让我们一个个地开始吧!
什么是假设检验?
假设检验是一种统计方法,用于使用实验数据进行统计决策。假设检验基本上是我们对人口参数做出的假设。
例如:你说班里的学生平均年龄是40岁,或者一个男生要比女生高。
我们假设所有这些例子都需要一些统计方法来证明这些。无论我们假设什么是真的,我们都需要一些数学结论。
我们为什么要用它?
假设检验是统计学中必不可少的过程。假设检验评估关于总体的两个相互排斥的陈述,以确定样本数据最佳支持哪个陈述。当我们说一个发现具有统计学意义时,这要归功于一个假设检验。
什么是假设的基本条件?
不同均值和方差下的正态分布
假设的基础是规范化和标准规范化。我们所有的假设都围绕这两个术语的基础。
你一定想知道这两个图像之间有什么区别,有人可能会说我找不到,而其他人看到的图像会比较平坦,而不是陡峭的。好吧伙计这不是我想要表达的,首先你可以看到有不同的正态曲线所有那些正态曲线可以有不同的均值和方差,如第二张图像,如果你注意到图形是合理分布的,总是均值= 0和方差= 1。当我们使用标准化的正态数据时,z—score的概念就出现了。
正态分布
如果变量的分布具有正态曲线的形状——一个特殊的钟形曲线,则该变量被称为正态分布或具有正态分布。正态分布图称为正态曲线,它具有以下所有属性:1.均值,中位数和众数是相等。
标准正态分布是平均值为0,标准差为1的正态分布。
哪些是假设检验的重要参数?
零假设
在推论统计中,零假设是一种普遍的说法或默认的观点,即两个测量现象之间没有关系,或者分组间没有关联,换句话说,它是一个基本假设,或基于领域或问题知识。
示例:公司的生产力=50个单位/天。
备择假设
另一种假设是假设检验中使用的假设与零假设相反。通常认为观察是真实效果的结果(叠加了一定量的偶然的变化)。
零假设与备择假设
示例:公司生产≠50单位/每天。
重要程度:指我们接受或拒绝无效假设的重要程度。接受或拒绝假设不可能100%准确,因此我们选择通常为5%的重要程度。
这通常用alpha(数学符号)表示,通常为0.05或5%,这意味着您的输出应该有95%的信心在每个样本中给出类似的结果。
I型错误:当我们拒绝零假设时,尽管该假设是正确的。类型I错误由alpha表示。在假设检验中,显示关键区域的正常曲线称为α区域;
II型错误:当我们接受零假设但它是错误的。II型错误用beta表示。在假设检验中,显示接受区域的正常曲线称为β区域。
单尾测试:统计假设的测试,其中拒绝区域仅在采样分布的一侧,称为单尾测试。
示例:一所大学有≥4000名学生或数据科学≤80%采用的组织。
双尾测试:双尾测试是一种统计测试,其中分布的关键区域是双侧的,并测试样本是否大于或小于某个值范围。如果被测试的样本属于任一关键区域,则接受替代假设而不是零假设。
示例:一所大学!= 4000名学生或数据科学!= 80%的组织采用。
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检验
1 <span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> scipy.stats <span class="code-snippet__keyword">import</span> ttest_1sampimport numpy <span class="code-snippet__keyword">as</span> npages = np.genfromtxt(“ages.csv”)print(ages)ages_mean = np.mean(ages)print(ages_mean)tset, pval = ttest_1samp(ages, <span class="code-snippet__number">30</span>)print(“p-values”,pval)<span class="code-snippet__keyword">if</span> pval < <span class="code-snippet__number">0.05</span>: <span class="code-snippet__comment"># alpha value is 0.05 or 5% print(" we are rejecting null hypothesis")else: print("we are accepting null hypothesis”)</span></span>
单样本t测试结果
1 <span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> scipy.stats <span class="code-snippet__keyword">import</span> ttest_indimport numpy <span class="code-snippet__keyword">as</span> npweek1 = np.genfromtxt(<span class="code-snippet__string">"week1.csv"</span>, delimiter=<span class="code-snippet__string">","</span>)week2 = np.genfromtxt(<span class="code-snippet__string">"week2.csv"</span>, delimiter=<span class="code-snippet__string">","</span>)print(week1)print(<span class="code-snippet__string">"week2 data :-\n"</span>)print(week2)week1_mean = np.mean(week1)week2_mean = np.mean(week2)print(<span class="code-snippet__string">"week1 mean value:"</span>,week1_mean)print(<span class="code-snippet__string">"week2 mean value:"</span>,week2_mean)week1_std = np.std(week1)week2_std = np.std(week2)print(<span class="code-snippet__string">"week1 std value:"</span>,week1_std)print(<span class="code-snippet__string">"week2 std value:"</span>,week2_std)ttest,pval = ttest_ind(week1,week2)print(<span class="code-snippet__string">"p-value"</span>,pval)<span class="code-snippet__keyword">if</span> pval <<span class="code-snippet__number">0.05</span>: print(<span class="code-snippet__string">"we reject null hypothesis"</span>)<span class="code-snippet__keyword">else</span>: print(<span class="code-snippet__string">"we accept null hypothesis”)</span></span>
双样本t校验结果
1 <span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> pandas <span class="code-snippet__keyword">as</span> pdfrom scipy </span>
1 <span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> statsdf = pd.read_csv(<span class="code-snippet__string">"blood_pressure.csv"</span>)df[[<span class="code-snippet__string">'bp_before'</span>,<span class="code-snippet__string">'bp_after'</span>]].describe()ttest,pval = stats.ttest_rel(df[<span class="code-snippet__string">'bp_before'</span>], df[<span class="code-snippet__string">'bp_after'</span>])print(pval)<span class="code-snippet__keyword">if</span> pval<<span class="code-snippet__number">0.05</span>: print(<span class="code-snippet__string">"reject null hypothesis"</span>)<span class="code-snippet__keyword">else</span>: print(<span class="code-snippet__string">"accept null hypothesis"</span>)</span>
-
样本量大于30。否则,请使用t检验。 数据点应彼此独立。换句话说,一个数据点不相关或不影响另一个数据点。 -
数据应该是正常分布的。但是,对于大样本量(超过30个),这并不总是重要的。 -
数据应从人口中随机选择,每个项目都有相同的选择机会。 -
如果可能的话,样本量应该相等。
1 <span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> pandas <span class="code-snippet__keyword">as</span> pdfrom scipy <span class="code-snippet__keyword">import</span> statsfrom statsmodels.stats <span class="code-snippet__keyword">import</span> weightstats <span class="code-snippet__keyword">as</span> stestsztest ,pval = stests.ztest(df[<span class="code-snippet__string">'bp_before'</span>], x2=<span class="code-snippet__keyword">None</span>, value=<span class="code-snippet__number">156</span>)print(float(pval))<span class="code-snippet__keyword">if</span> pval<<span class="code-snippet__number">0.05</span>: print(<span class="code-snippet__string">"reject null hypothesis"</span>)<span class="code-snippet__keyword">else</span>: print(<span class="code-snippet__string">"accept null hypothesis"</span>)</span>
H1:两组的平均值不为0
示例:我们检查血液之后和血液数据之前的血液数据。(下面是python代码)
1 <span class="code-snippet_outer">ztest ,pval1 = stests.ztest(df[<span class="code-snippet__string">'bp_before'</span>],x2=df[<span class="code-snippet__string">'bp_after'</span>],value=0,alternative=<span class="code-snippet__string">'two-sided'</span>)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__built_in">float</span>(pval1))<span class="code-snippet__keyword">if</span> pval<0.05: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"reject null hypothesis"</span>)<span class="code-snippet__keyword">else</span>: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"accept null hypothesis"</span>)</span>
F校验或ANOVA实例图
1 <span class="code-snippet_outer">df_anova = pd.read_csv(<span class="code-snippet__string">'PlantGrowth.csv'</span>)df_anova = df_anova[[<span class="code-snippet__string">'weight'</span>,<span class="code-snippet__string">'group'</span>]]grps = pd.unique(df_anova.group.values)d_data = {grp:df_anova[<span class="code-snippet__string">'weight'</span>][df_anova.group == grp] <span class="code-snippet__keyword">for</span> grp <span class="code-snippet__keyword">in</span> grps} F, p = stats.f_oneway(d_data[<span class="code-snippet__string">'ctrl'</span>], d_data[<span class="code-snippet__string">'trt1'</span>], d_data[<span class="code-snippet__string">'trt2'</span>])<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"p-value for significance is: "</span>, p)<span class="code-snippet__keyword">if</span> p<0.05: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"reject null hypothesis"</span>)<span class="code-snippet__keyword">else</span>: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"accept null hypothesis"</span>)</span>
1 <span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> statsmodels.api <span class="code-snippet__keyword">as</span> smfrom statsmodels.formula.api <span class="code-snippet__keyword">import</span> olsdf_anova2 = pd.read_csv(<span class="code-snippet__string">"https://raw.githubusercontent.com/Opensourcefordatascience/Data-sets/master/crop_yield.csv"</span>)model = ols(<span class="code-snippet__string">'Yield ~ C(Fert)*C(Water)'</span>, df_anova2).fit()print(<span class="code-snippet__string">f"Overall model F(<span class="code-snippet__subst">{model.df_model: <span class="code-snippet__number">.0</span>f}</span>,<span class="code-snippet__subst">{model.df_resid: <span class="code-snippet__number">.0</span>f}</span>) = <span class="code-snippet__subst">{model.fvalue: <span class="code-snippet__number">.3</span>f}</span>, p = <span class="code-snippet__subst">{model.f_pvalue: <span class="code-snippet__number">.4</span>f}</span>"</span>)res = sm.stats.anova_lm(model, typ= <span class="code-snippet__number">2</span>)res</span>
1 <span class="code-snippet_outer">df_chi = pd.read_csv(<span class="code-snippet__string">'chi-test.csv'</span>)contingency_table=pd.crosstab(df_chi[<span class="code-snippet__string">"Gender"</span>],df_chi[<span class="code-snippet__string">"Shopping?"</span>])<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'contingency_table :-\n'</span>,contingency_table)#Observed ValuesObserved_Values = contingency_table.values <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Observed Values :\n"</span>,Observed_Values)b=stats.chi2_contingency(contingency_table)Expected_Values = b[<span class="code-snippet__number">3</span>]<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Expected Values :-\n"</span>,Expected_Values)no_of_rows=<span class="code-snippet__built_in">len</span>(contingency_table.iloc[<span class="code-snippet__number">0</span>:<span class="code-snippet__number">2</span>,<span class="code-snippet__number">0</span>])no_of_columns=<span class="code-snippet__built_in">len</span>(contingency_table.iloc[<span class="code-snippet__number">0</span>,<span class="code-snippet__number">0</span>:<span class="code-snippet__number">2</span>])ddof=(no_of_rows<span class="code-snippet__number">-1</span>)*(no_of_columns<span class="code-snippet__number">-1</span>)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Degree of Freedom:-"</span>,ddof)alpha = <span class="code-snippet__number">0.05f</span>rom scipy.stats <span class="code-snippet__keyword">import</span> chi2chi_square=sum([(o-e)**<span class="code-snippet__number">2.</span>/e <span class="code-snippet__keyword">for</span> o,e in zip(Observed_Values,Expected_Values)])chi_square_statistic=chi_square[<span class="code-snippet__number">0</span>]+chi_square[<span class="code-snippet__number">1</span>]<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"chi-square statistic:-"</span>,chi_square_statistic)critical_value=chi2.ppf(q=<span class="code-snippet__number">1</span>-alpha,df=ddof)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'critical_value:'</span>,critical_value)#p-valuep_value=<span class="code-snippet__number">1</span>-chi2.cdf(x=chi_square_statistic,df=ddof)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'p-value:'</span>,p_value)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'Significance level: '</span>,alpha)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'Degree of Freedom: '</span>,ddof)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'chi-square statistic:'</span>,chi_square_statistic)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'critical_value:'</span>,critical_value)<span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">'p-value:'</span>,p_value)<span class="code-snippet__keyword">if</span> chi_square_statistic>=critical_value: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Reject H0,There is a relationship between 2 categorical variables"</span>)<span class="code-snippet__keyword">else</span>: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Retain H0,There is no relationship between 2 categorical variables"</span>) <span class="code-snippet__keyword">if</span> p_value<=alpha: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Reject H0,There is a relationship between 2 categorical variables"</span>)<span class="code-snippet__keyword">else</span>: <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">"Retain H0,There is no relationship between 2 categorical variables"</span>)</span>
https://towardsdatascience.com/hypothesis-testing-in-machine-learning-using-python-a0dc89e169ce
实习/全职编辑记者招聘ing
加入我们,亲身体验一家专业科技媒体采写的每个细节,在最有前景的行业,和一群遍布全球最优秀的人一起成长。坐标北京·清华东门,在大数据文摘主页对话页回复“招聘”了解详情。简历请直接发送至zz@bigdatadigest.cn
朋友会在“发现-看一看”看到你“在看”的内容