被験者間1要因分散分析
被験者間1要因分散分析(岡本安晴「データ分析のための統計学入門」2009、おうふう、pp.99−107)のプログラムを以下のように作ってみた。
=============== anovaOneFacInd.py ====================
from calc_p_for_F
import calc_p
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)
Yd = []
for j in range(0, a):
    sum = 0.0
    for i in range(0, N):
        sum
+= Y[j][i]
    Yd.append(sum / N)
print(Yd)
sum = 0.0
for j in range(0, a):
    sum += Yd[j]
Ydd = sum / a;
print("Tdd =
%f"%Ydd)
SSA = 0.0
SSS_A = 0.0
for j in range(0, a):
    SSA += N * ((Yd[j] - Ydd) **
2.0)
    for i in range(0, N):
       
SSS_A += (Y[j][i] - Yd[j]) ** 2.0
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 = calc_p( 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))
==========================================
上のプログラムでは、データをリストYに設定するとき、j番目の要素であるリストの
番目の要素に第j水準(条件)の被験者
のデータ
を設定している。例えば、リスト
Y = [[5, 7, 6],
[9, 8, 10],
[6, 3, 3]]
の
Y[0]=[5, 7, 6]
は、水準(条件)0の3人のデータを表し、
Y[2]=[6, 3, 3]
は、水準(条件)2の3人のデータを表している。すなわち、設定されているデータは表1のものである。
| 
   表1 被験者間1要因分散分析データ例  | 
 |||
| 
   条件  | 
  
   データ  | 
 ||
| 
   水準0  | 
  
   5  | 
  
   7  | 
  
   6  | 
 
| 
   水準1  | 
  
   9  | 
  
   8  | 
  
   10  | 
 
| 
   水準2  | 
  
   6  | 
  
   3  | 
  
   3  | 
 
上のデータの設定でプログラムを実行すると図1のように分散分析表が出力される。

図1
上のプログラムにおいて計算部分を次のようにクラス型CANOVA_Indとしてまとめた。
============== CanovaOneFacInd.py ===================
from calc_p_for_F
import calc_p
class CANOVA_Ind:
    def __init__(self, Y):
       
self.Y = Y
    def calc(self):
        a =
len(self.Y)
        N =
len(self.Y[0])
       
print("a = %d"%a)
       
print("N = %d"%N)
        Yd =
[]
        for
j in range(0, a):
           
sum = 0.0
           
for i in range(0, N):
               
sum += self.Y[j][i]
           
Yd.append(sum / N)
        sum
= 0.0
        for
j in range(0, a):
           
sum += Yd[j]
        Ydd
= sum / a;
        SSA
= 0.0
       
SSS_A = 0.0
        for
j in range(0, a):
           
SSA += N * ((Yd[j] - Ydd) ** 2.0)
           
for i in range(0, N):
               
SSS_A += (self.Y[j][i] - Yd[j]) ** 2.0
        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 =
calc_p( F, dfA, dfS_A )
       
return a, N, SSA, SSS_A, SST, dfA, dfS_A, MSA, MSS_A, F, p
============================================
上のプログラムをクラス型CANOVA_Indを用いて書き直すと以下のようになる。
========================================
#from calc_p_for_F
import calc_p
from CanovaOneFacInd
import CANOVA_Ind
Y = [[5, 7, 6],
      [9, 8, 10],
      [6, 3, 3]]
anova = CANOVA_Ind(Y)
a, N, SSA, SSS_A, SST,
dfA, dfS_A, MSA, MSS_A, F, p = anova.calc()
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))
===========================================
クラス型CANOVA_indのオブジェクトanovaをデータの設定されているリストYを実引数として作成して、メソッドanova.calc()を呼び出している。実行結果は、上のプログラムと同じく図1のようになる。
プログラムは圧縮ファイルanovaOneFacIndPrg.zipにまとめた。ファイル名anovaOneFacIndPrg.zipをクリックしてダウンロードすることができる。