900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 十 非参数检验:使用python进行卡方拟合优度检验

十 非参数检验:使用python进行卡方拟合优度检验

时间:2020-05-22 19:44:40

相关推荐

十 非参数检验:使用python进行卡方拟合优度检验

在参数检验中都是假设总体服从正态分布,那么如何才能知道总体在理论上服从一个什么分布呢?卡方拟合优度检验就是用来检验总体是否服从某个指定分布。从而可以进行:

检测观察数与理论数之间的一致性;通过检测观察数与理论数之间的一致性来判定事物之间的独立性。

1. 卡方拟合优度检验的原理

1.1. 假设检验的形式

H0:总体服从某个分布H1:总体不服从某个分布H_0: 总体服从某个分布 \quad H_1: 总体不服从某个分布H0​:总体服从某个分布H1​:总体不服从某个分布

1.2. 进行假设检验的步骤

在H0H_0H0​下,总体X取值的全体分成k个两两不相交的子集A1,....AkA_1,....A_kA1​,....Ak​;以Oi(i=1,...,k)O_i(i=1,...,k)Oi​(i=1,...,k)记录样本观察值x1,...,xnx_1,...,x_nx1​,...,xn​中落在AiA_iAi​的个数(观察频数)当H0H_0H0​为真且分布完全已知时,计算事件AiA_iAi​发生的概率pi=P(Ai),i=1,...,kp_i=P(A_i), i =1, ..., kpi​=P(Ai​),i=1,...,k; 如果假设的分布还有r个未知参数时,要先利用参数估计这r个未知参数,然后求得pip_ipi​的估计p^i\hat p_ip^​i​;计算理论频数Ti=npi(np^i)T_i=np_i(n\hat p_i)Ti​=npi​(np^​i​)构造检验统计量,道理上来说就是要检测Oi与TiO_i与T_iOi​与Ti​差异的显著性,构造如下检验统计量:

χ2=∑i=1k(Oi−Ti)2Ti\chi^2=\sum_{i=1}^k\frac{(O_i-T_i)^2}{T_i}χ2=i=1∑k​Ti​(Oi​−Ti​)2​

当假设分布不含有任何未知数时,服从自由度为k−1k-1k−1的卡方分布;当假设分布含有rrr个未知参数时,该统计量服从自由度为k−r−1k-r-1k−r−1的卡方分布。

1.3. 实例

解:由于泊松分布含有一个未知参数λ\lambdaλ, 所以首先使用极大似然估计知道其估计为样本均值,λ^=1749/330=5.3\hat \lambda=1749/330=5.3λ^=1749/330=5.3

使用python计算如下:

import numpy as npimport pandas as pdfrom scipy import statsd = {'order_counts': list(range(14))+[16], 'o_days':[3,6,21,46,48,61,52,42,27,11,6,4,1,1,1]}df = pd.DataFrame(d)

此时,使用基本数据构建的数据框输出如下:

因为每天订单数大于11的天数很少,所以将其合并,也就是每天不少于11个订单的天数为7, python处理如下:

df.iloc[11,1]=7df=df[:12]

此时,数据如下:

接下来根据原假设成立,计算理论频率:

Poiss=stats.poisson(mu=5.3)df['prop']=Poiss.pmf(df['order_counts'])# 修正订单数大于11对应的概率df.iloc[11, 2]=1-Poiss.cdf(10)

此时的输入如下:

接下来计算理论频数:

df['t_days']=330*df['prop']

得到的数据如下:

在卡方拟合优度检验中,一般要求n>50,npi>5n\gt 50, np_i\gt 5n>50,npi​>5. 所以要对理论频数不满足要求的行累计的后面的行。但是还有一种情况,就是末尾的数据通过计算后,不满足理论频数的要求,要与前面的行合并。处理如下:

df1=pd.DataFrame(df)n=Nonefor i in range(len(df1)):if df1.iloc[i,3] < 5:n =idf1.iloc[i+1,:] = df1.iloc[i+1,:] + df1.iloc[i,:]else:breakif n is not None:df1 = df1.iloc[n+1:,:]

上面的代码可以自动完成从前往后遍历数据框,遇到理论频数不满足要求的情况进行处理。因为本例题后面行的数据没有出现理论频数不满足要求的情况,所以没有编写处理的代码。进过上面的处理,目前数据如下:

至此,我们就可以使用scipy模块的函数chisquare进行验证,代码如下:

stats.chisquare(df1['o_days'], df1['t_days'], ddof=1)# 输出结果Power_divergenceResult(statistic=3.9705897417232916, pvalue=0.9133375422858901)

因为pvalue>α=0.05pvalue \gt \alpha=0.05pvalue>α=0.05,所以我们接受原假设,即认为这些数据来自一个泊松分布的总体。

例2: 某箱子中盛有10种球,现在从中有返回地随机抽取200个,其中第iii种球共取得viv_ivi​个,数据记录如下。

问箱子中这10种球的比例是否一样?(α=0.05\alpha=0.05α=0.05)

解:H0:10种球比例一样H_0: 10种球比例一样H0​:10种球比例一样

python计算如下:

import numpy as npimport pandas as pdfrom scipy import statsd={'o_vals':[35,16,15,17,17,19,11,16,30,14]}df = pd.DataFrame(d)df['t_vals']=[200*1/10]*len(df)

这样我们就得到了为进行卡方拟合优度检验所需的数据,如下:

继续使用python做出分析:

stats.chisquare(df['o_vals'], df['t_vals'])# 结果:Power_divergenceResult(statistic=24.900000000000002, pvalue=0.0030838136870983547)

因为pvalue=0.0030838136870983547<α=0.05pvalue=0.0030838136870983547\lt \alpha=0.05pvalue=0.0030838136870983547<α=0.05,所以拒绝原假设,认为箱子中10种球的比例是不一样的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。