一覧CS-12-1 · 確率の基礎

確率の基礎と期待値・分散

二つのさいころの全結果を列挙し、確率と平均的な値・ばらつきを求めます。

説明

標本空間は試行で起こり得る結果全体、事象はその中の条件を満たす結果の集合です。各結果が同じ確率なら、事象の確率は条件を満たす個数を全体の個数で割って求められます。結果の確率が異なる場合は、個数だけでは求まりません。

公平で独立な二つのさいころを使います。36通りを列挙して和の確率を求め、独立な事象では確率を掛けられることを確認します。最後に和の期待値と分散を計算し、実際の値の範囲と平均の意味を整理します。

136通りの結果

第1のさいころと第2のさいころを順序付きの組にします。(1,2)と(2,1)は別の結果です。

from itertools import product; from fractions import Fraction直積と分数; outcomes = list(product(range(1, 7), repeat=2))二つの目を全列挙; outcomes, len(outcomes)全結果と個数

6×6で36通りです。公平かつ独立という条件により、各組の確率は1/36です。和2から12の11種類が等確率なのではありません。

2和が7になる事象

和7の組だけを抽出します。

sum_seven = [(a, b) for a, b in outcomes if a+b == 7]条件を満たす組; sum_seven, Fraction(len(sum_seven), len(outcomes))事象と確率

6通りあるので確率は1/6です。和2は(1,1)だけなので1/36になります。同じ和という一つの値でも、それを作る組の個数が違います。

3和の分布を作る

それぞれの和の出現回数を数え、36で割ります。

from collections import Counter度数を集計; frequencies = Counter(a+b for a, b in outcomes)和ごとの個数; [(value, frequencies[value], Fraction(frequencies[value], 36)) for value in sorted(frequencies)]和・度数・確率

中央の7が最も多く、両端の2と12が最も少ない分布です。全ての確率を足すと1になり、和の取り得る値を漏れなく含みます。

4別々のさいころの事象

Aを第1の目が偶数、Bを第2の目が5以上とします。それぞれの確率と同時に起こる確率を求めます。

event_a = {(a,b) for a,b in outcomes if a%2 == 0}第1が偶数; event_b = {(a,b) for a,b in outcomes if b >= 5}第2が5以上; pa = Fraction(len(event_a),36); pb = Fraction(len(event_b),36)各確率; pa, pb, Fraction(len(event_a & event_b),36), pa*pb同時確率と積を比較

P(A)=1/2、P(B)=1/3、同時に起こる確率は1/6で積と一致します。独立なさいころの別々の目に関する事象なので、片方の結果がもう片方の確率を変えません。

5同時に起こらないことと独立

第1の目が1という事象Cと、第1の目が2という事象Dは同時には起こりません。

event_c = {(a,b) for a,b in outcomes if a == 1}第1が1; event_d = {(a,b) for a,b in outcomes if a == 2}第1が2; Fraction(len(event_c & event_d),36), Fraction(len(event_c),36)*Fraction(len(event_d),36)同時確率と積が一致しない

同時確率0に対し、積は1/36です。この二事象は排反ですが独立ではありません。Cが起きたと分かればDの確率は0になります。

6和の期待値

各和にその確率を掛けて足します。等確率の36結果を直接平均しても同じです。

expected = sum(Fraction(value*count,36) for value,count in frequencies.items())値×確率の合計; expected期待値, Fraction(sum(a+b for a,b in outcomes),36)36結果からの平均

期待値は7です。必ず7が出るという予測ではなく、この確率モデルでの平均です。偏りのあるさいころなら確率の重みを変更して計算します。

7平均からの二乗のずれ

各和から期待値7を引き、二乗して確率で平均します。これが分散です。

variance = sum(Fraction(count,36)*(value-expected)**2 for value,count in frequencies.items())二乗偏差の期待値; variance, float(variance), float(variance)**0.5分数・小数・標準偏差

分散は35/6、標準偏差は約2.415です。二乗するため、平均より上と下のずれが打ち消されません。分散は元の単位の二乗、標準偏差は元と同じ単位になります。

8同じ期待値でもばらつきが違う

必ず7を返す変数と、2か12を半分ずつ返す変数を比較します。両方の期待値は7です。

constant = [7, 7]; extremes = [2, 12]二つの等確率モデル; [(Fraction(sum(values),2), Fraction(sum((x-7)**2 for x in values),2)) for values in [constant, extremes]]期待値と分散を比較

期待値は同じ7ですが、分散は0と25です。平均だけでは分布の違いを表せないため、値の出る範囲やばらつきも併せて調べます。

まとめ

等確率の標本空間なら、事象の個数を全結果数で割って確率を求められます。

独立は同時確率が積になる条件で、排反とは異なります。

期待値は値の確率平均、分散は平均からの二乗偏差の確率平均です。

操作履歴と解説を振り返れます。

Python 3

1
from itertools import product; from fractions import Fraction; outcomes = list(product(range(1, 7), repeat=2)); outcomes, len(outcomes)
([(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)], 36)
2
sum_seven = [(a, b) for a, b in outcomes if a+b == 7]; sum_seven, Fraction(len(sum_seven), len(outcomes))
([(1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1)], Fraction(1, 6))
3
from collections import Counter; frequencies = Counter(a+b for a, b in outcomes); [(value, frequencies[value], Fraction(frequencies[value], 36)) for value in sorted(frequencies)]
[(2, 1, Fraction(1, 36)), (3, 2, Fraction(1, 18)), (4, 3, Fraction(1, 12)), (5, 4, Fraction(1, 9)), (6, 5, Fraction(5, 36)), (7, 6, Fraction(1, 6)), (8, 5, Fraction(5, 36)), (9, 4, Fraction(1, 9)), (10, 3, Fraction(1, 12)), (11, 2, Fraction(1, 18)), (12, 1, Fraction(1, 36))]
4
event_a = {(a,b) for a,b in outcomes if a%2 == 0}; event_b = {(a,b) for a,b in outcomes if b >= 5}; pa = Fraction(len(event_a),36); pb = Fraction(len(event_b),36); pa, pb, Fraction(len(event_a & event_b),36), pa*pb
(Fraction(1, 2), Fraction(1, 3), Fraction(1, 6), Fraction(1, 6))
5
event_c = {(a,b) for a,b in outcomes if a == 1}; event_d = {(a,b) for a,b in outcomes if a == 2}; Fraction(len(event_c & event_d),36), Fraction(len(event_c),36)*Fraction(len(event_d),36)
(Fraction(0, 1), Fraction(1, 36))
6
expected = sum(Fraction(value*count,36) for value,count in frequencies.items()); expected, Fraction(sum(a+b for a,b in outcomes),36)
(Fraction(7, 1), Fraction(7, 1))
7
variance = sum(Fraction(count,36)*(value-expected)**2 for value,count in frequencies.items()); variance, float(variance), float(variance)**0.5
(Fraction(35, 6), 5.833333333333333, 2.41522945769824)
8
constant = [7, 7]; extremes = [2, 12]; [(Fraction(sum(values),2), Fraction(sum((x-7)**2 for x in values),2)) for values in [constant, extremes]]
[(Fraction(7, 1), Fraction(0, 1)), (Fraction(7, 1), Fraction(25, 1))]

演習完了