# 乱数を扱うためのライブラリをインポートする。
import random

sample_size = 10 # 乱数発生回数

# 一様乱数を dist に格納する （distribution : 分布）
dist = [random.random() for i in range(sample_size)]

# dist の中身を確認する。
dist

# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
%matplotlib inline

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()

"""
Explanation: <h1 STYLE="background: #c2edff;padding: 0.5em;">Step 1. 分布</h1>

<ol>
<li><a href="#1">乱数と一様分布</a>
<li><a href="#2">二項分布</a>
<li><a href="#3">正規分布</a>
</ol>
<h4 style="border-bottom: solid 1px black;">Step 1 の目標</h4>

正規分布に従う乱数のヒストグラムを描く。
<img src="fig/seikibunpu.png">
<h2 STYLE="background: #c2edff;padding: 0.5em;"><a name="1">1.1 乱数と一様分布</a></h2>

<h4 style="border-bottom: solid 1px black;">一様乱数の分布の図示</h4>

まずは、一様乱数を発生させて、その分布を図示してみましょう。
End of explanation
"""


sample_size = 100 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()

sample_size = 1000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()

sample_size = 10000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()

sample_size = 100000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist)
plt.grid()
plt.show()

"""
Explanation: <h4 style="border-bottom: solid 1px black;">乱数発生回数を増やしてみる</h4>

乱数発生回数を多くするにしたがって、"理想的な" 分布の形に近づいていきます。
End of explanation
"""


sample_size = 100000 # 乱数発生回数

# 一様乱数を dist に格納する
dist = [random.random() for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100) # binを多くする
plt.grid()
plt.show()

"""
Explanation: <h4 style="border-bottom: solid 1px black;">binを増やしてみる</h4>

ゴミを分別するのに使う箱のことを bin と言います。ヒストグラムを描く時は、いくつの bin に分別するかで表示が違ってきます。binの数を多くすると、分布の細かい形が見えますが、ひとつのbinあたり分別されたデータ数は当然少なくなります。
End of explanation
"""


# 数値計算のライブラリをインポートする。
import numpy as np

sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=10, p=0.5) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()

"""
Explanation: <h2 STYLE="background: #c2edff;padding: 0.5em;"><a name="2">1.2 二項分布</a></h2>

np.random.binomial(n, p) は、確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、奇数が出る個数を返します。このような分布を、二項分布と言います。
<h4 style="border-bottom: solid 1px black;">等確率の二項分布</h4>

奇数と偶数が等確率で出るルーレットを１０回プレイし、奇数が出る回数を数えます。それを１００００回繰り返します。奇数と偶数が同じ回数だけ出る確率（５回ずつ出る確率）はどのくらいでしょうか。
End of explanation
"""


sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=100, p=0.5) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()

"""
Explanation: 上図から分かるように、奇数と偶数が等確率で出るルーレットを１０回プレイして、奇数と偶数が同じ回数だけ出る確率（５回ずつ出る確率）は、約２５％（１００００回中の約２５００回）ほどです。案外少ない、という印象を持つかもしれませんね。
<h4 style="border-bottom: solid 1px black;">そのルーレットはイカサマか</h4>

あなたはカジノで他の客がルーレットをプレイしているのを観察していました。すると、奇数の出る回数がやけに多いので、そのルーレットはイカサマではないかという気がしてきました。イカサマでなければ、ルーレットは奇数と偶数が等確率で出るはずです。ところがこのルーレットは、１００回中６０回、奇数が出ました。このルーレットはイカサマでしょうか。
奇数と偶数が等確率で出るルーレットを１００回プレイした時、奇数が出る回数が６０回以上になる確率はどれくらいでしょうか。まずは分布を描いてみましょう。
End of explanation
"""


sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=100, p=0.5) for i in range(sample_size)]

p = sum([1 for n in dist if n >= 60]) / sample_size
print("p値: %(p)s " %locals())

"""
Explanation: 上と同様の計算で、今度は「ルーレットを１００回プレイして奇数が６０回以上出る確率」を計算してみます。
End of explanation
"""


# 練習1.1

"""
Explanation: 奇数と偶数が等確率で出るルーレットを１００回プレイして、奇数が出る回数が「偶然」６０回以上になる確率は 5% 以下になることが分かりました。つまり、１００回中６０回以上奇数が出るようなルーレットは、そのルーレットがイカサマだと疑ってみるのが良さそうです。
このときのpを、p値(有意確率)と呼びます。

帰無仮説：そのルーレットはイカサマではない（奇数と偶数が等確率で出る）。
対立仮説：そのルーレットはイカサマである。
p < 0.05 なので、有意水準5%で、帰無仮説を棄却できる。
すなわち、そのルーレットはイカサマである可能性が高い。

<h4 style="padding: 0.25em 0.5em;color: #494949;background: transparent;border-left: solid 5px #7db4e6;">練習1.1</h4>

１００回中６０回以上奇数が出るようなルーレットは、そのルーレットがイカサマだと疑ってみるのが良さそうです。では、１０回中６回以上奇数が出た場合、<u>奇数が出た確率は同じ６０％</u>ですが、そのルーレットはイカサマと言えるでしょうか。p値を計算して答えてください。
End of explanation
"""


sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [np.random.binomial(n=20, p=0.05) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()

"""
Explanation: <h4 style="border-bottom: solid 1px black;">等確率でない二項分布</h4>

全住民の5%がある感染症に罹患したと推定されている。その全住民の中から無作為に20人を抽出した場合、抽出された集団の中に罹患者は何人いるでしょうか。そのような分布も二項分布になります。分布を描いてみましょう。
End of explanation
"""


# 練習1.2

"""
Explanation: <h4 style="padding: 0.25em 0.5em;color: #494949;background: transparent;border-left: solid 5px #7db4e6;">練習1.2</h4>

全住民の5%がある感染症に罹患したと推定されている。その全住民の中から無作為に100人を抽出したところ、抽出された集団の中に罹患者が10人以上いた。
(1)　それが偶然起こる確率を概算しなさい。
(2)　その結果をどう解釈すれば良いか。
End of explanation
"""


sample_size = 10000 # 乱数発生回数

dist = [random.normalvariate(mu=0, sigma=1) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()

"""
Explanation: <h2 STYLE="background: #c2edff;padding: 0.5em;"><a name="3">1.3 正規分布</a></h2>

random.normalvariate(mu, sigma) は正規分布に従う乱数を発生させる関数です（mu は平均で、sigma は標準偏差）。
<h4 style="border-bottom: solid 1px black;">標準正規分布</h4>

平均０、標準偏差1の正規分布を「標準正規分布」と言います。標準正規分布を描いてみましょう。
End of explanation
"""


sample_size = 10000 # 乱数発生回数

dist = [random.normalvariate(mu=0, sigma=1) for i in range(sample_size)]

p = sum([1 for n in dist if n >= 2]) / sample_size
print("p値: %(p)s " %locals())

"""
Explanation: 標準正規分布に従う乱数が２以上の値を出力する確率はどのくらいでしょうか。計算してみましょう。
End of explanation
"""


sample_size = 10000 # 乱数発生回数

# 確率pで奇数が出る（確率1-pで偶数が出る）ルーレットをn回プレイしたときに、
# 奇数が出る回数の分布
dist = [random.normalvariate(mu=50, sigma=10) for i in range(sample_size)]

# ヒストグラムを描く。
plt.hist(dist, bins=100)
plt.grid()
plt.show()

"""
Explanation: <h4 style="border-bottom: solid 1px black;">偏差値</h4>

大学受験模試などでよく使われる「偏差値」は、平均５０、標準偏差１０の正規分布に従うという仮定をおいています。分布を描いてみましょう。ここで、縦軸は「学生数」をイメージしてください。
End of explanation
"""


# 練習1.3

"""
Explanation: <h4 style="padding: 0.25em 0.5em;color: #494949;background: transparent;border-left: solid 5px #7db4e6;">練習1.3</h4>

偏差値７０以上の学生は、１万人中、何人いると推定されるでしょうか。
End of explanation
"""


