第5回 確率モデルと検定――前編――
プログラム(Pythonスクリプト)の完全なリストを以下に上げる。スクリプトのファイルは圧縮ファイルfiles5.zipとしてまとめたので、クリックしてダウンロード解凍すればスクリプトファイルを開くことができる。プログラムの説明は連載本文を参照されたい。
リスト1 平均と標準偏差
import numpy as np
A = np.array([168, 171, 168, 167, 164,
172, 154, 174, 166, 166])
B = np.array([185, 181, 180, 187, 176,
182, 171, 176, 176, 184])
meanA = A.mean()
meanB = B.mean()
sdA = A.std()
sdB = B.std()
print('A国: 平均 = ', meanA, ' SD =
', sdA)
print('B国: 平均 = ', meanB, ' SD = ', sdB)
リスト2 サンプリングデータの変動
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
import seaborn
mu = 170
sgm = 6
data = scipy.stats.norm.rvs(loc = mu,
scale = sgm, size = 10)
print(data)
data = []
for i in range(5):
data.append(scipy.stats.norm.rvs(loc
= mu, scale = sgm, size = 10))
Values = []
Groups = []
for i in range(5):
Values += [v for v in
data[i]]
Groups += ['S-{}'.format(i +
1)] * len(data[i])
seaborn.stripplot(x = 'G', y = 'V',
data = {'G': Groups, 'V': Values})
plt.show()
seaborn.boxplot(x = 'G', y = 'V', data
= {'G': Groups, 'V': Values})
plt.show()
リスト3 t検定
import numpy as np
A = np.array([168, 171, 168, 167, 164,
172, 154, 174, 166, 166])
B = np.array([185, 181, 180, 187, 176,
182, 171, 176, 176, 184])
def calc_t(X, Y):
M = len(X)
N = len(Y)
df = M + N - 2
meanX = X.mean()
meanY = Y.mean()
ss = (((X - meanX) **
2).sum() + ((Y - meanY) ** 2).sum()) / df
ss_XY = ss * (M + N) / (M *
N)
t = (meanX - meanY) / (ss_XY
** 0.5)
return t, df
t, df = calc_t(A, B)
print('t = ',t, ' 自由度 = ', df)
リスト4 帰無仮説の下でのt分布のシミュレーション
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
def calc_t(X, Y):
M = len(X)
N = len(Y)
df = M + N - 2
meanX = X.mean()
meanY = Y.mean()
ss = (((X - meanX) **
2).sum() + ((Y - meanY) ** 2).sum()) / df
ss_XY = ss * (M + N) / (M *
N)
t = (meanX - meanY) / (ss_XY
** 0.5)
return t, df
mu = 170
sgm = 6
M = 10
N_Exp = 10000
t_values = []
for t in range(N_Exp):
X = scipy.stats.norm.rvs(loc
= mu, scale = sgm, size = M)
Y = scipy.stats.norm.rvs(loc
= mu, scale = sgm, size = M)
t, df = calc_t(X, Y)
t_values.append(t)
t_range = [v for v in np.arange(-4, 4,
0.25)]
p_values = [scipy.stats.t.pdf(t, 2 * M
- 2) for t in t_range]
plt.hist(t_values, bins = t_range,
density = True)
plt.plot(t_range, p_values, linewidth
= 3)
plt.plot([-5.45, -5.45], [0.0, 0.1],
'r-o', linewidth = 5, label = 't = -5.45')
plt.legend()
plt.show()