見出し画像

✨ 単回帰のF検定とt検定がつながる!

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

イントロ


統計検定2級と統計モデルを結ぶ 完全一致シリーズ の第5話は 回帰モデルの F 検定と回帰係数の t 検定 です。
流れ星に願いと単回帰モデルを込めて、記事をお楽しみください!


トピック


1. 今日の一言

単回帰分析におけるモデルの F 検定と、傾きの t 検定が完全に一致する!

👉 外れ値があっても、この恒等式は崩れません。

✨✨✨

2. 導入ストーリー

夏の夜、みんなで流星群を観測しました。

  • 「流れ星が多いほど、たくさん願い事を唱えられるはずだよね」

  • ところが…1人だけ、流れ星がたった2個しか見えなかったのに、15個も願い事を唱えられた“ラッキーな人” が!

「流れ星の数と願い事の数には、本当に直線的な関係があるのかな?」
これを確かめるのが 単回帰分析
そして、F 検定と t 検定の一致を実感できる場面です。

3. データ例

30人が観測した「流れ星の数」と「願い事を唱えられた数」を記録しました。
※データはフィクションです。

$$
\begin{array}{ccr}
流れ星の数 & 願い事を唱えた数 & \\
\hline
\\
17 & 9 & \\
13 & 7 & \\
\vdots & \vdots& \\
2 & 15 & ← ラッキーな人! \\
\end{array}
$$

👉 実装では乱数で生成し、外れ値を1つ加えます。

# インポート
import numpy as np

# データ作成
n = 29
rng = np.random.default_rng(seed=0)
stars = rng.integers(1, 20, n)                             # 流れ星の数
wishes = np.clip(
    0.6*stars + rng.normal(1, 2, n), 0, 15).astype('int')  # 願い事の数

# 外れ値(ラッキーな人)を追加
stars = np.append(stars, 2)
wishes = np.append(wishes, 15)

# データの表示
print('【流れ星の数】')
print(stars)
print('【願い事】')
print(wishes)

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

【流れ星の数】
[17, 13, 10, 6, 6, 1, 2, 1, 4, 16, 13, 18, 10, 12, 19, 14, 13, 11, 11, 18, 6, 16, 13, 1, 8, 17, 11, 1, 15, 2]
【願い事】
[9, 7, 6, 5, 6, 1, 4, 0, 4, 12, 8, 10, 5, 7, 12, 7, 8, 7, 8, 12, 5, 9, 8, 3, 8, 8, 10, 4, 11, 15]

願い事データをデータフレームにまとめます。

# インポート
import pandas as pd

# データフレーム化
df = pd.DataFrame({'流れ星の数': stars, '願い事': wishes})

# 結果の表示
print('df.shape:', df.shape)
df.head()

【実行結果】

回帰直線付きの散布図で可視化します。

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

# 可視化(散布図+回帰直線)
sns.regplot(x='流れ星の数', y='願い事', data=df, ci=None,
            line_kws={'color':'tab:red'})
plt.scatter(2, 15, color='orange', marker='*', s=200, label='ラッキーな人')
plt.title('流れ星と願い事の関係')
plt.xticks(range(0, 21, 2))
plt.legend()
plt.show()

【実行結果】

「流れ星の数が多いほど唱えた願い事が多い」という正の相関が見られます。  

✨✨✨

4. 確かめる

4.1 F 検定(モデル全体の有意性)
単回帰分析を行って F 値を計算します。
statsmodels の ols と anova_lm を利用します。

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

# 回帰分析の実行
model = smf.ols('願い事 ~ 流れ星の数', data=df).fit()

# 分散分析表(F検定)の作成
anova_table = sm.stats.anova_lm(model, typ=1)
anova_table.round(3)

【実行結果】
👉 F 値(F)と p 値(PR(>0))が表示されます。

4.2 t 検定(回帰係数の有意性)
statsmodels 回帰の結果を表示します。

# 回帰結果のサマリ
model.summary().tables[1]

【実行結果】
👉 傾き(流れ星の数)の係数、t 値、p 値が出力されます。

4.3 結果の読み取り
F 値と傾きの t 値の二乗を突き合わせます。

# F値とt値²の確認
F_val = anova_table.loc['流れ星の数', 'F']
t_val = model.tvalues['流れ星の数']
print(f"F値={F_val:.5f}, t値²={t_val**2:.5f}")

【実行結果】

👉 F 値 = t 値 ² が完全一致!
 外れ値を入れても、この一致は崩れません。

4.4 F値とt値のつながり
(A) F 検定と F 値
単回帰モデルは:

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

F 値は:

$$
F = \frac{\text{SSR}/1}{\text{MSE}} = \frac{\text{SSR}}{\text{MSE}}
$$

ここで、$${\text{SSR}}$$:回帰の平方和、$${\text{MSE}}$$:残差の平均平方。

(B) t 検定と t 値の二乗
傾きの推定値の t 値は:

$$
t = \frac{\hat\beta_1}{SE(\hat\beta_1)}
$$

ここで傾きの標準誤差 SE の二乗は:

$$
SE(\hat\beta_1)^2 = \frac{\text{MSE}}{\sum (X_i - \bar X)^2}
$$

よって t 値の二乗は:

$$
t^2 = \frac{\hat\beta_1^2}{SE(\hat\beta_1)^2}
= \frac{\hat\beta_1^2 \cdot \sum (X_i - \bar X)^2}{\text{MSE}}
$$

一方、回帰の平方和は:

$$
\text{SSR} = \hat\beta_1^2 \cdot \sum (X_i - \bar X)^2
$$

したがって:

$$
t^2 = \frac{\text{SSR}}{\text{MSE}} = F
$$

👉 単回帰では必ず一致します。

✨✨✨

5. MLブリッジ

ML は機械学習の略称です。
scikit-learn の線形回帰を使ってみます。

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

# 説明変数と目的変数の準備
X = df[['流れ星の数']]
y = df['願い事']

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

# 決定係数の表示
print(f'決定係数 R²={reg.score(X, y):.4f}')

【実行結果】

👉 scikit-learn は F 値・t 値を出力しません。
👉 でも 「全体の説明力(R²)」と「個別の係数」 という統計との対応を意識すると、つながり=架け橋ができます。

✨✨✨

6. ⚠️誤解注意

  • F 値 = t 値 ² は単回帰に限る。
    重回帰では「全体(F)」と「各係数(t)」は別々に扱う。

  • 外れ値を入れても恒等式は崩れないが、有意性の結論は変わる可能性がある。

✨✨✨

7. 架け橋のまとめ

  • 単回帰では F 値と t 値 ² が完全一致

  • 「モデル全体」と「傾きの係数」が同じ意味を持つことがわかる。

👉 検定の仕組みを理解するうえで大切なブリッジになります。

✨✨✨

8. 今日の小テスト

Q1. 単回帰で F 検定と t 検定はどう関係する?
→ 答え: F 値 = t 値 ² で完全一致。

Q2. 外れ値を入れたら F 値 = t 値 ² の関係は崩れる?
→ 答え: いいえ、一致は維持される。ただし有意性は変わる。

Q3. 重回帰の場合も F 値 = t 値 ² は成り立つ?
→ 答え:いいえ、単回帰に限られる。

✨✨✨

9. 振り返り

今回の記事では、単回帰において F 値と t 値 ² が完全一致することを確認しました。
「モデル全体」と「傾きの係数」という一見異なる検定が、実は同じ数式に基づいていることが分かりました。

これで「完全一致シリーズ」は一区切りです。

  • テーマ 1:t 検定と回帰分析

  • テーマ 2:ANOVAと回帰分析

  • テーマ 3:相関係数と標準化回帰係数

  • テーマ 4:決定係数と寄与率

  • テーマ 5:単回帰の F 検定と t 検定

どのテーマも、統計の基本検定と回帰分析やモデル指標が「完全一致」することを、物語と数式を通して体感してきました。

👉 「統計」「回帰」「機械学習」は別々の島ではなく、同じ橋でつながっていることがわかりました。

次回以降は、新しいテーマで別のシリーズが始まります。
これまでの気づきを土台にして、さらに学びを広げていきましょう!

✨✨✨

おわり


シリーズ記事

次の記事

前の記事

目次

ブログの紹介


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 応援ありがとうございます。これからもがんばって記事を作成します!

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