期待値と平均の違いをPythonを使って説明してみた

期待値は母集団(例えばサイコロを無限回振った結果)の平均(母平均)を推定するため、根源事象とその確率をかけ合わせたものの総和である。

※根源事象: それ以上分けることができない事象。「偶数が出る」という事象は2、4、6という根元事象から成り立つ。)

平均はすべての試行結果の総和を、試行回数で割ったものであり、もし標本から母平均を推測したい場合には、平均よりも期待値をつかう方が正確である。

たとえば、重心がちょうど真ん中にあるサイコロを使った場合。それぞれの出目が出る確率はどれも1/6であるから、期待値は 1 * 1/6 + 2 * 1/6 + 3 * 1/6 + 4 * 1/6 + 5 * 1/6 + 6 * 1/6 = 21/6 つまり3.5である。

平均は試行結果の総和を試行回数で割る必要があるので、Pythonを使って実装してみよう。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dice = [1, 2, 3, 4, 5, 6]
prob = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6]
num_trial = 100

np.random.seed(0)
sample = np.random.choice(dice, num_trial, p=prob)
print(sample)

[4 5 4 4 3 4 3 6 6 3 5 4 4 6 1 1 1 5 5 6 6 5 3 5 1 4 1 6 4 3 2 5 3 4 1 4 4
4 6 5 3 3 5 1 5 5 2 1 2 3 4 3 6 1 2 1 4 2 3 2 1 1 4 1 2 3 5 1 6 1 6 3 6 4
5 1 2 1 2 1 2 3 1 5 4 2 4 1 4 6 2 5 1 5 2 2 4 1 5 1]

sample = np.random.choice(dice, num_trial, p=prob) の一行で、
dice変数のインデックスと、probのインデックスを対応させている。

print(np.sum(sample) / sample.size)

3.3

期待値は3.5だったが、平均は3.3で異なるものになった。試行回数を増やしてみよう。

num_trial = 10000

np.random.seed(0)
sample = np.random.choice(dice, num_trial, p=prob)
print(np.sum(sample) / sample.size)

3.4769

さっきよりも期待値の3.5に近づいた。このように試行回数を増やせば増やすほど、3.5に近づいていき、サイコロを無限回振った時、その平均は3.5になる。

だが、無限回サイコロをふることは不可能である。だから何回かサイコロを振って、そこから無限回振った時の平均を推測するしかない。上記のように試行回数を増やすほど3.5に近づくが、このサイコロを無限回ふった時の平均が3.5に収束するということはどのように求めれば良いのだろうか。期待値を使えばいい。

無限回振ったサイコロの出目が母集団、実際に何回か振ってみた結果を標本にする。もしこの母集団の根源事象すべての確率が明確にわかっているなら、その期待値は根源事象とその確率をかけたものの総和になる。この期待値が無限回の試行を行った場合の平均と等しくなるわけだ。