📑 查看全课大纲(第 16 / 20 节)

列联表分析与卡方独立性检验

约 48 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 多元统计分析

对应分析(Correspondence Analysis,亦称相应分析)是处理两个或多个定性变量(分类变量)间关系的强大可视化工具。它通过将列联表中的行与列类别映射到同一低维空间中,直观揭示变量水平间的“对应”关系。本节作为对应分析的理论基础,首先系统介绍列联表的数学结构与核心概念,并深入讲解用于检验两变量是否独立的卡方独立性检验。掌握这些内容,你将能够判断何时需要进行对应分析,并为后续的对应分析算法理解奠定坚实的统计基础。

💡 核心导读

  • 列联表是什么:将两个分类变量的观测频数整理成的交叉表格,是分析定性变量关系的标准数据结构。
  • 频率矩阵与轮廓分布:将原始频数转换为概率(频率)矩阵,进而计算行轮廓与列轮廓,这是理解对应分析中“距离”概念的关键。
  • 卡方独立性检验:检验列联表中两变量是否独立的统计方法。其核心统计量 χ2\chi^2 与对应分析中的“总惯量”(Total Inertia)直接相关。
  • 检验的意义:如果检验拒绝独立性假设,说明变量间存在关联,才有必要进行对应分析以探索具体的关联模式。

列联表:结构与基本概念

在实际研究中,我们常遇到两个分类变量(因素)的数据。例如,调查吸烟习惯(A因素:吸烟/不吸烟)与肺癌患病情况(B因素:患病/未患病)。将n个样本在这两个因素上的观测结果进行交叉计数,就得到了一个列联表(Contingency Table)。

二维列联表的数学表示

设因素A有 rr 个水平(A1,A2,,ArA_1, A_2, \dots, A_r),因素B有 cc 个水平(B1,B2,,BcB_1, B_2, \dots, B_c)。对 nn 个样本进行观测,得到频数矩阵 K=(kij)r×c\mathbf{K} = (k_{ij})_{r \times c},其中 kijk_{ij} 表示因素A取第 ii 个水平且因素B取第 jj 个水平的样本数。

K=(k11k12k1ck21k22k2ckr1kr2krc)\mathbf{K} = \begin{pmatrix} k_{11} & k_{12} & \cdots & k_{1c} \\ k_{21} & k_{22} & \cdots & k_{2c} \\ \vdots & \vdots & \ddots & \vdots \\ k_{r1} & k_{r2} & \cdots & k_{rc} \end{pmatrix}

定义边际和(Marginal Sums):

  • 行和:ki=j=1ckijk_{i\cdot} = \sum_{j=1}^{c} k_{ij},表示因素A取第 ii 个水平的总样本数。
  • 列和:kj=i=1rkijk_{\cdot j} = \sum_{i=1}^{r} k_{ij},表示因素B取第 jj 个水平的总样本数。
  • 总样本数:k=i=1rj=1ckij=nk_{\cdot\cdot} = \sum_{i=1}^{r}\sum_{j=1}^{c} k_{ij} = n

频率矩阵与概率分布

将频数矩阵转换为概率(频率)矩阵 F=(fij)r×c\mathbf{F} = (f_{ij})_{r \times c},其中 fij=kij/kf_{ij} = k_{ij} / k_{\cdot\cdot}。显然,i=1rj=1cfij=1\sum_{i=1}^{r}\sum_{j=1}^{c} f_{ij} = 1

从数理统计视角,F\mathbf{F} 可视为二维随机变量 (ξ,η)(\xi, \eta) 的经验联合分布,其中 ξ\xiη\eta 分别代表因素A和因素B。

  • 行边际分布:fr=(f1,f2,,fr)\mathbf{f}_r = (f_{1\cdot}, f_{2\cdot}, \dots, f_{r\cdot})^\top,其中 fi=jfijf_{i\cdot} = \sum_{j} f_{ij}
  • 列边际分布:fc=(f1,f2,,fc)\mathbf{f}_c = (f_{\cdot 1}, f_{\cdot 2}, \dots, f_{\cdot c})^\top,其中 fj=ifijf_{\cdot j} = \sum_{i} f_{ij}

定义边际对角矩阵: Dr=diag(f1,f2,,fr),Dc=diag(f1,f2,,fc)\mathbf{D}_r = \text{diag}(f_{1\cdot}, f_{2\cdot}, \dots, f_{r\cdot}), \quad \mathbf{D}_c = \text{diag}(f_{\cdot 1}, f_{\cdot 2}, \dots, f_{\cdot c}) 它们在后文定义的加权距离中起到权重矩阵的作用。

轮廓分布(Profile Distribution)

轮廓分布是理解对应分析中“点”与“距离”的核心。

行轮廓:在已知因素A取第 ii 个水平的条件下,因素B各水平的条件概率分布。 fi(r)=(fi1fi,fi2fi,,ficfi)Rc\mathbf{f}_i^{(r)} = \left( \frac{f_{i1}}{f_{i\cdot}}, \frac{f_{i2}}{f_{i\cdot}}, \dots, \frac{f_{ic}}{f_{i\cdot}} \right)^\top \in \mathbb{R}^c 所有行轮廓构成行轮廓矩阵 Dr1F\mathbf{D}_r^{-1}\mathbf{F}

列轮廓:在已知因素B取第 jj 个水平的条件下,因素A各水平的条件概率分布。 fj(c)=(f1jfj,f2jfj,,frjfj)Rr\mathbf{f}_j^{(c)} = \left( \frac{f_{1j}}{f_{\cdot j}}, \frac{f_{2j}}{f_{\cdot j}}, \dots, \frac{f_{rj}}{f_{\cdot j}} \right)^\top \in \mathbb{R}^r 所有列轮廓构成列轮廓矩阵 Dc1F\mathbf{D}_c^{-1}\mathbf{F}^\top

卡方独立性检验

在进行对应分析之前,一个首要问题是:因素A和因素B之间是否存在统计上的关联?如果两者独立,则没有必要进行后续的对应分析。卡方独立性检验(Chi-squared Test of Independence)正是用来回答这个问题。

假设与检验统计量

  • 原假设 H0H_0:因素A与因素B相互独立。
  • 备择假设 H1H_1:因素A与因素B不独立。

在原假设 H0H_0 下,根据独立性的定义,单元格 (i,j)(i, j) 的期望频数为: Eij=kikjkE_{ij} = \frac{k_{i\cdot} \cdot k_{\cdot j}}{k_{\cdot\cdot}}

Pearson 卡方统计量通过比较观测频数与期望频数的差异来构建: χ2=i=1rj=1c(kijEij)2Eij\chi^2 = \sum_{i=1}^{r} \sum_{j=1}^{c} \frac{(k_{ij} - E_{ij})^2}{E_{ij}}

当样本量足够大且 H0H_0 成立时,χ2\chi^2 统计量近似服从自由度为 (r1)(c1)(r-1)(c-1) 的卡方分布。拒绝域为 χ2>χ1α2((r1)(c1))\chi^2 > \chi^2_{1-\alpha}((r-1)(c-1)),其中 α\alpha 为显著性水平。

总惯量:关联强度的度量

在对应分析中,一个核心概念是总惯量(Total Inertia),它度量了列联表中行轮廓与列轮廓相对于其平均轮廓的离散程度,即变量间的总关联强度。其计算公式为: Total Inertia=χ2k\text{Total Inertia} = \frac{\chi^2}{k_{\cdot\cdot}}

总惯量是 χ2\chi^2 统计量的标准化版本,消除了样本量的影响,其值越大,表明两变量间的关联越强。在后续的对应分析中,总惯量将被分解为各维度(主坐标轴)所解释的部分。

Python 实战:列联表分析与卡方检验

下面我们使用 Python 的 scipy.stats 库对一个示例列联表进行卡方独立性检验,并计算总惯量。这段代码完全复现了验证脚本的逻辑。

import numpy as np
from scipy.stats import chi2_contingency

# 定义一个 3行 x 4列的示例列联表
contingency_table = np.array([
    [50, 30, 20, 10],  # 因素A水平1
    [20, 60, 40, 30],  # 因素A水平2
    [10, 20, 50, 60]   # 因素A水平3
])

# 执行卡方独立性检验
chi2_stat, p_val, dof, expected = chi2_contingency(contingency_table)

# 计算总样本数和总惯量 (Total Inertia)
n_total = np.sum(contingency_table)
total_inertia = chi2_stat / n_total

# 输出结果
print("列联表总频数 N:", int(n_total))
print("Pearson 卡方统计量:", round(chi2_stat, 4))
print("显著性检验 p 值:", round(float(p_val), 6))
print("自由度 dof:", dof)
print("总惯量 (Total Inertia):", round(total_inertia, 6))
print("行列表项是否存在极显著关联 (拒绝独立):", bool(p_val < 0.001))

运行上述代码,你将得到与验证脚本完全一致的输出:

列联表总频数 N: 400
Pearson 卡方统计量: 105.3951
显著性检验 p 值: 0.0
自由度 dof: 6
总惯量 (Total Inertia): 0.263488
行列表项是否存在极显著关联 (拒绝独立): True

结果解读

  • 卡方统计量高达 105.40,对应的 p 值远小于 0.001,因此我们强烈拒绝原假设,认为因素A与因素B不独立,存在显著的统计关联。
  • 总惯量为 0.2635,这是一个相对较大的值,表明两变量间的关联强度不容忽视。
  • 由于关联性显著,我们有必要进行下一步的对应分析,以可视化并深入探索这种关联的具体模式(例如,哪些行水平与哪些列水平更“亲近”)。

📝 动手练一练

  1. 概念理解:对于一个 3×43 \times 4 的列联表,其卡方独立性检验的自由度是多少?如果计算出的总惯量为 0.15,这意味着什么?
  2. 计算练习:给定以下简化列联表,手动计算其 Pearson 卡方统计量、自由度和总惯量。
    B1B2合计
    A1102030
    A2201030
    合计303060

参考答案:

  1. 自由度 = (31)×(41)=6(3-1)\times(4-1) = 6。总惯量 0.15 表示行列变量之间存在一定程度的关联,其强度为 0.15(需结合具体领域判断)。
  2. 期望频数矩阵为 (15151515)\begin{pmatrix}15 & 15 \\ 15 & 15\end{pmatrix}χ2=(1015)215+(2015)215+(2015)215+(1015)215=2515×46.667\chi^2 = \frac{(10-15)^2}{15} + \frac{(20-15)^2}{15} + \frac{(20-15)^2}{15} + \frac{(10-15)^2}{15} = \frac{25}{15}\times 4 \approx 6.667。自由度 = (21)×(21)=1(2-1)\times(2-1)=1。总惯量 = 6.667/600.1116.667 / 60 \approx 0.111

2×2 列联表的补充说明:上面的练习直接使用了未修正的 Pearson 卡方统计量。对 2×2 表还需注意两种特殊情形:①当总样本量 n40n \ge 40 但存在期望频数 1E<51 \le E < 5 时,应使用 Yates 连续性修正χ2=(OE0.5)2E\chi^2 = \sum \dfrac{(|O-E|-0.5)^2}{E};②当 n<40n < 40,或存在期望频数 E<1E < 1 时,卡方近似不再成立,应改用 Fisher 精确检验(Python 中为 scipy.stats.fisher_exact)。本题各单元格期望频数均为 15(5\ge 5),未修正的 χ26.667\chi^2 \approx 6.667 结果本身正确。

本章小结

本节奠定了对应分析的两大基石:列联表的数据结构与卡方独立性检验的统计逻辑。

  • 列联表是分析两个分类变量关系的标准数据形式,通过频率矩阵和轮廓分布,我们能够从概率视角理解数据的结构。
  • 卡方独立性检验是判断是否需要进行对应分析的“守门人”。其核心统计量 χ2\chi^2 与对应分析中的总惯量直接相关,后者量化了变量间的总关联强度。
  • 检验结果若拒绝独立性,则意味着数据中存在值得探索的关联模式,对应分析将成为揭示这些模式的强大可视化工具。

行动清单

  1. 数据准备:面对两个分类变量时,尝试将其整理成列联表形式。
  2. 预检验:在运行任何对应分析软件或代码前,先对列联表执行卡方独立性检验。若 p 值不显著(如 > 0.05),则需谨慎解释后续分析结果。
  3. 解读总惯量:在得到检验结果后,计算并关注总惯量的值,对其所代表的关联强度有一个初步判断。

— 小象教研组

配套学习资源与课件
  • 第7章课件:对应分析(相应分析)
    下载
  • 多元统计分析参考讲义与常用函数(多元分析与主成分常用函数速查)
    下载
  • 课程配套数据集(全课程实战数据包)
    下载
  • 课程全套源代码(课程相关代码汇总)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问