論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
t検定
t-test (t)
2群の平均に差があるか、または平均がある値と異なるかをt分布を使って検定。n小〜中で有効。
仮説検定tt検定Student's t-test
📍 文脈💡 30秒結論

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

論文中に 「t検定」として登場する用語。

t検定 とは:2群の平均に差があるか、または平均がある値と異なるかをt分布を使って検定。n小〜中で有効。

💡 30秒で分かる結論

👁️ 直感 — t検定は「平均値の差を統計的に評価」

t検定は、 2つの平均値(または1つの平均値とある定値)に統計的な差があるかを判定する仮説検定。 標本サイズが小さい時の標準ツール。

t分布

t分布は標準正規分布より「裾が重い」。 n が小さいほど顕著。 n が大きく(df > 30)なると正規分布とほぼ同じ。

🎯 t検定の3種類

種類 仮説
1標本t検定μ = μ₀「平均は5kgか?」
対応のあるt検定μ_前 = μ_後「ダイエット前後の体重」
独立2標本t検定μ₁ = μ₂「A群とB群の差」

📐 t統計量

1標本t検定

$$ t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}} \sim t(n-1) $$

独立2標本t検定(等分散仮定)

$$ t = \frac{\bar{x}_1 - \bar{x}_2}{s_p \sqrt{1/n_1 + 1/n_2}} $$

s_p はプール標準偏差。 自由度 df = n₁ + n₂ − 2。

Welch の t検定(不等分散)

$$ t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{s_1^2/n_1 + s_2^2/n_2}} $$

分散が違うグループ間の比較に適切。 sklearn では scipy.stats.ttest_ind の equal_var=False。

📋 t検定の仮定

  1. 正規性:データが正規分布(n が大きければ CLT で緩和)
  2. 独立性:観測値が互いに独立
  3. 等分散性:2標本の場合(Welch なら不要)

仮定が崩れる場合 → ノンパラメトリック(Wilcoxon、 Mann-Whitney U)を使用。

🐍 Python での t検定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from scipy import stats

# 1標本t検定
t, p = stats.ttest_1samp(data, popmean=50)

# 独立2標本(等分散)
t, p = stats.ttest_ind(group1, group2)

# Welch t検定(不等分散)
t, p = stats.ttest_ind(group1, group2, equal_var=False)

# 対応のあるt検定
t, p = stats.ttest_rel(before, after)

# 効果量(Cohen's d)
d = (np.mean(group1) - np.mean(group2)) / np.sqrt((np.var(group1, ddof=1) + np.var(group2, ddof=1))/2)
print(f't={t:.3f}, p={p:.4f}, Cohen\'s d={d:.3f}')

🚧 落とし穴と注意点

🔬 「t検定」を深く理解する

t検定の歴史 — "Student" の物語

William Sealy Gosset(1876-1937)は Guinness ビール工場の品質管理担当。 少サンプルでビール品質を判定する手法として t分布を発見(1908)。 会社の機密保護のため「Student」のペンネームで発表。

効果量 Cohen's d

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

サンプルサイズの目安

d=0.5、 α=0.05、 検出力 0.8 で各群 n=64 必要。 d=0.2 では各群 n=394 必要。

📝 練習問題 — 理解度チェック

  1. この用語の基本定義を、 自分の言葉で説明できますか?
  2. この手法が使われる典型的なシナリオを3つ挙げられますか?
  3. この手法の前提条件・仮定を確認できますか?
  4. 結果を解釈する際の注意点は何ですか?
  5. 類似手法との違いを説明できますか?
  6. Python(または他言語)で実装できますか?
  7. SSDSE データで応用例を作成できますか?

📚 参考文献・さらなる学習

古典的教科書

実践書

オンラインリソース

💼 実務応用ガイド

データサイエンスプロジェクトでの位置づけ

  1. 探索的分析(EDA):基本統計量・可視化でデータを理解
  2. 前処理:標準化・正規化・欠損値処理
  3. モデリング:回帰・分類・クラスタリング
  4. 評価:CV、 指標計算、 統計的検定
  5. 解釈・報告:効果量・信頼区間・可視化

業界別ユースケース

📖 完全ガイド — 統計学習の参照表

分析の流れ — 8ステップ

  1. 問題定義:何を知りたいのか、 目的を明確に
  2. データ収集:信頼できるソースから(SSDSEなど公的データ)
  3. データクリーニング:欠損値、 外れ値、 入力ミスの確認
  4. 探索的分析(EDA):要約統計量、 ヒストグラム、 散布図
  5. 変数変換:標準化、 対数変換、 カテゴリのエンコード
  6. モデリング:適切な手法を選び、 学習
  7. 評価:CV、 指標、 統計的検定
  8. 解釈・報告:効果量、 信頼区間、 可視化

統計手法の選び方マトリクス

目的 1変数 2変数 多変量
記述平均, 中央値, 分散相関, 共分散PCA, 因子分析
可視化ヒストグラム, 箱ひげ散布図, ヒートマップ散布図行列, バイプロット
予測時系列モデル単回帰重回帰, Ridge, LASSO
分類ロジスティック回帰判別分析SVM, RF, NN
グループ化階級分け2次元クラスタリングk-means, 階層クラスタリング
検定1標本t検定2標本t検定, χ²ANOVA, MANOVA

サンプル数別の手法ガイド

n 推奨手法
n < 10記述統計のみ、 ノンパラ検定、 ベイズ統計
10 ≤ n < 30t検定, ブートストラップ, 単回帰
30 ≤ n < 200重回帰, ANOVA, 階層クラスタリング
200 ≤ n < 10000複雑な回帰, RF, GBM, k-means
n ≥ 10000深層学習, 大規模分散学習

Python 主要ライブラリ早見表

ライブラリ 用途
numpy数値計算の基礎、 行列演算
pandasデータフレーム、 表操作
scipy統計関数、 最適化、 線形代数
statsmodels古典統計、 検定、 回帰分析の詳細
scikit-learn機械学習、 前処理、 評価
matplotlib基本可視化
seaborn統計的可視化(高級)
plotlyインタラクティブ可視化
xgboost / lightgbm勾配ブースティング
PyTorch / TensorFlow深層学習

よくある質問(FAQ)

📓 用語のまとめ — 30秒で理解

このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。

必ず押さえるべき記号

記号 意味 読み方
μ母平均ミュー
σ母標準偏差シグマ
σ²母分散シグマ二乗
標本平均エックスバー
s標本標準偏差エス
n標本サイズエヌ
pp値、 比率ピー
α有意水準アルファ
β回帰係数、 第二種誤り率ベータ
r相関係数アール
決定係数アール二乗
Σ総和記号、 共分散行列シグマ大文字
N(μ, σ²)正規分布ノーマル ミュー シグマ二乗
t(df)t分布ティー
χ²(df)カイ二乗分布カイ二乗
F(d1, d2)F分布エフ
H₀, H₁帰無仮説、 対立仮説エイチゼロ、 エイチワン
E[X]期待値エクスペクタンス
Var(X)分散バリアンス
Cov(X, Y)共分散カバリアンス

💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。

🌐 データサイエンス全体像での位置づけ

データサイエンスのワークフロー

  1. ビジネス理解:何を解決したいか
  2. データ理解:どんなデータがあるか
  3. データ準備:前処理、 特徴量エンジニアリング
  4. モデリング:手法選択、 学習
  5. 評価:性能、 解釈性、 ビジネス価値
  6. 展開:実装、 運用、 監視

(CRISP-DM プロセスより)

主要分野のマッピング

分野 主要技術 代表ツール
記述統計要約量、 可視化pandas, matplotlib
推測統計検定、 信頼区間scipy.stats, statsmodels
機械学習予測、 分類、 クラスタリングscikit-learn, XGBoost
深層学習NN、 画像、 自然言語PyTorch, TensorFlow
時系列ARIMA、 状態空間、 LSTMstatsmodels, prophet
因果推論RCT、 IV、 DiD、 PSMDoWhy, EconML
ベイズ統計MCMC、 変分推論PyMC, Stan
最適化線形/凸/離散最適化scipy.optimize, cvxpy

キャリアパス

💎 良いデータ分析のための10のコツ

  1. 必ず可視化から始める:散布図、 ヒストグラム、 箱ひげ図
  2. 外れ値を意識する:除く前にドメイン的に理解
  3. 仮定を確認する:正規性、 独立性、 等分散性
  4. サンプルサイズに見合う複雑性:n=10 で深層学習はしない
  5. 効果量も併記する:p値だけでは不十分
  6. 信頼区間で不確実性を示す:点推定だけでは誤解の元
  7. 多重比較を補正する:探索的解析でも誠実に
  8. ホールドアウト or CV で評価する:訓練データの精度は意味がない
  9. 解釈可能性も重視する:ブラックボックスより white-box
  10. 再現可能なコードを書く:random_seed、 バージョン管理

🔗 用語間の関係 — 統計概念のネットワーク

記述統計の基本セット

これらは互いに深く関連します:

推測統計の基本セット

回帰モデルファミリー

クラスタリング・次元削減ファミリー

検定ファミリー

🗺️ 概念マップ — 3つの視点で体系を理解する

t検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス推測統計検定t検定

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「t検定」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「t検定」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引(拡張)

直感 3種類のt検定 📊 統計量 ⚙️ 前提条件 🧮 SSDSE-B 実例 🐍 実装バリエーション ⚠️ 落とし穴集 Welch 代替検定 関連用語マップ

🧮 SSDSE-B を使った t検定の実例 — 「東日本 vs 西日本」

SSDSE-B(2020年)の医師数_人口10万対 で、 東日本(24県)と西日本(23県)の平均が有意に違うかをWelch のt検定で確認します。

① データ準備(東西分け)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2023.csv', encoding='shift_jis', header=[0,1])
df.columns = ['_'.join(c).strip() for c in df.columns]
d2020 = df[df['年度_Year'] == 2020].copy()

east_pref = ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県',
             '栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県',
             '石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県']
d2020['地域'] = d2020['都道府県_Prefecture'].apply(lambda x: '東' if x in east_pref else '西')
east = d2020[d2020['地域']=='東']['医師数_人口10万対']
west = d2020[d2020['地域']=='西']['医師数_人口10万対']
print(f'東: n={len(east)}, mean={east.mean():.1f}, sd={east.std():.1f}')
print(f'西: n={len(west)}, mean={west.mean():.1f}, sd={west.std():.1f}')

典型結果:東 n=24, mean=230.5, sd=33.2 / 西 n=23, mean=268.9, sd=42.7 — 平均差 約38人。

② Welch の t検定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from scipy import stats
t, p = stats.ttest_ind(west, east, equal_var=False)  # Welch
print(f't = {t:.3f}, p = {p:.4f}')
# 典型値: t ≈ 3.45, p ≈ 0.001 → 統計的に有意

# 効果量 Cohen's d
import numpy as np
pooled_sd = np.sqrt(((len(east)-1)*east.var() + (len(west)-1)*west.var()) / (len(east)+len(west)-2))
d = (west.mean() - east.mean()) / pooled_sd
print(f"Cohen's d = {d:.2f}")
# 典型値: d ≈ 1.0 → 大きな効果量

③ 信頼区間と検出力

1
2
3
4
5
6
7
8
from scipy.stats import t as t_dist
diff = west.mean() - east.mean()
se = np.sqrt(west.var()/len(west) + east.var()/len(east))  # Welch SE
df_welch = (west.var()/len(west) + east.var()/len(east))**2 / \
           ((west.var()/len(west))**2/(len(west)-1) + (east.var()/len(east))**2/(len(east)-1))
ci = t_dist.interval(0.95, df=df_welch, loc=diff, scale=se)
print(f'平均差 = {diff:.1f}, 95% CI = [{ci[0]:.1f}, {ci[1]:.1f}]')
# 典型値: 平均差 = 38.4, 95% CI = [16.0, 60.8] → 0 を含まないので有意

「西日本の医師数が10万人当たり約38人多い(95% CI [16, 61])」と区間で報告するのが現代的。 単に p=0.001 だけでは情報不足。

🐍 実装バリエーション — scipy / statsmodels / pingouin

(A) scipy.stats — 最も基本

1
2
3
4
5
6
7
8
9
from scipy import stats
# 1標本(母平均 = μ0 の検定)
t, p = stats.ttest_1samp(data, popmean=250)
# 独立2標本(等分散仮定)
t, p = stats.ttest_ind(grp1, grp2, equal_var=True)
# Welch(等分散仮定しない、 推奨デフォルト)
t, p = stats.ttest_ind(grp1, grp2, equal_var=False)
# 対応のあるt検定
t, p = stats.ttest_rel(pre, post)

(B) statsmodels — 信頼区間・効果量も同時に

1
2
3
4
5
6
7
from statsmodels.stats.weightstats import ttest_ind, DescrStatsW
t, p, df_resid = ttest_ind(west, east, usevar='unequal')
print(f't = {t:.3f}, p = {p:.4f}, df = {df_resid:.1f}')

# 信頼区間付き
cm = DescrStatsW(west).get_compare(DescrStatsW(east))
print(cm.summary(usevar='unequal'))  # 表形式で完結

(C) pingouin — 教育的・包括的

1
2
3
4
5
import pingouin as pg
result = pg.ttest(west, east, correction='auto')
print(result)
# T  dof  alternative  p-val  CI95%  cohen-d  BF10  power
# 一表で必要な情報がすべて出る

(D) ノンパラメトリック代替 — Mann-Whitney U

1
2
3
4
from scipy.stats import mannwhitneyu
# 正規性が成立しない時の代替
u, p = mannwhitneyu(west, east, alternative='two-sided')
print(f'U = {u}, p = {p:.4f}')

(E) ベイズ的 t検定 — PyMC で BEST

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pymc as pm
with pm.Model() as model:
    mu1 = pm.Normal('mu1', mu=250, sigma=100)
    mu2 = pm.Normal('mu2', mu=250, sigma=100)
    sd1 = pm.HalfNormal('sd1', sigma=50)
    sd2 = pm.HalfNormal('sd2', sigma=50)
    nu = pm.Exponential('nu', 1/30)  # 自由度(裾の重さ)
    pm.StudentT('y1', mu=mu1, sigma=sd1, nu=nu, observed=west)
    pm.StudentT('y2', mu=mu2, sigma=sd2, nu=nu, observed=east)
    diff = pm.Deterministic('diff', mu1 - mu2)
    trace = pm.sample(2000, tune=1000)
# diff の事後分布から「差 > 0 の確率」を直接計算可能

⚠️ 追加の落とし穴 — t検定の実務

❌ 等分散の Student t を反射的に使う
古典的な Student t検定は2群の分散が等しいと仮定する。 実務では分散が違うことが多く、 Welch のt検定(equal_var=False)が常に安全。 Welch は等分散時もほぼ同じ結果で、 不等分散時はより正確。 R では t.test() のデフォルトが Welch、 Python でも 2023年以降 Welch をデフォルトとする論調が主流。 等分散検定(F検定・Levene)の事後判断は多重検定問題を招くため推奨されない。
❌ 正規性検定の事後判断
「Shapiro検定で正規でなければ Mann-Whitney に切り替える」フローは多重検定。 全体の Type I error が膨らみ、 また小標本では Shapiro が低検出力、 大標本では過敏。 推奨:研究設計段階で「t検定で行く」「ノンパラで行く」を決め、 事後変更しない。 もしくは最初からノンパラまたはベイズで一貫させる。 t検定はそもそも n≥30 ならかなり頑健(CLT 効果)。
❌ 対応データに独立t検定を使う
前後比較・ペアマッチドサンプル(同一個体の処置前後)には対応のあるt検定 (ttest_rel) を使う。 独立t検定を使うと、 個体内の相関を無視するため検出力が大幅に下がる(または逆に偽陽性に)。 「前後の血圧」「兄弟ペア」「同一県の年次比較」などは対応データ。 データ構造を最初に明確化することが大切。
❌ 多重比較を補正しない
「複数の変数で t検定」「複数の群対比較」を素朴に行うと、 α=0.05 を 20回繰り返せば 1個は偶然有意になる。 Bonferroni(α/k)、 Holm 法、 Benjamini-Hochberg (FDR) などの補正が必須。 ANOVA + Tukey HSD のような事後検定枠組みも検討。 「探索的に多く検定して有意なものを報告」は p-hacking と呼ばれる重大な研究不正。
❌ p値のみ報告し効果量を書かない
p < 0.05 は「効果がある」を意味しない。 サンプルが大きければ実用的に無視できる差でも p < 0.001 になる。 必ず Cohen's d、 平均差の信頼区間、 元データの記述統計を併記する。 APA 7th 以降、 統計学会も「effect size + CI」を必須としている。 d < 0.2 は微小、 d ≈ 0.5 は中程度、 d ≥ 0.8 は大きな効果という Cohen の目安が標準。
❌ 外れ値の影響を確認しない
t検定は平均と分散に基づくため、 外れ値1個で t統計量が大きく動く。 必ず散布図・箱ひげ図で外れ値を確認し、 (i) 外れ値を含むt、 (ii) 外れ値を除いたt、 (iii) ノンパラ検定の3つを比較して結論の頑健性を確認。 外れ値を恣意的に削除するのは禁忌で、 削除する場合は事前に基準を決め、 削除前後の両方を報告する。
❌ 因果と関連を混同
「東日本と西日本で医師数が有意に違う」は群間関連を示すだけで、 「地域が医師数の原因」とは言えない。 交絡(高齢化率・気候・歴史)の影響を切り分けるには共分散分析 (ANCOVA)、 重回帰、 マッチング、 因果推論手法(DID・PSM)が必要。 t検定は「関連の確認」、 因果は別の枠組みで扱う。