Up

平均値の差の検定(独立なデータ)

 

2つの条件からそれぞれ独立にデータをM個とN個を収集したとき、それぞれの母集団の平均値の差の検定を行うために次式

の値が算出され、自由度のt分布と比較される(岡本安晴「データ分析のための統計学入門」2009、おうふうpp6574)。このt検定のためのプログラムを以下のように作成した。

 

=================  t_test_indep.py  =======================

import math

from calc_p_from_t import p_value

 

X = [ 5.128,

      4.000,

      4.587,

      4.831 ]

 

Y = [ 4.082,

      3.571,

      3.891,

      3.413 ]

 

M = len(X)

N = len(Y)

print("M = %d"%M)

print("N = %d"%N)

sumX = 0.0

for i in range(0, M):

    sumX += X[i]

meanX = sumX / M

sumY = 0.0

for i in range(0, N):

    sumY += Y[i]

meanY = sumY / N

print("mean of X = %f"%meanX)

print("mean of Y = %f"%meanY)

sumSS = 0.0

for i in range(0, M):

    sumSS += (X[i] - meanX)**2

for i in range(0, N):

    sumSS += (Y[i] - meanY)**2

s2 = sumSS / (M + N - 2.0)

print("s^2 = %f"%s2)

s2X_Y = (s2 / M) + (s2 / N)

t = (meanX - meanY) / math.sqrt(s2X_Y)

df = M + N - 2

p = p_value( t, df )

print("\nt = %f   df = %d"%(t, df))

print("Prob(x < %f) = %f     Prob(x > %f) = %f"%(t, p, t, 1.0 - p))

================================================

 

上のプログラムでは、データがリストXYに設定されている。

条件1でのデータ

5.128, 4.000, 4.587, 4.831

がリストXに設定され、条件2でのデータ

4.082, 3.571, 3.891, 3.413

がリストYに設定され、検定の計算が行われている。他のデータで検定を行うときは、リストXおよびYに検定を行うデータを設定すればよい。

上のデータの設定でプログラムを実行すると、図1のような結果になる。

図1

 

片側検定でのp値は

両側検定でのp値は

である。

上のプログラムにおいて、計算部分をクラス型にまとめると次のようになる。

 

================  calc_t_indep.py  ==================

import math

from calc_p_from_t import p_value

 

class Ccalc_t_indep:

    def __init__(self, X, Y):

        self.X = X

        self.Y = Y

        self.M = len(self.X)

        self.N = len(self.Y)

        print("M = %d"%self.M)

        print("N = %d"%self.N)

 

    def calc(self):

        sumX = 0.0

        for i in range(0, self.M):

            sumX += self.X[i]

        meanX = sumX / self.M

        sumY = 0.0

        for i in range(0, self.N):

            sumY += self.Y[i]

        meanY = sumY / self.N

        print("mean of X = %f"%meanX)

        print("mean of Y = %f"%meanY)

        sumSS = 0.0

        for i in range(0, self.M):

            sumSS += (self.X[i] - meanX)**2

        for i in range(0, self.N):

            sumSS += (self.Y[i] - meanY)**2

        s2 = sumSS / (self.M + self.N - 2.0)

        print("s^2 = %f"%s2)

        s2X_Y = (s2 / self.M) + (s2 / self.N)

        t = (meanX - meanY) / math.sqrt(s2X_Y)       

        df = self.M + self.N - 2

        p = p_value( t, df )

        return t, p, df

===========================================

 

上のプログラムのクラス型Ccalc_t_indepを用いる形で、最初のプログラムを書き直すと次のようになる。

 

=========================================

from calc_t_indep import Ccalc_t_indep as Calc_t

 

X = [ 5.128,

      4.000,

      4.587,

      4.831 ]

 

Y = [ 4.082,

      3.571,

      3.891,

      3.413 ]

 

calc_t = Calc_t(X, Y)

t, p, df = calc_t.calc()

print("\nt = %f   df = %d"%(t, df))

print("Prob(x < %f) = %f     Prob(x > %f) = %f"%(t, p, t, 1.0 - p))

=======================================

 

データの設定されたリストXYを実引数としてクラス型Calc_t、すなわちCcalc_t_indepのオブジェクトcalc_tを生成してメソッドcalc_t.calc()を呼び出している。実行結果は図1と同じである。

 

プログラムは圧縮ファイルt_test_indepPrg.zipとしてまとめた。ファイル名t_test_indepPrg.zipをクリックしてダウンロードすることができる。

 

 

 

Up