Pythonを一から勉強してデータ分析できるようになる

~ Pythonとデータ分析のお勉強の記録 ~

正規分布

[Take1] galton boardというおもちゃがあるらしい。

要は、パチンコの玉を台の真ん中に投入したら、どの辺に落ちるのか?

ということを、球数と釘の段数を変数にして集計する。

で、釘にいかさまが無ければ落ちていく場所はきれいな正規分布になるんじゃないの?ということを言いたいんだろうと思う。

砂時計みたいなおもちゃもあって、非常に興味深い話題だと思った。

 

【書式】

ランダムな値を生成する
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)

 

【結果】

 

 

[Take2] 正規分布関係の関数~norm.cdf

 

【書式】

ライブラリ: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

 

[Take2] 正規分布関係の関数~norm.ppf

 

【書式】

ライブラリ: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が計算できる。