📊 STEP 18: t検定の実践(ExcelとPython)
平均値の差を統計的に検証しよう
📋 このステップで学ぶこと
- t検定の3つのタイプ(1標本、2標本、対応あり)
- それぞれの使い分け
- Excelでの実装(T.TEST関数)
- Pythonでの実装(scipy.stats)
- 実務での活用例
学習時間の目安:3.5時間
🔍 1. t検定の種類
3つのt検定
t検定には、3つのタイプがあります
1. 1標本t検定(One-sample t-test)
・1つのグループの平均が、ある特定の値と異なるかを検定
・例:「当社の顧客満足度は、業界平均の75点と差があるか?」
2. 2標本t検定(Two-sample t-test)- 対応なし
・2つの独立したグループの平均に差があるかを検定
・例:「男性と女性で、購入金額に差があるか?」
3. 対応のあるt検定(Paired t-test)
・同じグループの前後で、平均に差があるかを検定
・例:「広告導入の前後で、売上に差があるか?」
どのt検定を使うか?
ステップ1:比較するグループの数は?
└ 1つ → 1標本t検定
└ 2つ → ステップ2へ
ステップ2:2つのグループは独立している?
└ はい(別々の人・対象)→ 2標本t検定(対応なし)
└ いいえ(同じ人・対象の前後)→ 対応のあるt検定
具体例:
・業界平均と比較 → 1標本
・男性 vs 女性 → 2標本(対応なし)
・AグループとBグループ(ランダム割り当て)→ 2標本(対応なし)
・導入前 vs 導入後(同じ店舗)→ 対応あり
・ダイエット前 vs ダイエット後(同じ人)→ 対応あり
| 検定 | 状況 | 例 | Python | Excel |
|---|---|---|---|---|
| 1標本 | 1つのグループと基準値を比較 | 当社 vs 業界平均 | ttest_1samp | 手動計算 |
| 2標本(対応なし) | 2つの独立したグループを比較 | 男性 vs 女性 | ttest_ind | T.TEST(…,2,2) |
| 対応あり | 同じグループの前後を比較 | 導入前 vs 導入後 | ttest_rel | T.TEST(…,2,1) |
📊 2. 1標本t検定
1標本t検定とは
1つのグループの平均が、ある特定の値(基準値)と異なるかを検定
仮説:
・H₀:平均 = 基準値(差がない)
・H₁:平均 ≠ 基準値(差がある)
ビジネス例:
・当社の顧客満足度は、業界平均(75点)と差があるか?
・新商品の重量は、規格値(500g)と差があるか?
・平均購入金額は、目標値(5000円)に達しているか?
Pythonでの実装
Excelでの実装
👥 3. 2標本t検定(対応なし)
2標本t検定とは
2つの独立したグループの平均に差があるかを検定
「独立している」とは:
・2つのグループに重複がない
・片方のグループの値が、もう片方に影響しない
仮説:
・H₀:グループAの平均 = グループBの平均(差がない)
・H₁:グループAの平均 ≠ グループBの平均(差がある)
ビジネス例:
・男性と女性で、購入金額に差があるか?
・東京と大阪で、売上に差があるか?
・AプランとBプランで、成約率に差があるか?
Pythonでの実装
Excelでの実装
2標本t検定では、2つのグループの分散が等しいかを確認する必要があります
等分散性の検定(Leveneの検定):
・p > 0.05 → 等分散と仮定できる → 通常のt検定
・p < 0.05 → 等分散と仮定できない → Welchのt検定
Excelの場合:
・等分散を仮定:=T.TEST(..., 2, 2)
・等分散を仮定しない:=T.TEST(..., 2, 3)
🔄 4. 対応のあるt検定
対応のあるt検定とは
同じグループ(または対象)の前後で、平均に差があるかを検定
「対応がある」とは:
・同じ人・対象を2回測定
・前後、Before/After の比較
・ペアになっているデータ
仮説:
・H₀:前の平均 = 後の平均(差がない)
・H₁:前の平均 ≠ 後の平均(差がある)
ビジネス例:
・広告導入の前後で、売上に差があるか?
・研修の前後で、スキルスコアに差があるか?
・価格変更の前後で、売上に差があるか?
Pythonでの実装
Excelでの実装
⚠️ 5. よくある間違いと注意点
対応なし vs 対応ありの混同
間違った例:
状況:同じ10店舗の、導入前後の売上を比較
誤り:2標本t検定(対応なし)を使う
正解:対応のあるt検定を使う
なぜ間違いか:
・同じ店舗のデータなので、独立していない
・店舗ごとの特性(立地、客層など)が、前後で共通
・対応なしt検定を使うと、検出力が下がる(効果を見逃しやすい)
判断基準:
「前のデータと後のデータが、同じ対象か?」
→ Yesなら対応あり、Noなら対応なし
t検定の前提条件
1. データが正規分布に従う(またはサンプルサイズが大きい)
- n ≥ 30:正規性の確認なしで使える(中心極限定理)
- n < 30:正規性を確認すべき
- 正規性がない場合:ノンパラメトリック検定を検討
2. 2標本t検定の場合:等分散性
- Leveneの検定で確認
- 等分散でない場合:Welchのt検定を使用
3. データが独立(対応なしの場合)
- 2つのグループに重複がない
- 同じ対象の前後なら、対応ありt検定を使う
正規性の確認
📝 STEP 18 のまとめ
1. 3つのt検定
- 1標本t検定:1つのグループと基準値を比較
- 2標本t検定:2つの独立したグループを比較
- 対応のあるt検定:同じグループの前後を比較
2. 実装方法
- Python:scipy.statsで簡単に実装
- Excel:T.TEST関数で実装
3. 注意点
- 対応なし vs 対応ありを間違えない
- 等分散性を確認(2標本t検定)
- 正規性を確認(特にサンプルが小さい場合)
t検定は、ビジネスで最もよく使われる統計検定です!
選び方のポイント:
・比較するグループは何個? → 1つなら1標本、2つなら次へ
・2つのグループは独立? → Yesなら2標本、Noなら対応あり
実務での注意:
・p値だけでなく、効果の大きさ(平均の差)も確認
・信頼区間を計算して、効果の範囲を把握
・サンプルサイズが小さいと、検出力が下がる
次のSTEP 19では、カイ二乗検定の実践を学びます!
STEP 19では、「カイ二乗検定の実践」を学びます。カテゴリデータの関連性を検証する方法を習得しましょう!
📝 練習問題
次の状況では、どのt検定を使うべきですか?
(1) A支店とB支店の月間売上を比較
(2) 社員研修の前後でスキルテストのスコアを比較
(3) 当社の平均給与が、業界平均(450万円)と異なるかを検証
(1) 2標本t検定(対応なし)
理由:A支店とB支店は独立した2つのグループ
Python: stats.ttest_ind(A支店, B支店)
Excel: =T.TEST(A1:A10, B1:B10, 2, 2)
(2) 対応のあるt検定
理由:同じ社員の前後を比較
Python: stats.ttest_rel(研修後, 研修前)
Excel: =T.TEST(A1:A10, B1:B10, 2, 1)
(3) 1標本t検定
理由:1つのグループ(当社)と基準値(450万円)を比較
Python: stats.ttest_1samp(当社給与, 450)
Excel: 手動計算
ExcelのT.TEST関数について、以下の問いに答えてください。
=T.TEST(A1:A10, B1:B10, 2, 1)
この関数の各引数の意味は何ですか?
=T.TEST(A1:A10, B1:B10, 2, 1)
A1:A10:1つ目のグループのデータ範囲
B1:B10:2つ目のグループのデータ範囲
2:両側検定(1なら片側検定)
1:対応のあるt検定
検定の種類:
1 = 対応のあるt検定
2 = 等分散を仮定した2標本t検定
3 = Welchのt検定(等分散を仮定しない)
以下のデータで、対応のあるt検定を実行してください。
状況:新しいパッケージデザイン導入前後の売上(同じ8店舗)
導入前:[100, 95, 110, 105, 98, 102, 108, 101]
導入後:[115, 108, 120, 118, 105, 110, 122, 112]
有意水準α=0.05で、効果はありますか?
使うべきt検定:対応のあるt検定
理由:同じ8店舗の前後を比較
結果:
・導入前の平均: 102.4
・導入後の平均: 113.8
・差: 11.4
・t統計量: 6.7082
・p値: 0.0003
判定:
p値(0.0003)< α(0.05)→ 帰無仮説を棄却
→ 新しいパッケージデザインの効果あり!
等分散性の検定について説明してください。
(1) なぜ等分散性を確認する必要があるのですか?
(2) Pythonでどのように確認しますか?
(3) 等分散でない場合、どうすれば良いですか?
(1) なぜ確認が必要か:
通常の2標本t検定は、2つのグループの分散が等しいことを前提としています。この前提が満たされないと、検定結果が不正確になる可能性があります。
(2) Pythonでの確認方法:
(3) 等分散でない場合:
Welchのt検定を使用します
Python: stats.ttest_ind(A, B, equal_var=False)
Excel: =T.TEST(A1:A10, B1:B10, 2, 3)
以下の2つのケースで、それぞれ適切なt検定を選び、理由を説明してください。
ケースA:
同じ20人の顧客に、サービス改善前後で満足度調査を実施
ケースB:
ランダムに選んだ30人の顧客を、15人ずつAグループとBグループに分け、
それぞれ異なるサービスを提供し、満足度を比較
ケースA:対応のあるt検定
理由:
・同じ20人の顧客を2回測定
・改善前と改善後で、対応がある
・各顧客の個人差(元々の満足度の高さなど)を考慮できる
Python: stats.ttest_rel(改善後, 改善前)
Excel: =T.TEST(改善後, 改善前, 2, 1)
ケースB:2標本t検定(対応なし)
理由:
・異なる顧客のグループ(Aグループ15人、Bグループ15人)
・2つのグループは独立している
・ランダムに割り当てられているので、重複なし
Python: stats.ttest_ind(Aグループ, Bグループ)
Excel: =T.TEST(A1:A15, B1:B15, 2, 2)
ポイント:
・同じ対象の前後 → 対応あり
・異なる対象のグループ → 対応なし
対応のあるt検定の方が、検出力が高い(効果を見つけやすい)ので、可能なら対応のあるデザインを選ぶべき!
❓ よくある質問
t検定の前提:
・データが正規分布に従う(または近似)
・サンプルサイズが小さいほど、この前提が重要
サンプルサイズの目安:
・n ≥ 30:正規性の確認なしで使える(中心極限定理)
・n < 30:正規性を確認すべき
・n < 10:慎重に。ノンパラメトリック検定も検討
正規性の確認方法:
・ヒストグラムや Q-Qプロットで視覚的に確認
・Shapiro-Wilk検定(Python:
stats.shapiro(data))正規性がない場合:
・Mann-Whitney U検定(対応なし)
・Wilcoxon符号順位検定(対応あり)
t検定の制限:
・t検定は2つのグループの比較のみ
・3つ以上のグループには使えない
3つ以上のグループの比較:
・一元配置ANOVA(One-way ANOVA)を使う
・例:A店、B店、C店の売上を比較
Pythonでの実装:
from scipy.stats import f_onewayf, p = f_oneway(A店, B店, C店)注意:
・複数のt検定を繰り返すのはNG!(多重比較問題)
・まずANOVAで「少なくとも1つのグループに差がある」を確認
・その後、どのペアに差があるかを多重比較法で検証
95%信頼区間の計算:
=AVERAGE(A1:A10) ± CONFIDENCE.T(0.05, STDEV.S(A1:A10), COUNT(A1:A10))引数の説明:
・0.05:有意水準(95%信頼区間なら0.05)
・STDEV.S(A1:A10):標準偏差
・COUNT(A1:A10):サンプルサイズ
実例:
平均 = 100、標準偏差 = 10、サンプルサイズ = 20
下限:
=100 - CONFIDENCE.T(0.05, 10, 20)上限:
=100 + CONFIDENCE.T(0.05, 10, 20)→ 95%信頼区間:[95.3, 104.7]
等分散性の検定(Leveneの検定):
・H₀:2つのグループの分散は等しい
・p > 0.05 → H₀を棄却できない
解釈:
・「分散が異なる」とは言えない
・でも「完全に等しい」わけではない
実務的な対応:
・p > 0.05 なら、等分散と仮定して通常のt検定
・p < 0.05 なら、Welchのt検定を使う
・迷ったら、Welchのt検定を使う(より安全)
Python:
stats.ttest_ind(A, B, equal_var=False)(Welch)Excel:
=T.TEST(A1:A10, B1:B10, 2, 3)(Welch)
例:
10人の顧客で、前後を比較
・顧客A:前=80、後=85 → OK
・顧客B:前=75、後=欠損 → 除外
・顧客C:前=欠損、後=90 → 除外
Pythonでの処理:
import pandas as pddf = pd.DataFrame({'前': 前, '後': 後})df_完全 = df.dropna() # 欠損を除外stats.ttest_rel(df_完全['後'], df_完全['前'])注意:
・サンプルサイズが大きく減ると、検出力が下がる
・欠損が多い場合は、欠損の理由を調査
・ランダムな欠損でないと、バイアスの可能性
標準的な報告フォーマット:
「t(自由度) = t値, p = p値」
例1:有意な場合
「男性と女性の購入金額に有意な差が見られた(t(18) = -15.78, p < .001)。女性(M = 5,590円, SD = 245)は男性(M = 3,980円, SD = 302)より購入金額が高かった。」
例2:有意でない場合
「AプランとBプランの成約率に有意な差は見られなかった(t(28) = 1.23, p = .228)。」
含めるべき情報:
・検定の種類(1標本、2標本、対応あり)
・t値と自由度
・p値(または「p < .05」「p < .001」)
・平均と標準偏差
・効果の方向(どちらが高いか)
学習メモ
ビジネスデータ分析・意思決定 - Step 18