1. 从一个反直觉的赌局说起:为什么"平均值"经常骗人
先抛一个我亲身经历过的场景。几年前帮一个做小生意的朋友看账,他每个月流水波动特别大,好的时候能到八万,差的时候只有一万出头。他自己算了个"平均月流水",大概四万五,然后拿这个数去规划开支,结果连续三个月现金流紧张。问题出在哪?他算的"平均"没错,但他忽略了一个关键信息——这个平均值到底稳不稳。四万五这个数字,可能是每个月都稳定在四万五,也可能是像他这样在八万和一万之间来回跳。这两种情况,平均值一模一样,但风险天差地别。
这就是单变量统计量里最核心的一对概念:期望和方差。期望告诉你"中心在哪",方差告诉你"离中心有多远、有多散"。只盯着期望做决策,就像只看一个人的平均身高去判断他能不能打篮球——信息量远远不够。
这篇内容我想把这两个统计量彻底讲透。不是教科书式的定义罗列,而是从"为什么需要它们""它们各自在算什么""怎么手算、怎么用代码算""什么情况下会踩坑"这几个角度,把期望和方差这两个单变量统计量拆开揉碎。适合刚学概率统计的学生、需要做数据分析的从业者,以及任何想搞明白"平均值到底靠不靠谱"的人。读完你应该能做到:拿到一组数据,不仅算出它的期望和方差,还能说清楚这两个数字背后的含义和局限。
2. 期望:不只是"平均数",而是"长期反复试验的稳定值"
2.1 期望的两种面孔:离散型与连续型
很多人第一次接触期望,老师会说"期望就是加权平均"。这话对,但不够。期望的本质是:如果你把同一个随机试验重复无数次,所有结果的平均值会趋近于一个固定值,这个值就是期望。注意这里的关键词是"重复无数次"和"趋近"。期望不是某一次试验的结果,而是一个理论上的长期稳定值。
对于离散型随机变量,期望的计算公式是每个可能取值乘以它对应的概率,然后全部加起来:
$$E(X) = \sum_{i} x_i \cdot P(X = x_i)$$
举个具体的例子。掷一个均匀的六面骰子,每个面出现的概率都是 1/6,那么期望是:
$$E(X) = 1 \times \frac{1}{6} + 2 \times \frac{1}{6} + 3 \times \frac{1}{6} + 4 \times \frac{1}{6} + 5 \times \frac{1}{6} + 6 \times \frac{1}{6} = 3.5$$
注意,3.5 这个数永远不会出现在骰子上,但它是长期掷骰子的平均结果。这就是期望"反直觉"的地方——它可以是实际不可能取到的值。
对于连续型随机变量,求和变成积分,概率变成概率密度函数:
$$E(X) = \int_{-\infty}^{+\infty} x \cdot f(x) , dx$$
这里 f(x) 是概率密度函数。连续型的期望理解起来更抽象,但核心思想一样:把取值按密度"加权"后积分。
2.2 期望的线性性质:一个极其好用的工具
期望有一个性质,用起来非常爽,叫做线性性质:
$$E(aX + bY + c) = aE(X) + bE(Y) + c$$
其中 a、b、c 是常数,X、Y 是随机变量。这个性质最厉害的地方在于:它不要求 X 和 Y 相互独立。不管 X 和 Y 是什么关系,这个等式都成立。
为什么这个性质重要?因为它让你可以把复杂的问题拆成简单的部分。比如你要算"掷两个骰子点数之和的期望",不用去列 36 种情况的概率分布,直接算 E(X+Y) = E(X) + E(Y) = 3.5 + 3.5 = 7。一步到位。
我在实际做数据分析时经常用这个性质。比如一个电商平台要估算"用户下单总金额的期望",可以拆成"下单件数的期望"乘以"单件价格的期望"(如果两者独立的话),或者更复杂地拆成多个部分分别估算再相加。这种拆解思路能大幅简化计算。
2.3 期望的陷阱:它可能根本不存在
这是很多人不知道的一个坑:不是所有随机变量都有期望。最经典的例子是柯西分布,它的概率密度函数是:
$$f(x) = \frac{1}{\pi(1+x^2)}$$
这个分布看起来关于 0 对称,直觉上期望应该是 0。但如果你真的去算积分:
$$\int_{-\infty}^{+\infty} \frac{x}{\pi(1+x^2)} , dx$$
你会发现这个积分不收敛——正无穷和负无穷两边的"拉扯"永远达不到一个平衡值。所以柯西分布的期望不存在。
这个例子告诉我们:期望的存在性不是理所当然的,需要满足一定的数学条件(比如绝对可积)。在实际数据中,如果数据里有极端离群值,样本均值也会被严重拉偏,这时候用中位数可能比用均值更靠谱。这也是为什么收入数据通常报"中位数收入"而不是"平均收入"——少数极高收入者会把平均值拉得虚高。
3. 方差:衡量"散不散"的标尺,以及它为什么用平方
3.1 方差的定义与计算逻辑
知道了期望,我们知道了数据的"中心"。但光有中心不够,还得知道数据围绕中心散得有多开。方差就是干这个的:
$$Var(X) = E\left[(X - E(X))^2\right]$$
翻译成人话:先算出每个值和期望的差(叫"离差"),把离差平方,然后求这个平方值的期望。方差越大,说明数据越分散;方差越小,说明数据越集中。
为什么用平方而不是直接取绝对值?这是个好问题。用绝对值当然也能衡量离散程度(那个叫"平均绝对偏差"),但平方有几个数学上的好处:
- 平方函数处处可导,方便做优化和推导
- 平方后得到的方差有很好的代数性质,比如 Var(X+Y) = Var(X) + Var(Y) + 2Cov(X,Y)
- 平方放大了大离差的影响,使得方差对极端值更敏感
但平方也有代价:方差的单位是原始单位的平方。比如你测的是"米",方差单位就是"平方米",这在实际解释时不太直观。所以通常还会开个根号,得到标准差:
$$\sigma = \sqrt{Var(X)}$$
标准差和原始数据同单位,解释起来更自然。
3.2 一个简化公式:让手算快十倍
方差有个等价的计算公式,实际算的时候比定义式好用得多:
$$Var(X) = E(X^2) - [E(X)]^2$$
"平方的期望减去期望的平方"。这个公式为什么好用?因为定义式需要你先算期望,再算每个离差,再平方,再求期望,步骤多。而这个公式只需要算两个期望:E(X²) 和 E(X),然后一减就完事。
用骰子验证一下。E(X) = 3.5。E(X²) = (1+4+9+16+25+36)/6 = 91/6 ≈ 15.167。所以 Var(X) = 15.167 - 12.25 = 2.917。标准差约等于 1.708。
注意:这个简化公式虽然好用,但在数值计算时有个坑。当 E(X²) 和 [E(X)]² 都很大且很接近时,直接相减会导致"灾难性抵消",精度损失严重。实际编程时如果数据量级很大,建议用定义式或者先做中心化处理。
3.3 方差的性质:哪些操作会改变它
方差有几个常用性质,理解了能帮你快速判断问题:
| 操作 | 对期望的影响 | 对方差的影响 |
|---|---|---|
| 所有数据加常数 c | 期望加 c | 方差不变 |
| 所有数据乘常数 a | 期望乘 a | 方差乘 a² |
| 两个独立变量相加 | 期望相加 | 方差相加 |
| 两个变量相减 | 期望相减 | 方差相加(不是相减!) |
最后一条特别容易搞错。X - Y 的方差是 Var(X) + Var(Y),不是 Var(X) - Var(Y)。因为减法引入的负号在平方之后消失了。这个性质在做误差分析时非常重要——两个独立测量值相减,误差不是变小而是变大了。
4. 手算一遍:从原始数据到期望和方差
光看公式容易飘,咱们拿一组具体数据从头走一遍。假设你记录了某台设备连续 10 天的日产量(单位:件):
[12, 15, 11, 14, 13, 12, 16, 11, 13, 13]
第一步:算期望(样本均值)
把所有数加起来:12+15+11+14+13+12+16+11+13+13 = 130。除以 10,得到均值 13。
第二步:算每个值与均值的离差
12 - 13 = -1 15 - 13 = 2 11 - 13 = -2 14 - 13 = 1 13 - 13 = 0 12 - 13 = -1 16 - 13 = 3 11 - 13 = -2 13 - 13 = 0 13 - 13 = 0第三步:离差平方
1, 4, 4, 1, 0, 1, 9, 4, 0, 0第四步:求平方的平均
总和 = 1+4+4+1+0+1+9+4+0+0 = 24。这里有个关键选择:除以 n 还是 n-1?
- 如果这 10 天就是全部数据(总体),除以 n=10,方差 = 2.4
- 如果这 10 天是从更大范围里抽的样本,除以 n-1=9,方差 ≈ 2.667
这个 n-1 叫贝塞尔校正。为什么样本方差要除以 n-1?直观理解是:样本均值本身是用这组数据算出来的,它已经"消耗"了一个自由度,导致离差平方和系统性地偏小。除以 n-1 能纠正这个偏差,让样本方差成为总体方差的无偏估计。实际做数据分析时,绝大多数情况我们处理的是样本,所以默认用 n-1。
第五步:开根号得标准差
总体标准差 = √2.4 ≈ 1.549;样本标准差 = √2.667 ≈ 1.633。
这组数据的期望是 13,标准差约 1.6,说明日产量大多在 13 上下 1.6 件的范围内波动。这个信息比单看"平均 13 件"有用得多——如果标准差是 5,那说明生产极不稳定,需要排查原因。
5. 用代码算:Python 和 Excel 的实操对比
手算适合理解原理,实际工作中当然用工具。我把常用的几种方式列出来,顺便说说各自的坑。
5.1 Python:numpy 和 statistics 的选择
import numpy as np import statistics data = [12, 15, 11, 14, 13, 12, 16, 11, 13, 13] # numpy 方式 mean_np = np.mean(data) # 13.0 var_np = np.var(data) # 2.4,默认除以 n(总体方差) var_np_sample = np.var(data, ddof=1) # 2.667,除以 n-1(样本方差) std_np_sample = np.std(data, ddof=1) # 1.633 # statistics 方式 mean_st = statistics.mean(data) # 13.0 var_st = statistics.variance(data) # 2.667,默认除以 n-1 std_st = statistics.stdev(data) # 1.633这里有个极易踩的坑:np.var()默认ddof=0,算的是总体方差(除以 n);而statistics.variance()默认算的是样本方差(除以 n-1)。两个库的默认行为不一致!如果你混用,结果会对不上。我的习惯是:只要不是明确处理完整总体,一律显式写ddof=1,避免歧义。
5.2 Excel:VAR.P 和 VAR.S 的区别
Excel 里有两组函数:
VAR.P/STDEV.P:除以 n,用于总体VAR.S/STDEV.S:除以 n-1,用于样本
老版本的VAR和STDEV函数等同于VAR.S和STDEV.S。我见过不少人用VAR.P去算样本方差,结果偏小,还找不到原因。记住一个简单规则:除非你手里就是全部数据,否则用带 .S 的版本。
5.3 大数据量下的数值稳定性
当数据量很大或者数值量级很高时,直接套公式可能出问题。比如计算 10 亿个数的方差,如果先算 E(X²) 再减 [E(X)]²,两个大数相减可能损失大量有效数字。更稳的做法是Welford 在线算法,它一边遍历数据一边更新均值和方差,不需要存储全部数据,数值稳定性也好:
def welford(data): n = 0 mean = 0.0 M2 = 0.0 for x in data: n += 1 delta = x - mean mean += delta / n delta2 = x - mean M2 += delta * delta2 if n < 2: return float('nan') return M2 / (n - 1) # 样本方差 print(welford([12, 15, 11, 14, 13, 12, 16, 11, 13, 13])) # 2.667这个算法在流式数据处理、实时监控场景里特别有用。我之前做一个传感器数据监控的项目,数据是源源不断来的,不可能全存下来再算,就是用类似 Welford 的思路做在线统计。
6. 期望和方差的实战应用:三个真实场景
6.1 场景一:A/B 测试里判断哪个方案更好
假设你做了一个网页改版,想比较新旧两个版本的转化率。旧版 1000 次访问转化了 50 次,新版 1000 次访问转化了 65 次。新版转化率 6.5% 高于旧版 5%,但这是真实提升还是随机波动?
这时候就要用到期望和方差。把每次访问看作一次伯努利试验(转化=1,未转化=0),转化率的期望是 p,方差是 p(1-p)/n。旧版转化率的标准差约 √(0.05×0.95/1000) ≈ 0.0069,新版约 √(0.065×0.935/1000) ≈ 0.0078。两个转化率之差 1.5%,相对于各自的标准差来说不算小,但要做严格判断还需要做假设检验。核心思路是:光看期望(转化率)的差异不够,还要看方差(波动范围)有多大。如果方差很大,那点差异可能只是噪声。
6.2 场景二:投资组合的风险评估
金融里期望和方差是基石概念。一支基金的"预期收益率"就是收益的期望,"风险"通常用收益率的标准差来衡量。两支基金预期收益都是 8%,但一支标准差 5%,另一支标准差 15%,显然第一支更稳。
更进一步,如果要把两支基金按比例组合,组合的期望收益是加权平均,但组合的方差不是简单加权——还要考虑两支基金的相关性。这就是马科维茨投资组合理论的核心:通过分散化降低整体方差。这个例子完美说明了为什么不能只看期望,方差(以及协方差)才是决定风险的关键。
6.3 场景三:生产质量控制
工厂生产零件,规格要求直径 10mm。抽检一批零件,均值 10.02mm,标准差 0.03mm。均值虽然偏离了 0.02mm,但标准差很小,说明生产很稳定,稍微调整一下设备参数就能达标。如果均值 10.00mm 但标准差 0.15mm,那问题就大了——虽然平均下来是准的,但单个零件可能从 9.7 到 10.3 都有,大量产品会超出公差范围。
这个场景里,方差直接对应"不良率"。假设直径服从正态分布,公差是 ±0.1mm,标准差 0.03mm 时超出公差的比例极小(约 0.1%),标准差 0.15mm 时超出公差的比例就相当可观了。这就是为什么制造业如此重视过程能力指数(Cp、Cpk),它们本质上都是在比较公差范围和标准差。
7. 那些教科书不常讲但实际会遇到的坑
7.1 方差的量纲问题与变异系数
前面提过,方差的单位是原始单位的平方,解释起来别扭。比如你说"这组数据方差是 2.4 件²",没人能直观理解。所以实际汇报时通常用标准差。
但还有一种情况:比较两组量纲不同的数据谁更"离散"。比如一组是身高(厘米),一组是体重(公斤),直接比标准差没意义。这时候用变异系数(CV):
$$CV = \frac{\sigma}{\mu}$$
标准差除以均值,消掉了量纲,变成一个相对指标。CV 越大说明相对波动越大。这个指标在比较不同量级的数据时特别有用。不过要注意,当均值接近 0 时 CV 会爆炸,这时候不能用。
7.2 期望和方差对离群值的敏感度
期望(均值)对离群值非常敏感。一组数据[1, 2, 3, 4, 100],均值是 22,但中位数只有 3。一个极端值就能把均值拉飞。方差更敏感,因为离差被平方了,那个 100 贡献了巨大的方差。
实际处理数据时,如果发现均值和方差异常大,第一件事应该是画个图看看有没有离群值。稳健的替代方案是用中位数代替均值,用四分位距(IQR)代替标准差。IQR 是第 75 百分位减第 25 百分位,不受极端值影响。
7.3 独立性与方差可加性的前提
前面说 Var(X+Y) = Var(X) + Var(Y),但这个等式只在 X 和 Y 不相关时成立。一般情况下:
$$Var(X+Y) = Var(X) + Var(Y) + 2Cov(X, Y)$$
如果 X 和 Y 正相关,方差会比简单相加更大;负相关则更小。很多人做误差传播分析时忘了协方差项,导致结果偏差。判断能否忽略协方差项,关键看两个变量是否独立(或至少不相关)。独立一定不相关,但不相关不一定独立——这是概率论里一个经典的反直觉点。
7.4 样本量对方差估计的影响
样本量小的时候,样本方差本身波动很大。用 5 个样本估出来的方差,可能和真实方差差好几倍。所以做小样本分析时,对方差相关的结论要格外谨慎。一般经验是:样本量少于 30 时,方差的估计就相当不稳定了,这时候用 t 分布而不是正态分布来做区间估计会更准确。
8. 从期望和方差延伸出去:下一步该学什么
期望和方差是单变量统计量的地基,但只是开始。如果你已经掌握了这两个概念,接下来几个方向值得深入:
协方差和相关系数:从单变量扩展到双变量,衡量两个变量之间的线性关系。这是理解回归分析的前提。
高阶矩:期望是一阶矩,方差是二阶中心矩。三阶矩对应偏度(衡量分布对称性),四阶矩对应峰度(衡量分布尖峭程度)。这四个矩基本能刻画一个分布的大致形状。
大数定律和中心极限定理:前者说样本均值会趋近期望,后者说大量独立同分布变量的和近似服从正态分布。这两个定理是统计推断的理论基石,理解了它们才能明白为什么正态分布无处不在。
条件期望和全期望公式:E(X) = E[E(X|Y)],这个公式在贝叶斯统计和机器学习里到处出现。它把复杂的期望计算拆解成"先按条件算,再对条件求期望"两步。
我自己学这部分的时候,最大的体会是:公式要背,但更重要的是理解每个统计量在回答什么问题。期望回答"中心在哪",方差回答"有多散",协方差回答"怎么一起变"。把这些问题和对应的统计量对应起来,遇到新场景时就知道该用哪个工具。
最后分享一个我常用的检验方法:每学完一个统计量,就拿一组自己熟悉的数据(比如每月开销、每天通勤时间)手算一遍,再用代码验证。手算的过程会逼你面对每一个细节,而代码验证能帮你发现理解偏差。这个习惯让我在后来做数据分析时,对每个数字背后的含义都心里有数,而不是盲目相信工具输出。