論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説(ジャストインタイム型データサイエンス教育)
t検定 — 平均値の比較
t-Tests for Means
標本サイズが小さいときの平均値検定 — 統計実務の入口
仮説検定パラメトリック正規性前提小標本可

🔖 キーワード索引

t tests」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「t tests」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

各種 t 検定1 標本 t2 標本 t対応のある tWelch の t前提条件 (正規性/等分散)scipy.stats.ttestF 検定Mann–Whitney 代替

これらのキーワードは「t tests の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

平均の差を比べるための道具です。

少数のデータで正しく判断するために使います。

部活の練習前後で成績が変わったか調べます。

t検定の種類と使い分けについて読みましょう。

📍 あなたが今見ているもの

🍰 まずはやさしく

t検定のまとめガイドです。

状況に合わせて正しい方法を選ぶために使います。

都道府県ごとのデータを比べる時に役立ちます。

前提条件や手法の選び方を順番に解説します。

本ページでは、 t検定を統合的に解説します。 1標本2標本(独立)対応のあるt検定Welchのt検定を、 前提条件・効果量・信頼区間まで一気通貫で理解できます。

t検定は、 標本サイズが小さい(n < 30 程度)ときに「平均値」に関する仮説を検証する最も基本的な方法です。 SSDSE-B のような 47 都道府県データでも頻繁に使われます。

🛡️ t 検定のロバスト代替と意思決定フロー

「とりあえず ttest_ind」ではなく、 データ特性に応じて適切な手法を選ぶための比較表です。

状況 推奨手法 理由 / 注意
n が大きく分布も正規Student の t / Welch の t古典的最強。 Welch を既定にしておけば等分散を気にせず安心。
n が小さく非正規・歪み大Mann-Whitney U順位ベースで分布形に依存しない。 効果量は r = Z/√N。
対応データかつ差分が非正規Wilcoxon 符号順位差分の中央値の検定。 効果量は r_w。
外れ値が支配的Yuen の t(トリム平均)両端 20% をトリムした平均で検定。 scipy.stats.ttest_ind の代替に pingouin.ttest(... yuen=True)
同等性 (差がないこと) を主張TOST(two one-sided tests)「差が ±δ 以内」を能動的に示す。 statsmodels.stats.weightstats.ttost_ind
事前確率を反映したいベイズ的 t 検定 (BF₁₀)BF₁₀ > 3 で「中程度の証拠あり」。 pingouin.ttest が自動計算。
分布仮定を一切置きたくないブートストラップ平均差10,000 回の再抽出で 95% CI。 サンプル数 5,000 件超でも実用速度。

論文・コンペでは「Welch の t と Mann-Whitney U の両方を行い、 結論が一致するか確認」する two-track 報告 が信頼性を高めます。

🎨 直感で掴む — t検定の正体

🍰 まずはやさしく

ものさしで差を測るようなものです。

その差がたまたま起きたことか判断します。

身長のわずかな差が誤差かどうかを考えます。

バラつきと差の関係について詳しく読みましょう。

t検定の核心は「平均の差は本物か、 たまたまのバラつきか?」を 偏差で割った標準化スコア で測ること。 SSDSE-B-2026 を例にすると、 「人口 100 万人以上の県」と「未満の県」に出生率を分けて比較するとき、 ふたつの群の平均差を 群内のバラつきの大きさ で割ると t値が得られます。 t値が大きければ「差は本物っぽい」、 小さければ「誤差でも起こりうる」と判断します。

比喩で言うと、 5cm の差が大きいかどうかは 普段のブレ と比較するべきです。 普段の身長測定誤差が 0.5cm なら 5cm は大きいですが、 普段のブレが 10cm(厚着の重量など)なら誤差範囲内。 t検定はこの「相対的な大きさ」を 1 つの数値で表してくれるツールです。

🎮 触って理解する — 使い分けナビと「対応あり」の威力

本ページの主役は「どの t 検定を使うか」の判断です。 デモ1では 3 つの質問に答えるだけで、 1標本 / Student / Welch / 対応あり / ノンパラ代替が絞り込まれます。 デモ2では SSDSE-B-2026 の実測値(同一 47 都道府県の年平均気温 B4101、 2013 年と 2023 年)を使い、 同じ平均差 +1.19℃ でも「対応あり」として扱うと t 値が 2.6 → 17.3 に跳ね上がる仕組みを、 ペア相関 ρ を動かして体感します。 計算はすべてこのブラウザ内で完結し(t 分布の両側 p 値を不完全ベータ関数で数値実装、 scipy と相対誤差 10⁻¹⁰ 程度で一致を検証済み)、 外部ライブラリ・外部通信はありません。 なお 2 群の平均・SD・n を自由に動かして t と p を見る実験は姉妹ページ「t検定」の🎮、 棄却域と過誤の可視化は「仮説検定」の🎮、 自由度と t 分布の形状は「自由度」の🎮で扱っています。

🧭 デモ1:使い分けナビ — 3 つの質問で検定が決まる

ボタンを選ぶと推奨される検定・scipy の関数・自由度が即座に更新されます。 本文の「📊 11. t検定の使い分け」表を操作できるフローチャートにしたものです。 Q3 は独立 2 群のときだけ意味を持ちます。

Q1. 何と何を比べる?
Q2. 分布の形は?
Q3. 2 群の分散は等しいと言える?(独立 2 群のみ)

🔗 デモ2:ペア相関 ρ が生む「対応あり」の検出力 — 実測 47 県の気温 2013 vs 2023

同一 47 都道府県の年平均気温を 2013 年と 2023 年で比べると、 平均差は +1.19℃。 これを「独立な 2 群」として Welch 検定すると t = 2.57 (p ≈ 0.012) ですが、 「同じ県の前後」 として対応づけると t = 17.3 (p ≈ 10⁻²¹) になります。 鍵はペア相関 ρ:差の分散は $s_d^2 = s_1^2 + s_2^2 - 2\rho s_1 s_2$ なので、 ρ が 1 に近いほど「県ごとの個性(もともと暖かい/寒い)」がキャンセルされ、 標準誤差が縮みます。 実測の ρ は約 0.99。 スライダーで ρ を下げて、 対応づけの利得が消えていく様子を確かめてください(曲線上を直接ドラッグ/スワイプしても動かせます)。

固定値は SSDSE-B-2026 の実測: 2013 年 x̄₁=15.61℃ (s₁=2.41)、 2023 年 x̄₂=16.80℃ (s₂=2.05)、 実測ペア相関 ρ=0.9907、 n=47。 実測点(緑の点)では paired t=17.3 となり scipy の実測値 t=17.33 (df=46) と一致(Welch は t=2.57, df=89.7)。 スライダーで ρ を下げた場合や n<47 の場合は「もし相関がこれしか無かったら/n 県分しか測れなかったら」という架空の思考実験です(平均・SD は実測値に固定)。

💡 解説を深める — 直感・落とし穴・発展

直感:対応のある t 検定は「n 対の 2 測定」を「n 個の差 $d_i$」に変換して 1標本 t 検定に帰着させる手法です。 差を取る瞬間に、 各ペアが共有する個体差(県の気候・被験者の体質)が分子からも分母からも消えます。 消える量を式で書くと共分散項 $2\rho s_1 s_2$。 気温データのように「10 年経っても暖かい県は暖かい」 (ρ≈0.99) なら、 群内バラつき (s≈2℃強) のほとんどが個体差であり、 差の SD はわずか 0.47℃ に縮みます。 これが同じ +1.19℃ の差を「ノイズの 17 倍」に見せるカラクリです。

落とし穴:① 対応データを ttest_ind に掛けると標準誤差が過大になり、 本デモの通り検出力を大きく損ないます(逆に、 独立なデータを無理に ttest_rel に掛けるのは対応関係の捏造であり不正)。 ② ρ が低いペアリング(目安 ρ < 0.5)では、 分散の縮小効果が小さい一方で自由度が $n_1+n_2-2$ から $n-1$ へ半減するため、 対応づけが逆効果になり得ます — デモ2で ρ=0 付近と n を小さくして確かめられます。 ③ 等分散仮定:「Levene 検定で確認してから Student か Welch を選ぶ」という 2 段階手続きは全体の第一種過誤率を歪めることが知られており、 現在は最初から Welch を既定にするのが推奨です(R の t.test() の既定も Welch)。 ④ 対応ありの効果量は $d = \bar{d}/s_d$($d_z$)で、 独立 2 群の Cohen's d と定義が異なるため混同しないこと。

発展:ペアリングは実験計画法の「ブロック化」の最小例で、 3 時点以上に増やすと反復測定 ANOVA や混合効果モデル(個体をランダム効果に)へ一般化されます。 A/B テストの世界では、 実験前の共変量で分散を削る CUPED や共分散分析 (ANCOVA) が「対応づけと同じ発想で SE を縮める」現代版です。 差の正規性が怪しければ Wilcoxon 符号順位検定(ノンパラメトリック検定)へ。 検定前に必要な n を見積もる検出力分析、 判断の指標となる効果量、 t 分布の形を決める自由度も併せて確認してください。

📐 8. 効果量(Cohen's d)と検出力

🍰 まずはやさしく

差の大きさを数値にする方法です。

データの数に左右されない評価をするために使います。

スマホの利用時間の差がどれほど重要か測ります。

効果量と検出力の考え方について解説します。

p値はサンプル数依存。 サンプルが多いほど小さな差でも有意になる。 効果の大きさ自体は効果量で評価する。

Cohen's d

$$d = \frac{\bar{x}_1 - \bar{x}_2}{s_p}$$

慣例:|d| ≈ 0.2 小、 0.5 中、 0.8 大。

🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 B4101(年平均気温) 北海道 11.0 東京都 17.6 沖縄県 23.8 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# ── この抜粋で使うデータを用意します ──
import numpy as np
import pandas as pd

import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]        # 2023 年の 47 都道府県
east = df.iloc[:24]['B4101']   # 北海道〜静岡の年平均気温
west = df.iloc[24:]['B4101']   # 愛知〜沖縄の年平均気温

def cohens_d(a, b):
    pooled = np.sqrt(((len(a)-1)*np.var(a, ddof=1) + (len(b)-1)*np.var(b, ddof=1)) / (len(a)+len(b)-2))
    return (np.mean(a) - np.mean(b)) / pooled

print('Cohen d =', round(cohens_d(east, west), 3))  # 東西の年平均気温
📤 実行例(実測) Cohen d = -1.198
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。

検出力 (Power)

「真に効果があるとき、 検定が正しく有意となる確率」。 慣例 0.8 以上が望ましい。 必要サンプルサイズの事前計算に使う。

🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
1
2
3
4
from statsmodels.stats.power import TTestIndPower
analysis = TTestIndPower()
n_needed = analysis.solve_power(effect_size=0.5, alpha=0.05, power=0.8)
print(f'必要サンプルサイズ (各群): {n_needed:.0f}')
📤 実行例(実測) 必要サンプルサイズ (各群): 64
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。

🎯 9. 平均の信頼区間

p値より、 平均の95%信頼区間を報告する方が情報量が多い。

$$\bar{x} \pm t_{\alpha/2, n-1} \cdot \frac{s}{\sqrt{n}}$$

🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np
from scipy import stats

x = df['B4101']  # 年平均気温 → 平均16.80℃, 95%CI=[16.20, 17.40]
n = len(x)
mean = x.mean()
se = x.std(ddof=1) / np.sqrt(n)
t_crit = stats.t.ppf(0.975, df=n-1)
ci = (mean - t_crit*se, mean + t_crit*se)
print(f'平均 = {mean:.2f}, 95%CI = [{ci[0]:.2f}, {ci[1]:.2f}]')
📤 実行例(実測) 平均 = 16.80, 95%CI = [16.20, 17.40]
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。

🔀 10. 多重比較補正

複数の t検定を行うと、 family-wise 第一種過誤率が膨らむ。 K 個の検定をすると、 全体で α が約 $1-(1-\alpha)^K \approx K\alpha$ になる。

🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
1
2
3
4
5
from statsmodels.stats.multitest import multipletests
p_values = [0.001, 0.012, 0.034, 0.045, 0.060]
reject, p_adj, _, _ = multipletests(p_values, alpha=0.05, method='holm')
print('Adjusted p:', p_adj)
print('Reject:', reject)
📤 実行例(実測) Adjusted p: [0.005 0.048 0.102 0.102 0.102] Reject: [ True True False False False]
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。

📊 11. t検定の使い分け

状況 使う検定 SciPy 関数
基準値との比較1標本t検定ttest_1samp
独立2群(等分散仮定)Studentのt検定ttest_ind(equal_var=True)
独立2群(等分散仮定なし)Welchのt検定ttest_ind(equal_var=False)
同一個体の前後対応のあるt検定ttest_rel
正規性が成り立たないMann–Whitney U / Wilcoxonmannwhitneyu / wilcoxon
3 群以上ANOVAf_oneway

🔬 数式を言葉で読み解く — t統計量の構成

$$ t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\dfrac{s_1^2}{n_1} + \dfrac{s_2^2}{n_2}}} $$
記号意味SSDSE-B-2026 例
$\bar{x}_1, \bar{x}_2$2 群の標本平均大都市と地方の出生率平均
$s_1^2, s_2^2$2 群の不偏分散各群内のバラつき
$n_1, n_2$サンプルサイズ大都市 7 県 vs 地方 40 県など
分子「シグナル」差大きいほど差が明確
分母「ノイズ」標準誤差小さいほど結論が安定

t値の絶対値が自由度の臨界値(2 群比較で約 2 程度)を超えれば、 通常 $p < 0.05$ で「平均差が偶然とは考えにくい」と判断します。

🧮 数式に値を入れて手で計算する: 2 標本 t 検定

SSDSE-B-2026 (2023 年・47 都道府県) で「東日本 (北海道〜静岡 24 県) vs 西日本 (愛知〜沖縄 23 県) の年平均気温 (B4101)」に差があるかを Welch t 検定で確かめる。

Step 1: 群別統計 (SSDSE-B-2026 の B4101 から算出)

東日本 (n=24): x̄ ≈ 15.77℃, s² ≈ 3.94 西日本 (n=23): x̄ ≈ 17.88℃, s² ≈ 2.26 SE = √(3.94/24 + 2.26/23) = √(0.164 + 0.098) = √0.262 ≈ 0.512

Step 2: t 統計量

t = (15.77 - 17.88) / 0.512 ≈ -4.13 Welch-Satterthwaite df ≈ 42.8 t(0.025, 42.8) ≈ 2.017 → |-4.13| > 2.017 で帰無仮説棄却 → 西日本のほうが年平均気温が有意に高い

🐍 Python で再現

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 B4101(年平均気温) 北海道 11.0 東京都 17.6 沖縄県 23.8 …(全 47 行)
1
2
3
4
5
6
7
8
import pandas as pd
from scipy import stats
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]  # 2023年の47都道府県
east = df.iloc[:24]['B4101']  # 北海道-静岡の年平均気温
west = df.iloc[24:]['B4101']  # 愛知-沖縄の年平均気温
t, p = stats.ttest_ind(east, west, equal_var=False)
print(f"Welch t: {t:.3f}, p: {p:.4f}")

📤 実行結果

Welch t: -4.130, p: 0.0002

💬 手計算 (Step 2) の t ≈ -4.13 と Python 出力が一致。 p < 0.001 で「東日本 vs 西日本の年平均気温は等しい」帰無仮説を棄却。 効果量 Cohen's d ≈ -1.20 (大) で、 実務的にも明確な差。

🐍 Python 実装バリエーション(scipy / statsmodels / pingouin)

SSDSE-B-2026 (2023 年) から「東日本 vs 西日本」の年平均気温 (B4101) を比較する Welch の t 検定を scipy.stats で実装し、 平均差の 95% 信頼区間まで一度に求めます。 続く練習問題で多変数の Holm 補正・検出力設計も確認します。

A. scipy.stats(最も簡潔)

🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 B4101(年平均気温) 北海道 11.0 東京都 17.6 沖縄県 23.8 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]  # 2023年の47都道府県
east = df.iloc[:24]['B4101']  # 北海道-静岡の年平均気温
west = df.iloc[24:]['B4101']  # 愛知-沖縄の年平均気温
t, p = stats.ttest_ind(east, west, equal_var=False)
mean_diff = east.mean() - west.mean()
se_diff = np.sqrt(east.var(ddof=1)/len(east) + west.var(ddof=1)/len(west))
print(f't={t:.3f}, p={p:.4f}, 平均差={mean_diff:.2f}℃ ± {1.96*se_diff:.2f}')
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。

📤 実行結果

t=-4.130, p=0.0002, 平均差=-2.11℃ ± 1.00

🧪 練習問題

Q2. 5 つの変数 (年平均気温 B4101、 年間降水量 B4109、 消費支出 L3221、 総人口 A1101、 15歳未満人口 A1301) について、 東日本 vs 西日本を比較する 5 つの t 検定を行い、 Holm 補正後の有意な変数を特定しなさい。
🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from statsmodels.stats.multitest import multipletests
variables = ['B4101', 'B4109', 'L3221', 'A1101', 'A1301']  # 気温/降水量/消費支出/総人口/15歳未満
p_list = []
for v in variables:
    e, w = df.iloc[:24][v], df.iloc[24:][v]
    _, p = stats.ttest_ind(e, w, equal_var=False)
    p_list.append(p)
reject, p_adj, _, _ = multipletests(p_list, method='holm')
for v, pa, r in zip(variables, p_adj, reject):
    print(f'{v}: p_adj={pa:.4f}, reject={r}')
📤 実行例(実測) B4101: p_adj=0.0008, reject=True B4109: p_adj=0.2859, reject=False L3221: p_adj=0.0045, reject=True A1101: p_adj=0.2859, reject=False A1301: p_adj=0.2859, reject=False
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。
Q3. 効果量 d=0.5 を α=0.05、 検出力 0.8 で検出するのに必要なサンプル数を計算しなさい。
🎯 解説: SSDSE-B-2026 を題材に、 2 群間の平均差を検定する t 検定(独立 2 標本/対応あり/1 標本)を scipy.stats で実行する。 帰無仮説「平均が等しい」の検証であり、 p < 0.05 で有意差ありと判定するのが慣例。
1
2
from statsmodels.stats.power import TTestIndPower
print(TTestIndPower().solve_power(effect_size=0.5, alpha=0.05, power=0.8))
📤 実行例(実測) 63.76561058785405
💬 読み方: t 値の絶対値が大きい(>2 程度)かつ p < 0.05 で「差は偶然では説明しにくい」。 ただし「有意=実用的に大きい」とは限らない(効果量 Cohen's d も併用)。 等分散仮定が怪しい場合は Welch t 検定(equal_var=False)を使う。

📝 14. 報告フォーマット

❌ NG例

「2 群に有意差が認められた (p < 0.05)。」

✅ OK例

「東日本 24 県 (M=15.8℃, SD=2.0) と西日本 23 県 (M=17.9℃, SD=1.5) の年平均気温 (B4101) を Welch のt検定で比較した結果、 西日本が有意に高かった (t(42.8) = -4.13, p < .001, 95% CI [-3.1, -1.1]℃, Cohen's d = -1.20 大)。 Levene 検定で等分散性は棄却されず (p=.07)、 参考に Student 版でも同一の結論を確認した。」

🐍 15. ライブラリ早見表

用途 関数・クラス
1標本t検定scipy.stats.ttest_1samp(a, popmean)
2標本t検定(独立)scipy.stats.ttest_ind(a, b, equal_var=True/False)
対応のあるt検定scipy.stats.ttest_rel(before, after)
Mann–Whitney Uscipy.stats.mannwhitneyu
Wilcoxon符号付き順位scipy.stats.wilcoxon
正規性 (Shapiro)scipy.stats.shapiro
等分散 (Levene)scipy.stats.levene
多重検定補正statsmodels.stats.multitest.multipletests
検出力解析statsmodels.stats.power.TTestIndPower
並べ替え検定scipy.stats.permutation_test

📜 16. t検定の歴史

💼 17. 実務応用

⚠️ 12. よくある落とし穴

落とし穴 対処
p値だけ報告効果量 (Cohen's d) と平均の信頼区間を必ず併記。
多重検定を補正しないHolm / BH で補正。 補正の有無を明記。
対応データを独立2標本で検定必ず ttest_rel。 検出力が大幅に下がる。
等分散と決めつけるWelch を既定にする。 検出力もあまり落ちない。
正規性検定で p > 0.05 だから正規と決定「棄却できない」は「成り立つ」ではない。 QQ プロットを目視。
事後にサンプルサイズを増やす第一種過誤率が膨らむ。 事前にサイズ計算を。
p > 0.05 を「差なし」と報告「有意ではない=差がない」ではない。 検出力不足の可能性。

⚠️ 詳説:t 検定の落とし穴 7 連発

1. p 値だけを「結論」にしてしまう。p 値はサンプルサイズに敏感で、 N が大きいほど些細な差でも有意になります。 実務的に重要かどうかは Cohen's d(小: 0.2 / 中: 0.5 / 大: 0.8)や平均差の 95% CI で判断しないと「統計的有意だが実用的に無意味」な誤読が生まれます。 報告書には d と CI を必ず併記しましょう。

2. 多重比較を補正せずに「最初に有意になったペア」を強調する。k 個のペア比較を α=0.05 で独立に行うと、 実効的な α は 1 − 0.95k に膨れます。 47 都道府県の総当たり t 検定(1081 ペア)では、 偶然のみで 50 件以上が有意になります。 Bonferroni / Holm / BH(FDR)のいずれかを必ず適用してください。

3. 対応データを独立 2 標本で検定してしまう。同じ個体の前後測定は正の相関を持つため、 独立 2 標本 t 検定(ttest_ind)を使うと標準誤差が過大になり、 検出力が大きく低下します。 必ず ttest_rel(対応のある t 検定)を使い、 d も d_z = Mdiff/SDdiff で計算しましょう。

4. 等分散を当然視して Student 版 t 検定を使う。分散が大きく異なる 2 群(例:東京 vs 鳥取の県民所得)では、 Welch の t 検定(equal_var=False)の方が頑健です。 検出力ロスは僅かなので、 実務既定として Welch を採用する流派が主流になっています。

5. 正規性検定(Shapiro 等)で p > 0.05 だから「正規」と判定。「正規性を棄却できなかった」と「正規である」は別物です。 とくに n が小さいと検出力不足で常に p > 0.05 になります。 QQ プロット・ヒストグラム・歪度/尖度の目視確認を優先し、 怪しい場合は Wilcoxon やブートストラップに切り替えましょう。

6. 結果を見ながらサンプルサイズを追加する(optional stopping)。「もうちょっとデータを取れば有意になりそう」と追加観測すると、 第一種過誤率は名目 5% でも実効 10〜20% に膨れます。 事前に検出力解析(statsmodels.stats.power)で必要 N を決め、 計画通りに観測する規律が必要です。

7. p > 0.05 を「差がない」と結論する。「有意でない」は「差が存在しない証拠」ではなく、 「差を検出する証拠が不足」です。 等価性(同等性)を主張したいなら、 TOST(two one-sided tests)や Bayes Factor を使うのが正攻法です。 「N が小さくて検出力不足だった可能性」も忘れず併記しましょう。

🗺 概念マップ

t 検定を中心に、 1 標本 / 2 標本独立 / 対応のある t 検定の 3 系統と、 前提となる正規性・等分散性、 派生する Welch 検定 ・ Mann-Whitney U (ノンパラ代替) を放射状に配置。 SSDSE-B-2026 で東日本 vs 西日本の平均所得比較などに直接適用できる。

t tests ANOVA Welchのt検定 対応のあるt検定 Mann-Whitney U 効果量(Cohen's d)

t 検定の概念マップは「1 標本 t / 対応のある t / Welch's t / 独立 2 標本 t (等分散)」の 4 派生を中心に置き、 SSDSE-B-2026 (2023 年) で東日本 (24 県) vs 西日本 (23 県) の年平均気温 (B4101) の平均差を Welch's t で比較するワークフローを示す。 周辺ノードに「等分散検定 (Levene)」「正規性検定 (Shapiro-Wilk)」「ノンパラ代替 (Mann-Whitney U)」「効果量 (Cohen's d)」を配置する。

🔗 隣接手法への橋渡し

t 検定は「2 群の平均比較」の標準ツール。 SSDSE-B-2026 では都道府県を任意の二値属性 (東日本/西日本、 人口 100 万以上/未満、 大都市圏/地方) に分割して「指標 X の平均に差はあるか」を検定する場面で使う。 3 群以上なら ANOVA、 順位データなら Mann-Whitney U に拡張する。

p 値だけ報告するのは現代的でない。 「t 統計量 + 自由度 + p 値 + Cohen's d + 95% CI」のセットが標準報告形式。

🌳 手法選択フロー

t 検定の 4 派生 (1 標本 / 対応あり / 等分散 / Welch) を SSDSE-B-2026 のシナリオで選び分けるフロー。

  1. ① 何と比較するか? 既知の基準値と比較 (例: 全国平均 100 と東京の値) → 1 標本 t。 2 群の平均比較 → ②へ。 同一県の異なる年 (2015 vs 2020) → 対応のある t。
  2. ② 2 群は独立か対応か? 東日本 vs 西日本のような独立 2 群 → ③へ。 同一県の指標 X vs Y (人口あたり医師数と病床数) → 対応のある t。
  3. ③ 分散は等しいか? Levene 検定で p > 0.1 なら Student's t (等分散)、 p ≤ 0.1 または不明なら Welch's t (等分散不要)。 実務上は迷ったら Welch を使えば安全。

SSDSE のように n=47 と小標本の場合、 正規性が崩れていれば Mann-Whitney U に切り替える。 サンプルサイズが各群 30 以上なら中心極限定理で t 検定は頑健。

🎨 深掘り直感 — 3 つの t 検定は「差 ÷ その差の標準誤差」で一つに繋がる

t 検定は種類が多くて混乱しがちですが、 骨格はどれも同じ「シグナル ÷ ノイズ」です。 分子には「知りたい平均の差(シグナル)」、 分母には「その差が標本抽出のたびにどれくらいブレるか=標準誤差(ノイズ)」を置き、 割り算した無次元の比が t 統計量です。 単位(℃・円・人)が分子分母で打ち消し合うので、 t 値は「差はノイズの何個分か」という物差しの共通言語になります。 気温でも所得でも、 t=4 なら「差はブレ幅の 4 倍」で同じ強さの証拠、 という読み方ができるわけです。

種類分子(シグナル)分母(ノイズ=SE)自由度
1 標本$\bar{x}-\mu_0$(平均と基準値の差)$s/\sqrt{n}$$n-1$
対応あり$\bar{d}$(各ペアの差の平均)$s_d/\sqrt{n}$$n-1$
独立 2 標本(Welch)$\bar{x}_1-\bar{x}_2$$\sqrt{s_1^2/n_1+s_2^2/n_2}$Welch–Satterthwaite 近似

対応ありは 1 標本の変装:ペアごとに差 $d_i$ を取ってしまえば、 あとは「$d$ の平均が 0 と違うか」という 1 標本 t 検定にそのまま帰着します。 だから公式が 1 標本とまったく同じ形になるのです。 独立 2 標本だけ分母が二群のバラつきの合成になり、 ここで「二群の分散が等しいと仮定するか(Student)/しないか(Welch)」の分岐が生まれます。

なぜ t 分布で、 正規分布ではないのか:分母の標準誤差そのものが標本から推定した「あやふやな量」なので、 割り算の結果は正規分布より裾が厚い分布に従います。 このブレの大きさを決めるのが自由度で、 自由度が小さい(小標本)ほど裾が厚く、 同じ t 値でも p 値は大きめに出ます。 $n$ が 30 を超えると t 分布はほぼ標準正規に一致し、 SSDSE の 47 都道府県($df\approx46$)なら実務上その差は無視できます。 分母の構成要素の詳細は標準誤差のページを参照してください。

⚠️ 深掘り落とし穴 — 「有意」を誤読しないための急所

t 検定は手軽さゆえに誤用が最も多い手法です。 本文 12 章の落とし穴表・7 連発を踏まえ、 ここでは判断を歪める急所を実測例と一緒に整理します。

  1. 標本サイズが大きいと「無意味な差」でも有意になる。t 値は分母(SE)が $1/\sqrt{n}$ で縮むため、 $n$ を増やすだけで p 値はいくらでも小さくできます。 「p<0.05」は差の存在の証拠であって差の大きさではありません。 必ず効果量 Cohen's dと平均差の信頼区間を併記し、 「統計的に有意だが実用的に無意味」を切り分けます。
  2. 正規性は「棄却できない=正規」ではない。Shapiro–Wilk で $p>0.05$ でも、 小標本では検出力不足でほぼ常にそうなります。 QQ プロット・ヒストグラムの目視確認を優先し、 歪みが強ければ順位ベースへ。 ただし各群 $n\ge30$ 程度なら中心極限定理で平均の分布は正規に近づき、 t 検定は頑健です。
  3. 等分散を勝手に仮定しない — 迷ったら Welch。「Levene で検定してから Student か Welch を選ぶ」という 2 段階手続きは全体の第一種過誤率を歪めることが知られ、 現在は最初から Welch を既定にするのが推奨(R の t.test() の既定も Welch)。 検出力の損失はごく僅かです。 分散比そのものを検定したいときはF 検定を参照。
  4. 対応あり/なしの取り違えは検出力を殺す(逆は捏造)。同一個体の前後データを ttest_ind に掛けると、 ペアが共有する個体差が分母に残って SE が過大になり、 検出力が激減します。 逆に、 独立データを無理に ttest_rel に掛けるのは対応関係のねつ造で不正です。 本ページ🎮デモ2の通り、 同じ +1.19℃ でも「対応あり」で扱えば t=2.6→17.3 に跳ね上がります。
  5. 多重比較を補正しない。K 回検定すると全体の過誤率は $1-(1-\alpha)^K\approx K\alpha$。 47 都道府県の総当たり(1081 ペア)なら偶然だけで 50 件超が「有意」に。 Holm / Benjamini–Hochberg などで補正します(多重比較補正)。
  6. 外れ値が結論を支配する。t 検定は平均と分散に依存するため、 東京都のような極端値 1 つで平均差も SE も動きます。 箱ひげ図で確認し、 疑わしければトリム平均(Yuen の t)や頑健統計・順位検定に切り替えます。
  7. 片側/両側を後付けで選ばない。片側検定は「方向の仮説を理論的に事前固定できるときだけ」使えます。 結果を見てから有意になる側を片側にするのは p 値ハッキングです。 通常は両側を既定に。
  8. 「p>0.05=差がない」ではない。非有意は「差を検出する証拠が不足」の意味。 同等性を主張したいなら TOST(two one-sided tests)や Bayes Factor を使い、 検出力不足の可能性も併記します。

実測で効果量の効きを体感する:SSDSE-B-2026(2023 年)で「三大都市圏 8 都府県(埼玉・千葉・東京・神奈川・愛知・京都・大阪・兵庫)」と「その他 39 県」の高齢化率(A1303/A1101×100)を比べると、 大都市圏 27.15%(SD 2.35, n=8)/その他 32.50%(SD 2.74, n=39)で、 Welch t=-5.70, p≈0.0001, Cohen's d≈-2.0(極めて大)。 Levene の等分散検定は p≈0.61 で等分散を棄却せず、 Student 版でも t=-5.14 と結論は不変です。 ここでは p だけでなく「d≈2.0=群平均が SD の 2 個分ずれている」という効果量の大きさまで報告することで、 初めて「実務的にも明確な差」と言い切れます。

🚀 発展 — Welch・対応あり・効果量・検出力・ノンパラ・ANOVA への地図

t 検定は「2 群の平均比較」という 1 点に過ぎず、 前後左右に自然な拡張があります。 用途別に接続先を整理します。

上の実測「大都市圏 vs その他の高齢化率」を、 発展手法まで一気通貫で確認するコード(SSDSE-B-2026 の実測。 出力値は上記本文と一致):

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) 北海道 5,092,000 1,681,000 東京都 14,086,000 3,205,000 沖縄県 1,468,000 350,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pandas as pd, numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()
df['aging'] = df['A1303'] / df['A1101'] * 100  # 高齢化率(%)

metro = ['埼玉県','千葉県','東京都','神奈川県','愛知県','京都府','大阪府','兵庫県']
g_m = df[df['Prefecture'].isin(metro)]['aging']   # 三大都市圏 8 都府県
g_o = df[~df['Prefecture'].isin(metro)]['aging']  # その他 39 県

# Welch の t 検定(等分散を仮定しない実務既定)
t, p = stats.ttest_ind(g_m, g_o, equal_var=False)
print(f'Welch t={t:.3f}, p={p:.5f}')            # → t=-5.695, p=0.00013

# 効果量 Cohen's d(プール SD)
n1, n2 = len(g_m), len(g_o)
sp = np.sqrt(((n1-1)*g_m.var(ddof=1) + (n2-1)*g_o.var(ddof=1)) / (n1+n2-2))
print(f"Cohen's d = {(g_m.mean()-g_o.mean())/sp:.3f}")  # → -1.995 (極めて大)

# 前提チェック: 等分散(Levene) と ノンパラ代替(Mann-Whitney U)
print('Levene:', stats.levene(g_m, g_o).pvalue)          # → 0.605 (等分散棄却されず)
print('Mann-Whitney U:', stats.mannwhitneyu(g_m, g_o).pvalue)

# 必要サンプルサイズ設計(d=0.5, α=0.05, power=0.8 を検出するには各群何県必要か)
from statsmodels.stats.power import TTestIndPower
print('n/群:', TTestIndPower().solve_power(effect_size=0.5, alpha=0.05, power=0.8))
📤 実行例(実測) Welch t=-5.695, p=0.00013 Cohen's d = -1.995 Levene: 0.6050470677490873 Mann-Whitney U: 5.0563272470258655e-06 n/群: 63.76561058785405

数値はすべて SSDSE-B-2026(2023 年・47 都道府県, cp932, skiprows=[1])の実測。 大都市圏 27.15%(SD 2.35, n=8)/その他 32.50%(SD 2.74, n=39)から算出。 三大都市圏の定義は「東京・大阪・名古屋圏の中核 8 都府県」という一般的区分に基づく(区分の取り方で n と結論の細部は変わり得る点に注意)。

🔖 🔖 キーワード索引(チップから該当箇所へジャンプ)

論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:

なぜt分布 t分布 自由度 1標本t検定 2標本t検定 対応のあるt検定 Welchのt検定 前提条件 正規性 等分散性 効果量 (Cohen's d) 平均の信頼区間 検出力 多重検定補正 scipy.stats.ttest statsmodels pingouin ブートストラップ SSDSE 実値計算 TOST 等価性 Bayes Factor