🍣

サンプルサイズの決め方8章 対応がある場合の母平均の差の検定

2024/10/07に公開

はじめに

このブログ記事では、永田靖著『サンプルサイズの決め方』(朝倉書店)の8章を参考に対応がある場合の母平均の差の検定、検出力の計算方法、適切なサンプルサイズの設計方法について解説します。これら統計学の基本的な概念をPythonを用いて実装しながら確認していきます。

対応がある場合の母平均の差の検定

対応がある場合の母平均の差の検定をする手順は書籍では以下のように紹介されています。

対応のあるデータ対 (x_{1i}, x_{2i}) (i = 1,2,\cdots,n) の構造式を以下のように想定:

\begin{aligned} x_{1i} &= \mu_1 + \gamma_i + \varepsilon_{1i}, \quad \varepsilon_{1i} \sim N(0, \sigma_1^2) \\ x_{2i} &= \mu_2 + \gamma_i + \varepsilon_{2i}, \quad \varepsilon_{2i} \sim N(0, \sigma_2^2) \end{aligned}

ここで、\mu_1, \mu_2は比較対象の母平均、\gamma_iは対応の効果、\varepsilon_{1i}, \varepsilon_{2i}は互いに独立な誤差項となっています。検定目的は\mu_1\mu_2の差の検定です。対応効果を消去するため、各データ対の差を計算します:

d_i = x_{1i} - x_{2i} = \mu_1 - \mu_2 + \varepsilon_{1i} - \varepsilon_{2i}

この差d_iに基づいて、以下の検定手順を実施します。

  • 手順1 仮説の設定

    • 帰無仮説 H_0: \mu_1 = \mu_2
    • 対立仮説:
      • (1) H_1: \mu_1 \neq \mu_2 (両側検定)
      • (2) H_1: \mu_1 > \mu_2 (右片側検定)
      • (3) H_1: \mu_1 < \mu_2 (左片側検定)
  • 手順2 有意水準の設定
    有意水準 \alpha の設定 (通常は \alpha = 0.05 とする)

  • 手順3 棄却域の設定

    • 対立仮説(1)の場合: R: |t_0| \geq t(\phi, \alpha)
    • 対立仮説(2)の場合: R: t_0 \geq t(\phi, 2\alpha)
    • 対立仮説(3)の場合: R: t_0 \leq -t(\phi, 2\alpha)

ここで、t(\phi, \alpha)は自由度 \phit 分布の両側 100\alpha% 点です。

  • 手順4 検定統計量の計算

    • データ対の差 d_1, d_2, \cdots, d_n を求め、検定統計量 t_0 の値を計算:
    • t_0 = \frac{\bar{d}}{\sqrt{V_d/n}}
    • \bar{d} = \frac{1}{n} \sum_{i=1}^n d_i
    • V_d = \frac{S_d}{n-1} = \frac{\sum(d_i - \bar{d})^2}{n-1} = \frac{\sum d_i^2 - (\sum d_i)^2/n}{n-1}
    • \phi = n-1
  • 手順5 判定
    計算された t_0 が手順3で設定した棄却域 R にあれば、有意と判定し、帰無仮説 H_0 を棄却する。

この検定手順に則って検定を行う関数をpythonで実装しました。

import numpy as np
from scipy import stats

def paired_t_test(x1, x2, alpha=0.05, test_type='two-sided'):
    """
    パラメータ:
    x1, x2 : array
        対応のあるデータセット
    alpha : float, optional
        有意水準 (デフォルト: 0.05)
    test_type : {'two-sided', 'greater', 'less'}, optional
        検定の種類 (デフォルト: 'two-sided')
        
    Returns:
    t_statistic : float
        検定統計量 t0 の値
    reject_null : bool
        帰無仮説を棄却するかどうか
    """
    
    d = np.array(x1) - np.array(x2)
    n = len(d)
    d_bar = np.round(np.mean(d), 2)
    v_d = np.round(np.sum((d - d_bar)**2) / (n - 1), 4)
    t_statistic = np.round(d_bar / np.sqrt(v_d / n), 4)
    df = n - 1

    # 棄却域の計算
    if test_type == 'two-sided':
        critical_value = stats.t.ppf(1 - alpha/2, df)
        reject_null = abs(t_statistic) >= critical_value
    elif test_type == 'greater':
        critical_value = stats.t.ppf(1 - alpha, df)
        reject_null = t_statistic >= critical_value
    elif test_type == 'less':
        critical_value = stats.t.ppf(alpha, df)
        reject_null = t_statistic <= critical_value
    else:
        raise ValueError("test_type must be 'two-sided', 'greater' or 'less'")
    
    return t_statistic, reject_null
\begin{aligned} &\text{問題8.1} \\ &n = 10 \text{ 組の対応のある下記のデータに基づいて、} H_0 : \mu_1 = \mu_2, H_1 : \mu_1 \neq \mu_2 \text{を}\\ &\text{有意水準 } 5\% \text{ で検定せよ。} \\ &\begin{array}{|c|cccccccccc|} \hline \text{データ1} & 6.2 & 4.8 & 7.3 & 5.5 & 6.5 & 4.9 & 6.8 & 7.9 & 6.6 & 7.3 \\ \text{データ2} & 5.3 & 6.2 & 5.9 & 7.3 & 8.4 & 7.3 & 6.9 & 7.6 & 8.5 & 8.1 \\ \hline \end{array} \end{aligned}
# 問題 8.1
x1_8_1 = [6.2, 4.8, 7.3, 5.5, 6.5, 4.9, 6.8, 7.9, 6.6, 7.3]
x2_8_1 = [5.3, 6.2, 5.9, 7.3, 8.4, 7.3, 6.9, 7.6, 8.5, 8.1]

t_stat_8_1, reject_8_1 = paired_t_test(x1_8_1, x2_8_1, alpha=0.05, test_type='two-sided')

print("問題 8.1 の結果:")
print(f"t統計量: {t_stat_8_1}")
print(f"帰無仮説を棄却するか: {reject_8_1}")
結果
問題 8.1 の結果:
t統計量: -1.84
帰無仮説を棄却するか: False

t統計量(-1.84)の絶対値が臨界値(2.262)より小さいため、帰無仮説を棄却できません。つまり、データ1とデータ2の母平均に有意な差があるとは言えません。

\begin{aligned} &\text{問題8.2} \\ &n = 9 \text{ 組の対応のある下記のデータに基づいて、} H_0 : \mu_1 = \mu_2, H_1 : \mu_1 > \mu_2 \text{を}\\ &\text{有意水準 } 5\% \text{ で検定せよ。} \\ &\begin{array}{|c|ccccccccc|} \hline \text{データ1} & 10.8 & 11.2 & 9.7 & 9.9 & 12.0 & 9.6 & 10.5 & 10.7 & 10.1 \\ \text{データ2} & 10.2 & 10.1 & 9.9 & 8.2 & 10.2 & 9.4 & 10.4 & 10.0 & 10.5 \\ \hline \end{array} \end{aligned}
# 問題 8.2
x1_8_2 = [10.8, 11.2, 9.7, 9.9, 12.0, 9.6, 10.5, 10.7, 10.1]
x2_8_2 = [10.2, 10.1, 9.9, 8.2, 10.2, 9.4, 10.4, 10.0, 10.5]

t_stat_8_2, reject_8_2 = paired_t_test(x1_8_2, x2_8_2, alpha=0.05, test_type='greater')

print("\n問題 8.2 の結果:")
print(f"t統計量: {t_stat_8_2}")
print(f"帰無仮説を棄却するか: {reject_8_2}")
結果
問題 8.2 の結果:
t統計量: 2.3632
帰無仮説を棄却するか: True

t統計量(2.3632)が臨界値(1.860)より大きいため、帰無仮説を棄却します。つまり、データ1の母平均がデータ2の母平均より有意に大きいと結論づけられます。

\begin{aligned} &\text{問題8.3} \\ &n = 8 \text{ 組の対応のある下記のデータに基づいて、} H_0 : \mu_1 = \mu_2, H_1 : \mu_1 < \mu_2 \text{を}\\ &\text{有意水準} 5\% \text{ で検定せよ。} \\ &\begin{array}{|c|cccccccc|} \hline \text{データ1} & 19 & 19 & 21 & 19 & 22 & 19 & 20 & 21 \\ \text{データ2} & 21 & 22 & 16 & 22 & 25 & 18 & 24 & 23 \\ \hline \end{array} \end{aligned}
# 問題 8.3
x1_8_3 = [19, 19, 21, 19, 22, 19, 20, 21]
x2_8_3 = [21, 22, 16, 22, 25, 18, 24, 23]

t_stat_8_3, reject_8_3 = paired_t_test(x1_8_3, x2_8_3, alpha=0.05, test_type='less')

print("\n問題 8.3 の結果:")
print(f"t統計量: {t_stat_8_3}")
print(f"帰無仮説を棄却するか: {reject_8_3}")
結果
問題 8.3 の結果:
t統計量: -1.3129
帰無仮説を棄却するか: False

t統計量(-1.3129)が臨界値(-1.895)より大きいため、帰無仮説を棄却できません。つまり、データ1の母平均がデータ2の母平均より小さいとは言えません。

検出力・サンプルサイズの計算

5章で紹介した方法と同じであるため、あらためて紹介はしません。こちらを参考にしてください。

最後に

本ブログでは、永田靖著『サンプルサイズの決め方』の第8章「対応がある場合の母平均の差の検定」の内容を、Pythonを用いて実践的に解説しました。このブログにて『サンプルサイズの決め方』に関するブログシリーズは終了とします。このブログを通してサンプルサイズの設計に関して知見が深まり、実務や研究に活きると幸いです。

DMM Data Blog

Discussion