「新しいWebデザインに変更して、
本当にユーザーの滞在時間は伸びたのか?」
「実施した研修プログラムは、
メンバーのスキルアップに効果があったのか?」
データ分析の現場で、このような
「2つのグループの平均値に、本当に意味のある差があるのか」
を客観的に判断したい場面は少なくありません。
人間の感覚だけで判断しようとすると、
一部の極端なデータに惑わされて見当違いの
結論を出してしまうリスクがあります。
そこで活躍する統計手法が「t検定(t-test)」です。
数学的な背景をすべて暗記する必要はありません。
大切なのは、
「データの性質に合わせて正しい関数を選び、
実際に出力された数値を実務の判断に活かすこと
(Learn by doing)」です。
今回は、Pythonを使ってt検定を実装する方法を、
アメブロでもバッチリ読めるテキスト形式で
スッキリと解説します!
📊 統計分析におけるt検定とは?
t検定とは、主に
「2つの母集団の平均値に有意な差
(偶然のブレとは言えない明確な差)があるかどうか」
を判定する統計学的な手法です。
📐 t検定の数理的なイメージ
t検定では、データをもとに「t値」と呼ばれる
統計量を計算します。
難しそうな計算の裏側で行われているのは、
実はとてもシンプルな引き算と割り算です。
-
t値 =(グループ1の平均 - グループ2の平均)÷(データのばらつき)
厳密には、分母の「データのばらつき」には、
それぞれのグループの不偏分散やサンプルサイズ
(データ数)から計算される標準誤差という数値が使われます。
この仕組みが意味しているのは、
「グループ間の平均の差」を「データのばらつき」で
割っているということです。
データの散らばりが小さく、
平均の差が大きいほどt値は大きくなり、
「明確な差がある」と判定されやすくなります。
💡 実務で使う主なt検定の種類
-
対応のないt検定(独立標本のt検定) 異なる2つのグループを比較する場合に使います(例:AチームとBチームのテスト点数の比較、広告Aと広告Bのクリック率の比較)。
-
対応のあるt検定(対応補本のt検定) 同じグループの前後比較を行う場合に使います(例:同じ参加者のプログラム受講前と受講後の体重比較)。
👨💻 Pythonによるt検定の実装ステップ
Pythonで統計分析を行う場合は、
科学技術計算ライブラリである
「SciPy(サイパイ)」を利用するのが最も効率的です。
💻 ケース1:広告のA/Bテスト(対応のないt検定)
2つの異なるグループで滞在時間に差があるかを検証します。
実務では2つのグループの分散(データの広がり方)が
等しいとは限らないため、等分散を仮定しない
「ウェルチのt検定(equal_var=False)」を使うのが安全です。
Python
ーーーーーー
import numpy as np
from scipy import stats
# サンプルデータの生成(滞在時間:秒)
np.random.seed(42)
group_a = np.random.normal(loc=120, scale=20, size=50) # 平均120秒
group_b = np.random.normal(loc=135, scale=25, size=50) # 平均135秒
# ウェルチの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%)を下回っている場合、「統計的に有意な差がある(偶然のブレではない)」と判断します。
💻 ケース2:プログラムの効果測定(対応のあるt検定)
同じ参加者10名の、
ダイエットプログラム開始前と1ヶ月後の体重を比較します。
個人の元の体重の影響(個体差)を排除して
純粋な効果を測るため、ttest_rel を使用します。
Python
ーーーーーー
# サンプルデータの生成(体重: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}")
ーーーーーー
⚠️ 分析を台無しにする「3つの落とし穴」
-
外れ値の放置 t検定は平均値をベースに計算するため、極端に大きな(または小さな)値が1つ混ざっているだけで結果が激しく歪みます。事前に箱ひげ図などでデータを確認し、異常値は除外する前処理を徹底しましょう。
-
データ数が少なすぎる 各グループのサンプルサイズが少なすぎる(目安として30未満)と、データの分布が正規分布(釣鐘型の分布)から外れた際に正しい検定ができなくなります。
-
p値ハッキング(有意差の捏造) 「p値が0.05未満になるまで、都合の悪いデータを削る」といった行為は不適切です。分析の目的と仮説は、必ずデータを集める前に設定してください。
📋 【コピペ用】実務でそのまま使えるウェルチのt検定関数
お手元のデータフレームから2つの列を渡すだけで、
自動で平均値の比較と判定までを行うテンプレートコードです。
Python
ーーーーーー
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(f"結論: 有意水準 {alpha} で、2つのグループには統計的に有意な差があります。")
else:
print(f"結論: 有意水準 {alpha} で、2つのグループに有意な差があるとは言えません。")
# 【使用例】データフレームの列を割り当てて実行
# perform_ab_test(df['A_score'], df['B_score'])
ーーーーーー
🏁 まとめ:完璧な数式理解より、正しいツール選び
SciPyを使えば、複雑な統計数式をガリガリ解かなくても、
わずか数行のコードで科学的なデータ分析が
実行できる時代です。
だからこそ重要なのは、コードを丸暗記することではなく、
「このデータは対応があるか・ないか」
「外れ値の処理は終わっているか」
を正しく見極めるリテラシーです。
まずは手元の簡単なデータや、
サンプルコードの数値を少し変えて動かしてみる
「Learn by doing」の精神で、勘に頼らない論理的な
意思決定の仕組みを構築していきましょう!
🏠 公式HPで「数字が苦手なノンエンジニア向け!コピペで自動判定まで完了する『Python統計分析コード集』&実務直結プロンプトテンプレート」を無料公開中!
脳のメモリを無駄遣いせず、
タイパ最強のルートでデータサイエンスを業務に組み込む
具体的なノウハウは、ぜひ公式HPのブログ記事を
ご覧ください。
「Pythonで統計分析!t検定の基礎から実装手順まで徹底解説」