引き続きハンバーガー統計学にようこそ!の第2章。
準備
import numpy as np import pandas as pd import scipy as sp
2.1 平均的ポテトを推定する
wakupote = pd.Series([47, 51, 49, 50, 49, 46, 51, 48, 52, 49]) wakupote.describe()
2.3 信頼区間/区間推定
p値からt値への関数はscipy.stats.t.ppf
。
from scipy.stats import t # 95%信頼区間に対応するt値 t.ppf(q=[0.025, 0.975], df=9) # 同99% t.ppf(q=[0.005, 0.995], df=9)
array([-2.26215716, 2.26215716]) array([-3.24983554, 3.24983554])
信頼区間はscopy.stats.t.interval
で求める。dfに自由度、locに標本平均、scaleに標本標準誤差を指定する。標本標準誤差はpandas.Series.sem
で求められる(cf. Pythonで正規分布の平均値の信頼区間を計算する方法)。
t.interval(alpha=0.95, df=9, loc=wakupote.mean(), scale=wakupote.sem()) t.interval(alpha=0.99, df=9, loc=wakupote.mean(), scale=wakupote.sem())
(47.859567155669005, 50.540432844331001) (47.274321990699256, 51.125678009300749)
自由度を複数与えることもできるので、t分布表も作れる。
df = np.hstack((np.arange(1,31,1), [40, 60, 120, 1e10])) pd.DataFrame(data = {"p=0.95" : t.ppf(q=[0.975], df=df), "p=0.99" : t.ppf(q=[0.995], df=df)}, index=df)
p=0.95 p=0.99 1.000000e+00 12.706205 63.656741 2.000000e+00 4.302653 9.924843 3.000000e+00 3.182446 5.840909 4.000000e+00 2.776445 4.604095 5.000000e+00 2.570582 4.032143 6.000000e+00 2.446912 3.707428 7.000000e+00 2.364624 3.499483 8.000000e+00 2.306004 3.355387 9.000000e+00 2.262157 3.249836 1.000000e+01 2.228139 3.169273 1.100000e+01 2.200985 3.105807 1.200000e+01 2.178813 3.054540 1.300000e+01 2.160369 3.012276 1.400000e+01 2.144787 2.976843 1.500000e+01 2.131450 2.946713 1.600000e+01 2.119905 2.920782 1.700000e+01 2.109816 2.898231 1.800000e+01 2.100922 2.878440 1.900000e+01 2.093024 2.860935 2.000000e+01 2.085963 2.845340 2.100000e+01 2.079614 2.831360 2.200000e+01 2.073873 2.818756 2.300000e+01 2.068658 2.807336 2.400000e+01 2.063899 2.796940 2.500000e+01 2.059539 2.787436 2.600000e+01 2.055529 2.778715 2.700000e+01 2.051831 2.770683 2.800000e+01 2.048407 2.763262 2.900000e+01 2.045230 2.756386 3.000000e+01 2.042272 2.749996 4.000000e+01 2.021075 2.704459 6.000000e+01 2.000298 2.660283 1.200000e+02 1.979930 2.617421 1.000000e+10 1.959964 2.575829
2.9 通過テスト
与えられた情報をそのままパラメータに渡せるので、Rのときより「ちゃんとやってる」感がある。別にだからどうしたということは無いのだが。
t.interval(alpha=0.95, df=499, loc=65, scale=np.sqrt(60)/np.sqrt(500))