# PandasとNumpyをインポート import pandas as pd import numpy as np # 日本語化Matplotlibもインポート import matplotlib.pyplot as plt !pip install japanize-matplotlib import japanize_matplotlib
from scipy import stats
変数名 = stats.分布(パラメータ)
変数名.pmf(xの値) #離散型の場合 probability mass function 変数名.pdf(xの値) #連続型の場合 probability density function
変数名.cdf(xの値) #cumulative distribution function
変数名.sf(xの値) #survival function.1-変数名.cdf(x)に同じ
変数名.ppf(下側確率) #percent point function
変数名.isf(上側確率) #inverse survival function
変数名.rvs(size=個数) #random variates
scipy.statsを使って正規分布を可視化してみよう
from scipy import stats #平均100,標準偏差30の正規分布を定義 dis = stats.norm(loc=100,scale=30) #xの範囲を適当に決める x=range(0,200) #確率密度関数をxにそってプロット plt.plot(x,dis.pdf(x)) plt.show() #1000個の乱数を作成 nums = dis.rvs(size=1000) #ヒストグラムを作成 plt.hist(nums, bins=50) plt.show()
神戸市における交通事故は1か月約350件と報告されている.この時,ポワソン分布を使って,以下の問いに答えなさい. なお,1日あたりの交通事故の平均件数をλ=350/30として計算せよ.
#ポワソン分布を作成 kobe_acc = stats.poisson(mu=350/30)
#確率関数,分布関数,パーセント点をそのまま表示するだけ print(f"[RQ1]: {kobe_acc.pmf(10)}") print(f"[RQ2]: {kobe_acc.cdf(5)}") print(f"[RQ3]: {kobe_acc.cdf(15) - kobe_acc.cdf(10)}") print(f"[RQ4]: {kobe_acc.isf(0.05)}")
ある調査によると,全国610,122人の17歳男子の平均身長は,
の正規分布にほぼ従うという.
この時,母集団からn個の標本を取り出し,標本平均X~,不偏標本分散U^2を計算して,μ,σ^2を推定できるかやってみよう.
#stats.normで全男子の母集団を生成(σ^2でなくσを使うことに注意) all_boys = stats.norm(loc=170.6931,scale=5.8082)
#nをとりあえず10として n=10 #ランダムにn人取り出してみる sample_boys = all_boys.rvs(size=n) #標本平均を計算する(何回も試してみる) sample_boys.mean()
#表を作る df = pd.DataFrame() #1000回繰り返して表に入れる(リストの内包表現) df[f"{n}人の標本平均"] = [all_boys.rvs(size=n).mean() for i in range(1000)] df
df.mean()
for n in [10,100,1000,10000]: df[f"{n}人の標本平均"] = [all_boys.rvs(size=n).mean() for i in range(1000)] df
df.mean()
df.plot.hist(subplots=True, bins=100)
#σ用の表を作る 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) df2.mean()
df2.plot.hist(subplots=True, bins=100)