斜率 0.0898 翻译成人话:绩效每多 10 点,加薪多 0.90 个百分点。这句话能拿去问人事。 但它只对「平均而言」成立。79 分的拿到 9.4%,83 分的只拿到 6.7%,方程一个都没抓到。 60 个人里 20 个人的偏差超过 1 个百分点,偏差中位数 0.83。所以预测必须连着误差一起交。
上一篇把线算出来了。这一篇把方程里的每个数翻译成能说出口的话,再看它失手的地方。 这一篇是全章的收口:计算器为什么建成了,又为什么没照计划行事。
一、把方程翻译成人话
方程是 y = 0.700 + 0.0898x。两个数,两句话。 m = 0.0898:绩效点数每多 1 点,加薪幅度平均多 0.0898 个百分点。 换成整十更好说:每多 10 点,加薪多 0.90 个百分点。
b = 0.700:点数 0 分时方程的预测值。这个数没有现实意义——没人考 0 分,别去解释它。 截距常常没有意义,斜率几乎总有意义。这是读回归方程时最实用的一条经验。
二、斜率是能拿去谈判的数
「平均加薪 6.76%」这句话,对谁都一样,说了等于没说。 「绩效每多 10 点,加薪多 0.90 个点」不一样:它告诉你多做多少能多拿多少。 按 8000 元月薪算,0.90 个百分点折成钱大约一年 862 元。
这个数不大,但它是可验证的:你可以拿它去问人事「是不是这个比例」。 能被验证的说法,才叫结论。不能被验证的,只是感受。
三、为什么它对某一个人不准
表里有两个人:79 分的实际拿 9.4%,83 分的实际只拿 6.7%。 方程给他们 7.79% 和 8.15%——一个低了 1.61,一个高了 1.45。 两个人分数只差 4 分,实际加薪却差了 2.7 个百分点,一年差 2592 元。这个差方程完全没抓到。
还有一个 48 分的拿了 6.7%,方程只给 5.01%,偏差 1.69,是 60 个人里最大的一笔。 这些偏差不是方程算错了,是方程压根没把「部门、岗位、谈判」这些变量放进去。
四、误差必须连着预测一起交
60 个人里,偏差超过 1 个百分点的有 20 个,占 33%。 偏差的中位数是 0.83 个点,最大 1.69 个点。中位数比 RMSE(0.94)小,说明 RMSE 被大偏差拖高了。 所以「你会加 8.6%」这句话是不完整的。完整的说法是「8.6% 上下一个点」。
不交误差,等于把不确定性藏起来,让对方以为这个数是确定的。 只报一个点估计,是把风险转嫁给了听的人。
五、第 11 章要补的东西
第一,要给预测配一个区间:不是「8.6%」,是「大概率落在 7.7% 到 9.5% 之间」。 第二,要把误差拆开看:是不是某一段分数的人特别不准,是不是某类岗位特别不准。 第三,要能回答「这个模型值不值得用」——拿它跟不用它比,差多少。
这三件事都是第 11 章的内容。这一章先把线立住,下一章给它加上边界。 回到那句老话:模型的价值不在于给出一个数,在于让人知道这个数能信几分。
六、动手 Demo:算法就是那个方程,以及它为什么失手
把斜率翻译成人话,再挑三个人看预测和实际差多少。 最后统计偏差的分布:超过 1 个点的有多少人,中位数和最大值各是多少。
S = [20261102]
def rnd():
S[0] = (S[0] * 1103515245 + 12345) % 2147483648
return S[0] / 2147483648.0
DATA = []
for i in range(60):
x = 40 + int(round(i * 55 / 59.0))
y = 1.2 + 0.085 * x + (rnd() - 0.5) * 3.2
DATA.append((x, round(y, 1)))
XS = [d[0] for d in DATA]
YS = [d[1] for d in DATA]
n = len(XS)
mx = sum(XS) / float(n)
my = sum(YS) / float(n)
num = sum((x - mx) * (y - my) for x, y in zip(XS, YS))
den = sum((x - mx) * (x - mx) for x in XS)
m = num / den
b = my - m * mx
print("每多 1 点 %.4f 个百分点" % m)
print("每多 10 点 %.2f 个百分点" % (m * 10))
print("每多 10 点,按 8000 月薪一年 %.0f 元" % (12 * 8000 * m * 10 / 100))
print()
for q in (79, 83, 48):
act = [y for x, y in DATA if x == q][0]
pv = b + m * q
print("%2d 分:预测 %5.2f%% 实际 %4.1f%% 差 %+.2f" % (q, pv, act, act - pv))
off = sorted(abs(y - (b + m * x)) for x, y in DATA)
print()
print("偏差超过 1 个点:%d 人(%.0f%%)"
% (sum(1 for d in off if d > 1.0), sum(1 for d in off if d > 1.0) / 60.0 * 100))
print("偏差中位数 %.2f 最大 %.2f" % ((off[29] + off[30]) / 2.0, off[-1]))
实跑输出:
--------------------------------------------------------------------
算法就是那个方程,以及它为什么失手
--------------------------------------------------------------------
① 方程里每个数是什么意思
--------------------------------------------------------------------
m = 0.0898:绩效点数每多 1 点,加薪幅度平均多 0.0898 个百分点。
换成整十:每多 10 点,加薪多 0.90 个百分点。
b = 0.700:点数 0 分时,方程的预测值。这个数没有现实意义——没人考 0 分,别去解释它。
② 斜率才是能拿去谈判的那个数
--------------------------------------------------------------------
「绩效每多 10 点,加薪多 0.90 个点」——这句话可以直接拿去问人事。
它比「平均加薪 6.76%」有用得多:平均值对谁都一样,斜率告诉你多做多少能多拿多少。
但它也只是一句平均话:同样 80 分的人,现实里的加薪散布还不小。
③ 拿它去预测几个真人
--------------------------------------------------------------------
79 分的这位:方程给 7.79%,实际拿到 9.4%,差 +1.61 个点。
83 分的另一位:方程给 8.15%,实际拿到 6.7%,差 -1.45 个点。
这两个人分数只差 4 分,实际加薪差了 2.7 个点——这个差,方程一点都没抓到。
按 8000 元月薪算,这 2.7 个点一年差 2592 元。
还有一个 48 分的:方程给 5.01%,他实际拿了 6.7%——偏差 1.69 个点,是 60 个人里最大的一笔。
60 个人里,偏差超过 1 个百分点的有 20 个,占 33%。
偏差的中位数是 0.83 个点,最大 1.69 个点。中位数比 RMSE 小,说明 RMSE 被大偏差拖高了。
④ 计算器为什么没照计划行事
--------------------------------------------------------------------
不是方程算错了,是它只能给「平均而言」的答案,给不了「这一个人」的答案。
RMSE 0.94 个百分点,偏差中位数 0.83 个百分点——一半人的偏差比中位数更大。
拿它去跟老板谈,谈的是平均值;老板看的是你这个人。中间那段距离就是误差。
! 任何预测都要连着误差一起交出去。只给一个数,等于把不确定性藏起来了。
⑤ 剩下的事交给第 11 章
--------------------------------------------------------------------
要回答「我这个预测有多少把握」,得给预测配一个区间。
要回答「我的模型哪儿最不准」,得把误差拆开看,分区分段。
这两件事都是第 11 章的内容。这一章先把这条线立住。
三行「预测 / 实际 / 差」摆在一起,比任何一句结论都直观:方程给的是中间那条线,人是线两边的点。 偏差中位数 0.83 小于 RMSE 0.94,说明误差分布有长尾——少数人偏得很远,把 RMSE 拉上去了。
30 秒实验
- 如果给每个人加薪时都按方程来,公司总支出会变多还是变少?为什么?
- 把「偏差超过 1 个点」的门槛改成 0.5 和 1.5,人数分别变成多少?门槛该怎么定?
- 想一想:为什么「预测必须带误差」这件事,在和老板谈的时候比在报告里写更重要?
常见误区
- 去解释截距:0.700 是「0 分时加薪 0.7%」,这句话在业务上没有对应物。
- 只报点估计:把「8.6%」当成确定的数交出去,藏掉了 ±1 个点的波动。
- 用平均值代替个人预测:平均值描述群体,个人预测必须带区间。
- 把偏差当模型错误:偏差里有真实信息(岗位、谈判),一味压低它会把有用结构也抹掉。
自测三问(点开对答案)
1. 斜率 0.0898 换算成「每 10 分」是多少?一年多少钱? —— 每 10 分对应 0.90 个百分点。按 8000 元月薪算,一年大约 862 元。 2. 为什么说截距常常没有意义? —— 它对应 x = 0 时的预测值,而 x = 0 往往落在数据范围外,甚至是现实中不存在的取值。 3. 偏差中位数 0.83 比 RMSE 0.94 小,说明什么? —— 说明误差分布有长尾:多数人偏得不多,少数人偏得很远,把均方根误差拉高了。第 10 章到此收口。第 11 章给这条线配上误差区间,回答「这个预测能信几分」。
- ☐ (本篇完,下一篇 11.1 客户大为恼火)