在参数检验中都是假设总体服从正态分布,那么如何才能知道总体在理论上服从一个什么分布呢?卡方拟合优度检验就是用来检验总体是否服从某个指定分布。从而可以进行:
检测观察数与理论数之间的一致性;通过检测观察数与理论数之间的一致性来判定事物之间的独立性。
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∑kTi(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种球的比例是不一样的。