要は、パチンコの玉を台の真ん中に投入したら、どの辺に落ちるのか?
ということを、球数と釘の段数を変数にして集計する。
で、釘にいかさまが無ければ落ちていく場所はきれいな正規分布になるんじゃないの?ということを言いたいんだろうと思う。
砂時計みたいなおもちゃもあって、非常に興味深い話題だと思った。
【書式】
ランダムな値を生成する
random.randint(a, b)
a <= N <= b であるようなランダムな整数 N を返す
【コード】
%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
import random
import pandas as pd
# galtonboardの定義
def galton(steps,count):
# 空のリストを定義
ans=[]
# 指定回数(玉数)繰り返す
for i in range(count):
# 中央値を100にする
val=100
# 指定回数(段数)分繰り返す
for j in range(steps):
if random.randint(0,1)==0:
val=val-1
else:
val=val+1
# リストに追加
ans.append(val)
# ansをデータフレームに変換
df=pd.DataFrame(ans)
# ヒストグラムで表示する
df[0].plot.hist()
plt.title(str(steps)+"段:"+str(count)+"個")
plt.ylabel("")
plt.show()
# ここまでが、galton(という関数)の定義
# ここからプログラム本文
galton(500,10000)
【結果】
【書式】
ライブラリ:scipy.stats
cdf=norm.cdf(x=調べたい値, loc=平均値, scale=標準偏差)
出力:ある値は下から何%に該当するか
【コード】
from scipy.stats import norm
mean=160.2
std=5.6
value=172.5
cdf=norm.cdf(x=value,loc=mean,scale=std)
print("素の値")
print(cdf)
print("\n%に換算した値")
print(cdf*100,"%")
print("\n上から何%?に換算した値")
print((1-cdf)*100,"%")
【結果】
0.985969358746576
%に換算した値
0.985969358746576
上から何%?に換算した値
0.0140306412534237
補足)計算の中身
Z=(172.5-160.2)/5.6=2.1964
標準正規分布表から Z=0.9857
【書式】
ライブラリ:scipy.stats
cdf=norm.ppf(q=パーセント値,loc=平均値,scale=標準偏差)
出力:下から〇%に該当する値は何か
【コード】
from scipy.stats import norm
mean=160.2
std=5.6
per=0.20
ppf=norm.ppf(q=per,loc=mean,scale=std)
print("下から"+str(per*100)+"%の値")
print(ppf)
print("\n上から"+str(per*100)+"%の値=下から"+str((1-per)*100)+"%の値")
ppf=norm.ppf(q=1-per,loc=mean,scale=std)
print(ppf)
【結果】
下から20.0%の値
155.486921091991
上から20.0%の値=下から80.0%の値
164.913078908008
補足)計算の中身
Z=(x-160.2)/5.6
標準正規分布表から Z=0.84
で、xが計算できる。