# 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
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()
#それぞれ分布関数から求める print(dis1.cdf(75)-dis1.cdf(50)) print(dis2.cdf(75)-dis2.cdf(50)) print(dis3.cdf(75)-dis3.cdf(50))
#それぞれ分布関数から求める print(dis1.ppf(0.95)) print(dis2.ppf(0.95)) print(dis3.ppf(0.95))
神戸市における交通事故は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)}")
ある調査によると,全国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) (U^2がσ^2の不偏推定量である) df2.mean()
df2.plot.hist(subplots=True, bins=100)