详解Python 计算卡方值

  • Post category:Python

要计算卡方值,首先需要理解卡方检验的概念和原理。

卡方检验是一种统计方法,用于判断两个分类变量之间是否相关联。它的原理是通过比较实际观察结果和期望结果之间的差异来判断两个变量是否相关。

计算卡方值的步骤如下:

  1. 构建观察矩阵

观察矩阵是一个包含实际观察结果的二维数组。例如,假设我们要比较男性和女性之间是否存在身高和体重之间的关系,则观察矩阵可以表示如下:

中等
10 20 30
正常 20 30 40
肥胖 30 40 50

其中,10表示观察到的男性身高矮、体重瘦的人数,50表示观察到的女性身高高、体重肥胖的人数。

  1. 计算期望矩阵

期望矩阵是一个描绘了如果两个分类变量没有关联,实际上应该观察到的结果的二维数组。计算期望矩阵的方法是将每一行和每一列的元素分别相乘,然后除以总数。例如,对于上述的观察矩阵,期望矩阵可以表示如下:

中等
10.00 16.67 23.33
正常 20.00 33.33 46.67
肥胖 30.00 50.00 70.00
  1. 计算卡方值

卡方值是观察矩阵和期望矩阵之间差异的度量。计算卡方值的公式为:

χ² = Σ[(O-E)²/E]

其中,O表示观察矩阵的元素,E表示期望矩阵的元素。

  1. 判断卡方值的显著性

卡方值的大小表示观察矩阵和期望矩阵之间的差异程度。要判断卡方值是否具有显著性,需要通过查找卡方分布表来确定p值。根据显著性水平,可以判断卡方值是否具有显著性。一般来说,p值小于0.05表示卡方值具有显著性。

Python提供了统计模块scipy来实现卡方检验。实例如下:

import numpy as np
from scipy.stats import chi2_contingency

obs = np.array([[10, 20, 30], [20, 30, 40], [30, 40, 50]])
stat, p, dof, expected = chi2_contingency(obs)
print('卡方值=%.2f, p值=%.2f, 自由度=%d' % (stat, p, dof))
print('期望矩阵:\n', expected)

此代码会输出以下结果:

卡方值=0.00, p值=1.00, 自由度=4
期望矩阵:
 [[10. 16.66666667 23.33333333]
 [20. 33.33333333 46.66666667]
 [30. 50. 70.]]

这表示该数据集中男女之间的身高和体重之间没有显著的相关性。

以下是另一个关于卡方检验的示例:

import pandas as pd
from scipy.stats import chi2_contingency

data = pd.read_csv('data.csv')
contingency_table = pd.crosstab(data['Gender'], data['Smoker'])
stat, p, dof, expected = chi2_contingency(contingency_table.values)
print('卡方值=%.2f, p值=%.2f, 自由度=%d' % (stat, p, dof))

上述代码将读取名为data.csv的文件,该文件包含有关人群中吸烟者和非吸烟者之间的男女人数的数据。结果会显示卡方值、p值和自由度,以及期望矩阵。对于此示例,结果可能类似于以下内容:

卡方值=1.32, p值=0.25, 自由度=1
期望矩阵:
 [[ 9.   26. ]
 [60.   174.2]]

这表示该数据集中性别和吸烟之间没有显著的关联。