《sklearn机器学习——聚类性能指标》Contingency Matrix(列联表)详解
Contingency Matrix(列联表)详解
1. 简介
Contingency Matrix,中文通常称为列联表(Contingency Table),是统计学中用于分析两个或多个分类变量之间关系的一种基本工具。它通过一个表格形式,展示不同类别变量的观测频数(或频率)在各个交叉组合下的分布情况,从而帮助研究者判断变量之间是否存在关联性或依赖关系。
1.1 基本概念
- 分类变量(Categorical Variable):取值为有限个类别的变量,如性别(男/女)、教育程度(小学/中学/大学)、产品类别(A/B/C)等。
- 交叉频数表:列联表本质上是一个交叉频数表,其行和列分别代表不同变量的类别,单元格中的数值表示同时属于某行类别和某列类别的样本数量。
- 独立性检验:列联表最常用于卡方独立性检验(Chi-Square Test of Independence),以判断两个分类变量是否相互独立。
1.2 历史背景
列联表的概念最早由英国统计学家卡尔·皮尔逊(Karl Pearson)在20世纪初提出,作为其在统计学中发展卡方检验的一部分。此后,列联表成为社会科学、医学、市场研究、机器学习等领域中分析分类数据的标准工具。
1.3 常见形式
- 2×2列联表:最简单的形式,涉及两个二分类变量。
- R×C列联表:更一般的形式,行数为R,列数为C,适用于多分类变量。
2. 数学公式与详细推导
2.1 基本结构
设我们有两个分类变量:
- 变量 XXX 有 rrr 个类别:X1,X2,…,XrX_1, X_2, \dots, X_rX1,X2,…,Xr
- 变量 YYY 有 ccc 个类别:Y1,Y2,…,YcY_1, Y_2, \dots, Y_cY1,Y2,…,Yc
则其列联表为一个 r×cr \times cr×c 的矩阵,记为 OijO_{ij}Oij,其中 OijO_{ij}Oij 表示在样本中同时属于 XiX_iXi 和 YjY_jYj 的观测频数。
Y1Y_1Y1 | Y2Y_2Y2 | …\dots… | YcY_cYc | Row Total | |
---|---|---|---|---|---|
X1X_1X1 | O11O_{11}O11 | O12O_{12}O12 | …\dots… | O1cO_{1c}O1c | R1R_1R1 |
X2X_2X2 | O21O_{21}O21 | O22O_{22}O22 | …\dots… | O2cO_{2c}O2c | R2R_2R2 |
⋮\vdots⋮ | ⋮\vdots⋮ | ⋮\vdots⋮ | ⋱\ddots⋱ | ⋮\vdots⋮ | ⋮\vdots⋮ |
XrX_rXr | Or1O_{r1}Or1 | Or2O_{r2}Or2 | …\dots… | OrcO_{rc}Orc | RrR_rRr |
Col Total | C1C_1C1 | C2C_2C2 | …\dots… | CcC_cCc | Total NNN |
其中:
- 行和:Ri=∑j=1cOijR_i = \sum_{j=1}^{c} O_{ij}Ri=∑j=1cOij
- 列和:Cj=∑i=1rOijC_j = \sum_{i=1}^{r} O_{ij}Cj=∑i=1rOij
- 总样本量:N=∑i=1r∑j=1cOij=∑Ri=∑CjN = \sum_{i=1}^{r} \sum_{j=1}^{c} O_{ij} = \sum R_i = \sum C_jN=∑i=1r∑j=1cOij=∑Ri=∑Cj
2.2 期望频数(Expected Frequency)
在变量 XXX 与 YYY 相互独立的原假设 H0H_0H0 下,每个单元格的期望频数 EijE_{ij}Eij 可通过以下公式计算:
Eij=Ri⋅CjN E_{ij} = \frac{R_i \cdot C_j}{N} Eij=NRi⋅Cj
推导过程:
若 XXX 与 YYY 独立,则联合概率 P(Xi∩Yj)=P(Xi)⋅P(Yj)P(X_i \cap Y_j) = P(X_i) \cdot P(Y_j)P(Xi∩Yj)=P(Xi)⋅P(Yj)。
样本中:
- P(Xi)≈RiNP(X_i) \approx \frac{R_i}{N}P(Xi)≈NRi
- P(Yj)≈CjNP(Y_j) \approx \frac{C_j}{N}P(Yj)≈NCj
因此,期望频数为:
Eij=N⋅P(Xi∩Yj)=N⋅RiN⋅CjN=RiCjN
E_{ij} = N \cdot P(X_i \cap Y_j) = N \cdot \frac{R_i}{N} \cdot \frac{C_j}{N} = \frac{R_i C_j}{N}
Eij=N⋅P(Xi∩Yj)=N⋅NRi⋅NCj=NRiCj
2.3 卡方统计量(Chi-Square Statistic)
用于检验变量独立性的卡方统计量定义为:
χ2=∑i=1r∑j=1c(Oij−Eij)2Eij \chi^2 = \sum_{i=1}^{r} \sum_{j=1}^{c} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} χ2=i=1∑rj=1∑cEij(Oij−Eij)2
该统计量衡量观测频数与期望频数之间的差异。若差异显著大,则拒绝独立性假设。
2.3.1 分布性质
在 H0H_0H0 成立且样本量足够大时,χ2\chi^2χ2 统计量近似服从自由度为:
df=(r−1)(c−1) df = (r - 1)(c - 1) df=(r−1)(c−1)
的卡方分布 χ2(df)\chi^2(df)χ2(df)。
2.4 独立性检验步骤
-
提出假设:
- H0H_0H0:变量 XXX 与 YYY 独立
- H1H_1H1:变量 XXX 与 YYY 不独立(存在关联)
-
构造列联表,计算 OijO_{ij}Oij、RiR_iRi、CjC_jCj、NNN
-
计算期望频数 Eij=RiCjNE_{ij} = \frac{R_i C_j}{N}Eij=NRiCj
-
计算卡方统计量:
χ2=∑(Oij−Eij)2Eij \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} χ2=∑Eij(Oij−Eij)2 -
确定自由度 df=(r−1)(c−1)df = (r-1)(c-1)df=(r−1)(c−1)
-
查卡方分布表或计算p值,与显著性水平 α\alphaα(如0.05)比较
-
决策:
- 若 p<αp < \alphap<α,拒绝 H0H_0H0,认为变量有关联
- 否则,不拒绝 H0H_0H0
2.5 连续性校正(Yates’ Correction)
对于 2×2 列联表,当样本量较小时,可使用耶茨连续性校正(Yates’ Correction for Continuity)以提高近似精度:
χYates2=∑i=12∑j=12(∣Oij−Eij∣−0.5)2Eij \chi^2_{\text{Yates}} = \sum_{i=1}^{2} \sum_{j=1}^{2} \frac{(|O_{ij} - E_{ij}| - 0.5)^2}{E_{ij}} χYates2=i=1∑2j=1∑2Eij(∣Oij−Eij∣−0.5)2
此校正使卡方值略微减小,降低I类错误风险。
2.6 Fisher 精确检验(Fisher’s Exact Test)
当期望频数过小(如 Eij<5E_{ij} < 5Eij<5 的单元格超过20%),卡方检验不再适用,应使用 Fisher 精确检验。
对于 2×2 表:
Yes | No | Total | |
---|---|---|---|
Exposed | a | b | a+b |
Not | c | d | c+d |
Total | a+c | b+d | N |
Fisher 精确检验基于超几何分布,计算在固定边际总数下,观察到当前或更极端配置的概率:
p=(a+ba)(c+dc)(Na+c)=(a+b)!(c+d)!(a+c)!(b+d)!a!b!c!d!N! p = \frac{{\binom{a+b}{a} \binom{c+d}{c}}}{{\binom{N}{a+c}}} = \frac{(a+b)!(c+d)!(a+c)!(b+d)!}{a!b!c!d!N!} p=(a+cN)(aa+b)(cc+d)=a!b!c!d!N!(a+b)!(c+d)!(a+c)!(b+d)!
然后对所有“更极端”的表求和,得到总p值。
2.7 关联性度量指标
列联表还可用于计算变量间的关联强度。
2.7.1 Phi 系数(Phi Coefficient)
仅适用于 2×2 表:
ϕ=χ2N \phi = \sqrt{\frac{\chi^2}{N}} ϕ=Nχ2
取值范围 [−1,1][-1, 1][−1,1],绝对值越大表示关联越强。
2.7.2 Cramer’s V
适用于 r×cr \times cr×c 表:
V=χ2/Nmin(r−1,c−1) V = \sqrt{ \frac{\chi^2 / N}{\min(r-1, c-1)} } V=min(r−1,c−1)χ2/N
取值范围 [0,1][0, 1][0,1],越接近1表示关联越强。
2.7.3 列联系数(Contingency Coefficient)
C=χ2χ2+N C = \sqrt{ \frac{\chi^2}{\chi^2 + N} } C=χ2+Nχ2
但最大值小于1,受表大小影响,不常用。
2.7.4 相对风险(Relative Risk, RR)与比值比(Odds Ratio, OR)
在医学研究中常用于 2×2 表:
-
相对风险:
RR=a/(a+b)c/(c+d) RR = \frac{a/(a+b)}{c/(c+d)} RR=c/(c+d)a/(a+b) -
比值比:
OR=a/bc/d=adbc OR = \frac{a/b}{c/d} = \frac{ad}{bc} OR=c/da/b=bcad
OR 更适用于病例对照研究。
3. 使用场景
列联表广泛应用于多个领域,以下为典型使用场景:
3.1 医学与流行病学
- 疾病与暴露因素的关系:如吸烟(是/否)与肺癌(是/否)的2×2表,通过卡方检验判断是否相关。
- 药物疗效评估:比较实验组与对照组的治愈率。
- 基因型与表型关联:分析特定基因突变与疾病发生的关系。
3.2 社会科学
- 教育程度与收入水平:分析不同教育背景人群的收入分布。
- 政治倾向与年龄组:研究不同年龄段对政党的支持率。
- 性别与职业选择:探讨性别是否影响职业分布。
3.3 市场营销与消费者行为
- 广告渠道与购买行为:比较不同广告投放渠道带来的转化率。
- 产品偏好与地区:分析不同地区消费者对产品的偏好差异。
- 客户满意度与服务类型:评估不同服务模式对客户满意度的影响。
3.4 质量控制与工业统计
- 生产批次与缺陷率:检查不同生产批次的产品缺陷是否存在差异。
- 操作员与错误率:分析不同操作员的操作失误频率是否一致。
3.5 机器学习与数据挖掘
- 混淆矩阵(Confusion Matrix):本质是列联表,用于评估分类模型性能(真实标签 vs 预测标签)。
- 特征选择:通过卡方检验判断分类特征与目标变量的相关性,用于特征筛选。
- 关联规则挖掘:如Apriori算法中,频繁项集的发现依赖于联合频数统计。
3.6 教育评估
- 教学方法与学生成绩:比较不同教学方法下学生的成绩分布(如优秀/良好/及格/不及格)。
- 性别与学科偏好:研究学生性别与选修课程之间的关系。
3.7 人力资源管理
- 员工流失与部门:分析不同部门的员工离职率是否存在显著差异。
- 绩效等级与培训经历:考察接受培训的员工是否绩效更高。
4. 优缺点分析
4.1 优点
4.1.1 直观易懂
列联表以表格形式呈现数据,结构清晰,便于非专业人士理解变量之间的交叉分布。
4.1.2 适用范围广
适用于任何分类变量,无论名义型(nominal)还是有序型(ordinal),均可构建列联表进行分析。
4.1.3 支持多种统计检验
- 卡方独立性检验
- Fisher 精确检验
- 似然比检验(G-test)
- Mantel-Haenszel 检验(用于分层数据)
4.1.4 可计算多种关联度量
如 Phi、Cramer’s V、RR、OR 等,不仅能判断“是否相关”,还能量化“相关程度”。
4.1.5 易于实现
几乎所有统计软件(SPSS、R、Python、SAS)都内置列联表分析功能,代码简洁,计算高效。
4.1.6 适用于小样本(配合Fisher检验)
当卡方检验不适用时,Fisher精确检验可在小样本下提供精确p值。
4.2 缺点与局限性
4.2.1 对样本量敏感
- 大样本问题:即使微弱的关联,在大样本下也可能导致卡方检验显著,造成“统计显著但实际无意义”。
- 小样本问题:期望频数过小时,卡方近似失效,需依赖Fisher检验,但后者计算复杂且仅适用于小表。
4.2.2 仅适用于分类变量
无法直接处理连续变量。若要使用,需先将连续变量离散化(分箱),但这会损失信息并引入主观性。
4.2.3 不能确定因果关系
列联表只能揭示变量间的统计关联,不能推断因果方向。例如,“吸烟与肺癌相关”不等于“吸烟导致肺癌”。
4.2.4 对稀疏表敏感
当表中存在大量零频数或低频数单元格时,卡方检验可能不可靠,需合并类别或使用精确检验。
4.2.5 多维列联表解释困难
当变量超过两个时,形成高维列联表(如3维),可视化和解释变得复杂,需借助对数线性模型等高级方法。
4.2.6 边际分布影响结果
卡方检验依赖边际总数,相同的关联模式在不同边际分布下可能得出不同结论。
4.2.7 不适用于配对数据
对于配对样本(如前后测试),应使用McNemar检验而非普通卡方检验。
5. 实际案例分析(2×2表)
5.1 问题描述
研究吸烟是否与肺癌发生有关。调查200人,结果如下:
肺癌 | 无肺癌 | 总计 | |
---|---|---|---|
吸烟 | 60 | 40 | 100 |
不吸烟 | 20 | 80 | 100 |
总计 | 80 | 120 | 200 |
5.2 卡方检验
-
期望频数:
- E11=(100×80)/200=40E_{11} = (100×80)/200 = 40E11=(100×80)/200=40
- E12=(100×120)/200=60E_{12} = (100×120)/200 = 60E12=(100×120)/200=60
- E21=(100×80)/200=40E_{21} = (100×80)/200 = 40E21=(100×80)/200=40
- E22=(100×120)/200=60E_{22} = (100×120)/200 = 60E22=(100×120)/200=60
-
卡方统计量:
χ2=(60−40)240+(40−60)260+(20−40)240+(80−60)260=10+6.67+10+6.67=33.34 \chi^2 = \frac{(60-40)^2}{40} + \frac{(40-60)^2}{60} + \frac{(20-40)^2}{40} + \frac{(80-60)^2}{60} = 10 + 6.67 + 10 + 6.67 = 33.34 χ2=40(60−40)2+60(40−60)2+40(20−40)2+60(80−60)2=10+6.67+10+6.67=33.34 -
自由度:(2−1)(2−1)=1(2-1)(2-1) = 1(2−1)(2−1)=1
-
查表:χ0.052(1)=3.84\chi^2_{0.05}(1) = 3.84χ0.052(1)=3.84,而 33.34>3.8433.34 > 3.8433.34>3.84,故 p<0.05p < 0.05p<0.05
-
结论:拒绝独立性假设,吸烟与肺癌显著相关。
5.3 关联度量
-
比值比(OR):
OR=60×8040×20=4800800=6.0 OR = \frac{60×80}{40×20} = \frac{4800}{800} = 6.0 OR=40×2060×80=8004800=6.0
即吸烟者患肺癌的几率是不吸烟者的6倍。 -
相对风险(RR):
RR=60/10020/100=3.0 RR = \frac{60/100}{20/100} = 3.0 RR=20/10060/100=3.0
吸烟者患肺癌的风险是不吸烟者的3倍。
6. 高维列联表与对数线性模型
当涉及三个或更多分类变量时,可构建多维列联表。例如,研究“吸烟”、“饮酒”与“肺癌”的关系。
此时,可使用对数线性模型(Log-linear Model)建模:
log(μijk)=λ+λiX+λjY+λkZ+λijXY+λikXZ+λjkYZ+λijkXYZ \log(\mu_{ijk}) = \lambda + \lambda^X_i + \lambda^Y_j + \lambda^Z_k + \lambda^{XY}_{ij} + \lambda^{XZ}_{ik} + \lambda^{YZ}_{jk} + \lambda^{XYZ}_{ijk} log(μijk)=λ+λiX+λjY+λkZ+λijXY+λikXZ+λjkYZ+λijkXYZ
其中 μijk\mu_{ijk}μijk 为期望频数。通过比较嵌套模型的似然比,可判断变量间是否存在交互作用。
7. 在Python中的实现
import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency, fisher_exact# 构造列联表
data = np.array([[60, 40],[20, 80]])# 卡方检验
chi2, p, dof, expected = chi2_contingency(data)
print(f"卡方值: {chi2:.2f}, p值: {p:.4f}, 自由度: {dof}")
print("期望频数:")
print(expected)# Fisher精确检验
odds_ratio, p_fisher = fisher_exact(data)
print(f"Fisher检验p值: {p_fisher:.4f}, OR: {odds_ratio:.2f}")# Cramer's V
def cramers_v(confusion_matrix):chi2 = chi2_contingency(confusion_matrix)[0]n = confusion_matrix.sum()phi2 = chi2 / nr, k = confusion_matrix.shapereturn np.sqrt(phi2 / min(r-1, k-1))print(f"Cramer's V: {cramers_v(data):.3f}")
输出结果:
卡方值: 31.69, p值: 0.0000, 自由度: 1
期望频数:
[[40. 60.][40. 60.]]
Fisher检验p值: 0.0000, OR: 6.00
Cramer's V: 0.398
8. 总结
列联表是分析分类变量关系的基础而强大的工具。它通过简单的频数统计,结合卡方检验、Fisher检验等方法,能够有效判断变量间的独立性与关联性。其优点在于直观、通用、易于实现,广泛应用于医学、社会学、市场研究等领域。
然而,也需注意其局限性:对样本量敏感、不能推断因果、不适用于连续变量等。在实际应用中,应结合效应量(如Cramer’s V、OR)而非仅依赖p值,并在必要时使用精确检验或多变量模型进行深入分析。
掌握列联表的构建、检验与解释,是数据分析人员必备的核心技能之一。