4. 统计基础:均值、方差、协方差

进入批次偏差校正之前,得先把统计基础捋一遍。说白了,均值、方差、协方差这三个东西,贯穿了我们整个校正流程。你可能觉得它们太基础了,但我在项目里见过太多人就是因为对这几个概念理解得不够透,导致校正结果一塌糊涂。

4.1 均值:数据的重心在哪

均值大家最熟悉了,就是平均值。但在批次偏差的语境下,它的意义远比“加起来除以总数”要深。均值告诉我们,每个批次的“重心”在哪里。如果A批次的平均分是75,B批次是80,那这两个批次就有5分的系统偏差。

我个人习惯在计算批次均值时,先看一眼数据分布。有一次在给银行做风控评分对接时,某个批次的打分分布严重左偏,均值被拉低了很多。如果直接拿均值去校正,反而会引入新的偏差。

加权均值,你考虑过吗?

实际工作中,每个样本的置信度可能不一样。比如新模型部署初期生成的评分,权重可以低一些。加权均值公式:

μ_weighted = Σ(w_i * x_i) / Σ(w_i)

我个人在金融评分校正中经常用这个方法,它能有效减少异常批次带来的偏差影响。

怎么算均值?用Python就是一行的事:

import numpy as np

scores_A = [72, 75, 68, 80, 74]
scores_B = [81, 79, 82, 78, 80]

mean_A = np.mean(scores_A)
mean_B = np.mean(scores_B)

print(f"A批次均值: {mean_A:.2f}")  # 输出 73.80
print(f"B批次均值: {mean_B:.2f}")  # 输出 80.00

结果很清楚,两个批次均值差了6.2分。这就是我们需要校正的“批次间偏差”。

4.2 方差与标准差:数据有多散

均值能告诉我们批次的重心,但光有重心还不够。你得知道这批数据分得有多散。方差衡量的是数据点与均值的偏离程度,标准差则是方差的平方根,跟原始数据同一个量级,更好理解。

我在项目中遇到过这样的事:两个批次均值一模一样,都是75分,但A批次的标准差是5,B批次的标准差是15。这说明B批次的评分很不稳定,有的给得太高,有的给得太低。如果只看均值校正,那B批次里的极端样本就会成为隐患。

避坑指南:方差的量级陷阱

我曾经在产品评分校正时,直接对比两个批次的方差大小,发现A批次方差是B批次的两倍。后来才发现,A批次样本量只有30,B批次有3000。小样本的方差天然更大。所以对比方差之前,一定要考虑样本量和自由度。

计算方差和标准差的代码:

var_A = np.var(scores_A, ddof=1)  # 样本方差,ddof=1
std_A = np.std(scores_A, ddof=1)

var_B = np.var(scores_B, ddof=1)
std_B = np.std(scores_B, ddof=1)

print(f"A批次: 方差={var_A:.2f}, 标准差={std_A:.2f}")
print(f"B批次: 方差={var_B:.2f}, 标准差={std_B:.2f}")

你可能注意到我用了ddof=1。这是样本方差的计算方式,除的是n-1而不是n。统计学里这个叫无偏估计,具体原理以后再说,你记住现在用ddof=1就对了。

4.3 协方差与相关性:变量之间的“默契”

到了协方差这里,事情开始有趣了。均值看单个变量的集中趋势,方差看单个变量的离散程度,而协方差看的是两个变量之间的“同步性”。

举个例子。假设我们有两个评分维度:逻辑能力分和表达通顺分。如果一个人在逻辑能力上得分高,表达通顺分也高,那这两者就是正相关,协方差为正。如果一个维度得分高时另一个维度得分低,协方差就是负的。

在批次偏差校正中,协方差非常关键。你想想看,单一的均值校正可能只修正了批次的整体偏移,但不同维度之间的联合偏移却可能被忽略。

协方差的直觉理解

协方差 = E[(X - μ_x)(Y - μ_y)]

说白了,就是把每个点相对于均值的偏离乘在一起,再平均。如果两个维度同时正向偏离或同时负向偏离,乘积为正,协方差为正。如果一个正一个负,乘积为负,协方差为负。

协方差计算也很简单:

logic_scores = [70, 85, 60, 90, 75]
express_scores = [68, 82, 65, 88, 78]

cov_matrix = np.cov(logic_scores, express_scores)
cov_val = cov_matrix[0, 1]

print(f"逻辑能力与表达通顺的协方差: {cov_val:.2f}")

但协方差有个缺点:它的数值受量纲影响很大。逻辑能力分如果是0-100,协方差可能很大;如果逻辑能力分被归一化到0-1,协方差就很小。所以我们更常用的是相关系数,就是把协方差标准化一下:

corr_matrix = np.corrcoef(logic_scores, express_scores)
corr_val = corr_matrix[0, 1]

print(f"皮尔逊相关系数: {corr_val:.3f}")

相关系数的取值在-1到1之间,绝对值越接近1,说明线性关系越强。在实际项目中,我一般设个阈值:|r| > 0.7就算强相关,需要重点关注。

注意:协方差≠因果关系

这是老生常谈了,但还是得强调。两个维度协方差很大,不代表其中一个导致了另一个。我曾经在客户投诉处理数据里看到“响应速度”和“满意度”协方差极高,但后来发现是因为响应快的客户本身问题更简单。相关性不是因果,这点在批次校正时也适用。

4.4 三者关系:一张图说清楚

均值、方差、协方差,它们不是孤立的。尤其在批次偏差校正场景下,它们组成了一个完整的统计画像:均值告诉你每个批次的位置,方差告诉你批次内部的波动,协方差告诉你多个维度之间的“默契程度”。

下面这张图概括了它们的关系。我个人经常用它来跟团队对齐思路,效果还不错:

批次偏差统计基础:均值·方差·协方差 均值 批次的重心位置 方差 · 标准差 批次的离散程度 协方差 维度间的同步性 核心位置偏移 → 系统偏差 波动大小 → 置信度评估 联合偏移 → 多变量校正 批次偏差校正中的实际应用 📍 均值差: 计算参考批次与目标批次的均值差值,作为偏移量校正基准 📍 方差比: 比较方差是否一致,判断校正后是否引入新的波动 📍 相关系数: 检查校正前后各维度的相关结构是否被破坏 三个统计量构成批次偏差校正的完整基础

4.5 实战中的常见问题

道理都懂,但真到了项目里,你会发现很多坑。我整理了几个真实案例里踩过的坑:

常见问题 错误做法 正确做法
忽略异常值 直接计算均值和方差,被离群点带偏 先做异常值检测,或使用截尾均值
样本量差异大 直接对比方差,小样本方差天然偏大 使用F检验判断方差齐性
只看单变量 只校正确,忽略维度间的协方差结构 多变量联合校正,保持协方差结构
混淆总体与样本 用总体标准差公式计算样本数据 样本数据用ddof=1(n-1)

避坑指南汇总:

  • 计算均值前,先可视化数据分布。我自己就用画个箱线图,一眼能看出异常点。
  • 对比方差时,别忘了做方差齐性检验。Levene检验是个好选择。
  • 做多维度校正时,一定把协方差矩阵算出来看看。有时候相关系数从0.8变成了0.3,那就是有问题的信号。

一个小习惯

拿到批次数据后,我习惯先算一个“三件套”:均值向量、方差向量、协方差矩阵。把它们打印出来贴在工作文档里。这样后续校正前后一对比,哪里变了、变多少,一目了然。