実践!Pythonでt検定|1標本、2標本(対応ありなし)を例題つきで


t検定はあるデータ間に差があるかどうかを統計的に判断できる有力なツールですが、手計算では少し複雑で面倒ですよね。でも、Pythonを使えばt検定がとっても簡単です!この記事では、1標本のt検定から2標本のt検定(対応あり・なし)まで、Pythonでのt検定の方法をわかりやすく解説します。

Pythonを使ったt検定のコード概要

Pythonでt検定を行う場合は、scipy.statsモジュールを使用して実行できます。t検定を行うときの基本的なコードの流れはこのようになります。

コードの基本的な流れ

  1. データを変数に格納
  2. 有意水準を決定
  3. 専用の関数を使ってt検定を実行
    • 1標本のt検定:scipy.stats.ttest_1samp
    • 2標本のt検定(対応あり):scipy.stats.ttest_rel
    • 2標本のt検定(対応なし):scipy.stats.ttest_ind
  4. t統計量とp値を出力
  5. 判定(統計的に有意かどうか判断)

1. 1標本のt検定(One-sample t-test)

1標本のt検定は、単一のサンプル群の平均が既知の母平均と異なるかどうかチェックする手法です。scipy.stats.ttest_1samp関数を使用します。

import scipy.stats as stats

# サンプルデータ
sample = [2, 3, 5, 6, 9]

# 母平均
pop_mean = 5

# 有意水準
alpha = 0.05

# t検定を実行
t_statistic, p_value = stats.ttest_1samp(sample, pop_mean)

print("t統計量:", t_statistic)
print("p値:", p_value)

# 判定
if p_value < alpha:
    print("帰無仮説を棄却(統計的に有意)")
else:
    print("帰無仮説を採択(統計的に有意ではない)")

2. 2標本対応ありのt検定(Paired t-test)

2標本対応ありのt検定は、同じ対象に対して行われた前後の測定値など、対応のある2つのサンプル群に対して使用されます。scipy.stats.ttest_rel関数を使用します。

import scipy.stats as stats

# 対応のある2つのサンプル群
before = [2, 3, 4, 5, 6]
after = [3, 4, 5, 6, 7]

# 有意水準
alpha = 0.05

# t検定を実行
t_statistic, p_value = stats.ttest_rel(before, after)

print("t統計量:", t_statistic)
print("p値:", p_value)

# 判定
if p_value < alpha:
    print("帰無仮説を棄却(統計的に有意)")
else:
    print("帰無仮説を採択(統計的に有意ではない)")

3. 2標本対応なしのt検定(Independent t-test)

2標本対応なしのt検定は、互いに独立した2つのサンプル群間で平均値に差があるかどうかをテストします。scipy.stats.ttest_ind関数を使用します。

import scipy.stats as stats

# 独立した2つのサンプル群
group1 = [20, 21, 22, 23, 24]
group2 = [30, 31, 32, 33, 34]

# 有意水準
alpha = 0.05

# t検定を実行
t_statistic, p_value = stats.ttest_ind(group1, group2)

print("t統計量:", t_statistic)
print("p値:", p_value)

# 判定
if p_value < alpha:
    print("帰無仮説を棄却(統計的に有意)")
else:
    print("帰無仮説を採択(統計的に有意ではない)")

Pythonを使ったt検定で片側検定をする場合

Pythonのscipy.statsライブラリを使用してt検定をする場合、注意したいのはデフォルトで両側検定のp値を出力する点です。

Pythonのscipy.statsをつかって片側検定をする場合は、このp値を2で割ることで対応できます。このとき、特定の方向性(正か負)にもとづいて適切に解釈する必要があります。

例えば、「1標本のt検定」で片側検定を行う場合は以下のように書くことができます。

import scipy.stats as stats

sample = [2, 3, 5, 6, 9]
pop_mean = 5
t_statistic, p_value = stats.ttest_1samp(sample, pop_mean)

# 両側検定
print("両側検定のp値:", p_value)

# 片側検定
if t_statistic > 0:
    p_value_one_sided = p_value / 2
else:
    p_value_one_sided = 1 - p_value / 2
print("片側検定のp値:", p_value_one_sided)

データをcsvファイルからインポートする場合

サンプルデータをファイルからインポートするには、Pythonのpandasライブラリを使用してデータを読み込む方法が便利です。

「1標本のt検定」を行うためのコードを以下のように変更します。「sample_data.csv」というファイルから「data」という列名を持ったデータをインポートする場合です。

import pandas as pd
import statsmodels.stats.weightstats as sm

# CSVファイルからデータを読み込む
# ここでは 'sample_data.csv' というファイル名と 'data' という列名を仮定しています
df = pd.read_csv('sample_data.csv')
sample = df['data']

# 母平均
pop_mean = 5

# 有意水準
alpha = 0.05

# t検定を実行
t_statistic, p_value, df = sm.ttest_1samp(sample, pop_mean)

print("t統計量:", t_statistic)
print("p値:", p_value)
print("自由度:", df)

# 判定
if p_value < alpha:
    print("帰無仮説を棄却(統計的に有意)")
else:
    print("帰無仮説を採択(統計的に有意ではない)")

scipy.statsとstatsmodelsどっちがt検定に適している?

statsmodelsはscipy.statsと同じくPythonで統計分析を行うためのライブラリです。statsmodelsは複雑な統計計算を行うときに使用し、t検定のような比較的単純な統計計算はscipy.statsが適しています。

statsmodelsでt検定をやってみる

せっかくなのでstatsmodelsを使ってt検定をやってみましょう。

まず、statsmodelsがインストールされていない場合は、以下のコマンドでインストールしてください。

pip install statsmodels

では「1標本のt検定」のPythonコードを書いてみましょう。

import numpy as np
import statsmodels.stats.weightstats as sm

# サンプルデータ
sample = np.array([2, 3, 5, 6, 9])

# 母平均
pop_mean = 5

# 有意水準
alpha = 0.05

# t検定を実行
t_statistic, p_value, df = sm.ttest_1samp(sample, pop_mean)

print("t統計量:", t_statistic)
print("p値:", p_value)
print("自由度:", df)

# 判定
if p_value < alpha:
    print("帰無仮説を棄却(統計的に有意)")
else:
    print("帰無仮説を採択(統計的に有意ではない)")
タイトルとURLをコピーしました