誕生日のパラドックスを分かりやすく解説（Pythonプログラム付き）

# 誕生日のパラドックスとは？

**誕生日のパラドックス**（バースデーパラドックス）とは、ある集団において「同じ誕生日のメンバーが存在するか？」を考えたとき、その確率が**直感的／経験的に思い浮かべる数値よりも、実際はずっと大きくなる**というものです。

先日、小学校の学級定員を全学年で $35$ 名にしていくという報道がありましたが、<font color='red'>$35$ 名の集団を考えた場合、そのなかで**誕生日が同じ児童がいる確率**を計算すると「$81.4\\%$」にもなります</font>。

この $81.4\\%$ という確率が、私たちが直感的／経験的に考えたよりもはるかに大きい、というのが**誕生日のパラドックス**になります。確かに、自分の経験から考えても、高すぎる確率になっている気がします。

このパラドックスのカラクリは「同じ誕生日のメンバー（＝<font color='red'>**ペア**</font>）が存在するか？」という問いに対して、「<font color='red'>**自分と**</font>同じ誕生日のメンバーが存在するか？」という読替えをしてしまう点にあります。

実際に、<font color='red'>自分を含めて $35$ 名の集団において、**自分と同じ誕生日**のメンバーが存在する確率は「$8.9\\%$」にしかなりません</font>。

このエントリでは、このような「誕生日のパラドックス」について、丁寧に分かりやすく解説していきたいと思います。また、Python を使って、実際に数値を計算したり、グラフを描いていきたいと思います。

## 前提条件

以降の説明にあたり、次のような前提を置きます。

- 閏年は考えずに$1$ 年は $365$ 日とする。
- 誕生日の「ばらつき」は一様分布に従うものとする。
  - つまり、ある人について「$1$ 月 $1$ 日が誕生日である確率」と「$2$ 月 $1$ 日が誕生日である確率」は等しく $1/365$ とする。いわゆる「同様に確からしい」というやつです。

# 実行環境

プログラムは、GoogleColab.（Python 3.6.9）、matplotlib 3.2.2 での動作確認をしています。また、グラフで日本語を使うために `!pip install japanize_matplotlib` で、japanize_matplotlib をインストールしています。


```py:ライブラリのインポート
%config InlineBackend.figure_format = 'svg'
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.patheffects as patheffects
import japanize_matplotlib
```

# 準備1：**自分と**友人が同じ誕生日である確率


最もシンプルな例として、《自分と友人が同じ誕生日》である確率 $p$ を考えます。これは、少し考えてもらえれば分かるように $1/365$ になります。

ところで、この確率 $p$ は《自分と友人が同じ誕生日》という事象を $\mathrm{X}$ とすれば、その **余事象** $\overline{\mathrm{X}}$ を考えて、その確率 $P(\overline{\mathrm{X}})$ を、**全事象** $\Omega$ の確率 $P(\Omega)=1$ から引き算することでも、計算することができます。

$$ p = P(\mathrm{X}) = P(\Omega)-P(\overline{\mathrm{X}}) = 1-P(\overline{\mathrm{X}})$$

このケースでは《自分と友人が**違う**誕生日》が**余事象** $\overline{\mathrm{X}}$ であり、その確率 $P(\overline{\mathrm{X}})$ は $364/365$ となるので、上式に代入すれば $p$ は次のようになります。

$$ p=1-\frac{364}{365}= \frac{1}{365}$$

# 準備2：**自分と**友人達が同じ誕生日である確率

次に、《$\mathbf{2}$**名の友人**（A君とB君）のうち「少なくともどちらか」と、自分の誕生日が同じ》という事象 $\mathrm{X}$ の確率 $p=P(\mathrm{X})$ を考えます。この事象 $\mathrm{X}$ は、次の**どれか**に該当する事象となります。

- 自分とA君の誕生日が同じ
- 自分とB君の誕生日が同じ
- 自分とA君とB君の3名の誕生日が同じ

この確率 $P(\mathrm{X})$ を求めたいわけですが、これも、先ほど同様に余事象  $\overline{\mathrm{X}}$ を考えることで求めていきます。まず、余事象  $\overline{\mathrm{X}}$ は次のようになります。

- 自分とA君の誕生日が違う、なおかつ、自分とB君の誕生日も違う

《自分とA君の誕生日が違う》確率は $364/365$ です。また《自分とB君の誕生日が違う》確率も $364/365$ です。よって、それらが同時に起こる確率、つまり、$P(\overline{\mathrm{X}})$ は $(354/365)^2$ になります。

以上より、もともと求めたかった確率  $p=P(\mathrm{X})$ は次のように計算できます。

$$ p = P(\mathrm{X}) = 1-P(\overline{\mathrm{X}})= 1 - \left( \frac{364}{365} \right)^2$$ 

同様に考えれば、《$\mathbf{3}$**名の友人**（A君、B君、C君）のうち「少なくとも誰か」と自分の誕生日が同じ》という確率 $p$ は、次のようになります。

$$ p = 1 - \left( \frac{364}{365} \right)^3 $$ 


さらに、一般化して《$\mathbf{k}$ **人の知人**のうち「少なくとも誰か」と自分の誕生日が同じ》という確率 $p$ は、次のようになります。

$$ p = 1.0 - \left( \frac{364}{365} \right)^k$$ 

例えば、$35$ 人学級では、自分の他に $34$ 名のクラスメイトがいるので、そのなかで**自分と同じ誕生日**のクラスメイトがいるという確率 $p$ は、次のように計算できます。

$$ p = 1.0 - \left( \frac{364}{365} \right)^{34}=0.0891$$ 

```py:35人学級のなかで自分と同じ誕生日のクラスメイトがいる確率.py
k=34
p= 1.0-(364/365)**k
print(f'{p:.2%}') # => 8.91%
```

集団（ここでは自分を除いた集団）の構成人数 $k$ を変化させて確率 $p$ をプロットしてみると次のようになります。

```py:k人の集団のなかに自分と同じ誕生日の人がいる確率.py
k = np.arange(1,1000+1)
p = np.ones(len(k))*364/365
p = 1 - np.multiply.accumulate(p)

fig,ax = plt.subplots(facecolor='white')
ax.plot(k,p)
ax.set_yticks([0.25,0.5,0.75,0.9,1])
ax.set_xlim(1,k[-1])
ax.set_ylim(0,1)
ax.tick_params(direction='in')
ax.set_xlabel('集団の構成人数（人）')
ax.set_ylabel('集団のなかに自分と同じ誕生日の人が\n少なくとも1人は存在する確率（%）')
for pp in [0.5,0.75,0.9]:
  idx = np.where(p>=pp)[0][0] 
  ax.scatter(k[idx],p[idx],c='tab:blue')
  ax.axvline(k[idx],ymax=p[idx],ls=':',c='tab:blue')
  ax.annotate(f'k={k[idx]}',va='top', xy=(k[idx],p[idx]), xycoords='data',
              xytext=(3,-3), textcoords='offset points')

ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y,_: f'{y:.0%}'))
ax.grid(axis='y')
ax.set_axisbelow(True)
plt.show()
```

実行結果は次のようになります。<br>![2021-01-31_14h35_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/eb01b27a-f1bc-bd32-aa59-64266f270c73.png)

$253$ 人の知人がいて、その確率はやっと $50\\%$ に達することが分かります。$506$ 人で $75\\%$、$840$ 人で $90\\%$ になります。交友関係の広さにもよりますが、同じ誕生日の人と出会うことは、なかなか難しそうです。

ここで注意すべきは、あくまで「集団のなかに**自分と同じ誕生日**のメンバーがいるか？」を考えている点になります。「**誕生日のパラドックス**」で扱うのは「自分と同じ」という部分を除いて、その集団のなかで「**同じ誕生日を持つペアが** $1$ **組以上いるか？**」という話になります。

以下、具体的に考えていきます。

# ある集団（2名）のなかに誕生日が同じペアが存在する可能性

ここからは、対象とする事象 $\mathrm{X}$ の余事象 $\overline{\mathrm{X}}$ について、その**場合の数**を数え上げていくことで確率 $p$ を求めていきます。

## すべての場合の数

まずは、A君とB君から構成される $\mathrm{2}$ **名の集団**で考えてみます。A君の誕生日として考えられるのは「1月1日」から「12月31日」までの $365$ 通りです。同様に、B君の誕生日として考えられるのも「1月1日」から「12月31日」までの $365$ 通りです。

このとき、$2$ 人の誕生日の組合せは「A君が1月1日で、B君も1月1日」「A君が1月1日で、B君が1月2日」$\cdots$「A君が1月1日で、B君が12月31日」、さらに「A君が1月2日で、B君が1月1日」$\cdots$「A君が12月31日で、B君が12月30日」「A君が12月31日で、B君が12月31日」のようになるので、$365\times365=365^2$ になります。つまり、**全事象** $\Omega$ **の場合の数** $|\\{\Omega\\}|$ は $365^2$ になります。

$$ | \\{\Omega \\}| = 365^2 $$

## 余事象の場合の数

対象とする事象 $\mathrm{X}$ は《誕生日が同じペアが存在する》です。$2$ 名の集団では、ペアはA君とB君しか考えられないので、事象 $\mathrm{X}$ は《A君とB君の誕生日が同じ》と読替えもできます。さて、その余事象 $\overline{\mathrm{X}}$ は《A君とB君の誕生日が**違う**》となります。

この余事象 $\overline{\mathrm{X}}$ の場合の数は、$365 \times 364$ となります。なぜかと言えば、$2$ 人の誕生日が**違う**という組合せを列挙すると以下のようになるためです。


- A君の誕生日が「1月1日」で、B君の誕生日が**その日を除いた**1月2日から12月31日までのいずれかである（$364$ 通り）。
- A君の誕生日が「1月2日」で、B君の誕生日が**その日を除いた**1月1日と1月3日から12月31日までのいずれかである（$364$ 通り）。
- A君の誕生日が「1月3日」で、B君の誕生日が**その日を除いた**1月1日から1月2日と、1月4日から12月31日までのいずれかである（$364$ 通り）。
<br>～～～省略～～～
- A君の誕生日が「12月31日」で、B君の誕生日が**その日を除いた**1月1日から12月30日までのいずれかである（$364$ 通り）。

つまり、A君の誕生日として$365$ 通りが考えられ、それぞれについて、それとは一致しないB君の誕生日が $364$ 通り考えられるためです。よって、余事象 $\overline{\mathrm{X}}$ の場合の数 $|\\{ \overline{\mathrm{X}} \\}|$ は $365 \times 364$ と計算できます。

余事象 $\overline{\mathrm{X}}$ の確率 $P(\overline{\mathrm{X}})$ は、「余事象 $\overline{\mathrm{X}}$ の場合の数」を分子、「すべての場合の数」を分母として求められます。つまり、以下のようになります。

$$ P(\overline{\mathrm{X}})= \frac{|\\{\overline{\mathrm{X}}\\}|}{|\\{\Omega\\}|} = \frac{356\times364}{356\times365}=\frac{365\cdot 364}{365^2}$$

## 2名のなかで誕生日が同じペアが存在する確率

これより、もともと求めたかった事象 $\mathrm{X}$《誕生日が同じペアが存在する》の確率 $p=P(\mathrm{X})$ は次のようになります。

$$ p= P(\mathrm{X}) = 1- P(\overline{\mathrm{X}}) =1-\frac{365\cdot 364}{365^2}=\frac{1}{365} $$

# ある集団（3名）のなかに誕生日が同じペアが存在する可能性

つづいて、A君、B君、C君の**3名から構成される集団**において《誕生日が同じペアが存在する》という確率を考えてみます。厳密に書けば《誕生日が同じペアが少なくとも1つは存在する》であり、これには「A君とB君で一致」「B君とC君一致」の他に「A君とB君とC君で一致」のような場合も含みます。

## すべての場合の数

$3$ 名の誕生日の組合せとして考えられるすべての場合の数（**全事象** $\Omega$ **の場合の数**）を考えます。各個人の誕生日としては「1月1日」から「12月31日」までの $365$ 通りがあるので、$3$ 名の組合せとしては $365^3$ になります。

$$ |\\{\Omega\\}| = 356\times365\times365 = 365^3 $$

## 余事象の場合の数

事象 $\mathrm{X}$《誕生日が同じペアが存在する》に対する余事象 $\overline{\mathrm{X}}$ は《A君とB君とC君の誕生日が**すべて違う**》と言えます。

結論から言えば、この余事象 $\overline{\mathrm{X}}$ の場合の数 $|\\{ \overline{\mathrm{X}} \\}|$ は次のようになります。

$$ |\\{ \overline{\mathrm{X}} \\}| = 365 \times 364 \times 363$$

これは、次のように考えて導くことができます。

- A君の誕生日として <font color='red'>$365$</font> 通りを考えることができる。
- B君の誕生日としては、A君の誕生日と重複しない $365-1=$ <font color='red'>$364$</font> 通りを考えることができる。
- C君の誕生日としては、A君の誕生日ともB君の誕生日とも重複しない $365-2=$ <font color='red'>$363$</font> 通りを考えることができる。

以上より、余事象 $\overline{\mathrm{X}}$ の確率 $P(\overline{\mathrm{X}})$ は、次のようになります。

$$ P(\overline{\mathrm{X}})= \frac{|\\{\overline{\mathrm{X}}\\}|}{|\\{\Omega\\}|} = \frac{356\times364\times363}{356\times365\times365}=\frac{365\cdot 364\cdot 363}{365^3}$$

## 3名のなかで誕生日が同じペアが存在する確率

これより、もともと求めたかった事象 $\mathrm{X}$《誕生日が同じペアが存在する》の確率 $p=P(\mathrm{X})$ は次のようになります。

$$ p= P(\mathrm{X}) = 1- P(\overline{\mathrm{X}}) =1-\frac{365\cdot 364\cdot 363}{365^3} $$

# 補足

ところで、次のような疑問が思い浮かぶかもしれません。

> 3名（A君、B君、C君）の集団で考えられるペアの組合せは「A君とB君」「B君とC君」「C君とA君」の3つである。<br>それぞれのペアで誕生日が**違う**確率は $364/365$。それが、3つのペアの全てにおいて成立する確率は $(364/365)^3$ のになる。<br>つまり《3名のなかで誕生日が**同じペアが存在しない**》確率は $(364/365)^3$ であり、その結果、《3名のなかで誕生日が**同じペアが存在する**》確率は $1-(364/365)^3$ のように計算できるのではないか？

この考え方でも良さそうに思えますが、実は問題があります。説明のために次のような設定を考えてみます。

> この世界には「A型」「B型」「O型」「AB型」の4つの血液型だけが存在し、しかも、その割合はすべて等しく $1/4$ です。いま、5名（A君～E君）に集まってもらったとき、そのなかに《血液型が**同じペアが存在する**》という事象 $\mathrm{B}$ の確率 $P(\mathrm{B})$ を求めよ。

先に、答えから言えば、$P(\mathrm{B})$ は $1.0$ になるはずです。なぜなら、血液型は $4$ 種類しかないので、$5$ 名を集めたときに、そこで全員が異なる血液型を持つことは不可能なためです。

この問題について、余事象 $\overline{\mathrm{B}}$《$5$ 名の血液型がすべて違う》の **場合の数** $|\\{\overline{\mathrm{B}}\\}|$ を数えてみると

- A君の血液型としては <font color='red'>$4$</font> 通りが考えられる。
- B君の血液型としては、A君の血液型と重複しない <font color='red'>$3$</font> 通りが考えられる。
- C君の血液型としては、A君ともB君とも重複しない <font color='red'>$2$</font> 通りが考えられる。
- D君の血液型としては、A君ともB君ともC君とも重複しない <font color='red'>$1$</font> 通りが考えられる。
- E君の血液型としては（A君ともB君ともC君ともD君ともA君の血液型と重複しない血液型は存在しえないので）<font color='red'>$0$</font> 通りが考えられる。

$$ |\\{\{\overline{\mathrm{B}}\}\\}| = 4\times3\times2\times1\times0 = 0$$

$$ P(\overline{\mathrm{B}}) = \frac{0}{4^5} = 0$$

$$ P(\mathrm{B}) = 1 - P(\overline{\mathrm{B}})=1-0 = 1$$

と正しい答えを導くことができます。

一方で、$5$ 名で構成できるペアは $10$ 通りで、各ペアで血液型が**違う**確率は $4/5$、すべてのペアで血液型が違う確率 $P(\overline{\mathrm{B}})$ は $(4/5)^{10} = 0.1074 $ である、のように考えてしまうと、正しい答えが得られません。

ということで、余事象の場合の数を考える方法で求めていく必要があります。

# ある集団（k名）のなかに誕生日が同じペアが存在する可能性

最後に、一般化して、$\mathbf{k}$ **名から構成される集団** において《誕生日が同じペアが存在する》確率 $p$ を考えます。ここでまでに、集団が $2$ 名の場合、集団が $3$ 名の場合と考えてきたことを拡張すればよいです。

## すべての場合の数

$k$ 名の誕生日の組合せとして考えられるすべての場合の数、つまり、全事象 $\Omega$ の場合の数 $|\\{\Omega\\}|$ は、次のようになります。

$$ |\\{\Omega\\}| = 365^k $$

## 余事象の場合の数

事象 $\mathrm{X}$《誕生日が同じペアが存在する》に対する余事象 $\overline{\mathrm{X}}$ は《 $k$ 名の誕生日が**すべて違う**》となります。

この余事象 $\overline{\mathrm{X}}$ の場合の数 $|\\{ \overline{\mathrm{X}} \\}|$ は次のようになります。

$$|\\{ \overline{\mathrm{X}} \\}| =  365 \times 364 \times 363 \times \cdots \times(365-k+1)$$

例えば、$k=3$ であれば、$(365-k+1)=(365-3+1)=363$ となり、先に示した $3$ 名の集団を想定して求めた数値と一致することが分かると思います。

また、余事象 $\overline{\mathrm{X}}$ の確率 $P(\overline{\mathrm{X}})$ は、次のようになります。

$$ P(\overline{\mathrm{X}})= \frac{|\\{\overline{\mathrm{X}}\\}|}{|\\{\Omega\\}|} = \frac{365 \times 364 \times 363 \times \cdots \times(365-k+1)}{365^k}$$

これは、これでよいのですが、そのまま計算しようとすると計算過程で非常に大きな数値（たとえば、$k=100$ では $365^{100}$ など）がでてくるので、少々、厄介です。そこで、変形して、近似式に置き換えていきます。

$$ P(\overline{\mathrm{X}})= \frac{365 \times 364 \times 363 \times \cdots \times(365-k+1)}{365^k}$$

$$ = \frac{365}{365}\cdot \frac{364}{365} \cdot \frac{363}{365} \cdots \frac{365-k+1}{365}$$

$$ = \left( \frac{365}{365} \right) \cdot \left( \frac{364}{365} \right) \cdot \left(\frac{363}{365} \right) \cdots \left(\frac{365-k+1}{365} \right) $$

$$ = \left(1- \frac{0}{365} \right) \cdot \left(1- \frac{1}{365} \right) \cdot \left(1-\frac{2}{365} \right) \cdots \left(1- \frac{k-1}{365} \right) $$

ここで、「$x \ll 1$」という条件下で利用可能な「$(1-x)\fallingdotseq e^{-x}$」という近似式を適用すると、

$$ =　e^{- \frac{0}{365}} \cdot e^{- \frac{1}{365}} \cdot e^{- \frac{2}{365}}\cdots e^{- \frac{k-1}{365}} $$

$$ =　e^{- \frac{1}{365}\left(0+1+2+\cdots+(k-1)\right)} $$

ここで、等差数列の和の公式「初項 $a$、項数 $n$、末項 $l$ 等差数列の和は $\frac{1}{2}n(a+l)$ 」を使います。すると $0+1+2+\cdots+(k-1)$ という $k$ 項からなる等差数列の和は $\frac{k(k-1)}{2}$ となるので

$$ =　e^{- \frac{1}{365}\cdot \frac{k(k-1)}{2}} $$

$$ =　\exp\left(\frac{k-k^2}{365\cdot2} \right)$$

となります。

## k名のなかで誕生日が同じペアが存在する確率

これより、もともと求めたかった事象 $\mathrm{X}$《誕生日が同じペアが存在する》の確率 $p=P(\mathrm{X})$ は次のようになります。

$$ p= P(\mathrm{X}) = 1- P(\overline{\mathrm{X}}) =1 - \exp\left(\frac{k-k^2}{365\cdot2} \right) $$

なお、厳密式では以下のようになります。

$$ p= 1- \frac{365 \times 364 \times 363 \times \cdots \times(365-k+1)}{365^k} $$

実際に求めてみましょう。

```py:35名の集団で誕生日が一致するペアが存在する確率.py
k = 35
t = np.arange(365,364-k+1,-1,dtype=np.float) 
#print(t)
## k=3 : [365, 364, 363]
## k=4 : [365, 364, 363, 362]
## k=5 : [365, 364, 363, 362, 361]

p1 = 1 - np.multiply.reduce(t/365)  # 厳密式
p2 = 1 - np.exp((k-k**2)/(365*2))   # 近似式

print(f'{k}名の集団で誕生日が一致するペアが存在する確率 {p1:.2%}')
print(f'{k}名の集団で誕生日が一致するペアが存在する確率 {p2:.2%}（近似計算）')
```

実行結果はつぎのようになります。

```
35名の集団で誕生日が一致するペアが存在する確率 81.44%
35名の集団で誕生日が一致するペアが存在する確率 80.41%（近似計算）
```

$35$ 名の集団では、約 $8$ 割以上の確率で、同じ誕生日のペアが存在していることになります。つづいて、人数を変えてグラフを描いてみます。

```py:集団のなかに誕生日が同じペアが少なくとも1組は存在する確率.py
x = np.arange(2,65+1)
y1 = np.zeros_like(x,dtype=np.float)
for i,k in enumerate(x) :
  px = np.arange(365,364-k+1,-1)/365
  p = 1 - np.multiply.reduce(px)
  #print(f'k={k} p={p:.1%}')
  y1[i] = p

y2 = 1 - np.vectorize(lambda k: np.exp(-(k**2-k)/(365*2)))(x) # 近似式版

fig,ax = plt.subplots(facecolor='white')
ax.plot(x,y1,marker='.',alpha=0.4,label='厳密計算')
ax.plot(x,y2,marker='.',alpha=0.4,label='近似計算')
ax.set_xlabel('集団の構成人数（人）')
ax.set_ylabel('集団のなかに誕生日が同じペアが\n少なくとも1組は存在する確率（%）')
ax.set_xlim(2,65)
ax.set_ylim(0,1)
ax.set_xticks([2]+list(range(10,60+1,10))+[65])
ax.set_yticks(np.linspace(0,1,11))
ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y,_: f'{y:.0%}'))
ax.tick_params(direction='in')
ax.legend()
ax.grid()
plt.show()
```

実行結果は次のようになります。<br>![2021-01-31_14h41_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/0af403de-b168-fd9c-46a1-604d2d1fbec0.png)

## 補足（近似計算）
「$x \ll 1$」において「$(1-x)\fallingdotseq e^{-x}$」であるという関係を使いました。どれぐらいの近似精度なのかをグラフに示してみます。

```py:近似式と誤差.py
# 目盛位置（調整）
matplotlib.rc('mathtext',fontset='cm') 
x = np.linspace(-1,1,21)
y = np.exp(-x)
y2 = 1-x

fig,ax = plt.subplots(figsize=(4,6),facecolor='white')
ax.plot(x,y2,marker='.',clip_on=False,alpha=0.5,label=r'$1-x$')
ax.plot(x,y,marker='.',clip_on=False,alpha=0.5,label=r'$e^{-x}$')
ax.fill_between(x,y,y2,facecolor='y',alpha=0.3,color='tab:pink')

ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

ax.set_xlim(-1,1)
ax.set_ylim(0,3)

# 主目盛：刻み間隔2、0は非表示、文字を白縁取り
ax.set_xticks(np.arange(-1,1+0.1,0.5))
labels = ax.set_xticklabels( [ np.round(x,1) for x in np.arange(-1,1+0.1,0.5)] )
for t in labels :
  t.set_path_effects([patheffects.Stroke(linewidth=3,foreground='white'),patheffects.Normal()])

ax.set_yticks(np.arange(0,3+0.1,0.5))
labels = ax.set_yticklabels( [ ( np.round(y,1) if y!=0 else '') for y in np.arange(-0,3+0.1,0.5)] )
for t in labels :
  t.set_path_effects([patheffects.Stroke(linewidth=3,foreground='white'),patheffects.Normal()])

ax.tick_params(which='major',direction='inout',length=7)

# 補助目盛（minor）：刻み間隔1でグリッド描画するための準備
ax.set_xticks(np.linspace(-1,1,21),minor=True)
ax.set_yticks(np.linspace(0,3,31),minor=True)
ax.tick_params(which='minor',direction='inout',length=3)
ax.legend(fontsize=15)

# グリッド（which='both'で、majorとminorの目盛位置にグリッド）
ax.grid(which='both')

plt.show()
```

実行結果は次のようになります。<br>![2021-01-31_14h43_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/467f187c-7c31-b5b2-5f1b-1e49ba425502.png)

# 生体認証などのセキュリティとの関係

施設の入退場管理や、デバイスのログインなどで指紋認証や静脈認証、顔認証などの生体認証が使われることがあります。これら認証において、誤って他人を受け入れてしまう確率のことを **他人受入率** といいます。例えば、指紋認証では、$100$ 万～ $1,000$ 万分の $1$ のような値になるそうです（ただし、**本人拒否率**とのトレードオフ関係）。仮に、他人受入率 が $500$ 万の$1$（$1/5,000,000$）とすれば、非常にセキュアな認証が実現できそうです。

確かに、システムの利用者という立場でみれば「他人が自分として誤認証されること」あるいは「自分が他人として誤認証されること」の可能性はほぼゼロと見なせるレベルです。

一方で、システム提供者という立場では「すべての利用者同士において誤認証がないか？」ということを考える必要があります。つまり、AさんとBさん、AさんとBさん、CさんとBさん・・・などのすべての組合せにおいて、どれだけの割合で他人受入が発生するかということが問題になります。

つまり、誕生日のパラドックスと同じような話になってきます。で、実際に計算してみると、他人受入率 が $500$ 万の$1$（$1/5,000,000$）でも、利用者が $5,000$ 人もいると、利用者のなかで少なくとも1つの他人受入が発生する確率は $90\\%$ を超えてしまいます。

これらの問題は「IDカードをタッチしたうえで指紋認証をする」といったことで回避できます。

```py:計算例
k = 5000
t = np.arange(5_000_000,4_999_999-k+1,-1,dtype=np.float) 

p1 = 1 - np.multiply.reduce(t/5_000_000)  # 厳密式
p2 = 1 - np.exp((k-k**2)/(5_000_000*2))   # 近似式

print(f'{k}名の利用者において、他人受入してしまうペアが存在する確率 {p1:.2%}')
print(f'{k}名の利用者において、他人受入してしまうペアが存在する確率 {p2:.2%}（近似計算）')
```

```実行結果
5000名の利用者において、他人受入してしまうペアが存在する確率 91.79%
5000名の利用者において、他人受入してしまうペアが存在する確率 91.79%（近似計算）
```

# 参考資料
- 神永正博「直感を裏切る数学」
- 結城浩「数学ガール 秘密ノート 確率の冒険」