python の仮説検定

a = np.array([70, 69, 72, 74, 66, 68, 69, 70, 71, 69, 73, 72, 68, 72, 67])
b = np.array([69, 72, 71, 74, 68, 67, 72, 72, 72, 70, 75, 73, 71, 72, 69])

a.mean(), b.mean()
# (70.0, 71.13333333333334)

sgm = (a.var() * len(a) + b.var() * len(b)) / (len(a)+ len(b)-2)

_t = np.abs(b.mean() - a.mean()) / (np.sqrt(sgm) * np.sqrt(2/15))
# 1.3795305076179911 
# t_28,0.05=2.048 のため、有意差があるとは言えない

# ウェルチのT検定の場合
s, p = stats.ttest_ind(a, b, equal_var = False)
p
# 0.17867124039594834 > 0.05 のため、有意差があるとは言えない


# 等分散比の F 検定
f = np.var(a, ddof=1) / np.var(b, ddof=1)
p_val1 = stats.f.cdf(f, len(a)-1, len(b)-1)
p_val2 = stats.f.sf(f, len(a)-1, len(b)-1)
p_val3 = min(p_val1, p_val2)
f, p_val1, p_val2, p_val3

#(1.0925196850393701,
#  0.5645793414381515,
#  0.43542065856184875,
#  0.43542065856184875)

# 95%信頼区間:(0.33572960066081176, 2.97858752410188)
stats.f.interval(0.95, len(a)-1, len(b)-1)

ohke.hateblo.jp

# 比率の差検定

N = 100
n = 16
M = 200
m = 50

pn = n/N
pm = m/M

z = np.abs(pn - pm) / np.sqrt((pn*(1-pn)/N) +( pm*(1-pm)/M))
z > 1.96

stats.norm.interval(0.95)
# (-1.959963984540054, 1.959963984540054)

future-chem.com

# 分布の適合度判定(a: sample, r: rate)
a = np.array([120, 50, 40, 10])
r = np.array([9,3,3,1])

# 分布の期待値
e = r / r.sum() * a.sum()

# カイ自乗統計量
(np.vectorize(lambda x: x ** 2)(t) / e).sum()
# 3.0303030303030303

stats.chi2.interval(0.9, 3)
chi2_05, chi2_95 = stats.chi2.interval(alpha=0.9, df=len(a)-1)
# chi2_95 = 7.8... のため、適合している