一堆数到手,第一件事不是算平均,是看形状。平均只描述中心,形状才告诉你这堆数是怎么来的。 60 条加薪记录:平均 7.24%,中位数 5.45%。两个数差了 1.79 个点,这就是「分布不对称」的信号。 5 条极端记录(占 8%)把平均值抬高了 1.34 个百分点。平均数很脆,它经不起几个异常值。
第 8 章处理「量不出来」。第 9 章回到「数据有一堆」,讲怎么先看形状再看数。 这里的 60 条记录是用固定公式生成的(普调 40 条、谈过加薪 15 条、极端 5 条), 任何人跑出来都一样,不是随机数。
一、年度考评要来了
公司要评年度绩效,加薪方案得先摸清底细:过去几年到底谁加了多少。 人事给了 60 条记录。就是一堆百分数,没有别的信息。 大部分人的第一反应是算一个平均,然后拿它当「公司整体水平」。这一步不算错,但它只说了一半。
另一半是形状:这堆数是挤在一起,还是分成两堆?是左边拖长尾巴,还是右边拖?
二、先算三个数
60 条记录:平均 7.24%,中位数 5.45%,最小 2.5%,最大 26.0%。 平均比中位数高 1.79 个百分点。这个差本身就是信息:右边有东西把平均拽上去了。 如果分布对称,平均和中位数会几乎相等。差得越多,说明尾巴越长。
看到这两个数不一致,第一反应应该是「去看图」,而不是「取哪个更合适」。
三、极端值有多大的力气
去掉最极端的 5 条,平均从 7.24% 变成 5.89%——抬高了 1.34 个百分点。 5 条记录只占总数的 8%,却拉动了 1.34 个点。这就是平均数的脆弱之处:它对每个数一视同仁。 中位数就稳得多:去掉这 5 条,中位数几乎不动。因为它只看「站在中间的那个」。
样本小的时候,中位数比平均更抗异常值;样本大且干净时,平均更有用。
四、平均说不出来的事
「平均 7.24%」这句话,可以被三种完全不同的公司说出来。 公平型:所有人都加 7.24% 左右。两极型:一半人加 2% 到 3%,一半人加 9% 到 11%。 少数型:大部分人加 4%,几个人加 20% 以上。 这三种公司,平均一模一样,员工的感受天差地别。
所以平均数不是「结论」,它是一个需要配上形状才能读的数。
五、那就画图
把 60 个数摆到数轴上,数一数每个区间落了几个人——这就是直方图。 它不需要任何假设,就是把数按区间归堆。堆出来的高低,就是形状。 下一篇画出来看。先记住一件事:算平均和看形状不冲突,是两个动作,都要做。
六、动手 Demo:一堆数先看形状,再算平均
60 条加薪记录:平均、中位数、极值,再算一遍去掉极端值之后的平均。 数据用固定公式生成,任何人跑出来都一样。
BASE = [round(2.5 + 0.1 * i, 1) for i in range(40)] # 普调 40 人
NEGO = [round(8.0 + 0.25 * i, 1) for i in range(15)] # 谈过加薪 15 人
EXTR = [18.0, 20.0, 22.0, 24.0, 26.0] # 极端 5 条
DATA = BASE + NEGO + EXTR
def mean(v):
return sum(v) / float(len(v))
def median(v):
s = sorted(v)
n = len(s)
return s[n // 2] if n % 2 else (s[n // 2 - 1] + s[n // 2]) / 2.0
print("条数 %d" % len(DATA))
print("平均 %.2f%% 中位数 %.2f%% 最小 %.1f%% 最大 %.1f%%"
% (mean(DATA), median(DATA), min(DATA), max(DATA)))
print("平均减中位数 %+.2f 个点" % (mean(DATA) - median(DATA)))
no_ext = BASE + NEGO
print()
print("去掉 5 条极端值:平均 %.2f%%,比原来低 %.2f 个点"
% (mean(no_ext), mean(DATA) - mean(no_ext)))
print("去掉 5 条极端值:中位数 %.2f%%" % median(no_ext))
实跑输出:
--------------------------------------------------------------------
一堆数先看形状,再算平均
--------------------------------------------------------------------
① 年度考评要来了
--------------------------------------------------------------------
公司要评年度绩效,加薪方案得先摸清底细:过去几年到底谁加了多少。
人事给了 60 条记录,就是一堆百分数。
大部分人的第一反应是算个平均——这一步没错,但远远不够。
② 先算三个数
--------------------------------------------------------------------
60 条记录:平均 7.24%,中位数 5.45%,最小 2.5%,最大 26.0%。
平均比中位数高 1.79 个百分点——这说明右边有东西把平均拽上去了。
! 平均和中位数不一致,是「分布不对称」的第一个信号。看到这个信号,就该去看图了。
③ 极端的几个数有多大影响
--------------------------------------------------------------------
去掉最极端的 5 条,平均变成 5.89%;留着是 7.24%。
5 条记录(占总数的 8%)把平均值抬高了 1.34 个百分点。
这 5 个人是谁?不知道。他们在数据里只是一个数,在现实里可能是高管、可能是特殊贡献者。
④ 平均说不出来的事
--------------------------------------------------------------------
平均 7.24% 这句话,可以被三种完全不同的公司说出来:
一种:所有人都加 7.2% 左右——很公平。
另一种:一半人加 2%~3%,一半人加 9%~11%——两极分化。
第三种:大部分人加 4%,少数几个人加 20% 以上——平均被少数人撑着。
这三种公司,平均一模一样。平均只描述中心,不描述形状。
⑤ 那就画图
--------------------------------------------------------------------
把 60 个数摆到数轴上,数一数每个区间落了几个人——这就是直方图。
下一节就画。先记住一件事:看形状和算平均不冲突,是两个动作。
平均和中位数差 1.79 个点,就因为那 5 条极端记录——它们只占 8% 的样本。 去掉极端值后中位数几乎不动,这是中位数抗干扰的直接证据。至于该不该去掉,是另一件事。
30 秒实验
- 如果把 5 条极端值改成 8.0、8.5、9.0、9.5、10.0,平均会变成多少?双峰还在吗?
- 在什么情况下应该保留极端值?在什么情况下该单列说明?
- 想一想:为什么「平均 7.24%」这个数,可能同时被员工和公司用来支持相反的观点?
常见误区
- 拿到数就直接算平均:平均只说中心,形状、尾巴、双峰全被抹掉。
- 看到平均和中位数不一致就挑一个:不一致本身是信息,说明分布不对称。
- 随手删极端值:删之前先问它是记录错误、还是真实存在。真实存在的极端值恰恰最重要。
- 用平均描述双峰数据:双峰数据的平均往往落在没人待的中间地带,谁都不像。
自测三问(点开对答案)
1. 为什么先算平均和中位数两个数? —— 两个数不一致说明分布不对称。差得越多,尾巴越长,越该去看图。 2. 5 条记录为什么能拉动平均值 1.34 个点? —— 因为平均对每个数一视同仁。极端值离中心很远,一个人的力气抵得上好几个人。 3. 中位数为什么更抗异常值? —— 因为它只看排序后站在中间的那个,极端值再怎么大,也只是排在末尾,不改变「谁是中间」。形状要靠图才看得见。下一篇画直方图:把数轴切段,数每段落了几个人。
- ☐ (本篇完,下一篇 9.2 直方图到底说明什么)