跳转至

3.3   联合概率

上一节里,小率学会了把“可能发生什么”放进样本空间里。可现实问题很少只问一件事。

天气预报里,我们不只关心“今天下雨吗”,还会关心“今天下雨并且我还出门跑步了吗”;抽卡游戏里,我们不只关心“抽到稀有卡吗”,还会关心“抽到稀有卡并且它正好是想要的角色吗”;数据分析里,我们也常常不只看“用户点击了吗”,还要看“用户点击并且下单了吗”。

均哥把小率过去 100 天的天气记录拿出来:“今天我们先不急着问‘在某种天气下跑步的概率’,只问一个更朴素的问题:两件事同时发生,占全部记录的多少?”

这就是 联合概率(Joint Probability)


3.3.1   “且”表示同时满足

先看这张 100 天记录表:

天气 该天气天数 其中跑步天数 同时发生的说法
下雨 20 天 4 天 下雨且跑步
刮风 30 天 27 天 刮风且跑步
晴天 50 天 30 天 晴天且跑步

这里的“且”,意思是两个条件都要满足。

比如“下雨且跑步”,不是所有下雨天,也不是所有跑步天,而是两者的交集:既下雨,又跑步。

图 3.3.1 用天气和跑步记录理解联合概率

图 3.3.1   联合概率看的仍然是全部 100 天,只是目标格子变成了“两件事同时满足”的格子。

在全部 100 天里:

\[ P(\text{下雨且跑步})=\frac{4}{100}=0.04 \]
\[ P(\text{刮风且跑步})=\frac{27}{100}=0.27 \]
\[ P(\text{晴天且跑步})=\frac{30}{100}=0.30 \]
所以联合概率的分母还是全部 100 天,只是分子要同时满足两个条件?
对。联合概率先别想复杂,它就是在全部范围里数“同时发生”的格子。

3.3.2   用交集写联合概率

如果用事件表示:

  • \(A\):今天下雨。
  • \(B\):今天跑步。

那么“下雨且跑步”可以写成:

\[ A\cap B \]

读作“\(A\)\(B\) 的交集”,也就是两个事件同时发生。

联合概率就是:

\[ P(A\cap B) \]

有些书也会写成:

\[ P(A,B) \]

它们表达的是同一件事:\(A\)\(B\) 同时发生的概率。

看到“并且”“同时”“既……又……”

题目里出现“并且”“同时”“既……又……”,通常就要想到交集 \(A\cap B\),也就是联合概率。


3.3.3   联合概率不是条件概率

小率很快问了一个容易混淆的问题:

“下雨且跑步是 \(4/100\)。那下雨时跑步是不是也是 \(4/100\)?”

均哥摇摇头:“不一样。你刚刚偷偷换了分母。”

问法 分母 计算
下雨且跑步的概率 全部 100 天 \(4/100=0.04\)
下雨时跑步的概率 下雨的 20 天 \(4/20=0.20\)

前者是联合概率:

\[ P(\text{下雨且跑步})=\frac{4}{100} \]

后者是下一节要讲的条件概率:

\[ P(\text{跑步}\mid\text{下雨})=\frac{4}{20} \]

两者都在数同一批“下雨且跑步”的格子,但分母不同,所以含义不同。


3.3.4   联合概率也可以由两步相乘得到

如果我们已经知道:

  • 下雨的概率是 \(P(\text{下雨})=0.20\)
  • 下雨时跑步的概率是 \(P(\text{跑步}\mid\text{下雨})=0.20\)

那么“下雨且跑步”的概率也可以写成两步:

\[ P(\text{下雨且跑步}) = P(\text{下雨})P(\text{跑步}\mid\text{下雨}) = 0.20\times0.20 =0.04 \]

一般地:

\[ P(A\cap B)=P(A)P(B\mid A) \]

也可以换个顺序:

\[ P(A\cap B)=P(B)P(A\mid B) \]

这两个式子说的是同一件事,只是走路的方向不同:

  • 先发生 \(A\),再在 \(A\) 的范围里看 \(B\)
  • 先发生 \(B\),再在 \(B\) 的范围里看 \(A\)

到这里,联合概率就接上了后面的两节:条件概率会解释“竖线右边为什么会改变分母”,全概率公式会把很多条联合路径加起来,而贝叶斯定理会在最后反过来问“看到结果以后,哪条路径最可能”。


3.3.5   用 Python 数联合概率

import pandas as pd

data = pd.DataFrame({
    "天气": ["下雨", "刮风", "晴天"],
    "天气天数": [20, 30, 50],
    "跑步天数": [4, 27, 30],
})

total_days = data["天气天数"].sum()
data["联合概率"] = data["跑步天数"] / total_days

print(data)

输出中的“联合概率”就是:

天气 联合概率
下雨且跑步 \(0.04\)
刮风且跑步 \(0.27\)
晴天且跑步 \(0.30\)

联合概率的第一要点很简单:不要只看事件名,要先问分母是谁。