心智模型是你脑子里那套「世界怎么运转」的假设。 它决定了你认为哪个变量重要、什么算异常、数据该怎么读。 这一篇用同一份广告投入与销量的数据,跑两个模型:一条直线和一个有上限的曲线, 看它们的结论怎么反过来。 结论会让你不太舒服:数据不会推翻模型,只会推翻「模型给出的预测」。
上一篇说「选哪一刀」,选刀本身也是模型在起作用——你认为渠道重要,才会先去切渠道。 这一篇把模型摊开来讲,是因为第 2 章(实验)和第 10 章(回归)都在造模型,不先弄清模型是什么, 那两章就只是背公式。
一、你带着模型看数据
看到销售额下滑,有人第一反应是「价格太高」,有人是「渠道不对」,有人是「竞品降价」。 这三种反应不是从数据里来的,是先于数据存在的。 数据只能告诉你「跌了」,跌的原因得靠模型去猜,再靠实验去验。 所以教材里那句话说得准:你对世界的假设和你确信的观点,就是你的心智模型。
二、两个常见的模型
直线模型:投得多就卖得多,一比一往上走。它的隐含假设是「没有上限」。 饱和模型:投到一定程度就不涨了。它的隐含假设是「市场有天花板」。 两个假设都很常见,选哪个不看谁更高级,看数据长什么样。
| 模型 | 形状 | 隐含假设 | 典型场景 |
|---|---|---|---|
| 直线 | y = b + kx | 投多少涨多少 | 市场远未饱和 |
| 饱和 | y = b + k·ln x | 越投越不划算 | 成熟品类 |
三、怎么比这两个模型
把每个数据点代进去,算预测值,再算「实际减预测」——这叫残差。 残差有正有负,直接平均会互相抵消,所以先平方再平均,最后开方,得到均方根误差(RMSE)。 它是一个「典型偏差有多大」的数。 RMSE 越小,模型越贴。注意是「贴」不是「对」——贴只能说明它没违背数据,不能说明它揭示了原因。
四、结论为什么会反过来
Acme 的八个点,投到 50 万以后销量就基本平了。 直线模型看不见这个平面,它会一直往上画,于是在 80 万那里高估了三个多万件。 拿直线模型的人说:还差 3 万件,继续加投。拿饱和模型的人说:已经在平面上,再加是白花钱。 同一份数据,两个相反的预算建议。差别不在数据,在那条线的假设里。
五、模型不是越复杂越好
既然两个都不完美,为什么不拟合一个更复杂的?因为模型要用来做决定,不是用来拟合历史。 参数越多,越容易把噪声也学进去,换一批数据就崩。这叫过拟合。 选模型的实用标准:能不能用一句人话讲清它的假设。讲不清的模型,客户不会拿它做决定。
六、动手 Demo:两个心智模型,看同一堆数
八个广告投入点,两种拟合,两张预测表,两个 RMSE。 直线模型在低投入端高估、在高投入端也高估——因为真实关系是弯的。
import math
ad = [10, 20, 30, 40, 50, 60, 70, 80]
vol = [12.1, 18.4, 23.2, 26.2, 27.9, 28.3, 28.6, 28.5]
def fit(xs, ys):
n = len(xs)
mx, my = sum(xs) / n, sum(ys) / n
k = sum((x - mx) * (y - my) for x, y in zip(xs, ys)) / \
sum((x - mx) ** 2 for x in xs)
return k, my - k * mx
kA, bA = fit(ad, vol)
kB, bB = fit([math.log(a) for a in ad], vol)
print('直线 y = %.2f + %.4f x' % (bA, kA))
print('对数 y = %.2f + %.3f ln x' % (bB, kB))
def rmse(pred):
return (sum((v - p) ** 2 for v, p in zip(vol, pred)) / len(vol)) ** 0.5
print('直线 RMSE %.2f' % rmse([bA + kA * a for a in ad]))
print('对数 RMSE %.2f' % rmse([bB + kB * math.log(a) for a in ad]))
print('投 80 万:直线 %.1f,对数 %.1f,实际 %.1f'
% (bA + kA * 80, bB + kB * math.log(80), vol[-1]))
实跑输出:
--------------------------------------------------------------------
两个心智模型,看同一堆数
--------------------------------------------------------------------
① 心智模型是什么
--------------------------------------------------------------------
你脑子里那套「世界怎么运转」的假设,就是心智模型。
它决定你认为哪些变量重要、数据该怎么读、什么算异常。
下面两套模型,看的是同一份广告投入与销量的数据。
| 广告投入万元 | 销量万件 |
|---:|---:|
| 10 | 12.1 |
| 20 | 18.4 |
| 30 | 23.2 |
| 40 | 26.2 |
| 50 | 27.9 |
| 60 | 28.3 |
| 70 | 28.6 |
| 80 | 28.5 |
② 模型 A:投得多就卖得多(直线)
--------------------------------------------------------------------
最小二乘直线:销量 = 14.357 + 0.2176 × 投入
这句话的意思是:每多投 1 万元,多卖 0.218 万件。
按它算,投 80 万应该卖 31.8 万件。
③ 模型 B:投到一定程度就不涨了(对数)
--------------------------------------------------------------------
销量 = -6.218 + 8.370 × ln(投入)
按它算,投 80 万应该卖 30.5 万件。
④ 两个模型谁更贴
--------------------------------------------------------------------
| 投入 | 实际 | 直线预测 | 对数预测 |
|---:|---:|---:|---:|
| 10 | 12.1 | 16.5 | 13.1 |
| 20 | 18.4 | 18.7 | 18.9 |
| 30 | 23.2 | 20.9 | 22.3 |
| 40 | 26.2 | 23.1 | 24.7 |
| 50 | 27.9 | 25.2 | 26.5 |
| 60 | 28.3 | 27.4 | 28.1 |
| 70 | 28.6 | 29.6 | 29.3 |
| 80 | 28.5 | 31.8 | 30.5 |
均方根误差:直线 2.61,对数 1.16
! 数据在 50 万之后就平了,直线模型看不见这个平面,它只会一直往上画。
⑤ 模型决定你看见什么
--------------------------------------------------------------------
拿直线模型的人会说:投 80 万还差 3 万件,继续加投。
拿对数模型的人会说:80 万已经在平面上,再加是白花钱。
同一份数据,两个建议正好相反——差别不在数据,在模型。
所以「数据说话」这句话是半句,另外半句是「模型决定数据说什么」。
手写的最小二乘和对数拟合,结果与 numpy 的 polyfit 一致(这里不用 numpy 是为了让公式露出来)。 两个 RMSE 差了一倍多:直线 2.61,对数 1.16。差这么多,选哪个就不该凭感觉了。
30 秒实验
- 把最后两个销量点改成 32 和 36(真的还在涨),重算两个 RMSE,看谁赢。
- 把对数换成平方根,RMSE 会变成多少?
- 只取前五个点拟合,再拿后三个点验证,两个模型的预测差多少?
常见误区
- 把拟合当因果:模型贴得好只说明它没违背数据,不说明它找到了原因。
- 用 R² 当唯一标准:R² 高但残差有明显规律(比如都偏正),模型仍然是错的。
- 在数据范围外做预测:80 万以内的点没覆盖 200 万,问它 200 万就是外插(第 11 章细讲)。
- 忽略低端的偏差:直线模型在 10 万处高估了四万多件,这在真实业务里是致命的。
自测三问(点开对答案)
1. 心智模型和数据,谁先谁后? —— 模型先。你先有「什么可能导致销量变化」的假设,才会去收那几个字段的数据。 2. 为什么用 RMSE 而不是「残差的平均」? —— 残差有正有负,直接平均会互相抵消。平方后再平均,才不会让一个大正误差和一个小负误差假装抵消。 3. 直线模型在两个端头都高估,这说明什么? —— 说明真实关系是弯的(凹的)。任何直线都不可能同时贴住两端,这是模型形式本身的限制。模型再贴,也总有没写进去的东西——竞品动作、政策、天气。 下一篇讲怎么把「不知道」也写进模型,而不是假装它不存在。
- ☐ (本篇完,下一篇 1.5 心智模型的盲区)