分散分析
被験者間1要因(独立なサンプル)、被験者内1要因(繰り返し/対応のあるデータ)、2要因分散分析のPythonスクリプト例を作成した。スクリプトファイルは、1要因の場合のものを圧縮ファイルANOVA.zipにまとめた。Jupyter Notebook用のものは圧縮ファイルANOVA_jn.zipにまとめた。それぞれダウンロード・解凍して自由に利用されたい。2要因のものは、2要因のところに用意している。
被験者間1要因デザインのデータ例として、表1のものを考える。条件として水準1、水準2、水準3の3水準がせっていされ、各水準内の条件で独立に3個のデータが収集されている。
表1 被験者間1要因分散分析データ例 |
|||
条件 |
データ |
||
水準0 |
5 |
7 |
6 |
水準1 |
9 |
8 |
10 |
水準2 |
6 |
3 |
3 |
表1のデータの分散分析のためのスクリプトを、<岡本安晴「データを使いこなすための統計入門」22世紀アート>のpp. 99-107の説明に従って、以下のスクリプトを作成した。
import numpy as np
import scipy.stats as ss
Y = [[5, 7, 6],
[9, 8, 10],
[6, 3, 3]]
a = len(Y)
N = len(Y[0])
print("a = %d"%a)
print("N = %d"%N)
Y = np.array(Y)
Yd = Y.mean(axis = 1)
print('Yd = ', Yd)
Ydd = Y.mean()
print('Ydd = ', Ydd)
SSA = ((Yd - Ydd) ** 2).sum() * N
print('SSA = ', SSA)
SSS_A = 0.0
for j in range(a):
SSS_A += ((Y[j] - Yd[j]) **
2).sum()
print('SSS_A = ', SSS_A)
SST = SSA + SSS_A
dfA = a - 1
dfS_A = a * (N - 1)
MSA = SSA / dfA
MSS_A = SSS_A / dfS_A
F = MSA / MSS_A
p = ss.f.cdf(F, dfA, dfS_A)
print()
print("%10s"%"Source",
end = " ")
print("%12s"%"SS",
end = " ")
print("%5s"%"df",
end = " ")
print("%12s"%"MS",
end = " ")
print("%12s"%"F")
print("%10s"%"A",
"%12.3f"%SSA, "%5d"%dfA, "%12.3f"%MSA,
"%12.3f"%F,
" p = %-10.5f"%(1.0 - p))
print("%10s"%"S/A",
"%12.3f"%SSS_A, "%5d"%dfS_A, "%12.3f"%MSS_A)
print("%10s"%"Total",
"%12.3f"%SST, "%5d"%(a * N - 1))
表1のデータをリストに
Y = [[5, 7, 6],
[9, 8, 10],
[6, 3, 3]]
と設定している。各行が各水準のデータに対応していることに注意。リストYに他のデータを設定すれば、そのデータの分析ができる。スクリプトは圧縮ファイルanovaOneFacInd.zipをダウンロード・解凍して、自由に利用されたい。
上のプログラムを実行すると以下の結果(端末画面からコピー・貼り付け)を得る。
====== RESTART:
D:\yasuharu\www\LaCoocan\Python\IntroStat\ANOVA\anova_files\anovaOneFacInd.py
======
a = 3
N = 3
Yd = [6. 9. 4.]
Ydd = 6.333333333333333
SSA = 38.0
SSS_A = 10.0
Source
SS df
MS
F
A
38.000 2
19.000
11.400 p =
0.00904
S/A
10.000 6
1.667
Total
48.000 8
>>>
被験者内1要因デザインの分散分析のデータ例として表2のものを考える。条件として水準0、水準1、水準2の3水準があり、被験者は各水準全ての条件においてデータが採られる。
表2 被験者内1要因分散分析データ例 |
|||
|
条件 |
||
被験者 |
水準0 |
水準1 |
水準2 |
被験者0 |
1 |
3 |
2 |
被験者1 |
5 |
9 |
7 |
被験者2 |
6 |
12 |
9 |
表2のデータを分散分析するためのスクリプトを、<岡本安晴「データを使いこなすための統計入門」22世紀アート>のpp. 107-115の説明に従って、次のように作成した。
import numpy as np
import scipy.stats as ss
Y = [[1, 3, 2],
[5, 9, 7],
[6, 12, 9]]
N = len(Y)
a = len(Y[0])
print("a = %d N = %d"%(a, N))
Y = np.array(Y)
Yid = Y.mean(axis = 1)
print(Yid)
Ydj = Y.mean(axis = 0)
print(Ydj)
Ydd = Y.mean()
print(Ydd)
SS_A = ((Ydj - Ydd) ** 2).sum() * N
SS_S = ((Yid - Ydd) ** 2).sum() * a
SS_SA = ((Y - np.array([Yid]).T - Ydj + Ydd) **
2).sum()
SS_T = SS_A + SS_S + SS_SA
df_A = a - 1
df_S = N - 1
df_SA = (a - 1) * (N - 1)
MS_A = SS_A / df_A
MS_S = SS_S / df_S
MS_SA = SS_SA / df_SA
F = MS_A / MS_SA
p = ss.f.cdf(F, df_A, df_SA)
print()
print("%10s"%"Source",
"%12s"%"SS", "%5s"%"df",
"%12s"%"MS", "%12s"%"F")
print("%10s"%"S",
"%12.3f"%SS_S, "%5d"%df_S, "%12.3f"%MS_S)
print("%10s"%"A",
"%12.3f"%SS_A, "%5d"%df_A, "%12.3f"%MS_A,
"%12.3f"%F,
" p = %-10.5f"%(1.0 - p))
print("%10s"%"SA",
"%12.3f"%SS_SA, "%5d"%df_SA, "%12.3f"%MS_SA)
表2のデータをリストに
Y = [[1, 3, 2],
[5, 9, 7],
[6, 12, 9]]
と設定している。他のデータをYに設定すれば、そのデータの分析が行える。スクリプトファイルは圧縮ファイルanovaOneFacRel.zipとして用意したが、ダウンロード解凍して自由に利用されたい。
上のスクリプトを実行すると、以下の出力を得る(端末画面のコピー・貼り付け)。
====== RESTART: D:/yasuharu/www/LaCoocan/Python/IntroStat/ANOVA/anova_files/anovaOneFacRel.py
======
a = 3 N = 3
[2. 7. 9.]
[4. 8. 6.]
6.0
Source
SS df
MS
F
S
78.000 2 39.000
A
24.000 2
12.000 12.000 p = 0.02041
SA
4.000 4
1.000
>>>
2要因分散分析
2要因分散分析のスクリプト例は別のウェブサイトに用意した。