卡方检验(Chi-squared test)是一种统计检验方法,用于检验观察频数与期望频数之间的差异是否显著,从而判断两个分类变量之间是否独立。以下是卡方检验的数学原理、公式推导和常用背景的介绍:
举个例子,比较淘宝网页上各个链接上新与做优惠券之间有没有关系。
数学原理
卡方检验基于以下假设:
- 样本来自一个足够大的总体。
- 样本是随机且独立的。
- 每个观察值的实现是独立的。
卡方检验的统计量是卡方值,它是观察频数与期望频数差异的度量。如果两个变量独立,那么观察频数应该接近期望频数。
公式推导
设有一个 ( r \times c ) 的列联表,其中 ( r ) 行和 ( c ) 列分别代表两个分类变量的类别数。表中的 ( O_{ij} ) 表示在第 ( i ) 行和第 ( j ) 列交叉处的观察频数,( E_{ij} ) 表示在相同位置的期望频数。
期望频数 ( E_{ij} ) 可以通过以下公式计算:
[ E_{ij} = \frac{(行总和)_i \times (列总和)_j}{总样本数} ]
卡方统计量 ( \chi^2 ) 的计算公式为:
[ \chi^2 = \sum_{i=1}{r}\sum_{j=1}{c} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} ]
其中,求和是对所有的行 ( i ) 和列 ( j ) 进行。
常用背景
-
独立性检验:卡方检验最常用的场景是检验两个分类变量是否独立。例如,检验性别(男/女)和某种疾病(患病/未患病)之间是否存在关联。
-
拟合优度检验:卡方检验也可以用来检验一个变量的观察分布是否符合某种理论分布。例如,检验一个六面的骰子是否公平(是否每个面出现的概率都是1/6)。
-
同质性检验:在多个独立样本的情况下,卡方检验可以用来检验不同样本是否具有相同的分布。例如,检验不同地区的人口性别比例是否一致。
注意事项
- 卡方检验要求每个期望频数 ( E_{ij} ) 都不小于5,否则检验结果可能不准确。如果某些期望频数小于5,可能需要合并某些类别或使用Fisher精确检验。
- 卡方检验对样本量有一定的要求,样本量过小可能导致检验力不足。
- 卡方检验只能用于分类变量,不能用于连续变量。
卡方检验是一种非常强大的工具,广泛应用于社会科学、生物统计、市场研究等领域。
这段代码是用于进行卡方独立性检验的Python脚本,它检查数据集中的变量是否相互独立。下面是对代码中各个步骤的原理说明:
-
导入
stats
模块:- 从
scipy
库中导入stats
模块,这个模块提供了统计分析的工具,包括卡方检验。
- 从
-
设置显著性水平
p
:p
值用于确定统计检验的显著性水平,通常设置为0.05,意味着如果检验结果的 p 值小于0.05,则拒绝原假设(即认为变量之间不独立)。
-
定义变量列表
lst
:- 这个列表包含了需要进行独立性检验的变量名称,这些变量应该是数据框
df
中的列名。
- 这个列表包含了需要进行独立性检验的变量名称,这些变量应该是数据框
-
定义函数
chi_lst
:- 这个函数接受三个参数:数据框
df
,变量列表lst
,以及显著性水平p
(默认为0.05)。
- 这个函数接受三个参数:数据框
-
打印显著性水平和变量列表:
- 函数开始时,打印出显著性水平和将要检验的变量列表。
-
嵌套循环遍历变量列表:
- 外层循环遍历列表中的每个变量
x
。 - 内层循环再次遍历变量列表中的每个变量
i
,用于与外层循环的变量x
进行配对。
- 外层循环遍历列表中的每个变量
-
跳过相同变量的配对:
- 如果内层循环中的变量
i
与外层循环中的变量x
相同,则跳过,因为同一个变量与自身不需要进行独立性检验。
- 如果内层循环中的变量
-
打印分隔符:
- 为了提高输出的可读性,在每次变量配对检验前打印分隔符。
-
构建交叉表:
- 使用
pd.crosstab
函数构建变量x
和i
的交叉表,这个表显示了两个变量之间的频数分布。
- 使用
-
进行卡方检验:
- 使用
stats.chi2_contingency
函数对交叉表进行卡方检验,这个函数返回三个值:卡方统计量、p 值和自由度。这里只关心第二个返回值,即 p 值。
- 使用
-
根据 p 值判断独立性:
- 如果卡方检验的 p 值大于显著性水平
p
,则认为两个变量独立;否则,认为两个变量相关。
- 如果卡方检验的 p 值大于显著性水平
-
打印结果:
- 根据卡方检验的结果,打印出变量
x
和i
是否独立的信息。 - 如果两个变量不独立,打印出频数交叉表和频率表。
- 根据卡方检验的结果,打印出变量
-
打印频率表:
- 使用
pd.crosstab
函数再次构建交叉表,这次使用normalize='index'
参数,得到变量x
和i
的频率分布表,而不是频数分布。
- 使用
这个函数可以用来检验数据集中的多个分类变量之间的独立性。通过卡方独立性检验,可以判断两个变量是否独立,即一个变量的分布是否受到另一个变量分布的影响。如果两个变量独立,那么它们之间没有关联;如果不独立,则它们之间存在某种关联。
python代码实现
from scipy import stats
# 独立检验
p = 0.05
lst = ['数据源', '是否做促销', '是否做优惠券', '是否上新']
def chi_lst(df,lst,p=0.05):
print('p值为:',p,'\n变量为',lst)
for x in lst:
print("="*50)
for i in lst:
if x is i:
continue
print('-'*50)
cross_tab = pd.crosstab(df[x], df[i], margins=True, margins_name='Total')
if stats.chi2_contingency(cross_tab)[1]>p:
print(x,'与',i,'独立')
else:
print(x,'与',i,'相关\n频数交叉表:\n',cross_tab)
print('频率表:\n',pd.crosstab(df[x], df[i], normalize='index'))
这段代码是用于进行卡方独立性检验的Python脚本,它检查数据集中的变量是否相互独立。下面是对代码中各个步骤的原理说明:
-
导入
stats
模块:- 从
scipy
库中导入stats
模块,这个模块提供了统计分析的工具,包括卡方检验。
- 从
-
设置显著性水平
p
:p
值用于确定统计检验的显著性水平,通常设置为0.05,意味着如果检验结果的 p 值小于0.05,则拒绝原假设(即认为变量之间不独立)。
-
定义变量列表
lst
:- 这个列表包含了需要进行独立性检验的变量名称,这些变量应该是数据框
df
中的列名。
- 这个列表包含了需要进行独立性检验的变量名称,这些变量应该是数据框
-
定义函数
chi_lst
:- 这个函数接受三个参数:数据框
df
,变量列表lst
,以及显著性水平p
(默认为0.05)。
- 这个函数接受三个参数:数据框
-
打印显著性水平和变量列表:
- 函数开始时,打印出显著性水平和将要检验的变量列表。
-
嵌套循环遍历变量列表:
- 外层循环遍历列表中的每个变量
x
。 - 内层循环再次遍历变量列表中的每个变量
i
,用于与外层循环的变量x
进行配对。
- 外层循环遍历列表中的每个变量
-
跳过相同变量的配对:
- 如果内层循环中的变量
i
与外层循环中的变量x
相同,则跳过,因为同一个变量与自身不需要进行独立性检验。
- 如果内层循环中的变量
-
打印分隔符:
- 为了提高输出的可读性,在每次变量配对检验前打印分隔符。
-
构建交叉表:
- 使用
pd.crosstab
函数构建变量x
和i
的交叉表,这个表显示了两个变量之间的频数分布。
- 使用
-
进行卡方检验:
- 使用
stats.chi2_contingency
函数对交叉表进行卡方检验,这个函数返回三个值:卡方统计量、p 值和自由度。这里只关心第二个返回值,即 p 值。
- 使用
-
根据 p 值判断独立性:
- 如果卡方检验的 p 值大于显著性水平
p
,则认为两个变量独立;否则,认为两个变量相关。
- 如果卡方检验的 p 值大于显著性水平
-
打印结果:
- 根据卡方检验的结果,打印出变量
x
和i
是否独立的信息。 - 如果两个变量不独立,打印出频数交叉表和频率表。
- 根据卡方检验的结果,打印出变量
-
打印频率表:
- 使用
pd.crosstab
函数再次构建交叉表,这次使用normalize='index'
参数,得到变量x
和i
的频率分布表,而不是频数分布。
- 使用
这个函数可以用来检验数据集中的多个分类变量之间的独立性。通过卡方独立性检验,可以判断两个变量是否独立,即一个变量的分布是否受到另一个变量分布的影响。如果两个变量独立,那么它们之间没有关联;如果不独立,则它们之间存在某种关联。