=SUMPRODUCT(B2:B5,C2:C5)/SUM(C2:C5) 计算加权平均:B 列的每个分数乘以 C 列中对应的权重,把乘积相加,再用总和除以权重之和。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Part | Score | Weight | Average | Result | |
| 2 | Homework | 85 | 20% | Weighted | 81.2 | |
| 3 | Quizzes | 78 | 30% | Plain AVERAGE | 80.75 | |
| 4 | Midterm | 72 | 20% | |||
| 5 | Final | 88 | 30% |
加权总评是 81.2,而普通的 AVERAGE 得到 80.75,因为它把只占 20% 的作业当成了和占 30% 的期末考试一样重要。修改期末考试的分数,加权总评的变化会比作业分数同样变化时更大。
Excel 没有 WEIGHTED.AVERAGE 函数,所以用 SUMPRODUCT 除以 SUM 就是标准公式。Google Sheets 有 AVERAGE.WEIGHTED(B2:B5,C2:C5)。
加权平均公式的原理
SUMPRODUCT 把两个区域逐行相乘,再把结果相加。用一个辅助列展开来写,就是一列乘积再加上它们的 SUM:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Part | Score | Weight | Score x weight |
| 2 | Homework | 85 | 20% | 17.0 |
| 3 | Quizzes | 78 | 30% | 23.4 |
| 4 | Midterm | 72 | 20% | 14.4 |
| 5 | Final | 88 | 30% | 26.4 |
| 6 | Total | 100% | 81.2 | |
| 7 | Weighted average | 81.2 |
每一部分贡献的是分数乘以权重:85 × 20% 是 17.0,78 × 30% 是 23.4,依此类推。它们加起来是 81.2。权重之和是 100%,所以这里除以 C6 不会改变结果,但当权重之和不是 100% 时,正是这一步保证了公式的正确性。
权重之和不是 100% 的情况
权重不一定是百分比。GPA 按学分加权,平均价格按数量加权。除以权重的 SUM,任何总和都能处理。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Course | Grade points | Credits | Average | Result | |
| 2 | Math | 4 | 4 | Weighted GPA | 3.51 | |
| 3 | History | 3 | 3 | Plain average | 3.48 | |
| 4 | Biology | 3.7 | 4 | Total credits | 14 | |
| 5 | Art | 2.7 | 2 | |||
| 6 | Lab | 4 | 1 |
如果不做除法,公式返回的是绩点乘以学分的总和,这里是 49.2,而不是 GPA。做了除法后,F2 显示的是按 14 个学分加权的 GPA。4 学分的课程会把平均值拉向它们的成绩,而 1 学分的实验课几乎没有影响:把 B6 改成 2,对比一下 F2 和 F3 的变化幅度。
如果你的权重是百分比,而且加起来恰好是 100%,那么单用 =SUMPRODUCT(B2:B5,C2:C5) 也能得到相同的结果。但还是要保留 /SUM(...):哪天某个权重被修改、总和变成了 105%,不带除法的公式就会出错,而表格上不会有任何提示。
按条件计算加权平均
如果只对部分行加权,就在 SUMPRODUCT 中乘以一个条件,再用 SUMIF 把符合条件的权重相加。下面按销售数量对每个地区的平均价格加权。
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Region | Product | Price | Qty | Region | Average price | |
| 2 | North | Apple | $1.20 | 100 | North | $1.45 | |
| 3 | South | Pear | $1.50 | 40 | South | $1.36 | |
| 4 | North | Pear | $1.50 | 60 | |||
| 5 | South | Apple | $1.20 | 120 | |||
| 6 | North | Plum | $2.00 | 40 | |||
| 7 | South | Plum | $2.00 | 20 |
North 卖出了 100 个苹果、60 个梨和 40 个李子,所以它的平均价格是 $1.45,比三个价格的简单平均值更接近苹果的价格。条件 (A2:A7=F2) 在 North 的行上为 1,在其他行上为 0,所以其他行不会给分子增加任何值,而分母中的 SUMIF 只把 North 的数量相加。
练习:加权平均价格
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Batch | Price | Qty | Average | Result | |
| 2 | Jan | $4.20 | 100 | Weighted price | ||
| 3 | Feb | $4.50 | 40 | |||
| 4 | Mar | $3.90 | 250 | |||
| 5 | Apr | $4.80 | 10 | |||
| 6 | May | $4.10 | 120 |
轮到你了: 你分五批以不同的价格买入了同一种商品。按每批的数量加权,计算每件商品的平均价格。把公式写在 F2 中。
导致加权平均出错的常见错误
- 对乘积求 AVERAGE。 对一列“分数 × 权重”使用
=AVERAGE(D2:D5),除的是行数而不是权重,会得到一个很小且毫无意义的数字。应该用乘积的 SUM 除以权重的 SUM。 - 除以个数而不是权重。
=SUMPRODUCT(B2:B6,C2:C6)/COUNT(B2:B6)只有在每个权重都是 1 时才正确。 - 区域没有对齐。
=SUMPRODUCT(B2:B6,C3:C7)会把每个值和下一行的权重配对。两个区域必须在同样的行开始和结束;大小不同时会返回#VALUE!。 - 权重为空。 空权重算作 0,所以那一行会被悄悄排除在外。如果缺少权重时应该停止计算,先用
=COUNTBLANK(C2:C6)检查一下。 - 对平均值求平均。 两个班的平均分分别是 70(10 名学生)和 90(30 名学生),它们的平均并不是 80。按班级人数加权,结果是 85;AVERAGEIF 一文中带条件的计算也有同样的陷阱。
常见问题
Excel 中怎么计算加权平均?
用 =SUMPRODUCT(B2:B5,C2:C5)/SUM(C2:C5),其中值在 B 列,权重在 C 列。SUMPRODUCT 把每个值乘以它的权重并把结果相加,再除以权重之和就得到平均值。
权重之和必须是 100% 吗?
不必,只要你除以权重的 SUM 就行。学分为 3、4、2、1,或者权重为 2、1、1,计算方法都一样。只有不做除法、直接用 =SUMPRODUCT(B2:B5,C2:C5) 的简便写法,才要求权重之和恰好是 100%。
Excel 中有 WEIGHTED.AVERAGE 函数吗?
没有。Excel 没有内置的加权平均函数,所以 SUMPRODUCT 和 SUM 的组合就是标准公式。在 Google Sheets 中,AVERAGE.WEIGHTED(B2:B5,C2:C5) 能完成同样的计算。
怎么按条件计算加权平均?
在 SUMPRODUCT 中加上条件,权重部分用 SUMIF:=SUMPRODUCT((A2:A7="North")*B2:B7*C2:C7)/SUMIF(A2:A7,"North",C2:C7)。