Python3(NumPy, Scipy, pandas)で、対応のある(対の)2標本t検定(両側)。scipy.stats.ttest_rel()

Python3コード

#!/usr/bin/env python3


"""(docstring)
"""


# 使用したデータは『すぐできる生物統計』
#
# 対応のある(対の)2標本t検定(両側)
# 9つの池のpHについて、夜明けと夕暮れに測定された2系列の測定結果
#
# 帰無仮説
# pH濃度の差の平均値が0である。
# つまり、池は夜明けと夕暮れで同じ濃度pHをもつ。
#


# import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats


def main():
    """(docstring)
    """

    # matplotlib
    # macOSやOS Xで文字化けするなら。
    # font = {'family' : 'Osaka'}

    dat = {'夜明けpH': [4.84, 5.26, 5.03, 5.67, 5.15, 5.54, 6.01, 5.32, 5.44],
            '夕暮れpH': [4.91, 5.62, 5.19, 5.89, 5.44, 5.49, 6.12, 5.61, 5.70]}

    df = pd.DataFrame(dat)
    print(df)
    print('')
    print(df.describe())
    print('')

    print('差(夕暮れpH - 夜明けpH)')
    diff = df.ix[:, '夕暮れpH'] - df.ix[:, '夜明けpH']
    print(diff)
    print('')
    # t値の手計算
    print('t = 差の平均値 / 差の標準誤差')
    print('pandas')
    print(diff.mean() / diff.sem())
    print('')
    # Scipyなら、sp.stats.mean(x) / sp.stats.sem(x)
    # と思ったが、公式で、
    # "scipy.stats.mean is deprecated; please update your code to use numpy.mean."
    # なので、以下
    print('numpyとscipy')
    print(np.mean(diff) / sp.stats.sem(diff))
    print('')

    # scipy.stats.ttest_rel()
    res = sp.stats.ttest_rel(df.ix[:, '夜明けpH'], df.ix[:, '夕暮れpH'])
    print(res)
    print('')
    # t値は|t| (絶対値)
    # だから、以下、abs()を使用。

    t_statistic, p_value = sp.stats.ttest_rel(df.ix[:, '夜明けpH'], df.ix[:, '夕暮れpH'])
    print('t値', abs(round(t_statistic, 3)))
    print('p値', round(p_value, 3))
    print('')

    if p_value < 0.05:
        print('{0}{1} {2}'.format('p値', round(p_value, 3), '< 0.05'))
        print('帰無仮説は棄却される。')
    else:
        print('{0} {1} {2}'.format('p値', round(p_value, 3), '> 0.05'))
        print('帰無仮説を棄却する証拠はない。')

if __name__ == '__main__':
    main()

出力

   夕暮れpH  夜明けpH
0   4.91   4.84
1   5.62   5.26
2   5.19   5.03
3   5.89   5.67
4   5.44   5.15
5   5.49   5.54
6   6.12   6.01
7   5.61   5.32
8   5.70   5.44

          夕暮れpH     夜明けpH
count  9.000000  9.000000
mean   5.552222  5.362222
std    0.358182  0.352199
min    4.910000  4.840000
25%    5.440000  5.150000
50%    5.610000  5.320000
75%    5.700000  5.540000
max    6.120000  6.010000

差(夕暮れpH - 夜明けpH)
0    0.07
1    0.36
2    0.16
3    0.22
4    0.29
5   -0.05
6    0.11
7    0.29
8    0.26
dtype: float64

t = 差の平均値 / 差の標準誤差
pandas
4.40420423293

numpyとscipy
4.40420423293

Ttest_relResult(statistic=-4.4042042329316624, pvalue=0.0022739422338356871)

t値 4.404
p値 0.002

p値0.002 < 0.05
帰無仮説は棄却される。

参考文献

パソコンで簡単!すぐできる生物統計―統計学の考え方から統計ソフトSPSSの使い方まで

パソコンで簡単!すぐできる生物統計―統計学の考え方から統計ソフトSPSSの使い方まで