在单样本问题中, 人们想要检验的是总体的中心是否等于一个已知的值. 但在实际问题中, 更受注意的往往是比较两个总体的位置参数; 比如, 两种训练方法中哪一种更出成绩, 两种汽油中哪一种污染更少, 两种市场营销策略中哪种更有效等等.

1. python中独立性检验 独立性检验函数_二维独立性检验的原理

若随机变量python中独立性检验 独立性检验函数_概率论_02的分布函数分别为python中独立性检验 独立性检验函数_概率论_03, 且联合分布为python中独立性检验 独立性检验函数_类变量_04, 则X与Y的独立性归结为假设检验问题:

python中独立性检验 独立性检验函数_类变量_05

若X与Y为分类变量,其中X的取值为python中独立性检验 独立性检验函数_取值_06, Y的取值为python中独立性检验 独立性检验函数_概率论_07, 将X与Y的各种情况组合用一张python中独立性检验 独立性检验函数_python中独立性检验_08列联表表示,称为python中独立性检验 独立性检验函数_python中独立性检验_09二维列联表,如下图所示:

python中独立性检验 独立性检验函数_概率论_10


表中python中独立性检验 独立性检验函数_概率论_11表示n个随机试验的结果中X取python中独立性检验 独立性检验函数_python中独立性检验_12及Y取python中独立性检验 独立性检验函数_类变量_13的频数,python中独立性检验 独立性检验函数_概率论_14.

python中独立性检验 独立性检验函数_类变量_15

python中独立性检验 独立性检验函数_python中独立性检验_16

python中独立性检验 独立性检验函数_概率论_17 则X与Y的独立性检验等价于下述检验:

python中独立性检验 独立性检验函数_python中独立性检验_18

注: 若X与Y 为连续型随机变量, 这时将它们的取值范围分成r个及s个互不相交的小区间, 用python中独立性检验 独立性检验函数_概率论_11 表示n个随机试验的结果中“X属于第i个小区间, Y 属于第k个小区间”的频数 python中独立性检验 独立性检验函数_概率论_20 这时可将X与Y 的独立性转化为列联表的独立性检验问题.

由于python中独立性检验 独立性检验函数_概率论_21的极大似然估计为python中独立性检验 独立性检验函数_二维_22, python中独立性检验 独立性检验函数_概率论_23的极大似然估计为python中独立性检验 独立性检验函数_取值_24, 因此若python中独立性检验 独立性检验函数_二维_25成立,则python中独立性检验 独立性检验函数_类变量_26的极大似然估计为python中独立性检验 独立性检验函数_概率论_27. 从而X取代python中独立性检验 独立性检验函数_python中独立性检验_12, Y取代python中独立性检验 独立性检验函数_类变量_13(试验数据落入第python中独立性检验 独立性检验函数_python中独立性检验_30个类)的理论频数为python中独立性检验 独立性检验函数_二维_31. 由此构造检验统计量为:

python中独立性检验 独立性检验函数_类变量_32

可以证明在原假设成立时, python中独立性检验 独立性检验函数_二维近似服从python中独立性检验 独立性检验函数_类变量_34

2. 使用Python展示和计算

在python中的pandas库中有一个DataFrame的数据结构,可以用来保存二维数据,并进行计算。

例1: 对表1所示频数分布表,以59%显著水平,检验色觉与性别是否相关。

python中独立性检验 独立性检验函数_二维_35

2. 1. 初始化数据

import numpy as np
import pandas as pd
from scipy import stats
d=np.array([[442, 514],[38,6]])
r,s = d.shape
df = pd.DataFrame(d, columns=['male', 'female'], index=['normal', 'blindness'])

上述代码已将初始化数据存入df,显示如下:

python中独立性检验 独立性检验函数_类变量_36

2.2. 计算边际频数

首先在df基础上建立一个数据框(数据一致)。并在新建的数据框基础继续计算。

df1 = df[:]
df1= pd.DataFrame(df1)
df1['r_tot']=np.sum(df1,axis=1)
df1.loc['c_tot']=np.sum(df1, axis=0)

经过上面的处理,df1就是带有编辑频数的数据框。显示如下:

python中独立性检验 独立性检验函数_python中独立性检验_37

2.3. 计算理论频数分布表

r_tot = df1['r_tot'][:-1]
c_tot=df1.loc['c_tot'][:-1]
total = np.sum(r_tot)
data = np.zeros((r,s))
for i in range(len(r_tot)):
    for j in range(len(c_tot)):
        data[i,j]=r_tot[i]*c_tot[j]/total
df2=pd.DataFrame(data, index=['normal', 'blindness'], columns=['male', 'female'])

至此,我们将计算得到的理论频数分布表保存在了df2中,而原始数据在df中,如下图所示:

python中独立性检验 独立性检验函数_类变量_38

2.4. 统计量计算

为了清晰整个计算过程,这里添加一步(对计算结果来说是多余的)产生统计量数据框的代码:

(df-df2)**2/df2

其产生的统计量数据框如下图:

python中独立性检验 独立性检验函数_python中独立性检验_39


其实,下面一行代码即可获得卡方统计量的值并获取pval:

chi_square=np.sum((df-df2)**2/df2).sum()
stats.chi2.sf(chi_squre, df=(r-1)*(s-1))

得到python中独立性检验 独立性检验函数_取值_40
因为python中独立性检验 独立性检验函数_python中独立性检验_41, 所以拒绝原假设,可以认为色盲和性别有关系