📈 第1章 数据分析引言
📄 一句话概括

心智模型是你脑子里那套「世界怎么运转」的假设。 它决定了你认为哪个变量重要、什么算异常、数据该怎么读。 这一篇用同一份广告投入与销量的数据,跑两个模型:一条直线和一个有上限的曲线, 看它们的结论怎么反过来。 结论会让你不太舒服:数据不会推翻模型,只会推翻「模型给出的预测」。

📝 本章和前面几章的关系

上一篇说「选哪一刀」,选刀本身也是模型在起作用——你认为渠道重要,才会先去切渠道。 这一篇把模型摊开来讲,是因为第 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 秒实验

  1. 把最后两个销量点改成 32 和 36(真的还在涨),重算两个 RMSE,看谁赢。
  2. 把对数换成平方根,RMSE 会变成多少?
  3. 只取前五个点拟合,再拿后三个点验证,两个模型的预测差多少?

常见误区

  1. 把拟合当因果:模型贴得好只说明它没违背数据,不说明它找到了原因。
  2. 用 R² 当唯一标准:R² 高但残差有明显规律(比如都偏正),模型仍然是错的。
  3. 在数据范围外做预测:80 万以内的点没覆盖 200 万,问它 200 万就是外插(第 11 章细讲)。
  4. 忽略低端的偏差:直线模型在 10 万处高估了四万多件,这在真实业务里是致命的。
自测三问(点开对答案) 1. 心智模型和数据,谁先谁后? —— 模型先。你先有「什么可能导致销量变化」的假设,才会去收那几个字段的数据。 2. 为什么用 RMSE 而不是「残差的平均」? —— 残差有正有负,直接平均会互相抵消。平方后再平均,才不会让一个大正误差和一个小负误差假装抵消。 3. 直线模型在两个端头都高估,这说明什么? —— 说明真实关系是弯的(凹的)。任何直线都不可能同时贴住两端,这是模型形式本身的限制。

模型再贴,也总有没写进去的东西——竞品动作、政策、天气。 下一篇讲怎么把「不知道」也写进模型,而不是假装它不存在。

相关笔记