「投資センスを問うクイズ」をセンスないので力技(Python モンテカルロシミュレーション)で解いてみた


「ROKOHOUSE シーゲル流ロジカル投資術」さんの過去記事に興味深いクイズが出題されていました。

【投資センスを問うクイズ <出題編>】

以下のような問題です。

男の子だけを欲しがる国では、どの家も男の子が生まれるまで子供を増やし続けます。
女の子ができたらもうひとり子供を作ります。
男の子が生まれたらもう子供を作りません。
この国の男女比はどうなりますか?
※男女が生まれる確率は各々1/2とします。
非公認Googleの入社試験より

私は、「どの家も男の子の数は1人。 男の子が生まれるまで子供を作り続けるから女の子が少し多いくらいか?」と直感では思いました。

解答編の記事はこちらです。見る前に自分で考えてみるのもよいかと思います。

【投資センスを問うクイズ<解答・解説編>】

私の直感はハズレだったので、解答編が本当に正しいのか、実際に試してみました。

百万組のカップルに、男の子が生まれるまでひたすら子作りをしてもらいました。

実際には独裁国家でない限り無理なので、Pythonコードでやりました。

これも一種のモンテカルロ・シミュレーションと呼べるのでしょうか。

以下はその結果です。見る前に自分で考えてみるのもよいかと思います。
(以下ネタバレ)

次のコードで確認しました。

import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

dic =  {'boys':[],
        'girls':[]}

n_couples = 1000000

for i in range(n_couples):
    n_girls = 0
    n_boys = 0
    while True:
        baby = random.choice(['boy','girl'])
        if baby=='boy':
            n_boys += 1
            break
        else:
            n_girls += 1

    dic['boys'].append(n_boys)
    dic['girls'].append(n_girls)

df = pd.DataFrame(dic)
df.index.name = 'parent_id'
df['total'] = df.sum(axis = 1)

print("百万組のカップルから生まれた、")
print("男の子の数:{:>7}".format(df['boys'].sum()))
print("女の子の数:{:>7}".format(df['girls'].sum()))
print("\n平均出産回数:{:.0f}回".format(df['total'].mean()))
print("\n女の子数別の世帯数分布")
df2 = pd.DataFrame(df['girls'].value_counts())

df2.index.name = '女の子の数'
df2.columns = ['世帯数']

df2e = df2.copy()
df2e.index.name = 'Number of girls'
df2e.columns = ['number of couples']
df2e.plot(kind = 'bar', figsize = (8,5))

df2

以下、コードからのアウトプットとコメントです。

百万組のカップルから生まれた
男の子の数1000000
女の子の数 999687

男の子の数は当然百万人です。女子の数もほぼ百万人となりました。

平均出産回数2

平均すると2回出産すれば男の子が生まれるという結果です。確率50%なので納得ですが、事前にはわかりませんでした。

女の子数別の世帯数分布

女の子の数 世帯数
0 500580
1 249813
2 124471
3 62512
4 31319
5 15657
6 7718
7 3962
8 1935
9 1041
10 493
11 239
12 141
13 60
14 22
16 14
15 13
17 4
18 3
20 1
19 1
25 1

 
全体の半分の約5万世帯で、男の子が最初の出産で生まれ、女の子がゼロです。確率50%ということです。

「50%の世帯で男の子が1人、女の子ゼロ」というのが、男の子と女の子の総数が等しくなるポイントです。直感で考えたときはこの点を見落としていました。

 

そして、女の子1人が約2万5千世帯、女の子2人が約1万2500世帯、、、と半減していきます。出産1回につき50%の確率で男の子が生まれています。

最後に、男の子を出産するまでに25人の女の子を産んだカップルが1組ありました。お疲れ様です。

上表をグラフ化するとこうなります。

このクイズ、最初は分かりませんでしたが、コードを書いているうちに「男の子が生まれたらそのカップルは出産をやめるとか、いろいろこねくり回しているけど、結局どのカップルが産もうが50%の確率で男の子と女の子が生まれ続けているだけでは?」と気づきました。

センスのある人はすぐにこの事実に気づいて、上グラフのような分布イメージが頭に浮かぶのでしょう。

というわけで答えは、

「この国の男女比は1:1(期待値)」

が正解でした。