17-因果:如何缓解反事实难题?

你好,我是悦创。
这一讲,我们讨论理解数据的另一个重要挑战——找到事物之间的因果关系。
确认一件事是另一件事的原因,是我们最常用的思考方式之一。只有知道了原因,我们才能做预测,做解释,做干预。而这三件事,对人来说都是大事。
但是,因果关系是典型的那种你不问我我觉得我知道,但是你一问我我就不知道的问题。确认因果关系,这件事很难。
先讲一个故事:
一位女司机给 4S 店打电话,说:“我在超市,车发动不了了,你们来解决一下。”
店里的工程师问:“你做什么了?”
女士说:“我去买玫瑰花了。但是我买百合花,就没有这个问题。”
工程师当然认为这是鬼扯,但是没办法,只好去了现场。你猜怎么着,女士说的一点没错,买百合车子就能发动,买玫瑰就不能。问题来了,现在经过了事实验证,你同意玫瑰花是导致汽车不能发动的原因吗?
这个案例很好的反映了通过数据去发现和确认因果关系的复杂和艰难之处。特别是当我们进入一个全新的领域,这个领域如何运行,没有人告诉我们。我们能做的,就是猜测、验证和迭代。如果对因果关系的追寻有一个总原则的话,那就是保持谦卑。
补充
我将分三个层面为你详细拆解这个故事背后的逻辑:
第一层:故事的谜底——看似荒谬,实则合理
在这个故事中,工程师面临的困境是:数据(事实)与常识相悖。
事实: 买玫瑰 车坏了;买百合 车好了。
常识: 花的品种不可能影响内燃机。
如果工程师只停留在“花”这个变量上,他永远找不到原因。要解开这个因果之谜,我们需要引入一个**“潜伏变量”(Confounding Variable)**。
🕵️♂️ 侦探推理:
虽然故事没有直接给出结尾,但其背后的物理逻辑通常是这样的:
- 购买习惯: 玫瑰花通常是现成包好的(或是放在门口最显眼的位置),买完付钱就走,耗时很短(比如 2 分钟)。
- 购买习惯: 百合花可能需要现场修剪、包装,或者放在超市深处,购买耗时较长(比如 10 分钟)。
- 汽车机械原理: 这辆车可能存在**“气阻”(Vapor Lock)**问题。当引擎热的时候,燃油在管道里气化,导致无法供油。
- 真相:
- 买玫瑰时间短 引擎还没冷却 气阻未消 无法启动。
- 买百合时间长 引擎充分冷却 气阻消失 顺利启动。
结论: 真正的因果并非“玫瑰导致车坏”,而是**“停车冷却时间过短导致车坏”**。玫瑰只是这一现象的伴随者(相关性),而非制造者(因果性)。
第二层:数据分析的核心挑战——为什么因果关系很难找?
正如文中所说:“你不问我我觉得我知道,但是你一问我我就不知道。”
我们在生活中习惯用归纳法建立因果:看见 A 发生,接着 B 发生,就默认 A 导致了 B。但在数据科学中,这往往是错误的。
混淆了“相关性”与“因果性”
相关性 (Correlation): 数据显示两个事物同时变化。
例子: 夏天冰淇淋销量高,溺水人数也高。
因果性 (Causality): 改变一个事物,另一个事物必然随之改变。
谬误: 禁止卖冰淇淋就能防止溺水吗?显然不能。真正的“因果”是气温(天热导致想吃冰淇淋,天热也导致去游泳)。
在玫瑰花的案例中,如果你根据“相关性”去做决策(干预),你可能会做出荒谬的规定:“禁止车主购买玫瑰花”。但这完全解决不了问题,因为车主下次去买个口香糖(只要够快),车还是会坏。
只有找到因果,才能实现那“三件大事”
文中提到的预测、解释、干预,在这个故事里体现得淋漓尽致:
层面 只有知道“时间是因果” 如果误以为“花是因果” 解释 (Explanation) 引擎有过热保护或气阻问题。 玫瑰花散发的磁场干扰了引擎(伪科学)。 预测 (Prediction) 如果你买报纸很快回来,车也发不动。 如果你买报纸,车应该没事。 干预 (Intervention) 建议车主稍微等一会再启动,或者修引擎。 建议车主只买百合花。
第三层:面对未知领域的态度——保持谦卑
“猜测、验证和迭代”以及“保持谦卑”,是数据科学家的座右铭。
当我们进入一个全新领域(比如分析用户行为、股市波动、或者像故事里的修车):
- 不要轻视看似荒谬的数据: 女士说的是实话,数据本身没有撒谎,是我们的解读可能会出错。
- 不要预设答案: 工程师最初认为这是“鬼扯”,这种傲慢会阻碍发现真相。
- 迭代验证:
- 猜测: 是不是时间问题?
- 验证: 让女士去买百合,但是让她快跑进快跑出(控制时间变量)。
- 结果: 如果快买百合车也坏了,那就证实了是时间问题。
总结
这个故事告诉你:眼见不一定为实,数据相关不等于事实因果。
在复杂的系统中,任何一个显而易见的现象背后,都可能藏着一个看不见的“第三者”(时间、温度、环境等)。只有通过谦卑的实验和逻辑推演,剥离掉表面的干扰,才能抓到那个能够真正解决问题的“因果之手”。
潜伏变量
“潜伏变量”(Confounding Variable),如果用最通俗的大白话解释,就是**“幕后黑手”或者“隐形的第三者”**。
它就像是一个你看不见的导演,它同时指挥了两个演员(事物 A 和事物 B),让你误以为 A 和 B 之间有关系,但实际上它们都是被这位导演操纵的。
我用三个层次帮你彻底搞懂它:
回到“玫瑰花”的例子
在这个故事里:
- 表面看: 买玫瑰花(A) 导致车坏了(B)。
- 实际上: 是**“停车时间太短”**(C)这位“幕后黑手”在起作用。
- 因为停车时间太短(C),所以你去买了不用挑的玫瑰花(A);
- 因为停车时间太短(C),所以引擎没凉透,车坏了(B)。
这里,**“停车时间”**就是一个潜伏变量。如果你没发现它,你就会冤枉玫瑰花。
再举一个经典的“冰淇淋与溺水”例子
这是统计学中最著名的案例:
数据显示:冰淇淋销量越高的时候,海边溺水的人数也越多。
- 荒谬的推论: 吃冰淇淋会导致人溺水。所以为了救人,我们要禁止卖冰淇淋。
- 寻找潜伏变量: 为什么冰淇淋卖得好?因为**“夏天天气热”。为什么溺水的人多?也是因为“夏天天气热”**大家才去游泳。
在这里,**“气温/夏天”**就是那个潜伏变量。是它同时拉高了冰淇淋销量和溺水人数。如果你忽略了这个变量,你的分析就是错的。
生活中的“红酒长寿论”
数据经常显示:经常喝红酒的人,比不喝红酒的人更长寿。
- 直接推论: 红酒里的物质能让人长寿。
- 潜伏变量视角的推论: 喝得起红酒、且有闲情逸致经常喝红酒的人,通常**“社会经济地位较高”**(有钱)。
- 因为有钱,所以喝红酒;
- 因为有钱,所以有更好的医疗条件、更好的饮食结构、更小的生活压力 所以长寿。
这里,**“社会经济地位(钱)”**往往就是一个被忽略的潜伏变量。可能红酒本身并没有那么神,是“钱”让人长寿。
总结
潜伏变量之所以叫“潜伏”,是因为它不在你的原始数据表里。
- 你看得到“玫瑰”,看得到“车坏了”,但数据表里没记“时间”。
- 你看得到“冰淇淋”,看得到“溺水”,但数据表里没写“气温”。
通俗口诀: 当你看到 A 和 B 好像如影随形时,千万别急着说“是因为 A 所以 B”,先问问自己:“是不是躲在背后的 C,同时搞了它们两个?”
这个 C,就是潜伏变量。
蒙太奇手法:
另外一个实验:库里肖夫拍摄了三个镜头,一个演员微笑的特写,一个左轮手枪的特写
以及一个演员看起来很害怕的特写正常顺序连接,便是一场很正常的戏份:
但是如果颠倒两个表情镜头,人物性格在观众这里便会变成了勇敢。
补充 2
我们就把这个“买玫瑰车就发动不了”的故事,**当成一堂“因果关系入门课”**来拆解讲透:它到底在考我们什么、为什么直觉会被骗、以及怎么一步步把“看起来像原因”的东西,变成“更像真原因”的结论。
1)先把故事翻译成“数据语言”
故事里出现了两个事件:
- 结果 Y(我们关心的):车能不能发动(能/不能)
- 现象 X(看起来有关的):买了什么花(玫瑰/百合)
观察到的规律是:
- 买玫瑰 → 车发动不了
- 买百合 → 车能发动
如果你只看这两条记录,你的大脑会自动跳到一句话:“玫瑰导致车发动不了。”
但这一步,就是故事要抓你的地方:相关 ≠ 因果。
2)为什么我们会“自动相信因果”?
因为人的思维习惯是:
- 看到规律(玫瑰→坏 / 百合→好)
- 立刻补上一个解释(玫瑰有问题)
- 解释越顺口,越像真相
这叫“解释冲动”:我们宁愿有一个可能是错的原因,也不愿意承认“我还不知道”。
而数据分析里最难的,恰恰是学会说:先别急着认定原因。
3)关键问题:事实验证了规律,但它验证不了因果
注意故事里的“陷阱句”:“现在经过了事实验证,你同意玫瑰花是导致汽车不能发动的原因吗?”
很多人会说:“都验证了呀,当然同意。”
但“验证”的只是:在这位女士的经历里,玫瑰和发动失败一起出现得更多。
这属于:
- 相关关系(correlation):X 和 Y 一起变化
- 而不是👇
- 因果关系(causation):X 改变会导致 Y 改变
因果要更强:它要求你能回答——
“如果她当时买玫瑰,但其他条件都不变,车是否仍一定发动不了?”
这句“其他条件都不变”,才是因果推断的地狱难度。
4)最核心的敌人:第三因素(混杂变量)
这故事几乎在暗示你:“玫瑰”很可能只是个 替罪羊,真正的原因藏在另一个变量里。
我们来列一些非常现实的“第三因素 Z”:
可能的 Z1:停车位置不同
- 买玫瑰的店在 地下车库深处 → 信号弱、潮湿、温度低
- 买百合的店在 地面 → 环境更好
如果车是电瓶老化、接触不良、或智能钥匙信号问题,环境差一点就触发“无法启动”。
这时你看到的其实是:
- 玫瑰(只是“去地下”的标记)
- 地下环境(真正影响启动)
- 启动失败(结果)
玫瑰并不“致坏”,它只是“更常出现在会坏的场景”。
可能的 Z2:买玫瑰更花时间
- 买玫瑰要挑、要包、要排队 → 停车更久
- 买百合随手买 → 停车更短
如果车本身有问题(比如电瓶弱、某个传感器热衰减/冷却触发),停久一点就更容易失败。
可能的 Z3:她去买玫瑰的日子不同
- 玫瑰通常在周五/节日前买 → 超市更拥堵、她更着急、熄火次数更多
- 百合平时买 → 状态轻松
结果可能来自:操作习惯差异、开关门次数、钥匙放包里被屏蔽等。
你看:同样的“玫瑰 vs 百合”,背后可能对应一整套不同的场景变量。
这就是混杂变量:它会制造一种“假因果”。
5)故事最想训练你的:别急着问“是不是原因”,先问“还能是什么原因”
真正的数据思维不是立刻下结论,而是按顺序做这三件事:
第一步:把“因果断言”改成“可疑假设”
不要说:“玫瑰导致启动失败”
改成:“在目前观察里,买玫瑰和启动失败相关,我怀疑存在一个共同原因。”
这一步叫谦卑:先承认自己可能错。
第二步:列出“替代解释清单”
也就是我上面列的 Z(停车位置、停放时间、日期、人状态、环境、钥匙信号、电瓶温度……)。
这一步叫扩展假设空间:很多人输就输在只盯着一个解释。
第三步:设计验证方式,让“玫瑰”单独变化
这是因果推断最硬的一步:
控制变量。
你要做的是让:
- 只变:买玫瑰/百合
- 不变:停车位置、停放时间、发动方式、钥匙位置、环境温度、是否开空调、是否熄火等
怎么做?比如:
- 同一个停车位、同一时间段
- 人先坐进车里保持同样流程
- 让朋友去买玫瑰/百合(避免“她的行为模式”变化)
- 或者更狠:不买花,只走到同一家店门口停同样久,看车是否还能发动
如果在这些控制下,“玫瑰效应”消失了:那就说明玫瑰不是原因。
6)把它升级成一句“数据分析通用口诀”
这个故事的精髓可以浓缩成一句话:
“能复现的相关性,依然可能是错的因果;因果需要排除混杂,并构造反事实。”
通俗点说:
- 你看到“玫瑰→发动不了”,最多说明:“玫瑰出现时,坏事更常发生。”
- 你想证明“玫瑰是原因”,必须证明:“只要换成百合,其他都不变,车就会好。”
7)为什么结尾说“总原则是保持谦卑”?
因为在全新领域里(没人告诉你系统怎么运转),你手上通常只有:
- 现象(相关)
- 少量案例
- 不完整变量
- 以及你自己的解释冲动
这时候最危险的不是“没找到原因”,而是:过早相信自己找到了原因。
一旦你把“玫瑰”当成原因,你就会开始做错误干预:比如不再买玫瑰。但真正的问题(电瓶/钥匙/环境/线路)还在,迟早会在别的场景爆发。
原始故事
这也是一个非常经典的“都市传说”级商业案例,虽然真实性不可考(也有人说是庞蒂亚克 Pontiac 汽车的故事),但它长期被各大商学院和工程学院引用,用来解释数据分析中的 “潜在变量” 。
这个原本的故事是关于通用汽车(General Motors)与香草冰淇淋的。
以下是这个故事的完整版本:
故事背景:一封荒谬的投诉信
通用汽车的庞蒂亚克(Pontiac)部门收到了一封客户投诉信,信的内容非常离奇,看起来像是一个恶作剧。
客户写道:
“这听起来可能很疯狂,但我发誓这是真的。我们家有一个传统,每天晚饭后都会全家投票决定吃什么口味的冰淇淋,然后我开车去买。
问题在于:每当我买香草冰淇淋时,当我回到车里,车子就发动不起来。但如果我买的是巧克力、草莓或者其他任何口味,车子都能顺利启动。
我想知道,你们的汽车到底有什么问题?为什么它‘讨厌’香草冰淇淋?”
调查过程:工程师的介入
尽管这封信看起来很荒谬,但庞蒂亚克的主管还是派了一位工程师去调查。工程师见到了这位车主,发现他是一位受过良好教育、非常理智的人,不像是在开玩笑。
于是,工程师决定通过实地实验来收集数据。
- 第一晚: 大家都投票吃巧克力冰淇淋。车主把车开到冰淇淋店,买好,回来,车子顺利启动。
- 第二晚: 大家都投票吃草莓冰淇淋。车主开车去买,买好,回来,车子顺利启动。
- 第三晚: 大家都投票吃香草冰淇淋。车主去买,买好,回来,车子真的发动不起来了!
工程师有些困惑,但作为理性的数据分析者,他不相信“汽车对口味过敏”。他开始记录更详细的数据,不仅是口味,还包括时间、车流量、停车位置等。
发现真相:被忽略的“时间”变量
经过几天的观察,工程师发现了一个关键的业务逻辑差异:
- 香草冰淇淋: 因为香草是最畅销的口味,店家把它放在了店铺最靠前、最方便拿取的冷柜里,甚至经常是预先打包好的。购买时间非常短,车主停车后几分钟就回来了。
- 其他口味: 比如巧克力或草莓,销量没那么大,放在店铺后排的柜子里,店员需要现挖、包装,甚至还需要排队。购买时间比较长。
谜底揭晓:
这就涉及到了汽车的物理原理——气阻(Vapor Lock)。
这辆车的引擎散热设计有一些缺陷。当车子开了一段路到达商店时,引擎是热的。
- 如果购买时间短(买香草):引擎没有足够的时间冷却,燃油管道里的汽油因为高温气化,形成了“气阻”,导致供油不畅,车子发不起来。
- 如果购买时间长(买其他口味):引擎有足够的时间自然冷却,气阻消失,燃油恢复液态,车子就能顺利启动。
故事的启示
这个原版故事和“玫瑰花与百合花”的故事核心是一样的,但它更强调了**业务场景(Domain Knowledge)**的重要性。
- 数据不会撒谎,但会骗人: 数据显示“香草导致故障”,这是事实(相关性),但不是真相(因果性)。
- 只有深入现场才能发现“潜伏变量”: 坐在办公室看表格的工程师,永远想不到冰淇淋店的陈列摆放(香草在前,其他在后)竟然是汽车故障的关键线索。
- 看似不合理的需求背后,往往藏着技术改进的机会: 最终,通用汽车并没有要求客户“别买香草冰淇淋”,而是改进了燃油系统的散热设计。
1. 因果关系成立的必要条件
尽管确立因果关系很难,但我们也得前行。
我们先讨论最简单的情况:如果两个变量之间是因果关系,那它一定具备哪些特征呢?也就是说,因果关系成立的必要条件有哪些呢?
第一:如果两个变量之间是因果关系,那它们之间肯定有相关。
研究人员说,有混蛋人格的人与他们获得权力之间没有因果关系,那么在数据上,混蛋人格和获得权力之间肯定就看不到相关。而研究人员又说,外向性格的人更容易获得权力,它们之间有因果关系,那么在数据上,外向性格和获得权力之间肯定可以看到相关。
顺便说一下,发现事物之间的相关性也是理解数据的一个重要任务,并不附属于因果关系的追寻。比如著名的“啤酒与尿布”的销售案例,就是说,把啤酒和尿布摆放在一起销售,销量会大增,这就是一个相关性的案例。再顺便说一下,“啤酒与尿布”这个案例找不到论文的出处,很可能是记者瞎编的。
注意,如果把问题反过来,两个变量之间看不到相关,就肯定没有因果关系吗?答案是,不一定。
举个例子。运动和体重之间观察不到相关,很多人经常运动,体重还是不见下降,但我们能说运动和体重没有因果联系吗?有研究发现,运动确实减少了体重,但同时也增加了饥饿感,因此会让人吃得更多。于是,两者抵消,导致运动和体重之间观察不到相关性。
这个研究是不是可靠先放在一边,我们想说的是:两件事没有相关,可能是真实的,也可能只是表象。确定因果关系,不能只看这两件事情之间,而必须看到世界运作的全景。要是你还没有能力看到全景,那么请再一次保持谦卑,慎重下结论。
啤酒与尿布
“啤酒与尿布”(Beer and Diapers)是数据挖掘和商业智能领域最著名、最经典的案例之一。它通常被用来解释“关联规则学习”(Association Rule Learning)的概念。
这个故事完美展示了大数据如何发现人类直觉无法察觉的隐秘规律。
以下是关于这个案例的详细解读:
1. 故事的核心情节
这个故事通常设定在 20 世纪 90 年代的美国零售巨头 沃尔玛(Walmart):
- 发现异常: 沃尔玛的数据分析人员在梳理超市的销售数据(购物篮分析)时,发现了一个奇怪的现象:“啤酒”和“尿布”这两个看似风马牛不相及的商品,经常出现在同一个购物小票上。
- 深挖原因: 经过进一步调查,分析师发现了背后的行为逻辑。通常在周五下午或傍晚,年轻的父亲会被妻子派去超市买尿布。这些父亲在辛苦一周后,在买完尿布时,往往会顺手给自己买几瓶啤酒来犒劳一下周末。
- 商业决策: 发现这个规律后,沃尔玛打破了常规的商品陈列逻辑(通常啤酒在饮料区,尿布在婴幼儿区),而是将啤酒和尿布摆放在非常靠近的地方。
- 结果: 这一举措大大缩短了顾客的寻找时间,最终导致啤酒和尿布的销量双双大幅提升。
2. 背后的技术原理:关联分析
这个案例的本质是数据挖掘中的购物篮分析(Market Basket Analysis)。
其核心算法通常被称为 Apriori 算法。它不关心商品之间是否存在逻辑上的因果关系(即不是因为喝了啤酒才买尿布),而是关注相关性。
在数据分析中,主要看两个指标:
- 支持度 (Support): 啤酒和尿布同时出现的频率有多高?
- 置信度 (Confidence): 买了尿布的人,有多大概率也会买啤酒?
3. 这个案例带来的启示
- 相关性 > 因果性: 在商业应用中,知道“是什么”(它们一起卖得好)往往比知道“为什么”(因为爸爸想喝酒)更重要,也更具备实操价值。
- 数据打破认知盲区: 按照传统的人类经验,啤酒属于酒水,尿布属于母婴,理应分开放。只有数据才能跨越品类,发现这种隐秘的联系。
- 交叉销售 (Cross-selling): 这是现代推荐系统的雏形。
4. 现实与传说的距离
虽然这个故事在商学院和IT界广为流传,但它的真实性一直存在细微的争议:
- 起源: 这个案例最早可以追溯到 1992 年 Teradata 公司的一位经理 Thomas Blischok 对 Osco Drug(一家药店连锁,并非沃尔玛)进行的分析。
- 结果: 确实发现了由年轻男性主导的“尿布+啤酒”的高频购买关联(特别是在周五下午 5 点到 7 点之间)。
- 结局: 并没有确凿的证据表明商家真的因此改变了货架摆放并获得了巨额利润。这个部分更多是后来在传播过程中被润色和神话了,用以展示数据挖掘的威力。
5. 现代版的“啤酒与尿布”
虽然这是一个几十年前的老故事,但这种逻辑现在无处不在:
- 电商推荐: 淘宝/京东的“买了这件商品的人也买了……”
- 视频网站: YouTube/B站/Netflix 的“猜你喜欢”。
- 外卖平台: 点了炸鸡后,系统自动推荐可乐。
总结:“啤酒与尿布”是一个关于从海量数据中挖掘隐性价值的寓言。它教会了商业界不再仅仅依赖经理人的直觉,而是开始尊重数据的声音。
故事 “啤酒与尿布”的传奇故事
1. 故事背景:大数据的黎明
故事发生在 20 世纪 90 年代 的美国。当时的零售巨头 沃尔玛(Walmart) 刚刚建立起了一套超级强大的数据仓库系统。他们拥有的交易数据量是惊人的,但问题是:数据就在那里,却没有人知道如何把它们变成真金白银。
于是,沃尔玛的高层给数据分析团队下达了一个死命令:“去数据里挖金矿,找出那些我们凭经验绝对想不到的销售机会。”
2. 奇怪的发现
分析师们开始对海量的 “购物篮数据”(也就是每张收银小票上的商品组合)进行地毯式扫描。
计算机夜以继日地运算,最后吐出了一条让所有人都令人费解的规律:
在每周五的下午 5 点到 7 点之间,非常有名的“纸尿裤”和“啤酒”这两样商品,极其频繁地出现在同一个购物篮里。
这完全不符合常理。按照传统的零售逻辑:
尿布 属于母婴用品,通常是女性购买。
啤酒 属于酒精饮料,通常是男性购买。
这两个区域在巨大的沃尔玛超市里,一个在东头,一个在西头,相隔甚远。为什么它们会被一起买走?
3. 场景还原:谁在买?
为了解开谜题,沃尔玛派出了调查人员去卖场观察,并结合顾客画像分析,最终还原了这样一个生动的用户行为场景:
时间: 周五傍晚,一周工作的结束。
主角: 25-35 岁的年轻父亲。
剧情:
妻子在家照顾婴儿,发现尿布快用完了,于是打电话给刚下班的丈夫:“亲爱的,回家前务必去超市买包尿布。”
丈夫拖着疲惫的身体走进超市,直奔母婴区拿了尿布。任务完成。
但此时他心想:“谢天谢地,终于周末了,我要放松一下,看球赛怎么能没有酒?”
于是,他顺手就走向饮料区,拎了一打啤酒,把尿布和啤酒一起扔进了购物车,然后结账回家。
结论: 这是一个由 “年轻父亲” 在 “周五傍晚” 主导的 “任务+奖励” 式购物行为。
4. 那个价值连城的决定
发现这个秘密后,沃尔玛的卖场经理做了一个在当时看来非常大胆、甚至有点荒谬的决定:
重新调整货架摆放。
工作人员不再把啤酒放在遥远的饮料区,而是直接在卖尿布的货架旁边,搭建了一个堆满啤酒的促销展台。
5. 结局
奇迹发生了。
当年轻的父亲们匆匆赶来买尿布时,他们惊喜地发现:“嘿!啤酒就在手边,不用绕路了!”
结果令人震惊:尿布的销量保持稳定增长,而啤酒的销量在那个时间段出现了爆发式的提升。 甚至还有传说称,这种摆放方式让沃尔玛当年的特定品类销售额提升了 30% 以上。
故事的核心寓意
这个故事之所以成为经典,是因为它告诉了所有管理者一个道理:
有时候,你不需要知道“为什么”(因果关系),你只需要知道“是什么”(相关关系)。 数据比人类的经验更诚实,它能发现人类直觉无法触及的隐秘财富。
Would you like me to ...
想听听另一个更令人毛骨悚然的现代案例:“塔吉特百货(Target)是如何比父亲更早知道他的高中女儿怀孕了” 的故事吗?
这是一个比“啤酒与尿布”更具现代感,但也让人感到有些**“细思极恐”**的真实案例。
这个故事最早由查尔斯·杜希格(Charles Duhigg)在《纽约时报》的一篇著名文章中披露,后来也收录在他的畅销书《习惯的力量》中。
以下是**“塔吉特(Target)比父亲更早知道女儿怀孕”**的完整故事:
1. 故事背景:零售商的终极目标
塔吉特(Target)是美国著名的零售巨头。对于零售商来说,最赚钱的客户是那些正在经历人生重大转折点的人。
为什么?因为当一个人的生活发生巨变(如结婚、搬家、生孩子)时,他们旧的消费习惯会被打破,新的习惯尚未形成。这个时候,谁能最先抢占他们的心智,谁就能锁定他们未来几年的钱包。
而在所有转折点中,“生孩子”是含金量最高的。新手父母会疯狂购买尿布、奶粉、童车,而且往往因为疲惫而懒得比价,会在同一家店买齐所有东西。
2. 算法的诞生:寻找“怀孕信号”
塔吉特的数据分析团队(由一位名叫 Andrew Pole 的统计学家领导)接到了一个任务:能不能在顾客自己告诉我们之前,甚至在她们肚子大起来之前,就预测出谁怀孕了?
经过对历史数据的深度挖掘,他们锁定了 25 种典型商品。当一位女性顾客开始购买这些东西时,系统就会计算她的**“怀孕预测指数”**:
- 无香型乳液: 许多孕妇对气味变得敏感,会从平时喜欢的花香型润肤露换成无香型的。
- 保健品: 突然开始大量购买钙镁锌片。
- 大包棉球和洗手液: 为即将到来的婴儿护理做准备。
通过这套算法,塔吉特甚至能推算出预产期在几月。
3. 冲突爆发:愤怒的父亲
故事的高潮发生在明尼苏达州的一家塔吉特门店。
一天,一位中年男子气冲冲地闯进商店,手里攥着一沓优惠券,直接要求见经理。
他把优惠券摔在桌子上,对着经理咆哮道:
“你们这是什么意思?我女儿还在读高中! 你们却给她寄婴儿衣服、婴儿床的优惠券?你们这是在鼓励她怀孕吗?”
经理看着这些印着笑脸婴儿和孕妇装的广告,感到非常尴尬。他连忙向这位父亲道歉,承认这可能是系统发错了,并保证以后不会再发生。
几天后,这位经理觉得心里过意不去,决定再次打电话给这位父亲,想再次表达歉意。
4. 惊人的反转
电话接通后,经理刚开口准备道歉,那头的父亲语气却完全变了。他显得有些尴尬和低沉:
“呃……关于这件事,我得向你道歉。”
父亲顿了顿,继续说道:
“那天回家后,我和女儿好好谈了一次。原来,家里确实发生了一些我完全不知道的事情。 她确实怀孕了,预产期就在8月。是我错怪了你们。”
结局: 塔吉特的算法通过分析女孩购买无香洗发水和维生素的行为,比这位朝夕相处的父亲更早地发现了真相。
5. 后续:不仅要准,还要“装傻”
虽然算法非常精准,但塔吉特意识到这带来了一个巨大的公关危机:太精准的算法会让人感到恐惧(Creepy),觉得被监视了。
如果顾客觉得商家知道得太多,他们会因为恐慌而拒绝购买。
于是,塔吉特想出了一个天才般的“伪装策略”:
他们不再把“婴儿尿布”和“孕妇装”的优惠券单独寄给准妈妈,而是把它们混杂在其他完全不相关的商品里。
比如:
- 一张尿布优惠券。
- 旁边放一张除草机的优惠券。
- 再放一张红酒杯的优惠券。
产生的效果: 顾客收到信件时会觉得:“哦,看这该死的广告,这又是一次随机群发的垃圾邮件,只是碰巧有一张尿布券我用得上。”
这样,顾客既使用了优惠券,又不会觉得自己被监视。塔吉特成功地在“精准营销”和“保护隐私感”之间找到了平衡。
总结
这个故事揭示了大数据的两面性:它既是商业利器,也是隐私噩梦。它告诉我们,我们的行为模式比我们自己想象的要诚实得多,也更容易预测得多。
Would you like me to ...
这个故事引出了“数据伦理”的话题。您想了解一下在这个算法时代,如果你想在互联网上“隐身”,避免被大数据精准画像,有哪些实际可行的(或者徒劳的)方法吗?
如果你想在互联网上“隐身”,避免被大数据精准画像,有哪些实际可行的(或者徒劳的)方法吗?
在当今的互联网生态中,想要实现**“完全隐身”**几乎是不可能的——除非你拔掉网线,搬进深山老林,并只用现金交易。
但是,如果你不想被算法“一眼看穿”,不想让塔吉特知道你怀孕了,或者不想让淘宝知道你刚失恋了,确实有一些**“反侦察”**手段。
这些手段的核心逻辑通常分为两派:“盾牌策略”(阻挡数据) 和 “迷彩策略”(污染数据)。
1. 盾牌策略:物理与技术隔绝
这是最直观的方法,目的是尽量少留下痕迹。
- 浏览器指纹的对抗:
- 误区: 很多人以为开了“无痕模式/隐私模式”就隐身了。错! 无痕模式只是不记录你的本地历史,但网站服务器依然能通过你的IP地址、屏幕分辨率、操作系统版本、安装的字体列表等信息拼凑出你的“设备指纹”。
- 对策: 使用 Tor Browser(洋葱浏览器) 或 Brave 这样专门混淆指纹的浏览器。它们会让你的设备看起来和成千上万其他人的设备一模一样。
- 搜索习惯的改变:
- Google 和 百度 是最大的数据收集器。
- 对策: 改用 DuckDuckGo 或 Startpage。这些搜索引擎承诺不追踪用户,不记录搜索历史。
- 账号隔离(马甲战术):
- 不要用同一个 Google/微信/Apple ID 登录所有应用。
- 对策: 准备专门的“垃圾邮件邮箱”(Burner Email)用于注册那些不重要的服务。购物用一个号,社交用一个号,看视频用一个号,切断它们之间的数据关联。
2. 迷彩策略:数据污染(这是最高级的玩法)
既然躲不掉,那就**“搞乱它”。如果你不能阻止他们收集数据,那就给他们垃圾数据**,让算法生成的画像彻底失真。
- AdNauseam(广告恶心插件):
- 这是一个非常激进的浏览器插件。它的逻辑是:后台自动点击网页上的每一个广告。
- 效果: 在谷歌或Facebook的后台,你会被标记为一个对“猫粮”、“挖掘机”、“口红”和“量子物理”都感兴趣的怪人。当你的兴趣标签变成了几万个时,原本精准的画像就变成了一堆噪音,算法就无法对你进行精准投放了。
- 随机行为:
- 偶尔在视频网站上点开几个你完全不感兴趣的视频(比如你是男生,点开几个美妆视频放完)。这会扰乱推荐系统的权重。
3. 令人绝望的现实:为什么还是很难逃脱?
即使你做到了上面所有的一切,依然存在几个无法解决的**“上帝视角”**漏洞:
- 影子画像(Shadow Profiles):
- 这是最可怕的。就算你不使用社交媒体,你的朋友也会出卖你。
- 比如,你没有微信,但你的朋友手机里存了你的号码,上传了包含你照片的合影,甚至在聊天中提到了你的名字。算法可以通过分析你周围人的数据,勾勒出一个**“虚拟的你”**。Facebook 曾因此被诟病:他们甚至知道非用户的政治倾向和性取向,纯粹是推算出来的。
- 步态与行为识别:
- 现在的追踪不仅仅靠Cookie。你打字的速度、点击鼠标的节奏、甚至拿着手机走路时的轻微晃动(通过陀螺仪数据),都是你的生物特征。这些特征很难伪装。
- 跨设备追踪:
- 超声波信标(Ultrasonic Beacons)。一些APP会在后台播放人耳听不见的高频声音,而你身边的电脑或平板麦克风能听到。通过这种方式,广告商知道这台手机和那台电脑属于同一个人,从而把数据打通。
总结
在算法时代,隐私不再是“拥有秘密”,而是“拥有对自己信息的控制权”。
要做一个完全的“隐形人”是徒劳的,但做一个**“模糊的人”是可行的。通过增加数据噪音和使用阻断工具,你可以让算法觉得你是一个“难以预测的、混乱的用户”**,从而降低被精准操控的风险。
Would you like me to ...
既然聊到了对抗技术,您想听听另一个更具攻击性的领域吗:“社会工程学”(Social Engineering)——也就是黑客是如何不通过写代码,而是仅仅通过聊天和心理操纵,就骗走密码或入侵企业的?(这是那个著名的黑客凯文·米特尼克的拿手好戏)。
第二:两个变量之间有先后。
是先有市场,才导致人们合作,还是人们倾向于合作,导致了市场的出现呢?《悦创日课》里提到的研究说,是市场导致合作。
因果关系,必须原因在前,结果在后。
补充讲解
核心逻辑:为什么说“市场在前”?
要理解这个因果关系,我们首先要定义什么是“市场”。在这里,市场 = 交换的需求和机制。
在这个视角下,逻辑链条是这样的:
- 欲望与稀缺(起点): 我有苹果,但我想要梨。你手里有梨,但你想要苹果。
- 理性的算计(动机): 如果我抢你的梨,你可能会打我,我可能受伤(成本高);如果我用苹果跟你换,我们都能满足(收益高)。
- 市场行为(机制): 这种“我想换”的念头,就是市场的萌芽。
- 合作(结果): 为了完成这个交换,我们必须达成协议:“不打架,一手交钱一手交货”。这种“不打架、讲规则”的行为,就是合作。
结论: 是因为有了“交换(市场)”的动力,才迫使两个互不关心、甚至互相敌视的人,坐下来“合作”。
举个经典例子:面包师为什么给你面包?
经济学鼻祖亚当·斯密说过一句很著名的话,完美解释了“市场导致合作”:
“我们要吃饭,不能指望屠夫、酿酒师和面包师的慈善,而是要指望他们对自己利益的关切。”
- 场景: 你饿了,走进一家面包店。你和面包师素昧平生,他凭什么把辛苦烤的面包给你?
- 如果是“先有合作”: 那意味着面包师必须先爱你,或者先把你当兄弟,才会给你面包。这在陌生人社会是不可能的。
- 现实是“先有市场”:
- 面包师想赚钱(市场动机)。
- 你想吃面包(市场需求)。
- 为了赚钱,面包师不得不和你合作,他对你笑脸相迎,保证面包卫生,按时开门。
这一连串的“友好合作”,都是由“想赚钱(市场)”这个原因逼出来的结果。
时间线推演:从原始部落看因果
让我们回到人类社会早期,看看这个“先后”是怎么发生的:
- 状态 A(无市场): 两个不同的部落相遇了。没有交换的需求。
- 结果: 互相也是陌生人,不仅没有合作,甚至可能直接开战,抢夺地盘。
- 状态 B(市场萌芽): 部落甲发现部落乙手里有盐,而自己手里有多余的兽皮。
- 原因(市场): “想要盐”的欲望产生了。
- 推演: 为了得到盐,直接抢可能两败俱伤。怎么办?
- 结果(合作): 于是部落首领决定:“大家把刀收起来,我们派人去跟他们谈谈,用皮换盐。”
在这个瞬间,贸易(市场)创造了和平(合作)。著名的思想家孟德斯鸠也提出过**“贸易带来和平”**的观点:哪里有商业,哪里的人际关系就会变得温和,因为打仗会断了财路。
- 状态 A(无市场): 两个不同的部落相遇了。没有交换的需求。
为什么这个观点很有说服力?
支持“市场导致合作”主要有以下两个强力理由:
- 突破血缘限制:
- 靠情感和本能的合作,只能局限在家庭和熟人之间(小圈子)。
- 只有市场机制,能让一个中国人和一个巴西人,虽然这辈子都没见过面,语言也不通,却能通过买卖大豆紧密地合作。是全球市场把他们连在了一起。
- 强制性信任:
- 在市场上,为了做成生意,你必须守信用。一个总是骗人的商家会被市场淘汰。
- 所以,是市场这只“无形的手”,逼着坏人也得装作好人去合作,否则他就活不下去。
- 突破血缘限制:
总结
回到一开始的提问: 先有“想交换、想获利”的动力(市场),为了实现这个目的,人们才被迫或主动制定规则、放下敌意,形成了(合作)。
如果没有交换利益的驱动,陌生人之间很难产生大规模的、长期的合作关系。
❌「人类天生爱合作 → 所以出现市场」
这个说法的问题在于:
- 如果人类天然就强烈合作
- 那为什么历史上大量是冲突、抢夺、战争?
- 如果合作先于市场
- 那合作靠什么长期维持?
- 靠情感?靠道德?靠善意?
- 没有稳定规则
- 合作规模无法扩大
- 只能停留在熟人、小群体
👉 所以:“合作倾向”本身,不足以产生市场。
- 如果人类天然就强烈合作
✅「市场出现 → 合作被激活、放大、稳定」
这个解释满足因果要求:
- 时间顺序合理
- 先有规则、价格、交换机制
- 再出现大规模合作
- 机制清晰
- 市场降低了合作风险
- 市场降低了信任成本
- 可验证
- 哪里市场越成熟,陌生人合作越多
- 哪里规则崩溃,合作立刻退化
👉 所以可以非常严谨地说一句:市场不是合作的结果,而是合作的“制度前提”。
不是因为人们爱合作,才有市场;而是因为有了市场,人们才“敢”合作、“能”合作、“持续”合作。
合作在这里不是道德行为,而是制度诱导下的理性选择。
- 时间顺序合理
不要拿量子力学怼这个条件,量子力学只能用在自然界,不能用在人类社会这个层面。还有一些观点认为,人类社会存在反因果的案例,但我认为说服力都不足。当然,如果有了确切的证据,学术共同体有了新的共识,我们再调整认知。
第三:两个变量之间的关系不被第三个变量解释。
举个例子:
我们可以观察到,城市女性的生育率比农村女性低,我们可以说是城市导致的生育率低吗?不能。因为中间还存在第三件事——教育程度。统计发现,教育程度高,生育数量就少,而城市女性普遍比农村女性教育程度更高。所以,教育程度更好地解释了城市和农村之间生育率的差别。
明白了这个条件,我们就可以解决开头玫瑰花和汽车的问题了。
工程师在现场发现,这家超市很奇怪,卖百合花的地方和卖玫瑰花的不在一个地方。百合花离停车场近,玫瑰花离停车场远。这样,女士买百合,回来车还是热的,很容易发动;买玫瑰,回来车就凉了,导致车辆冷启动困难,于是就发动不了。这才是真正的因果关系,和你买的是百合还是玫瑰没有关系。
以上,我们的讨论仅仅局限在两个变量之间。但是,现实世界是普遍联系的,各种事情交织在一起,这时候怎么寻找因果关系呢?
整体思路是这样的:
先建立所研究问题整体的运行图景,说明各个变量之间的联系。然后去收集数据,让数据逼近这个理论图景。再然后,用数据验证这个理论。如果验证通过,就对理论更相信一点。如果不通过,就改进理论或者收集新的数据,再次验证。如此循环下去。
2. 反事实难题
可能你会好奇,为什么寻找因果关系就这么难呢?一句话,因为缺少数据。
你说,这个很容易解决,收集数据不就完了吗?你想简单了。有的事情就是没有数据。不信看个例子——统计发现,上过大学的人比没有上过大学的收入更高。那么,上过大学是不是收入高的原因呢?
我们看看标准做法:比较两组人,一组上过大学,另一组没有,然后看看10年后这两组人的工资差异。对吗?
补充
直觉的陷阱:直接比较是错的
我们普通人的直觉是:找两群人,A 群上过大学,B 群没上过大学,看谁工资高。如果 A 群高,那就是大学的功劳。
这本身是有点:不靠谱。
- 原因: 这两群人本来就不一样。
- 通俗解释: 能考上大学的人,可能本来就更聪明、更有毅力、家庭条件更好。这些特质本身就会让他们在未来赚更多钱。
- 结论: 你看到他们收入高,可能不是因为“读了大学”,而是因为他们“本来就很强”。大学只是锦上添花,甚至可能是个筛选器,而不是原因。
核心难题:“反事实难题”(平行宇宙)
文中提到的“反事实难题”,其实就是说我们缺少“平行宇宙”的数据。
如果要绝对科学地证明上大学是导致你高收入的原因,我们需要做这样一个实验:
- 宇宙 A: 18 岁的你,去上了大学,30 岁时年薪 50 万。
- 宇宙 B: 18 岁的同一位你,强行没让你上大学,30 岁时年薪 10 万。
比较结果: 因为是同一个你(基因、家庭、性格完全一样),唯一的变量是“大学”。如果宇宙 A 赚得多,那才是大学的功劳。
现实的无奈: 现实中只有一个宇宙。你上了大学,就永远无法知道“如果你没上大学会怎样”。这就是“缺少数据”,也就是“反事实难题”。
我们该怎么理解因果关系?
既然无法通过“平行宇宙”来验证,给你三个重要的认知法则,帮助我们理性看待这个问题:
- 看群体,别看个人(概率游戏):我们没法保证你上大学一定赚大钱。但我们知道,从几百万人的平均值来看,上大学的人群通常比没上大学的人群收入高。这是一种大概率事件。「个人不能做到对照组是同一个人,但是群体可以做到是同一个群体」
- 接受不确定性(会有反例):正如你所说,“肯定存在反例”。比尔·盖茨没读完大学也是首富,但这属于极少数。对普通人来说,上大学是提高成功“概率”的手段,而不是买到了“必胜”的彩票。
- 保持谦虚(局限性):哪怕是做科学实验,结论也不一定能套用到所有人身上。
一句话总结:上过大学不一定是某个人收入高的绝对原因(因为他可能本来就很优秀),但在宏观的社会统计上,它是一个提升高收入概率的重要因素。
补充 2:五步分析法来拆解这两个案例
案例一:“游泳选手的身材迷局”
这个案例来自《黑天鹅》作者塔勒布的一个著名观察。
- 第一步:看现象(直觉的陷阱)
- 现象: 你打开电视看奥运会游泳比赛,发现职业游泳运动员的身材都极其完美:倒三角、宽肩膀、流线型。
- 直觉: “哇,游泳真能塑形!只要我去游泳,我也能练成那样的身材。”
- 第二步:找漏洞(人是不一样的)
- 比较两组人: 你拿职业游泳选手和你家楼下从不运动的大爷比,当然不一样。
- 但是: 是因为游泳把他们“练”成了这样吗?不完全是。残酷的真相是:只有天生拥有这种“适合游泳的身材”的人,才能坚持下来并成为职业选手。 腿短、身体笨重的人,早就在层层选拔中被淘汰了。
- 第三步:想办法(寻找“平行宇宙”)
- 理想实验: 找一个天生骨架小、微胖的人(比如咱们普通人)。
- A 时空: 让他每天游 8 小时,坚持 10 年。
- B 时空: 让他躺平 10 年。
- 比较: A 时空的他可能会紧致一些,但他绝不会变成菲尔普斯那种身材,因为骨架改不了。
- 第四步:面对现实(反事实难题)
- 你只看到了“幸存者”(成功的游泳选手),没看到那些游了很久但因为身材不合适而放弃的人(缺失的数据)。
- 结论: 并非游泳让人身材好,而是身材好的人被筛选去游了泳。身材是“门槛”,而不是“结果”。
- 第一步:看现象(直觉的陷阱)
案例二:“医院让人死亡?”
这个案例虽然极端,但最能说明因果关系的荒谬。
第一步:看现象(直觉的陷阱)
现象: 统计发现,死在医院里的人,远远多于死在麦当劳里的人。
直觉(荒谬版): “天哪,医院太危险了,去医院会导致死亡!为了长寿,我生病了应该去麦当劳,那里死人少。”
第二步:找漏洞(人是不一样的)
- 比较两组人: 去医院的人和去麦当劳的人,是同一类人吗?
- 显然不是: 去医院的人通常已经病得很重了;去麦当劳的人通常活蹦乱跳。
- 本质差异: 是“生病”导致了他们去医院,同时也是“生病”导致了死亡。
第三步:想办法(寻找“平行宇宙”)
- 我们要验证“医院是否导致死亡”,得看同一个重病患者:
- A 时空: 重病患者去了医院。结果:可能救活了,也可能没救过来。
- B 时空: 同一个重病患者强行送去麦当劳。结果:大概率直接挂了。
第四步:面对现实(反事实难题)
- 因为我们无法看到把重病患者送去麦当劳的后果(没人会做这种实验),所以数据上看似“医院死人多”。
- 但在反事实的逻辑推演下,我们知道:去医院反而降低了死亡的概率(虽然还是有人死,但比不去好)。
总结这两个案例:
你看,这两个案例和“上大学导致收入高”是不是一个模子刻出来的?
- 游泳案例 = 筛选效应
- 上大学也是一种筛选,本身智商高、能力强的人才容易考上(就像身材好才去游泳)。
- 医院案例 = 状态差异
- 去医院的人本身就病了(上大学的人本身条件可能就不同)。
通俗得不能再通俗的总结: 当你下次再看到“做 A 的人比不做 A 的人更好/更坏”时,先别急着信,问自己一句:“这帮做 A 的人,是不是本来就跟别人不一样?”
- 游泳案例 = 筛选效应
但是,这两组人真的一样吗?不一定。一个人能上大学,所以他才上了大学,另一个人不能上大学,因此没有上大学,这很可能就是两类人。另外,上大学这个因素,对这两类人的影响可能是不一样的。适合上大学的,大学对他们很重要;不适合上大学的,上了大学可能影响也不大。所以,这样做是不行的。
如果真要确定上大学是不是收入高的原因,就要比较同一组人。但是,一个人不可能既上过大学又没有上过大学,所以我们永远缺少数据。这就是社会科学中做因果关系的本质难题。这个难题有一个名字值得你记住,叫“反事实难题”。
相对而言,自然科学家就很幸福。这个光子跟那个光子完全相同,对一个光子做测量,就是对全宇宙所有的光子做测量,得出的结论可以适用于全宇宙。
因为这个反事实难题的存在,在社会领域推断因果关系时,我们必须牢记以下三个重要的认知:
我们只能对群体做因果推断,不能对个体做因果推断。
因为一个人不能既上了大学又不上大学,所以对于单独的个体,我们就不能做因果推断。我们只能在平均的意义上比较两组人,然后做出推断。
我们只能对因果关系做概率表述,不能做确定性的表述。
当我们说上大学可以提高收入的时候,只是概率性的。大部分上了大学的人比大部分没有上过大学的人收入高,但肯定存在反例。
随机试验不能完全解决问题,推广到总体时要很小心。
随机试验仅仅是对一部分人做试验,这部分人能不能代表人类整体,不能想当然。
3. 辛普森悖论
因果关系的确定之所以那么难,除了反事实难题之外,还在于确认因果关系的过程中有很多陷阱。时间有限,这里就提一个主要的,就是大名鼎鼎的“辛普森悖论”。
这是一件真事。一所美国大学的校方要求,每一个系招研究生时,女生的录取率必须高于男生。但是,校长拿到汇总表后发现,男生的录取率还是高于女生。于是校长大怒,下令追查是哪个系不听话。但是,等看到各系招生明细表时,校长傻眼了,他发现,每一个系的招生都是女生的录取率多于男生。
补充
第一步:还原“大学招生”现场
我们设定这所大学只有两个系:理工系(很难进,录取率低)和 人文系(很容易进,录取率高)。
校长的要求是:每个系女生的录取率都要高于男生。
分组数据(各系明细表)
这时,校长拿到了各系的明细表,情况如下(注意看粗体字的对比):
院系 性别 申请人数 录取人数 录取率 结果 理工系 (难进) 女生 100 20 20% 女生胜 (20% > 10%) 男生 1000 100 10% 人文系 (易进) 女生 1000 800 80% 女生胜 (80% > 70%) 男生 100 70 70% 校长的观察(分组视角):
理工系:女生录取率 20% > 男生 10%。(达标)
人文系:女生录取率 80% > 男生 70%。(达标)
结论:确实如系主任所说,每个系女生都比男生容易被录取。
第二步:见证“悖论”发生
接着,校长把两个系的数据加在一起,看全校的总表。
汇总数据(全校总表)
性别 总申请人数 总录取人数 全校录取率 女生 1100 20 + 800 = 820 74.5% 男生 1100 100 + 70 = 170 15.5% (注:此处为了演示悖论效果,通常需要极端的样本分布。在上述经典数学模型中,若调整人数比例,极易出现男生总录取率反超的情况。)
我们要制造“男生反超”的完美数学模型,其实是这样的:
【修正后的数据模型】
- 女生(喜欢申请难进的系): 100 人申请理工(录取10人,率10%),10 人申请人文(录取 5 人,率 50%)。
- 男生(喜欢申请易进的系): 10 人申请理工(录取 0 人,率 0%),100 人申请人文(录取 40 人,率 40%)。
再次对比:
- 看单系:
- 理工系:女生 10% > 男生 0% (女生赢)
- 人文系:女生 50% > 男生 40% (女生赢)
- 看总数:
- 女生总录取率:(10+5)/110 = 13.6%
- 男生总录取率:(0+40)/110 = 36.3%
最终结果: 男生总体录取率 (36.3%) 竟然远高于女生 (13.6%)!这就是让校长大怒的原因。
第三步:深度解析(为什么会这样?)
这个悖论产生的原因在于**“混杂因素”(在统计学中也叫潜伏变量)。在这个故事里,这个隐藏的陷阱就是“申请的难度”**。
- 权重的力量: 女生虽然在每个系都略微占优,但她们绝大多数(100人)都去“死磕”那个极难录取的理工系。这导致她们的整体分母被“难录取”这个大背景拉低了。
- 聪明的(或幸运的)选择: 男生虽然在每个系都略微劣势,但他们绝大多数(100人)都选择了容易进的人文系。这让他们的“基本盘”非常稳。
一句话总结: 结构(选择哪里)比单点表现(录取率多少)更能决定整体结果。
第四步:A/B 测试中的应用
第二个例子(A/B测试)逻辑是一样的。
- 背景: 20万用户做测试,看红色标题好还是黑色标题好。
- 陷阱: 如果你的分组不均匀。
- 比如:你看似随机分了组,但实际上“红色组”里全是老用户(本身点击率就低),“黑色组”里全是新用户(本身点击率就高)。
- 结果:黑色组点击率大胜。
- 决策:全站改成黑色。
- 真相(辛普森悖论): 其实如果是同一个用户群,红色可能更吸引人。但因为引入了“新老用户”这个混杂因素,导致数据被扭曲,得出了错误的因果关系。
总结
想告诉你的核心观点是: 因果关系很难确定,因为数据是可以“骗人”的。 当我们只看汇总数据(总录取率、总点击率)而忽略了内部结构(如院系难度、新老用户比例)时,我们很容易得出完全错误的结论。
补充 2
先给一句“人话版”结论(先有整体感)
辛普森悖论:
👉 在每一个分组里都成立的结论,
👉 在把所有组加在一起之后,
👉 可能会 完全反过来。
注意三点关键词:
- 分组里成立
- 总体里反转
- 可能,不是一定
第一个故事:大学招生(一步一步拆)
① 校方定的规则(原因)
校方下了一条明确的政策:每一个系招研究生时:女生的录取率 必须高于 男生。
这里的因果逻辑是:
- 原因:校方要求提高女性录取
- 结果:女生录取率应高于男生
② 校长看到“汇总表”(第一次震惊)
校长拿到的是全校汇总数据,发现:❌ 男生的整体录取率 反而高于 女生
这一步给校长的直觉是:“肯定有系违规了!”——这是人类非常自然的反应。
③ 校长查“各系明细表”(第二次震惊)
结果发现:
✅ 每一个系
👉 女生的录取率
👉 都 高于 男生
没有一个系违规。
④ 矛盾出现了(悖论产生)
我们同时得到了两个“都是真的”结论:
层级 结论 每个系 女生录取率 > 男生 全校总体 男生录取率 > 女生 这在直觉上是不可能同时为真的,但现实中它真的发生了。👉 这就是 辛普森悖论。
为什么会这样?(核心机制)
关键不在“录取率”,而在 分布:不同性别,报考的系不一样。
一种典型情况是:
- 女生更多报考:竞争极其激烈的系(整体录取率很低)
- 男生更多报考:相对容易录取的系(整体录取率较高)
结果就是:
在每个系内部:女生都更容易被录取(比例更高)
但在总体上:
- 女生集中在“难录取”的系
- 男生集中在“好录取”的系
📌 总录取率 = 录取率 × 人数分布
分布一变,总结论就会翻转。
把故事抽象成一句话(非常重要)
在分组比较中都占优势的一方,可能会在总评中失势。
第二个故事:A/B 测试(为什么工程师也会中招)
① A/B 测试的基本逻辑
- A 方案:红色标题
- B 方案:黑色标题
- 各给 10 万用户看
如果结果是:红色点击率 > 黑色👉 那就全站换红色
② 隐藏前提(很多人没意识到)
这个结论默认了一个前提:这 20 万测试用户 能代表所有用户。
但现实中常常不是。
③ 辛普森悖论如何出现?
举个常见但隐蔽的情况:
- 测试组里:红色方案被更多“活跃用户”看到
- 全量用户里:红色方案会被大量“低活跃用户”看到
结果:
- 在测试区:红色效果更好
- 在全站:红色反而更差
👉 结论在总体中被“反转”了
为什么这是“因果陷阱”?
因为它会让你犯一个非常致命的错误:
❌ 把“统计相关”
❌ 当成“真实因果”
你以为你找到了原因:
- “红色标题更好”
- “女生更容易被录取”
但其实你忽略了一个隐藏变量:
- 专业分布
- 用户结构
- 场景差异
这件事有多严重?(作者给出的现实数据)
来自一线策略产品经理的经验估计:
约 20% 的真实工作场景中,都可能遇到辛普森悖论。
⚠️ 20% ≠ 小概率
⚠️ 这是一个工程级、决策级风险
最后用一句“认知警告”收尾
只看总体数据,可能是错的,只看分组数据,也可能是错的
👉 真正困难的不是算数据,
👉 而是判断:“我现在该不该分组?按什么分?”
那句话:因果关系之所以难,不是因为人不聪明,而是陷阱太多。
如果抽象一点,这件事的意思是说,在分组比较中都占优势的一方可能会在总评中失势。注意,是可能,不是一定。
我再说另一件真事。你听说过互联网公司都要做 A/B 测试吧?比如,A 方案标题用红色,B 方案标题用黑色,然后分配 20 万用户测试一下,10 万人看见红色,10 万人看见黑色。如果红色标题的点击比黑色的高,那全站就采用 A 方案,把所有的标题都改成红色的。
问题就在于,分配的这两个组的 20 万用户是不是准确代表了全量用户的情况。如果有些时候不能代表,就会产生辛普森悖论,在实验区成立的结论在全量区被逆转。
这种情况有多严重呢?据一位在内容推荐领域一线的策略产品经理的实战估计,在他自己的工作中,这种情况出现的概率小于20%[1] 。20%,可不算是小概率事件了。
学习完理解数据,下一讲,我们进入课程的新模块,如何操纵数据。
我是悦创,我们下一讲见。
划重点:
- 两个变量之间因果关系成立的必要条件有三个:一,两个变量有相关;二,两个变量有先后;三,两个变量的关系不能被第三个变量解释。
- 因果关系的寻找是一项重大挑战,没有保证成功的一般法则。其中,最大的困难就在于反事实难题的存在。
- 面对现实问题,我们能做的就是猜测、验证和迭代。如果对因果关系的追寻有一个总原则的话,那就是保持谦卑。
3. 补充故事
除了刚才看到的“大学招生”案例(其实它的原型就是著名的 1973年加州大学伯克利分校性别歧视案),这里还有两个非常经典的 真实案例 ,分别涉及 “救命的手术” 和 “生死的误判” 。
通过这两个故事,你能更深刻地理解:为什么透过数据看本质,必须找到那个“藏在背后的第三者”。
3.1 故事一:肾结石治疗方案之争(医疗界的经典案例)
这是 1986 年发表在《英国医学杂志》(BMJ) 上的一项真实研究。
3.1.1 故事背景
医院有两种治疗肾结石的方法:
- 方案 A(传统开刀手术): 创伤较大,医生觉得风险高。
- 方案 B(微创穿刺手术): 创伤小,看起来更先进。
医院统计了两种方案的总体成功率,结果如下:
| 治疗方案 | 总人数 | 成功人数 | 成功率 |
|---|---|---|---|
| 方案 A (开刀) | 350 | 273 | 78% |
| 方案 B (微创) | 350 | 289 | 83% |
直觉结论: 方案 B(微创)更好,成功率高达 83%,应该首选方案 B。
3.1.2 反转时刻(细分数据)
但是,医生觉得不对劲。因为临床经验告诉他们,开刀(方案 A)其实更靠谱。于是他们把病人按**“结石大小”**分成了两组,结果惊掉了下巴:
| 结石类型 | 方案 A (开刀) 成功率 | 方案 B (微创) 成功率 | 胜者 |
|---|---|---|---|
| 小结石 | 93% (81/87) | 87% (234/270) | 方案 A 胜 |
| 大结石 | 73% (192/263) | 69% (55/80) | 方案 A 胜 |
奇怪的现象出现了:
- 如果你有小结石,方案 A 更好(93% > 87%)。
- 如果你有大结石,方案 A 也更好(73% > 69%)。
- 但是合起来看,却是方案 B 更好!
3.1.3 为什么会这样?(讲解)
这里的**“隐藏第三者”**(混杂因素)是:病情的严重程度。
- 医生的选择偏差: 医生很负责,遇到大结石(疑难杂症)时,他们倾向于让病人做更有把握的方案 A(开刀)。所以方案 A 承担了绝大多数的“重病号”,这直接拉低了它的整体分数。
- 方案 B 的“红利”: 方案 B 处理的绝大多数都是小结石(轻症),容易治好,所以即使它技术不如 A,靠着大量的轻症患者,它的总分也“刷”上去了。
教训: 如果不看病情严重程度,盲目迷信大数据推荐的“高成功率方案”,可能会耽误重症患者的治疗。
3.2 故事二:吸烟反而更长寿?(威克姆研究)
这是一个发生在 1970 年代英国威克姆(Whickham)的真实调查,困扰了流行病学家很久。
3.2.1 故事背景
研究人员调查了当地女性的吸烟习惯和 20 年后的存活情况。 统计结果出来后,烟草公司简直想拿去打广告:
| 组别 | 总人数 | 20年后死亡人数 | 死亡率 |
|---|---|---|---|
| 吸烟者 | 582 | 139 | 24% |
| 不吸烟者 | 732 | 230 | 31% |
直觉结论: 不吸烟的人死亡率(31%)竟然比吸烟的人(24%)还要高!难道吸烟有利于长寿?
3.2.2 反转时刻(细分年龄)
只要稍微有一点常识,就知道这个结论是荒谬的。于是数据科学家把这些人按**“年龄段”**拆开来看:
| 年龄段 | 吸烟者死亡率 | 不吸烟者死亡率 | 胜者 |
|---|---|---|---|
| 18-44岁 | 5.0% | 2.7% | 不吸烟者 胜 |
| 45-64岁 | 26.0% | 18.0% | 不吸烟者 胜 |
| 65岁+ | 87.0% | 86.0% | 基本持平 |
真相大白: 在每个年龄段里,不吸烟者的存活率都更高(或持平)。
3.2.3 为什么会这样?(讲解)
这里的**“隐藏第三者”**(混杂因素)是:年龄。
- 吸烟者的构成: 在当年的调查中,吸烟的大多是年轻人。年轻人本身死亡率就很低,不管吸不吸烟,过 20 年大部分还活着。
- 不吸烟者的构成: 当时不吸烟的群体里,包含了很多老年人(因为身体不好戒烟了,或者那个年代老太太不吸烟)。老年人本身死亡率就高。
结果: 所谓的“不吸烟组”,实际上是一个“老年组”;而“吸烟组”,实际上是一个“青年组”。是用年轻人的命硬,掩盖了香烟的危害。
3.2.4 总结:如何识破这种骗局?
结合这三个故事(大学招生、肾结石、吸烟长寿),我们可以总结出识破辛普森悖论的核心心法:
当你看到两个组进行比较(比如:A 药比 B 药好,男生比女生录取率高),在下结论前,先问自己一个问题:
“这两组人,除了我们要比较的这个特征(如性别、药物)之外,还有没有其他极其重要的不同?”
- 大学案例: 区别在于“申请的专业难易度”。
- 结石案例: 区别在于“病情的轻重”。
- 吸烟案例: 区别在于“年龄的大小”。
3.3 辛普森悖论数据演示
下面我为你准备了一个完整的 Python 脚本。它不仅复现了我们刚才讲的“大学招生”和“肾结石”案例,还包含了一个自动检测辛普森悖论的函数。你可以直接运行它,见证“数据说谎”的时刻。
这里包含了:
- 数据构造:完全还原我们刚才讨论的极端案例数据。
- 分组分析:展示拆解后的真实情况。
- 汇总分析:展示合并后的“假象”。
- 自动化检测:教你如何写代码来自动报警“这里可能存在辛普森悖论”。
import pandas as pd
import numpy as np
def demo_simpsons_paradox():
print("="*50)
print("案例 1: 大学招生性别歧视之谜")
print("="*50)
# ---------------------------------------------------------
# 1. 构造数据 (完全还原刚才故事中的极端数学模型)
# ---------------------------------------------------------
# 我们创建每一行代表一组申请情况
data_admission = [
# 理工系 (A系 - 难进): 女生录取率(10%) > 男生(0%)
{'系别': 'A系_理工(难)', '性别': '男', '申请人数': 10, '录取人数': 0},
{'系别': 'A系_理工(难)', '性别': '女', '申请人数': 100, '录取人数': 10},
# 人文系 (B系 - 易进): 女生录取率(50%) > 男生(40%)
{'系别': 'B系_人文(易)', '性别': '男', '申请人数': 100, '录取人数': 40},
{'系别': 'B系_人文(易)', '性别': '女', '申请人数': 10, '录取人数': 5}
]
df_adm = pd.DataFrame(data_admission)
# 计算分组录取率
df_adm['录取率'] = df_adm['录取人数'] / df_adm['申请人数']
print("\n【步骤 1: 查看各系明细数据 (分组视角)】")
print("注意:在每个系里,女生的录取率都【高于】或等于男生")
print("-" * 30)
print(df_adm[['系别', '性别', '申请人数', '录取人数', '录取率']])
# ---------------------------------------------------------
# 2. 汇总数据 (忽略系别,只看性别)
# ---------------------------------------------------------
print("\n\n【步骤 2: 校长看到的汇总表 (全局视角)】")
print("注意:合并后,男生的录取率竟然【反超】了女生!")
print("-" * 30)
# 按性别分组求和
df_total = df_adm.groupby('性别')[['申请人数', '录取人数']].sum()
df_total['全校录取率'] = df_total['录取人数'] / df_total['申请人数']
print(df_total)
print("\n---> 结论: 分组看女生赢,总评看男生赢。这就是辛普森悖论。")
print("\n" + "="*50)
print("案例 2: 肾结石手术方案对比 (医疗数据)")
print("="*50)
# ---------------------------------------------------------
# 1. 构造数据 (基于 1986 年 BMJ 真实研究数据简化)
# ---------------------------------------------------------
data_kidney = [
# 小结石 (容易治): 方案A (93%) > 方案B (87%)
{'结石大小': '小结石', '方案': 'A_开刀', '总人数': 87, '成功人数': 81},
{'结石大小': '小结石', '方案': 'B_微创', '总人数': 270, '成功人数': 235},
# 大结石 (难治): 方案A (73%) > 方案B (69%)
{'结石大小': '大结石', '方案': 'A_开刀', '总人数': 263, '成功人数': 192},
{'结石大小': '大结石', '方案': 'B_微创', '总人数': 80, '成功人数': 55}
]
df_kidney = pd.DataFrame(data_kidney)
# 计算分组成功率
df_kidney['成功率'] = df_kidney['成功人数'] / df_kidney['总人数']
print("\n【步骤 1: 细分病情数据】")
print("注意:无论是大结石还是小结石,方案 A 的成功率都【更高】")
print("-" * 30)
print(df_kidney[['结石大小', '方案', '总人数', '成功率']])
# ---------------------------------------------------------
# 2. 汇总数据
# ---------------------------------------------------------
print("\n\n【步骤 2: 医院看到的总表】")
print("注意:方案 B 的总成功率竟然【更高】")
print("-" * 30)
df_kidney_total = df_kidney.groupby('方案')[['总人数', '成功人数']].sum()
df_kidney_total['总成功率'] = df_kidney_total['成功人数'] / df_kidney_total['总人数']
print(df_kidney_total)
def detect_simpsons_paradox(df, group_col, category_col, value_col, target_col):
"""
一个简单的通用检测函数
df: 数据框
group_col: 混杂因素列 (如 '系别', '结石大小')
category_col: 我们要比较的分类 (如 '性别', '方案')
value_col: 分母列 (如 '申请人数', '总人数')
target_col: 分子列 (如 '录取人数', '成功人数')
"""
print("\n" + "*"*30)
print(f"正在检测混杂因素: [{group_col}] ...")
# 1. 计算全局趋势
total_stats = df.groupby(category_col)[[value_col, target_col]].sum()
total_stats['rate'] = total_stats[target_col] / total_stats[value_col]
best_overall = total_stats['rate'].idxmax()
print(f"全局来看,表现最好的是: {best_overall}")
# 2. 计算分组趋势
df['rate'] = df[target_col] / df[value_col]
# 找出每个分组里表现最好的
# (这里做一个简化假设:只比较两个类别。如果是多类别会更复杂)
subgroup_winners = []
groups = df[group_col].unique()
paradox_detected = False
for g in groups:
sub_df = df[df[group_col] == g]
if sub_df.empty: continue
best_in_group = sub_df.loc[sub_df['rate'].idxmax()][category_col]
subgroup_winners.append(best_in_group)
if best_in_group != best_overall:
paradox_detected = True
print(f" -> 在分组 '{g}' 中,表现最好的是: {best_in_group} (与全局不同!)")
else:
print(f" -> 在分组 '{g}' 中,表现最好的是: {best_in_group}")
if paradox_detected:
print("\n🚨 警告:检测到辛普森悖论!")
print(f"即使 '{best_overall}' 在总评中胜出,但在某些(或所有)细分分组中它其实输了。")
else:
print("\n✅ 未检测到明显的辛普森悖论反转。")
if __name__ == "__main__":
demo_simpsons_paradox()
# 既然写了检测函数,我们来试一下那个“肾结石”数据
# 重新构造一下 DataFrame 方便传入函数
data_kidney = [
{'结石大小': '小结石', '方案': 'A_开刀', '总人数': 87, '成功人数': 81},
{'结石大小': '小结石', '方案': 'B_微创', '总人数': 270, '成功人数': 235},
{'结石大小': '大结石', '方案': 'A_开刀', '总人数': 263, '成功人数': 192},
{'结石大小': '大结石', '方案': 'B_微创', '总人数': 80, '成功人数': 55}
]
df_test = pd.DataFrame(data_kidney)
detect_simpsons_paradox(
df_test,
group_col='结石大小',
category_col='方案',
value_col='总人数',
target_col='成功人数'
)这段代码主要做了三件事,你可以把它们看作是一个数据分析师的“标准工作流”:
- 数据复原(Reconstruction): 我没有直接给结论,而是用
pd.DataFrame把我们在故事里讲到的数字一一列了出来。- 你可以看到: 在
data_admission里,我特意设计了女生申请 A系(难) 的人数是 100,而申请 B系(易) 的只有 10。这正是导致悖论的根源——样本分布不均。
- 你可以看到: 在
- 分组运算(Aggregation with GroupBy): 这是 Pandas 最强大的功能之一。
df.groupby('性别')这一行代码,模拟的就是那位“糊涂校长”的行为。它无视了内部结构(系别),直接把所有男生的申请数加在一起,所有女生的申请数加在一起。- 结果: 这一步操作直接导致了结论的反转。
- 自动化检测函数(The Detector): 在最后,我写了一个
detect_simpsons_paradox函数。- 逻辑: 它先看一眼“总冠军”是谁,然后深入到每一个“小组”里去看冠军是谁。
- 报警: 如果发现“小组冠军”和“总冠军”名字不一样(比如总冠军是方案B,但小组冠军全是方案A),它就会打印出
🚨 警告:检测到辛普森悖论!。
https://gemini.google.com/share/c07f65ab61f5
公众号:AI悦创【二维码】

AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,招收学员面向国内外,国外占 80%。全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh

数据源自《策略产品经理实践》,作者韩瞳。 ↩︎
更新日志
81c69-于4c286-于37e58-于3fce7-于1a3ba-于0adf5-于48441-于0958d-于7e251-于27cc4-于39aa9-于49f0d-于affa1-于f536f-于8708a-于b1d74-于8ea91-于979b0-于d546d-于22b58-于482cd-于


