假如把N个人分成一组,至少有两个人是同一天生日的概率是多少?
现在来猜一猜:假设这一组有N=30个人。那么有两个人在同一天吃生日蛋糕的概率是多少呢?我们换个说法:你敢不敢用10美元赌里面有两个同月同日生的人?
我们会以这个例子收尾,但首先我们需要收集所有的元件(也就是下文标题部分),才能解开生日谜题。
基础中的基础
为了充分“卖弄学问”,我们就略去惹人白眼的引言部分:概率的数值在0和1 之间(如果喜欢的话,你还可以说它在0%到100%之间)。好的。现在你明白为什么“我1000%确定他们会迟到”一类句子会让数据猿急得跳脚。
分析概率的三种方式
人们在分析概率时,常用三种方法:
- 基于事件的概率(包括列举事件,计算事件数量)
- 基于频率的概率(包括用代表事物在平行宇宙中的收束方式的分布)
- 主观概率(包括代表人对于可能发生情况的信念的分布,尤指通过赌注的方式……毕竟不空口说白话可以避免胡说八道)
假如你的统计课老师没有一字一句地强调基础要点,那笔者告诉你,课本将提到以下内容:
基于事件的概率
概率=[分子]/[分母]
前几章会从基于事件的概率分析方法开始。因为通过这种方法人们能很容易地就获取到基本信息,而且或许大部分人(你懂的)已经有这方面的直觉。举个例子:投掷一枚硬币背面朝上的概率是?1/2. 投掷骰子出现6点的概率是多少?1/6.为什么会这样?
分子:所考察的事件可能发生的次数
分母:任何(有关)事件发生的次数
就一枚硬币来说,分母即所有相关事件是正面朝上和背面朝上。这就是分母2的来源。很简单。
细数事件
要想处理基于事件的概率问题,我们首先需要列举出所有的事件并记录事件的数量。这也就是为什么教材很可能会不停地讲如何组合分析,直到你彻底看烦。组合分析能教你掌握计算(针对所求分子和分母的)事件数量的方法。
回顾在作业中出现无数遍的问题,无非是关于:“从100名候选人中选出19名委员有多少种方式?”(17310309456440种)或者是“一组4位数密码共有多少种组合可能?”(1000种)。
在基于事件的世界里,所有的时间群发生的概率相等,因而它们在算法中不受各个层的凌乱的调节器影响。在这个世界里,抛出去的每枚硬币的正反面朝上的概率相当,所有投掷的骰子出现的数字平衡,所有的卡牌都无需重排,所有的人的出生日期的分布均等。
对于生日问题,我们需要快速了解什么是计数:
“AND”要求对(x)计数进行吃乘积。 “OR”要求对(+)计数进行叠加。
你可以去查找证据……或者快速阅读这个例子,满足自己的求知欲:如果有2种素食套餐和3种肉食套餐可供我选择,那么一共有多少种选择呢?答案是2+3=5种可能。假如我确定会选择一个主餐,要从2份甜品之中选择一样,这种情况下会有多少种套餐组合呢?答案是共有5x2=10种。不信吗?你可以找几道菜,把所有组合一一写出来。
随机组合的套餐是素食的概率是多少?
分子= 2x2=4;;分母=10
答案=4/10=40%
超越事件
现在看了三章,但突然教材中有关组合分析的内容全部消失了。当你入门排列组合的时候,它们就销声匿迹了。与此同时,分布变得无处不在。发生了什么?
可以思考如下问题:“你需要至少等待十分钟才能上公交车的概率是多少?”这会是一个很难“数”出来的问题(到底需要多少秒呢?),计数在这里甚至会变得有些棘手,因为你不能用计数的方式分割时间这个连续的介质。更糟的是,有些公交车司机可能会根据公交车的延迟程度,考虑是否停下来抽烟休息。你怎么能列举这种情况?不可能做到的。也许计数在这里根本不适用…..
学习基于频率的概率定义时,将遇到这种说法:“如果上文事件在无限平行宇宙中发生(限定,或者假设这一事件受某些规则制约),有多少公交车会在超过十分钟以后到?”(平行宇宙?!难怪我们数据猿总是眼光清奇)
然后(通常是很久之后),当到达课本贝叶斯数据的主观概率定义章节时,你将可能根据你自己的感受建立分布。看见没有,在你被剥夺列举事件的能力后,剩下的是不是方法是不是很复杂?不过对于生日问题来说,假设所有366个生日出现的概率相同,我们还可以继续数数。
什么,你不喜欢我的假设?想开点吧,所有的统计数据都关乎假设——否则宇宙会陷入一片混乱。如果不喜欢我的假设,觉得我的方案不是你期待的,那就提出一套新的方案来。。我们可以随心所欲提出假设,数据也因此富有创造性。在这里我想不恰当地引用George Box的一句名言:“所有的解决方案都是错误的,但一旦某一个方案符合你一直以来的假设,那它就可能对你有用。”
没有称赞之意
解决生日问题的最后组件是补数,另一方面它也被称为NOT。
P(not A)= 1- P(A)
这个公式读作:“某一事件的概率(由于创造力有限,我们将其称为事件A)不发生的概率等于100%的概率减去该事件发生的概率。”
所以投掷骰子不出现点6的概率是多少呢?
答案是1-1/6=5/6
好的,这就是所有内容。现在准备解决生日问题了!
生日问题
问题是什么来着?
如果一组有N个人,至少出现两个人是同一天生日的概率是多少?
那就来搭建“乐高块”吧…..
生日问题的分母
一个人有多少种生日的可能呢,366种(上文提过)。
所以N=30时会有多少生日数量吗?
第一个人有366种可能,第二个人也有366种,第三个人也是366种……然后第N个人也是366种情况。把这N个366相乘就是结果了!
分母=366^ N,苍天好大一个数! N为30,结果就是一个76位数,比1000后面再跟24组“000” 的数还大(给事物命名不好玩吗?)
生日问题的分子
准备迎接令你晕头转向的部分吧。这里需要记录所有不同的可能,保证至少有两个人是同一天过生日。所以如果第一个人有366中选项,而第29个人有1个选项,因为需要和第一个人相符,但可能是第二个人或者第十七个人,抑或有三个人的生日在同一天,或者……不,试图将所有的可能选项记在脑海里会变得很乱。
……这就是为什么生日问题会成为一项很有趣的工程。在看诀窍之前需要绞尽脑汁(或者到网上跪求解题攻略。你是这样找到这条博文的吗?很好,我懂你了)。
解决生日问题的窍门
与其列举所有的两个以上的人在同一天生日的可能,不如将问题转化为一个更简单的切入角度:寻找问题对立面!
P(至少有两个人是同一天生日)=1-P(所有人都不是同一天生日)
所以我们只需要求以下问题的答案:“没有任何一个人与另一个人是同一天生日的概率是多少?”也就是说,所有人都不是同一天生日的概率是多少?
“所有人都不是同一天生日”的分母
答案仍然是366^ N。通过对问题的补数进行转化,我们将重点放到分子上,让分母保持不变。
“所有人都不是同一天生日”的分子
这就是神奇之处!
第一个人的生日有366种可能(贪婪的家伙)然而第二个人只有365种可能因为我们要求他们的生日不在同一天。如果第一个人的生日在10月8日,我们就把所有在10月8日过生日的人排除在外。这样每个样本中的成员的可能生日数量将越来越少。
所以366是第一个人的可能数量,而365是第一个人的可能数量而364是第三个人的可能数量……而(367-N)是第N个人的可能数量。
如果N 是30,将各个数相乘,见证奇迹!
366 x 365 x 364 x 363 x 362 x 361 x 360 x 359 x 358 x 357 x 356 x 355 x 354 x 353 x 352 x 351 x 350 x 349 x 348 x 347 x 346 x 345 x 344 x 343 x 342 x 341 x 340 x 339 x 338 x 337 = …
啊,又是一个76位数的数字。
但是,幸运的是,计算机会帮我们处理除法问题,如果操作得当的话。
也许这不是我们需要的
P(所有39个人的生日都不在同一天)=(366 x 365 x 364 x 363 x 362 x 361 x 360 x 359 x 358 x 357 x 356 x 355 x 354 x 353 x 352 x 351 x 350 x 349 x 348 x 347 x 346 x 345 x 344 x 343 x 342 x 341 x 340 x 339 x 338 x 337) / (366 ^ 30)
=0.3
最后,就是我们需要的数值!
P(30个人有人是同一天生日) = 1-0.3 =70%
在30个人的组中,有人是同一天的生日的概率是~70%。
我希望你没有赌10美元说,有人的生日在同一天的概率小于每个人的生日都不在同一天的概率……但是如果你真的赌了,我不反对把钱捐给维基百科。
赌错结果很可能是因为你低估了一组数据不重复的难度——如果你是在门口负责拦截所有与室内的人同一天生日的人的保镖,不久之后想进入房内的人就会失望。
这取决于你有多少个朋友……
我可以用两分钟,通过电脑上的R程序得出每一个N的概率。如果你好奇具体数值是什么(N等于23时概率为50%,N等于55时概率为99%),可以来体验我编写的代码串。可能不太好看,但绝对好用。无需下载,就可以在浏览器上运行。
- # Initialize settings for N = 1:
- probability <- 0
- numerator <- 366
- denominator <- 366# Loops are terrible in R, let's make one anyways:
- for (N in 2:80) {
- numerator <- numerator * (366 + 1 - N)
- denominator <- denominator * 366
- p <- 1 - (numerator / denominator)
- probability <- c(probability, p)
- }# Look at the answer to 2 decimal places:
- paste("For N =", 1:80, "prob is", round(probability, 2))# Plot!
- plot(1:80, probability, xlab = "Group Size", ylab = "P(Shared birthdays)", type = "l", col = "red", main = "The Birthday Solution")
我们学到了什么?
除了一些基本概率知识(处理概率问题的不同方法,分子和分母的计算方法),以及计数原则(加法原则和乘法原则)以外,这篇文章的主旨是,为什么需要以特定顺序解决特定问题。
为什么在教材开始,计数是重中之重,而在后续内容中,计数会淡出我们的视野,留下愤愤不平的我们?结果貌似说明每一种方法都对应着一种目的,每一种事件发生的概率相等这一前提对于专业人员来说,过于浅显,无法消化……即使在生日问题上也是如此。当业余人士想象数据分析猿每一天都在干什么的时候,他们首先想到的是数牌和抛硬币,这不是很好玩吗?辟谣跑断腿啊!
生日问题之所以是数据分析入门的经典问题,是因为这个问题上所需的脑力刚刚好:数据分析员需要学习如何转化问题,以使转化后的问题更便于解题。采取简单粗暴的办法将难以计算,因此需要另辟蹊径。如果你选择了数据分析的生活,时刻准备迎接一系列抛掷硬币和转化的问题。