Pythonで統計分析!t検定の基礎から実装手順まで徹底解説
データ分析の現場で「2つのグループ間に本当に差があるのか?」を客観的に判断したい場面は少なくありません。例えば、「新しいデザインのWebサイトは、古いデザインよりも滞在時間が長いか?」「新薬は既存薬よりも効果があるか?」といった疑問です。このような時に活躍する統計分析の手法が「t検定(t-test)」です。
この記事では、Pythonを使ってt検定を実装する方法を、統計の基礎知識から具体的なコード例、よくある失敗例まで網羅的に解説します。この記事を読むことで、実務で自信を持ってt検定を行い、データに基づいた意思決定ができるようになります。
目次
統計分析におけるt検定とは?
t検定とは、主に「2つの母集団の平均値に有意な差があるかどうか」を検定する統計学的な手法です。標本(サンプル)から得られたデータを用いて、背後にある母集団全体の傾向を推測します。
t検定の数理的な背景
t検定では、t値と呼ばれる統計量を計算します。t値は以下のブロック数式のように表されます(シンプルな例)。
$$ t = \frac{\bar{x}_1 – \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}} $$
ここで、\(\bar{x}\) は標本平均、\(s^2\) は不偏分散、\(n\) はサンプルサイズを表します。この数式が意味するのは、「グループ間の平均の差」を「データのばらつき(標準誤差)」で割っているということです。差が大きく、ばらつきが小さいほど、t値は大きくなり、「有意な差がある」と判定されやすくなります。
t検定の主な種類
- 対応のないt検定(独立標本のt検定): 異なる2つのグループ(例:A組とB組のテストの点数)を比較する場合に使います。
- 対応のあるt検定(対応標本のt検定): 同じグループの前後比較(例:同じ生徒の1学期と2学期のテストの点数、ダイエット前後の体重)に使います。
- 1標本のt検定: 1つのグループの平均値が、特定の基準値と異なるかを調べます。
Pythonを使ったt検定の準備
Pythonで統計分析を行う場合、SciPy(サイパイ)という科学技術計算ライブラリを利用するのが一般的です。また、データの操作にはpandas、数値計算にはNumPyを用います。
まずは必要なライブラリをインストールし、インポートしておきましょう。
import numpy as np
import pandas as pd
from scipy import stats
実践:Pythonでt検定を行う手順と具体例
ここからは、実務でよく遭遇するシチュエーションを想定し、Pythonでの実装例を解説します。
ケース1:広告A/Bテスト(対応のないt検定)
Webサイトに2種類の広告(デザインAとデザインB)をランダムに表示し、それぞれのクリック率や滞在時間を測定したとします。「デザインAとBで滞在時間に差があるか」を検証します。
# サンプルデータの生成(滞在時間:秒)
np.random.seed(42)
group_a = np.random.normal(loc=120, scale=20, size=50) # 平均120秒、標準偏差20
group_b = np.random.normal(loc=135, scale=25, size=50) # 平均135秒、標準偏差25
# ウェルチのt検定(等分散を仮定しない)を実行
t_stat, p_value = stats.ttest_ind(group_a, group_b, equal_var=False)
print(f"t値: {t_stat:.3f}")
print(f"p値: {p_value:.4f}")
ここで重要なのが p値(p-value) です。一般的にp値が0.05(5%)を下回った場合、「統計的に有意な差がある」と判断します。この例では、SciPyの ttest_ind 関数を使っています。また、実務では2つのグループの分散が等しいとは限らないため、equal_var=False を指定してウェルチのt検定を行うのが安全です。
ケース2:ダイエットプログラムの効果測定(対応のあるt検定)
同じ参加者20名の、ダイエットプログラム開始前と1ヶ月後の体重を比較します。
# サンプルデータの生成(体重:kg)
weight_before = np.array([75, 80, 68, 92, 85, 78, 88, 70, 77, 95])
weight_after = weight_before - np.random.normal(loc=2, scale=1, size=10) # 平均2kg減
# 対応のあるt検定を実行
t_stat, p_value = stats.ttest_rel(weight_before, weight_after)
print(f"t値: {t_stat:.3f}")
print(f"p値: {p_value:.4f}")
対応のあるt検定には ttest_rel を使用します。これにより、個人の元の体重(個体差)の影響を排除して、純粋なプログラムの効果を分析できます。
t検定を行う際の注意点・よくある落とし穴
Pythonを使えば数行のコードでt検定を実行できますが、統計的な前提条件を満たしていないデータを無理に検定すると、誤った結論を導く危険性があります。
- 外れ値の影響を受けやすい: t検定は平均値を基に計算されるため、極端に大きな(または小さな)値が1つあるだけで結果が歪みます。分析前に箱ひげ図などでデータを確認し、必要に応じて除外などの前処理を行いましょう。
- 正規性の仮定: 原則として、データが正規分布(釣鐘型の分布)に従っていることが前提です。サンプルサイズが小さい(おおむね30未満)場合は特に注意が必要で、シャピロ・ウィルク検定などで正規性を確認するか、ノンパラメトリック検定(マン・ホイットニーのU検定など)への切り替えを検討します。
- p値のハッキング: 有意な結果(p \( \lt 0.05 \))が出るまでデータを削ったり、様々な変数を手当たり次第に検定したりする行為は不適切です。分析の目的と仮説は事前に設定しましょう。
コピペで使える!Python・t検定チェックリスト付きテンプレート
実務でそのまま活用できる、対応のないt検定(ウェルチのt検定)のテンプレート関数です。データフレームから対象の列を抽出し、結果をわかりやすく出力します。
import pandas as pd
from scipy import stats
def perform_ab_test(data_group_1, data_group_2, alpha=0.05):
"""
2つのグループ間でウェルチのt検定を行い、結果を出力する関数
"""
t_stat, p_val = stats.ttest_ind(data_group_1, data_group_2, equal_var=False)
print("--- t検定結果 ---")
print(f"グループ1 平均: {data_group_1.mean():.2f}")
print(f"グループ2 平均: {data_group_2.mean():.2f}")
print(f"t値: {t_stat:.3f}, p値: {p_val:.4f}")
if p_val < alpha:
print("結論: 有意水準 {} で、2つのグループには統計的に有意な差があります。".format(alpha))
else:
print("結論: 有意水準 {} で、2つのグループに有意な差があるとは言えません。".format(alpha))
# 使用例
# perform_ab_test(df['A_score'], df['B_score'])
よくある質問(FAQ)
Q1. サンプルサイズ(データ数)はどのくらい必要ですか?
A. 一般的には各グループに30以上のサンプルがあれば、中心極限定理により平均値の分布が正規分布に近づくため、t検定を適用しやすいと言われています。少なすぎる場合(例:5個ずつなど)は、結果の信頼性が下がるため注意が必要です。
Q2. 3つ以上のグループを比較したい場合はどうすればいいですか?
A. t検定は「2グループ間」の比較にしか使えません。3つ以上のグループ(例:デザインA、B、C)を比較する場合は、t検定を繰り返すのではなく、「分散分析(ANOVA)」を使用します。t検定を繰り返すと、誤って「差がある」と判定してしまう確率(第一種の過誤)が上昇してしまうからです。
Q3. p値が0.05より大きかった場合、「2つのグループは完全に同じ」と言えますか?
A. 言えません。p値が0.05以上だった場合は、「差があるとは証明できなかった(手持ちのデータからは判断を保留する)」という意味になります。「差がないことが証明された」わけではない点に注意してください。
まとめ
Pythonを使ったt検定の実装方法について解説しました。SciPy を使えば複雑な計算を意識することなく、数行のコードで統計分析が可能です。
しかし、分析ツールを動かすこと以上に重要なのは、「データが検定の前提条件を満たしているか」「対応のある・なしどちらの手法を選ぶべきか」を正しく判断することです。今回紹介したテンプレートや注意点を参考に、ぜひご自身の手元のデータでt検定を実践してみてください。
Learning Tools
記事を検索したい方はここから!
記事を検索
関連記事や、今の内容に近いテーマをすぐに検索できます。
例: AI / 勉強法 / プログラミング / 塾講師