見出し画像

☕️ t検定と回帰分析がつながる!

日常に統計・データ分析を取り入れてみませんか?

イントロ


統計検定2級と統計モデルを結ぶ 完全一致シリーズ の第1話は t 検定と回帰分析 です。
コーヒーと一緒に、t 検定と回帰分析がつながる様子をご堪能ください。


トピック


1. 今日の一言

2群の平均の差を調べる t 検定は、実は ダミー変数を使った回帰分析 とまったく同じことをしている!

☕️☕️☕️

2. 導入ストーリー

休日に友達とカフェへ。コーヒーの価格に話題が進みます。

  • チェーン店:価格は安定していて安めだね。

  • 個人店:ちょっと高いけど雰囲気が好き。

「コーヒーの平均価格って、チェーン店と個人店で本当に違うのかな?」

これを調べるのが t 検定
でも実は、同じ問いを 単回帰分析 でも確かめられるのです。

喫茶店で話す人達のイラスト(男性):「いらすとや」さんより

3. データ例

チェーン店30店、個人店30店の価格サンプルをとります。
※データはフィクションです。

$$
\begin{array}{cr}
店舗タイプ & 価格(円) \\
\hline
チェーン & 353 \\
チェーン & 346 \\
\vdots & \vdots \\
個人店 & 344 \\
個人店 & 372 \\
\vdots & \vdots \\
\end{array}
$$

👉 実際には乱数で生成して30サンプルずつ比較します。

# インポート
import numpy as np

# データの作成:正規分布乱数
rng = np.random.default_rng(seed=0)
n = 30
chain = rng.normal(loc=350, scale=30, size=n).astype('int')   # チェーン店の価格
local = rng.normal(loc=380, scale=35, size=n).astype('int')   # 個人店の価格

# データの表示
print('【チェーン店】')
print(chain)
print('【個人店】')
print(local)

【作成した仮想データの内容】

【チェーン店】
353, 346, 369, 353, 333, 360, 389, 378, 328, 312, 331, 351, 280, 343, 312, 328, 333, 340, 362, 381, 346, 390, 330, 360, 377, 352, 327, 322, 336, 356
【個人店】
344, 372, 374, 398, 387, 392, 357, 375, 407, 432, 335, 432, 427, 407, 389, 369, 431, 448, 443, 426, 392, 337, 379, 402, 334, 393, 395, 404, 338, 356

個人店とチェーン店の平均価格を棒グラフで比べます。

# インポート
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib

# 平均価格の棒グラフの描画
sns.barplot(x='店舗タイプ', y='価格', data=df, hue='店舗タイプ', palette='pastel',
            legend=False)
plt.xticks([0,1], ['個人店', 'チェーン店'], rotation=0)
plt.title(f'カフェのコーヒー平均価格の比較')
plt.show()

【実行結果】

チェーン店の価格のほうがやや安い感じです。
※ 黒いおひげは平均値の 95% 信頼区間です。

☕️☕️☕️

4. 確かめる

4.1 Student の t 検定で平均差を調べる
チェーン店と個人店の平均価格の差を Student の t 検定で調べます。
Student の t 検定は2つの群の分散が等しいことを仮定しています。

scipy.stats の ttest_ind() で Student の t 検定を行います。
equal_var = True が Student の t 検定(等分散を仮定する)、equal_var = False がWelch の t 検定(等分散を仮定しない)です。

# インポート
from scipy.stats import ttest_ind

# Studentのt検定
# equal_var=TrueがStudent:等分散を仮定する, FalseがWelch:等分散を仮定しない
result = ttest_ind(chain, local, equal_var=True)
print(f't検定: t統計量={result.statistic:.5f}, p値={result.pvalue:.5f}')

【実行結果】

p 値 < 0.05 です。
チェーン店と個人店で平均価格に有意な差があることがわかります。

☕️

4.2 回帰分析で同じ問いを表す
単回帰モデルを立てます。

$$
Y_i = \beta_0 + \beta_1 D_i + \varepsilon_i
$$

  • $${Y_i}$$:価格

  • $${D_i}$$:店舗タイプのダミー変数(チェーン店 = 1、個人店 = 0)

statsmodels の ols でこの単回帰モデルをモデリングします。

出力に「店舗タイプ」の係数が現れます。これが2群の平均差を表します。

# インポート
import statsmodels.formula.api as smf

# 回帰分析
model = smf.ols('価格 ~ 店舗タイプ', data=df).fit()
model.summary().tables[1]  # 係数の表だけ表示

【実行結果】
単回帰モデルの回帰係数を推定しました。
店舗タイプの係数は -43.2333 です。

☕️

4.3 結果の読み取り
🔢ポイント1:平均の差=回帰の係数 になっている。

# 回帰分析のダミー変数の係数と価格平均の計算
mean_diff = chain.mean() - local.mean()
coef_chain = model.params.店舗タイプ

# 結果の表示
print('2群の平均値の差     :', mean_diff)
print('回帰分析のダミー変数の係数:', coef_chain)

【実行結果】

🔢ポイント2:t 検定の t 値 = 回帰係数の t 値になっている。

# t検定と回帰係数のt値を表示
print('t検定のt値 :', result.statistic)
print('回帰係数のt値:', model.tvalues.店舗タイプ)

【実行結果】

☕️

4.4 Student の t 検定と単回帰分析のつながり
2群のダミー変数を説明変数にする単回帰モデルの場合:

  • 平均差 = ダミー変数の回帰係数

  • Student の t 検定の t 値 = 回帰係数の検定の t 値

  • 帰無仮説

    • t 検定:$${\mu_{\text{チェーン店}} - \mu_{\text{個人店}} = 0}$$

    • 回帰係数の検定:$${\beta_1 = 0}$$

👉 同じ仮説を、表現を変えて検証しているだけ。
だから結果は完全に一致します。

☕️

【参考】平均差とダミー変数の回帰係数が一致することを数式で整理
2群を $${D=0}$$(個人店)と $${D=1}$$(チェーン店)に分け、目的変数を $${Y}$$、説明変数を店舗タイプのダミー変数 $${D}$$ とします。
誤差 $${\varepsilon_i}$$ の平均 を0と仮定します。

  • 回帰モデル:

$$
Y_i = \beta_0 + \beta_1 D_i + \varepsilon_i
$$

  • 個人店のとき $${D=0}$$:

$$
E[Y \mid D=0] = \beta_0
$$

→ 切片 $${\beta_0}$$ は 個人店の平均値。

  • チェーン店のとき $${D=1}$$:

$$
E[Y \mid D=1] = \beta_0 + \beta_1
$$

→ チェーン店の平均値は $${\beta_0 + \beta_1}$$。

したがって、

$$
\beta_1 = E[Y \mid D=1] - E[Y \mid D=0]
$$

となり、ダミー変数の係数 $${\beta_1}$$ は 2群の平均の差 に等しくなります。

☕️☕️☕️

5. MLブリッジ

ML は機械学習の略称です。
scikit-learn の線形回帰でも statsmodels の単回帰分析と同様に、切片・傾きを推定できます。

# インポート
from sklearn.linear_model import LinearRegression

# 説明変数と目的変数の準備
X = df[['店舗タイプ']]
y = df['価格']

# モデルの学習
reg = LinearRegression().fit(X,y)
print(f'切片:{reg.intercept_:.4f}, 傾き:{reg.coef_[0]:.4f}')

【実行結果】

👉 切片・傾きは statsmodels と一致。
👉 「統計の検定 → 回帰分析 → 機械学習の線形回帰」へ自然につながる!

☕️☕️☕️

6. ⚠️誤解注意

  • 平均差と係数が一致するのは「切片+1つのダミー変数」の単回帰モデルの場合だけです。

  • 変数を増やすと「他の要因で調整した平均差(偏回帰係数)」になるので、単純な t 検定とは別物になります。

  • 回帰は「平均差を超えて、他の要因も同時に調整できる」ことが強みです。

☕️☕️☕️

7. 架け橋のまとめ

  • Student の t 検定は「2群の平均差 = 0」を検定している。

  • 回帰分析は「ダミー変数の係数 = 0」を検定している。

  • 同じ仮説を、表現を変えて検定しているだけだから結果は完全一致する。

👉 検定と回帰は別世界ではなく、同じ地図の別の場所。
この気づきが、検定から統計モデル・機械学習へと進む架け橋になります。

☕️☕️☕️

8. 今日の小テスト

Q1. t 検定の帰無仮説と回帰の帰無仮説はどう違う?
→ 答え:t 検定は「平均差=0」、回帰は「係数=0」。実質的に同じ意味。

Q2. 平均差と回帰係数が完全に一致するのはどんな場合?
→ 答え:「切片+1つのダミー変数だけ」の単回帰モデルのとき。

☕️☕️☕️

9. 次回へつなぐ

2群の平均差を「t 検定」と「単回帰」でまったく同じように検証できることを見てきました。

では、3群以上あったらどうなるでしょうか?
たとえば「チェーン店」「個人店」「カフェ以外の店」の3つを比べたいとき、t 検定ではペアごとに比較しなければなりません。

このときに登場するのが ANOVA(分散分析)。
実はこれも回帰分析で表現でき、検定結果は完全に一致します。

👉 次回は「ANOVAと回帰分析の完全一致」を見ていきましょう!

おわり


シリーズ記事

次の記事

目次

ブログの紹介


note で8つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!

1.のんびり統計

統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。

2.統計・データ分析とつながる

シリーズ「統計・データ分析とつながる」は、統計・データ分析との「つながり」を発掘して、コラム風に仕立てたブログシリーズです。
生成 AI の力を借りながら、統計・データ分析の入り口をイメージして、自由気ままに書きました。
たとえば…
・日常生活と統計のつながり
・統計検定2級からその先へのつながり
気楽にお読みいただけたら嬉しいです🍀

3.実験!たのしいベイズモデリング1&2をPyMC Ver.5で

書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!

4.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で

書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!

5.楽しい写経 ベイズ・Python等

ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀

6.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で

書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。

7.データサイエンスっぽいことを綴る

統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。

8.Python機械学習プログラミング実践記

書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。

最後までお読みいただきまして、ありがとうございました。

いいなと思ったら応援しよう!

ネイピア DS 応援ありがとうございます。これからもがんばって記事を作成します!

この記事が参加している募集