📑 查看全课大纲(第 3 / 20 节)
- 1.多元统计分析概述与多元正态分布
- 2.多元数据矩阵与向量化运算
- 3.统计数据探索与高维数据清洗
- 4.样品与变量相似性度量(距离与相似系数)
- 5.系统聚类与K均值聚类算法原理
- 6.聚类分析代码实战与谱系图绘制
- 7.距离判别法理论推导与应用
- 8.贝叶斯判别与Fisher线性判别
- 9.判别分析代码实战与误判率评估
- 10.主成分分析推导、几何意义与统计性质
- 11.主成分回归与共线性消除
- 12.主成分分析代码实战与降维可视化
- 13.因子分析正交模型与因子载荷求解
- 14.因子正交旋转(方差最大化)与因子得分计算
- 15.因子分析代码实战与行业综合评价
- 16.列联表分析与卡方独立性检验
- 17.对应分析理论推导与过渡图原理
- 18.对应分析代码实战与双标图解读
- 19.典型相关变量数学推导与显著性检验
- 20.典型相关系数阵计算与代码实战
统计数据探索与高维数据清洗
约 47 分钟
现代统计计算与数据科学基础:统计数据探索与高维数据清洗
小象实战讲义 · 多元统计分析
在掌握了多元数据矩阵与向量化运算后,我们将正式进入多元统计分析的核心实战环节。本节课程将系统性地讲授如何利用现代统计计算工具对高维数据进行探索性分析与清洗,为后续的建模与分析奠定坚实的数据基础。学完本节,你将能够独立运用Python完成多维数据的描述性统计、离群点检测、多重共线性诊断等关键预处理任务。
💡 核心导读
- 数据质量是分析的基石:理解高维数据清洗的必要性与核心挑战。
- 马氏距离与多维离群点:掌握基于马氏距离的离群点检测方法及其卡方分布理论基础。
- 协方差矩阵与条件数:学习如何通过协方差矩阵的条件数诊断多重共线性问题。
- Python实战工作流:使用
numpy、scipy等现代化库,构建从数据探索到清洗的完整Python分析流程。
从数据描述到多维探索
在单变量分析中,我们常用均值、方差、分位数等描述数据的集中趋势与离散程度。然而,当数据维度升高至维()时,变量间的相关性成为不可忽视的因素。一个维随机向量的完整描述需要其均值向量和协方差矩阵:
其中,,。协方差矩阵是对称半正定的,它刻画了所有变量两两之间的线性相关关系。
在实际分析中,我们通常基于样本估计和。给定个维观测样本,样本均值向量和样本协方差矩阵的计算公式为:
这些是后续所有多元统计分析的基础。
马氏距离与多维离群点检测
在单变量情形下,我们常用“均值±3倍标准差”的规则来识别离群点。但在多维空间中,由于变量间存在相关性,简单的欧氏距离会扭曲数据的真实分布。此时,马氏距离(Mahalanobis Distance)成为更合适的度量。
对于一个维观测点到总体均值向量的马氏距离定义为:
其样本版本为:
马氏距离的关键性质在于,它考虑了数据的协方差结构。当各变量不相关且方差均为1时(即),马氏距离退化为欧氏距离。更重要的是,若数据来自维多元正态分布,则马氏距离的平方服从自由度为的卡方分布:
需要注意,上式是总体参数 、 已知时的精确结论;实际计算中用样本均值 和样本协方差阵 代替 、 后, 并不严格服从 ,此时 临界值只是大样本近似(精确分布与 Hotelling 分布有关),小样本情形应改用 Hotelling 临界值。
这一性质为我们提供了严格的统计检验依据。我们可以设定一个显著性水平(如0.01),计算对应的卡方分布临界值。若某个样本点的马氏距离平方超过该临界值,则有的把握认为该点是离群点。
协方差矩阵的病态诊断:条件数
在进行多元统计分析(如多元回归、判别分析、主成分分析)时,一个数值稳定的协方差矩阵至关重要。如果协方差矩阵接近奇异(即行列式接近于0),则其逆矩阵的计算会极不稳定,导致马氏距离、回归系数等估计值产生巨大误差。
矩阵的条件数(Condition Number)是衡量其“病态”程度的常用指标。对于协方差矩阵,其条件数定义为最大特征值与最小特征值之比:
其中和分别是的最大和最小特征值。
- 若接近1,说明矩阵是良态的。
- 若远大于1(例如>1000),说明矩阵是病态的,可能存在严重的多重共线性或某些变量方差过小。
- 若趋于无穷大(即),则矩阵接近奇异,不可逆。
高条件数通常意味着:
- 多重共线性:某些变量近乎线性相关。
- 尺度差异巨大:不同变量的量纲或数量级差异过大。
- 样本量不足:样本数小于或接近变量数。
Python实战:数据探索与清洗全流程
下面我们通过一个完整的Python示例,演示如何对模拟的高维数据进行探索性分析,包括计算描述统计量、检测多维离群点以及诊断协方差矩阵的病态性。
"""
多元统计分析 2.2 统计数据探索与高维数据清洗
实战演示:马氏距离离群点检测与协方差矩阵病态诊断
"""
import numpy as np
from scipy.spatial.distance import mahalanobis
from scipy.stats import chi2
# 固定随机种子,确保结果可复现
np.random.seed(42)
# 1. 生成模拟数据:120个样本,3个变量,来自标准多元正态分布
n, p = 120, 3
X = np.random.multivariate_normal([0, 0, 0], np.eye(3), size=n)
# 2. 人为注入几个离群点,以检验检测方法的有效性
X[0] = [3.5, -3.5, 3.2] # 离群点1
X[1] = [-3.8, 3.6, -3.0] # 离群点2
X[2] = [4.0, 4.0, -4.0] # 离群点3
# 3. 计算样本均值向量和协方差矩阵
mean_vec = np.mean(X, axis=0)
cov_mat = np.cov(X, rowvar=False) # rowvar=False表示每列是一个变量
inv_cov = np.linalg.inv(cov_mat) # 协方差矩阵的逆,用于马氏距离计算
print("样本均值向量:", mean_vec.round(4))
print("样本协方差矩阵:\n", cov_mat.round(4))
# 4. 计算每个样本点到中心点的马氏距离平方
d2 = np.array([mahalanobis(x, mean_vec, inv_cov)**2 for x in X])
# 5. 基于卡方分布设定离群点检测阈值(显著性水平alpha=0.01)
alpha = 0.01
threshold = chi2.ppf(1 - alpha, df=p) # 自由度为变量数p
# 6. 识别离群点
outliers_idx = np.where(d2 > threshold)[0]
# 7. 计算协方差矩阵的条件数,诊断多重共线性
cond_num = np.linalg.cond(cov_mat)
# 8. 输出关键结果
print("\n" + "="*60)
print("马氏距离临界值 (alpha=0.01, df=3):", round(threshold, 4))
print("检测到的异常值样本索引:", outliers_idx.tolist())
print("前三个人工注入离群点的马氏距离平方:",
[round(float(d2[i]), 4) for i in [0, 1, 2]])
print("协方差矩阵条件数:", round(cond_num, 4))
print("是否存在强多重共线性/奇异 (条件数>1000)?", bool(cond_num > 1000))
print("="*60)运行上述代码,将得到以下输出结果:
样本均值向量: [ 0.0878 -0.1592 0.0769]
样本协方差矩阵:
[[ 0.9643 -0.1011 -0.0265]
[-0.1011 1.2347 -0.4407]
[-0.0265 -0.4407 1.431 ]]
============================================================
马氏距离临界值 (alpha=0.01, df=3): 11.3449
检测到的异常值样本索引: [0, 1, 2, 69, 87]
前三个人工注入离群点的马氏距离平方: [22.9362, 27.9047, 37.1458]
协方差矩阵条件数: 2.1836
是否存在强多重共线性/奇异 (条件数>1000)? False
============================================================结果解读:
- 离群点检测成功:我们人工注入的三个离群点(索引0,1,2)的马氏距离平方(22.94, 27.90, 37.15)均远超过临界值11.34,被正确识别。此外,算法还发现了两个自然产生的疑似离群点(索引69,87)。
- 协方差矩阵健康:条件数仅为2.18,远小于1000的警戒线,表明变量间不存在严重的多重共线性,协方差矩阵数值稳定。
- 统计检验有效:基于卡方分布的阈值设定提供了严格的统计推断依据,而非主观经验判断。
📝 动手练一练
调整离群点检测的灵敏度 修改上述代码中的显著性水平
alpha,分别尝试0.05和0.001,观察检测到的离群点数量如何变化。思考:在实际应用中,应如何选择合适的显著性水平?参考答案:
- 当
alpha=0.05时,临界值降低,检测标准更宽松,可能会识别出更多“可疑”点。 - 当
alpha=0.001时,临界值升高,检测标准更严格,只有极端偏离的点才会被标记。 - 选择依据:需权衡I类错误(误报)和II类错误(漏报)的成本。在金融风控等高风险领域,常采用较严格的
alpha(如0.001);在探索性数据分析中,可采用较宽松的alpha(如0.05)以全面了解数据特征。
- 当
模拟多重共线性场景 修改数据生成部分,创建一个具有强多重共线性的数据集。例如,让第三个变量是前两个变量的线性组合加少量噪声:
X = np.random.multivariate_normal([0, 0, 0], np.eye(3), size=n) X[:, 2] = 0.8 * X[:, 0] + 0.7 * X[:, 1] + 0.1 * np.random.randn(n)重新运行代码,观察条件数的变化,并思考此时进行马氏距离计算可能遇到的问题。
参考答案: 当变量间存在强线性关系时,协方差矩阵接近奇异,其逆矩阵的计算会变得极不稳定(条件数极大)。此时马氏距离的计算可能产生数值误差,甚至因矩阵不可逆而报错。在实际分析中,遇到这种情况应先处理多重共线性问题,如使用主成分分析降维或引入正则化。
本章小结
本节系统性地介绍了高维数据探索与清洗的核心方法,重点包括:
- 多维描述统计:理解均值向量和协方差矩阵是描述多元数据分布的基础。
- 马氏距离:掌握其定义、计算及其在多元正态假设下服从卡方分布的重要性质,学会基于此进行统计严格的离群点检测。
- 条件数诊断:学会通过协方差矩阵的条件数识别多重共线性等数据质量问题。
- Python实战能力:能够使用
numpy、scipy等库完整实现从数据生成、描述统计、离群点检测到病态诊断的全流程。
行动清单:
- 对你手头的任意一个多维数据集(至少3个变量),计算其样本均值向量和协方差矩阵。
- 实施马氏距离离群点检测,尝试不同的显著性水平,并解释检测结果。
- 计算该数据集协方差矩阵的条件数,评估是否存在多重共线性问题。
— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问