同班五个孩子同名的概率

机器算法验证 可能性 组合学
2022-03-25 17:05:33

在婴儿命名论坛上,准父母一直在重复他们对詹妮弗的恐惧:“我不希望我的孩子成为班上 5 个以他的名字命名的孩子之一。” 问题是,再也没有一个名字能比得上那种受欢迎程度了,即使在詹妮弗热潮的高峰期,你也没有在一个班级里得到五个。我想为这些父母提供某种答案,即这种重复名字的巧合是多么不可能。

使用社会保障局广泛的婴儿姓名数据(https://www.ssa.gov/oact/babynames/limits.html),有人能告诉我如何计算美国小学班级有五个孩子的机会吗?同名的孩子?(为简单起见,“同名”是指相同的拼写,“学校班级”是指所有孩子都在同一年出生。)我没有指定班级人数,但绝对应该大于 4 . :-)

2个回答

所有数据都可以在这里找到。表中的每个值表示给定来自该位置和出生年份的 25 人样本的概率,其中 5 人将共享一个名字。

方法:我在每个名字上使用二项式 PDF来计算任何给定的 25 人班级有 5 个人同名的概率:

n = class size
k = 5,6,...,n 
p_i = (# of name[i]'s) / (total # of kids)

Pn(5+ kids share name)= namesk=5n(nk)pik(1pi)nk

例如,如果总共有 4,000,000 个孩子和 21,393 个 Emily,那么在 25 名学生的任何给定班级中有 5 个 Emily 的概率是 Binomial(25, 5, 0.0053) = 0.0000002。对所有名字求和并不能给出确切的答案,因为根据包含/排除原则,我们还必须考虑到多组 5 人共享名字的可能性。然而,由于这些概率对于所有实际目的几乎为零,我假设它们可以忽略不计,因此P(Ai)P(Ai)

更新:正如许多人指出的那样,随着时间的推移和州之间存在相当大的差异。所以我运行相同的程序,逐个州,随着时间的推移。以下是结果(全国概率为红色,个别州为黑色):

在此处输入图像描述

有趣的是,过去几十年来,佛蒙特州(我的家乡)一直是最有可能发生这种情况的地方之一。

请参阅以下 Python2 的 Python 脚本。

答案的灵感来自大卫 C 的答案。

我的最终答案是,根据https://www.ssa.gov/oact/babynames/limits.html “National Data “从 2006 年开始。

概率是根据二项分布计算的,其中 Jacob-Probability 是成功的概率。

import pandas as pd
from scipy.stats import binom

data = pd.read_csv(r"yob2006.txt", header=None, names=["Name", "Sex", "Count"])

# count of children in the dataset:
sumCount = data.Count.sum()

# do calculation for every name:
for i, row in data.iterrows():
    # relative counts of each name being interpreted as probabily of occurrence
    data.loc[i, "probability"] = data.loc[i, "Count"]/float(sumCount)

    # Probabilites being five or more children with that name in a class of size n=25,50 or 100
    data.loc[i, "atleast5_class25"] = 1 - binom.cdf(4,25,data.loc[i, "probability"])
    data.loc[i, "atleast5_class50"] = 1 - binom.cdf(4,50,data.loc[i, "probability"])
    data.loc[i, "atleast5_class100"] = 1 - binom.cdf(4,100,data.loc[i, "probability"])

maxP25 = data["atleast5_class25"].max()
maxP50 = data["atleast5_class50"].max()
maxP100 = data["atleast5_class100"].max()

print ("""Max. probability for at least five kids with same name out of 25: {:.2} for name {}"""
   .format(maxP25, data.loc[data.atleast5_class25==maxP25,"Name"].values[0]))
print
print ("""Max. probability for at least five kids with same name out of 50: {:.2} for name {}, of course."""
   .format(maxP50, data.loc[data.atleast5_class50==maxP50,"Name"].values[0]))
print
print ("""Max. probability for at least five kids with same name out of 100: {:.2} for name {}, of course."""
   .format(maxP100, data.loc[data.atleast5_class100==maxP100,"Name"].values[0]))

最大限度。25 个孩子中至少有 5 个同名孩子的概率:Jacob 名字为 4.7e-07

最大限度。50 个孩子中至少有 5 个同名孩子的概率:当然,名字 Jacob 的概率为 1.6e-05。

最大限度。100 个中至少有 5 个同名的孩子的概率:当然,名字 Jacob 的概率为 0.00045。

与大卫 C 的结果相同的 10 倍。谢谢。(我的回答没有总结所有的名字,应该可以讨论)