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

对应分析理论推导与过渡图原理

约 42 分钟

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

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

对应分析(Correspondence Analysis)是处理定性变量关联关系的核心多元统计方法,它将R型(变量)与Q型(样品)因子分析统一在同一框架下,可在同一坐标系中同时展示行、列类别的结构关联。本节将推导从原始列联表到过渡矩阵Z的变换过程,基于奇异值分解实现两类因子分析的统一,并通过Python完成全流程实现。

💡 核心导读

  • 核心思想:通过加权变换构建过渡矩阵Z,实现R型与Q型因子分析的统一。
  • 关键变换:掌握从列联表到频率矩阵、再到过渡矩阵Z的推导,理解χ²距离的引入动机。
  • 数学统一:理解ZTZZ^TZZZTZZ^T具有相同非零特征值,两类因子分析的特征向量可线性转换。
  • 实践应用:能用Python SVD实现对应分析,计算行/列主坐标并解读双标图。
  • 前提检验:掌握分析前的行列变量独立性卡方检验方法。

一、从列联表到过渡矩阵Z的构建

对应分析用于探究两个定性变量(因素A、B)各水平的关联结构,设原始列联表(频数矩阵)为: K=(kij)r×cK = (k_{ij})_{r \times c} 其中kijk_{ij}为因素A第i水平、因素B第j水平的频数。

1.1 频率矩阵与χ²距离

首先将频数矩阵转换为频率矩阵,消除样本量影响: F=(fij)r×c,fij=kijk..,k..=i=1rj=1ckijF = (f_{ij})_{r \times c}, \quad f_{ij} = \frac{k_{ij}}{k_{..}}, \quad k_{..} = \sum_{i=1}^r \sum_{j=1}^c k_{ij} 定义行边缘概率r=(r1,,rr)T\mathbf{r} = (r_1, \dots, r_r)^T、列边缘概率c=(c1,,cc)T\mathbf{c} = (c_1, \dots, c_c)^Tri=jfij=ki.k..,cj=ifij=k.jk..r_i = \sum_j f_{ij} = \frac{k_{i.}}{k_{..}}, \quad c_j = \sum_i f_{ij} = \frac{k_{.j}}{k_{..}} 行轮廓(第i行的条件分布)为: firow=(fi1ri,,ficri)TRc\mathbf{f}_{i}^{row} = \left( \frac{f_{i1}}{r_i}, \dots, \frac{f_{ic}}{r_i} \right)^T \in \mathbb{R}^c 为比较行轮廓的相似性,引入χ²距离(加权欧氏距离),消除列边际概率的影响: Dχ2(i,i)=j=1c1cj(fijrifijri)2D_\chi^2(i, i') = \sum_{j=1}^c \frac{1}{c_j} \left( \frac{f_{ij}}{r_i} - \frac{f_{i'j}}{r_{i'}} \right)^2

1.2 过渡矩阵Z的定义

为将χ²距离转化为普通欧氏距离的形式,定义变换元素: zij=fijricjricjz_{ij} = \frac{f_{ij} - r_i c_j}{\sqrt{r_i c_j}} 排列为过渡矩阵Z=(zij)r×cZ = (z_{ij})_{r \times c},其矩阵形式为: Z=Dr1/2(FrcT)Dc1/2Z = D_r^{-1/2} (F - \mathbf{r}\mathbf{c}^T) D_c^{-1/2} 其中Dr=diag(r1,,rr)D_r = \text{diag}(r_1, \dots, r_r)Dc=diag(c1,,cc)D_c = \text{diag}(c_1, \dots, c_c)

注意:行轮廓的χ²距离等于Dr1/2ZD_r^{-1/2}Z的行向量欧氏距离,即Dχ2(i,i)=j(zijrizijri)2D_\chi^2(i,i') = \sum_j \left( \frac{z_{ij}}{\sqrt{r_i}} - \frac{z_{i'j}}{\sqrt{r_{i'}}} \right)^2,Z是后续统一两类因子分析的核心。

二、R型与Q型因子分析的统一

2.1 协方差矩阵的对等性

基于过渡矩阵Z,可构造两类协方差矩阵:

  1. 列协方差矩阵(R型)Σc=ZTZRc×c\Sigma_c = Z^T Z \in \mathbb{R}^{c \times c},描述列变量(因素B水平)的协方差结构。
  2. 行协方差矩阵(Q型)Σr=ZZTRr×r\Sigma_r = Z Z^T \in \mathbb{R}^{r \times r},描述行样品(因素A水平)的协方差结构。

关键定理Σc\Sigma_cΣr\Sigma_r具有完全相同的非零特征值λ1λ2λm>0\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_m > 0,其中mmin(r1,c1)m \le \min(r-1, c-1)

2.2 特征向量的转换关系

vjRc\mathbf{v}_j \in \mathbb{R}^cΣc\Sigma_c对应λj\lambda_j的单位特征向量,即: Σcvj=ZTZvj=λjvj\Sigma_c \mathbf{v}_j = Z^T Z \mathbf{v}_j = \lambda_j \mathbf{v}_j 用Z左乘两边得: ZZT(Zvj)=λj(Zvj)Z Z^T (Z \mathbf{v}_j) = \lambda_j (Z \mathbf{v}_j) 说明ZvjZ \mathbf{v}_jΣr\Sigma_r对应同一λj\lambda_j的特征向量,因此只需对一个矩阵做特征分解,即可通过线性变换得到另一矩阵的特征向量。

2.3 主坐标与双标图

对Z做奇异值分解(SVD): Z=USVTZ = U S V^T 其中URr×mU \in \mathbb{R}^{r \times m}为左奇异向量矩阵(Σr\Sigma_r的单位特征向量),VRc×mV \in \mathbb{R}^{c \times m}为右奇异向量矩阵(Σc\Sigma_c的单位特征向量);S=diag(σ1,,σm)S = \text{diag}(\sigma_1, \dots, \sigma_m)为奇异值对角矩阵,Λ=S2=diag(λ1,,λm)\Lambda = S^2 = \text{diag}(\lambda_1, \dots, \lambda_m)为主惯量对角矩阵(λj=σj2\lambda_j = \sigma_j^2,即Σc\Sigma_cΣr\Sigma_r的非零特征值)。

为使坐标间欧氏距离等于原始χ²距离,计算主坐标

  • 行主坐标(因素A):F=Dr1/2USRr×mF = D_r^{-1/2} U S \in \mathbb{R}^{r \times m}
  • 列主坐标(因素B):G=Dc1/2VSRc×mG = D_c^{-1/2} V S \in \mathbb{R}^{c \times m}

将前两维主坐标绘制在同一平面,即双标图。需注意:行点与列点分属不同空间的投影,二者之间的欧氏距离并无直接解读意义;正确做法是观察各点与原点连线的方向——同一方向且远离原点的行点与列点表示正关联,方向相反则表示负关联。

2.4 惯量与贡献率

特征值λj\lambda_j在对应分析中称为主惯量,其总和称为总惯量Total Inertia=j=1mλj=tr(Σc)=tr(Σr)\text{Total Inertia} = \sum_{j=1}^m \lambda_j = \text{tr}(\Sigma_c) = \text{tr}(\Sigma_r) 总惯量与卡方统计量满足χ2=k..Total Inertia\chi^2 = k_{..} \cdot \text{Total Inertia},衡量数据偏离独立性的总体程度。第j维贡献率为λj/λj\lambda_j / \sum \lambda_j,通常选取前两维(累计贡献率≥80%)进行可视化分析。

三、Python实战:对应分析全流程

import numpy as np
from scipy.stats import chi2_contingency

# 1. 构造示例列联表(3行4列)
K = np.array([
    [50.0, 30.0, 20.0, 10.0],
    [20.0, 60.0, 40.0, 30.0],
    [10.0, 20.0, 50.0, 60.0]
])
n = np.sum(K)  # 总样本量

# 2. 独立性检验(对应分析前提)
chi2, p_value, dof, expected = chi2_contingency(K)
print(f"卡方检验: χ²={chi2:.4f}, p值={p_value:.6f}")
if p_value < 0.05:
    print("结论: 两因素不独立,适合进行对应分析。")

# 3. 计算频率矩阵与边缘概率
P = K / n
r = np.sum(P, axis=1)  # 行边缘概率
c = np.sum(P, axis=0)  # 列边缘概率

# 4. 计算过渡矩阵 Z
Dr_inv_sqrt = np.diag(1.0 / np.sqrt(r))
Dc_inv_sqrt = np.diag(1.0 / np.sqrt(c))
Z = Dr_inv_sqrt @ (P - np.outer(r, c)) @ Dc_inv_sqrt

# 5. SVD分解与主坐标计算(取前两维)
U, s, Vt = np.linalg.svd(Z, full_matrices=False)
V = Vt.T
F = Dr_inv_sqrt @ U @ np.diag(s)[:, :2]  # 行主坐标
G = Dc_inv_sqrt @ V @ np.diag(s)[:, :2]  # 列主坐标

# 6. 惯量与贡献率计算
inertia = s ** 2
total_inertia = np.sum(inertia)
ratio = inertia / total_inertia
print(f"总惯量: {total_inertia:.4f}, 前两维累计贡献率: {np.sum(ratio[:2]):.4f}")
print("行主坐标(前两维):\n", np.round(F, 4))
print("列主坐标(前两维):\n", np.round(G, 4))

关键运行结果:卡方统计量≈105.4,p值远小于0.05;总惯量≈0.2635,前两维累计贡献率100%。(本例为 3×4 列联表,对应分析的最大维度为 min(3−1,4−1)=2,故前两维累计贡献率必然为 100%,并非数据恰好低维。)

📝 动手练一练

  1. 距离计算:给定2×3列联表K=(102030201020)K = \begin{pmatrix} 10 & 20 & 30 \\ 20 & 10 & 20 \end{pmatrix},计算两行轮廓的χ²距离(保留3位小数)。 参考答案:总频数k..=110k_{..}=110,行边缘概率r1=6/11,r2=5/11r_1=6/11, r_2=5/11,列边缘概率c1=3/11,c2=3/11,c3=5/11c_1=3/11, c_2=3/11, c_3=5/11。行轮廓分别为[1/6,1/3,1/2][1/6, 1/3, 1/2][2/5,1/5,2/5][2/5, 1/5, 2/5],代入χ²距离公式得平方距离Dχ20.287D_\chi^2≈0.287,距离值Dχ0.536D_\chi≈0.536

  2. 矩阵验证:用Python验证过渡矩阵Z的行和与列和近似为0(数值误差范围内)。 参考答案

    import numpy as np
    np.random.seed(42)
    K = np.random.randint(1, 50, size=(4, 5))
    P = K / K.sum()
    r, c = P.sum(axis=1), P.sum(axis=0)
    Z = np.diag(1/np.sqrt(r)) @ (P - np.outer(r, c)) @ np.diag(1/np.sqrt(c))
    print("行和最大误差:", np.max(np.abs(Z.sum(axis=1))))  # 约1e-16
    print("列和最大误差:", np.max(np.abs(Z.sum(axis=0))))  # 约1e-16

本章小结

本节系统讲解了对应分析的核心理论与实现方法:

  1. 数据变换:通过zij=(fijricj)/ricjz_{ij} = (f_{ij} - r_i c_j)/\sqrt{r_i c_j}构建过渡矩阵Z,为两类因子分析的统一奠定基础。
  2. 数学统一Σc=ZTZ\Sigma_c=Z^TZΣr=ZZT\Sigma_r=ZZ^T具有相同非零特征值,其特征向量分别对应Z的右、左奇异向量。
  3. 可视化逻辑:通过SVD分解计算行/列主坐标,前两维主坐标构成的双标图直观展示行、列类别间的关联结构。
  4. 实践要点:分析前需进行卡方独立性检验;优先从变量数较少的一侧(通常为R型)进行因子分析以简化计算。

行动清单

  • 使用Python复现过渡矩阵Z的构建与SVD分解过程。
  • 对任意二维列联表,计算其行/列主坐标并绘制双标图。
  • 解读双标图中点间距离的关联含义,完成一份对应分析报告。

— 小象教研组

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

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

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

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