第1回

第1回ハンズオン

0. 準備

1. Pythonで確率分布を見てみよう

SciPy statsライブラリ

statsライブラリの基本的な使い方

正規分布を可視化してみよう

from scipy import stats

#平均100,標準偏差30の正規分布を定義
dis1 = stats.norm(loc=100,scale=30)
#平均130,標準偏差30の正規分布を定義
dis2 = stats.norm(loc=130,scale=30)
#平均100,標準偏差10の正規分布を定義
dis3 = stats.norm(loc=100,scale=10)

#xの範囲を適当に決める
x=range(0,200)

#確率密度関数をxにそってプロット
plt.plot(x,dis1.pdf(x), label="N(100,30)")
plt.plot(x,dis2.pdf(x), label="N(130,30)")
plt.plot(x,dis3.pdf(x), label="N(100,10)")
plt.grid()
plt.legend()
plt.show()

#1000個の乱数を作成
nums1 = dis1.rvs(size=1000)
nums2 = dis2.rvs(size=1000)
nums3 = dis3.rvs(size=1000)
#ヒストグラムを作成
plt.hist(nums1, bins=range(0,200,5), alpha=0.5)
plt.hist(nums2, bins=range(0,200,5), alpha=0.5)
plt.hist(nums3, bins=range(0,200,5), alpha=0.5)
plt.grid()
plt.show()

例題:神戸市で交通事故が起こる確率を調べる

神戸市における交通事故は1か月約350件と報告されている.この時,ポワソン分布を使って,以下の問いに答えなさい. なお,1日あたりの交通事故の平均件数をλ=350/30として計算せよ.

#ポワソン分布を作成
kobe_acc = stats.poisson(mu=350/30)
#概形をプロットしてみる
x = range(1,30)
plt.bar(x, kobe_acc.pmf(x))
plt.grid()
#確率関数,分布関数,パーセント点をそのまま表示するだけ
print(f"[RQ1]: {kobe_acc.pmf(10)}")
print(f"[RQ2]: {kobe_acc.cdf(5)}")
print(f"[RQ3]: {kobe_acc.cdf(15) - kobe_acc.cdf(9)}")

2. 統計的推測をPythonでシミュレーションしてみよう

例題:全国17歳男子の身長の分布を推定する

ある調査によると,全国610,122人の17歳男子の平均身長は,

の正規分布にほぼ従うという.

この時,母集団からn個の標本を取り出し,標本平均X~,不偏標本分散U^2を計算して,μ,σ^2を推定できるかやってみよう.

準備

  1. 母集団を表す正規分布を作成する
    #stats.normで全男子の母集団を生成(σ^2でなくσを使うことに注意)
    all_boys = stats.norm(loc=170.6931,scale=5.8082)

平均μ(=170.6931)を推定してみよう

  1. all_boysからn=10人の標本X={x1,x2,...,x10}を取り出し,標本平均X~を計算しよう
    #nをとりあえず10として
    n=10
    #ランダムにn人取り出してみる
    sample_boys = all_boys.rvs(size=n)
    #標本平均を計算する(何回も試してみる)
    sample_boys.mean()
  2. この作業を1000回繰り返した結果を表に入れてみよう
    #表を作る
    df = pd.DataFrame()
    #1000回繰り返して表に入れる(リストの内包表現)
    df[f"{n}人の標本平均"] = [all_boys.rvs(size=n).mean() for i in range(1000)]
    df
  3. 標本平均の平均E(X~)を計算してみる
    df.mean()
  4. nを変化させて同じ実験をする
    for n in [10,100,1000,10000]:
      df[f"{n}人の標本平均"] = [all_boys.rvs(size=n).mean() for i in range(1000)]
    df
  5. 標本平均の平均E(X~)が平均的にμの近くの値になっていることがわかる(X~がμの不偏推定量である
    df.mean()
  6. ヒストグラムを描いてみる.nが大きくなるほどX~の分布がμに近づくことがわかる (X~がμの一致推定量である)
    df.plot.hist(subplots=True, bins=100)

σ^2(=33.735)を推定してみよう

  1. μの時とほぼ同じ.numpyの標本偏分散U^2は,var(ddof=1)で計算する
    #σ用の表を作る
    df2 = pd.DataFrame()
    #nを変化させてn個の不偏標本分散を1000回取る実験をする(不偏推定量の確認)
    for n in [10,100,1000,10000]:
      df2[f"{n}人の不偏標本分散"] = [all_boys.rvs(size=n).var(ddof=1) for i in range(1000)]
    #不偏標本分散の平均E(U^2) (U^2がσ^2の不偏推定量である)
    df2.mean()
  2. ヒストグラムを描いてみる(U^2がσ^2の一致推定量である)
    df2.plot.hist(subplots=True, bins=100)

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS