t検定はあるデータ間に差があるかどうかを統計的に判断できる有力なツールですが、手計算では少し複雑で面倒ですよね。でも、Pythonを使えばt検定がとっても簡単です!この記事では、2標本のt検定(対応あり・なし)まで、Pythonでのt検定の方法をわかりやすく解説します。
Pythonを使ったt検定のコード概要
Pythonでt検定を行う場合は、scipy.stats
モジュールを使用して実行できます。t検定を行うときの基本的なコードの流れはこのようになります。
コードの基本的な流れ
- データを変数に格納
- 有意水準を決定
- 専用の関数を使ってt検定を実行
- t統計量とp値を出力
- 判定(統計的に有意かどうか判断)
- 2標本のt検定(対応あり):
scipy.stats.ttest_rel
- 2標本のt検定(対応なし):
scipy.stats.ttest_ind
1. 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("帰無仮説を採択(統計的に有意ではない)")
2. 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で割ることで対応できます。このとき、特定の方向性(正か負)にもとづいて適切に解釈する必要があります。
例えば、「対応のあるt検定」で片側検定を行う場合は以下のように書くことができます。
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 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
ライブラリを使用してデータを読み込む方法が便利です。
「対応のあるt検定」を行うためのコードを以下のように変更します。「sample_data.csv」というファイルから「data」という列名を持ったデータをインポートする場合です。
import pandas as pd
import scipy.stats as stats
# 有意水準
alpha = 0.05
# CSVファイルからデータを読み込む
df = pd.read_csv('sample_data.csv')
# "data"という列名を持ったデータを抽出
before = df['before'].dropna().tolist()
after = df['after'].dropna().tolist()
# 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("帰無仮説を採択(統計的に有意ではない)")
scipy.statsとstatsmodelsどっちがt検定に適している?
statsmodelsはscipy.statsと同じくPythonで統計分析を行うためのライブラリです。statsmodelsは複雑な統計計算を行うときに使用し、t検定のような比較的単純な統計計算はscipy.statsが適しています。
【statsmodels】
目的と特徴:統計モデルの推定、統計テスト、データ探索、データ可視化に特化しています。このライブラリは、統計モデリングに重点を置いており、線形モデル、一般化線形モデル、ロバスト線形モデル、時間系列分析モデルなど、多様な統計モデルの構築と分析が可能です。
利用シーン: 回帰分析、ANOVA(分散分析)、時系列分析など、複雑な統計モデリングや推定が必要な場合に適しています。
【scipy.stats】
目的と特徴:科学技術計算のためのライブラリSciPy
の一部で、統計的なテスト、確率分布、記述統計などの基本的な統計機能を提供します。より一般的な統計操作や標準的な統計テストに焦点を当てています。
利用シーン: 基本的な統計分析、確率分布の操作、t検定、相関分析など、比較的単純な統計計算やテストが必要な場合に適しています。