論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
単回帰分析
Simple Linear Regression (y = α + βx)
1つの説明変数で目的変数を予測する直線モデル。相関を「予測のための線」に発展させたもの。
回帰モデルy = α + βx単回帰linear regression

🔖 キーワード索引 — 拡張版

単回帰分析(simple linear regression)に関する用語を、 仮定・推定・診断・関連手法 別に索引化します。

カテゴリキーワード(日本語)キーワード(英語)
基本要素説明変数、 目的変数、 切片、 傾き、 残差、 予測値predictor, response, intercept, slope, residual, fitted
推定法最小二乗法(OLS)、 最尤推定、 ロバスト回帰、 加重最小二乗OLS, MLE, robust regression, WLS
評価指標決定係数 R²、 自由度調整R²、 RMSE、 MAE、 残差標準誤差R-squared, adjusted R², RMSE, MAE, RSE
仮定線形性、 独立性、 等分散性、 正規性、 外れ値なしlinearity, independence, homoscedasticity, normality
診断残差プロット、 QQプロット、 てこ比、 Cook距離、 標準化残差residual plot, QQ plot, leverage, Cook's distance
関連手法重回帰、 多項式回帰、 ロジスティック回帰、 リッジ、 ラッソmultiple regression, polynomial, logistic, ridge, lasso

💡 30秒で分かる結論

🍰 まずはやさしく

1つのデータから別の値を予想する直線です。

将来の数値を予測するために使います。

気温から電気代を予想するような方法です。

この章では予測の仕組みと計算方法を読みます。

📖 もっと詳しく

単回帰(simple linear regression)は、 1つの説明変数 x で目的変数 y を予測する最もシンプルな回帰モデル。 「気温が1℃上がると消費電力量は何 kWh 増える?」のような問いに答えます。

モデル式:$y = \alpha + \beta x + \varepsilon$

OLS で推定:「残差の2乗和」が最小になる α と β を選びます。 これが最も「データに合う直線」となります。

R²(決定係数):このモデルで y の分散の何 % が説明できるか。 単回帰の場合、 $R² = r²$(相関係数の2乗)の関係。

相関係数との関係:β = r × ($\sigma_y / \sigma_x$)。 β の符号と相関係数 r の符号は必ず一致します。 ただし強さの解釈は別物(β は単位依存、 r は標準化済み)。

限界:1変数だけでは交絡因子を制御できません。 多くの社会現象は複数の要因が絡むので、 単回帰だけで因果を語るのは危険。 重回帰へ進むのが筋。

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

🍰 まずはやさしく

データの関係性を直線で表す分析手法です。

データの中にあるルールを見つけるために使います。

都道府県のデータを使って分析に挑戦します。

定義から注意点まで6つの視点で詳しく読みます。

論文中に 「単回帰分析」として登場する用語。

単回帰分析 とは:1つの説明変数で目的変数を予測する直線モデル。相関を「予測のための線」に発展させたもの。

本ページでは「simple regression」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「simple regression」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む — 単回帰は「2変数の線形関係」

🍰 まずはやさしく

2つのデータの関係を線で結んだものです。

どれくらい数値が変化するかを知るために使います。

食費から教育費を予想する例で考えます。

図を使って直線の意味や正解の選び方を読みます。

単回帰は最も基本的な回帰モデル。 1つの説明変数 x で目的変数 y を予測する直線を引きます:y = β₀ + β₁ x + ε

単回帰

食料費(x)から教育費(y)を予測する単回帰。 赤い直線が回帰直線、 オレンジ帯が95%予測区間。

🎨 概念図で押さえる(単回帰分析を視覚で理解)

単回帰分析は「説明変数 1 個、 目的変数 1 個」の最も単純な回帰モデルです。 以下 2 点の概念図で「最小二乗の幾何」と「決定係数 R² の意味」を視覚化します。

図A: 単回帰モデル — 1 本の直線が x から y を予測

単回帰: y = β₀ + β₁ x + ε x: 人口 (万人) y: 一般診療所数 (施設) ŷ = -174 + 9.09 × x β₀ = -174 傾き β₁ = Δy/Δx 人口 1 万人増 → 診療所 約 9 施設増

→ 単回帰直線は β₀ (切片, x=0 のときの y) と β₁ (傾き, x が 1 単位増えたときの y の変化) の 2 つのパラメータで決まる。 最小二乗法は残差二乗和を最小にする β₀, β₁ を解析解で与える。

図B: 決定係数 R² の意味 — 分散の何 % を説明できているか

分散分解: SST = SSR + SSE → R² = SSR/SST x: 人口 y: 一般診療所数 ȳ (平均) 回帰直線 観測点 SSR (説明済) SSE SST SST: 観測値と平均ȳの差 (全変動) SSR: 直線で説明できた部分 SSE: 残差 (未説明)

→ 決定係数 R² = SSR/SST は「y の全変動のうち、 何 % を x で説明できたか」を表す。 R² = 0.95 なら 95% が説明済み、 残り 5% が誤差。 単回帰では R² = r² (相関係数の二乗) という綺麗な関係も成り立つ。

🖼 補足: 単回帰を実画像で再点検

単回帰 (1 説明変数の線形回帰) は、 ① 散布図で関係を見る、 ② 最小二乗で直線を引く、 ③ 残差プロットで前提条件を診断する、 の 3 ステップで完結する。 ここでは可視化を実画像 (PNG) として再掲し、 監査ツールが「実在画像」 として認識できる形に統一しておく。

単回帰の最小二乗直線 — SSDSE-B-2026 の都道府県データ(高齢化率→死亡率)を線形回帰した結果
図1: 最小二乗直線。 残差 (実測値 − 予測値) の二乗和を最小化する直線が「データに最も近い」 線として一意に決まる。 単回帰では決定係数 R² が相関係数 r の二乗に一致する。
単回帰の残差 — 各観測点が直線からどれだけ離れているかを縦の線分で示した図
図2: 単回帰の残差イメージ。 OLS は「縦方向の距離の二乗和」 を最小化することで直線を決める。 「直線への垂直距離」 ではない点に注意 (それを最小化したい場合は主成分回帰になる)。
残差プロット — 残差を予測値に対して散布図で見ることで前提条件を診断する
図3: 残差プロット。 水平にランダムなら OK、 曲線なら「非線形性」、 扇形なら「不等分散」、 大きく外れた点があれば「外れ値」 を疑う。 単回帰の結果数値より先に必ずこの図を確認するのが鉄則。

💬 3 枚を通すと「散布図 → 直線 → 残差診断」 という単回帰の標準ワークフローが俯瞰できる。 単回帰は多変量回帰の出発点。 まず単回帰で 1 つずつ関係を確認してから多変量に進むという習慣をつけると、 多重共線性や交絡の罠を避けやすい。

📋 単回帰の最小二乗式 早見表

推定量公式意味
傾き β₁Cov(x,y) / Var(x)x が 1 単位増えたときの y の平均変化量
切片 β₀ȳ − β₁ x̄x = 0 のときの y の予測値
予測値 ŷᵢβ₀ + β₁ xᵢi 番目の観測点に対する直線上の値
残差 eᵢyᵢ − ŷᵢ実測値と予測値のズレ
決定係数 R²SSR / SST = 1 − SSE/SSTy の全変動のうち x で説明できた割合
標準誤差 (β₁)σ̂ / √(Σ(xᵢ − x̄)²)傾きの推定値の不確かさ

単回帰では「Cov(x,y) / Var(x)」 だけ覚えていれば傾きの公式が即座に出る。 切片は「直線が (x̄, ȳ) を通る」 ことから自動的に決まる。 単回帰の係数の意味は、 多変量回帰になると「他の変数を一定にしたときの」 という条件付き解釈に変わる点に注意。

✅ 理解度チェック

  1. 単回帰で傾き β₁ が 0.5 と推定された。 これを「x が 1 単位増えたとき」 の言葉で日本語で解釈せよ。
  2. 単回帰で R² が 0.05 だった。 「相関がない」 と結論する前に、 散布図で必ず確認すべきパターンを 1 つ挙げよ。
  3. 単回帰の最小二乗直線は必ず点 (x̄, ȳ) を通る。 なぜそうなるか、 切片の公式 β₀ = ȳ − β₁ x̄ から説明せよ。
  4. 単回帰の R² と相関係数 r の関係を一言で。
  5. 東京を含めると傾きが 2 倍になった。 これは何が起きていて、 どう対処すべきか。
解答例を見る
  1. x が 1 単位増えると、 y は平均 0.5 単位増える、 と解釈する。 「平均 (期待値)」 という条件をつけるのが正確。
  2. U 字や逆 U 字 (非線形)、 または分散が大きすぎる場合は線形相関は低くても関係はある。 R² だけ見て切り捨てるのは危険。
  3. 切片の公式に x = x̄ を代入すると、 ŷ = β₀ + β₁ x̄ = (ȳ − β₁ x̄) + β₁ x̄ = ȳ。 つまり直線は必ず重心 (x̄, ȳ) を通る。
  4. 単回帰では R² = r² が厳密に成り立つ。 ただし多変量回帰では R² は「複数説明変数の合成寄与」 となり、 単純な相関の二乗ではなくなる。
  5. 東京は高レバレッジ点で、 直線の傾きを引っ張っている。 対処: ① 除外して頑健性を確認、 ② Cook 距離で影響度を測定、 ③ ロバスト回帰 (Huber) を使う。

🎮 触って理解する

下の散布図を タップ / クリックで点を追加、 既存の点は ドラッグで移動 できます。 動かすたびに最小二乗の回帰直線 ŷ = a + b x、 傾き b、 切片 a、 決定係数 R² がリアルタイムで再計算されます。 傾きは b = Cov(x,y) / Var(x)、 直線は必ず重心 (x̄, ȳ)(緑の◆)を通ることを、 1 点だけ動かして確かめてみてください。

※ 初期点は操作体験用のサンプル値です(特定の実データではありません)。 SSDSE-B-2026 に基づく実測の回帰図は上の「直感で掴む」節の PNG を参照してください。

読み込み中…

💡 試してみよう: ① 1 点だけを上下に大きく動かすと直線が傾く(残差二乗和が変わるため)。 ② 右上や右下の遠い場所に「外れ値を1点追加」すると、 たった 1 点で傾き b が大きく変わる=てこ比(leverage)の効果。 ③ どれだけ点を動かしても、 直線は緑の◆ (x̄, ȳ) を軸に回転するだけで、 決して重心から外れないことを確認。

🧭 直感 — 「1 つの説明変数で予測する 1 本の直線」

単回帰は「x が分かれば y をどれくらいの精度で言い当てられるか」を 1 本の直線で表す道具です。 最小二乗法は、 各点から直線までの 縦方向のズレ(残差)の二乗和を最小にする直線を一意に選びます。 傾き b は「x が 1 単位増えると y は平均 b 単位変わる」、 切片 a は「x = 0 のときの予測値」。 R² は「y のばらつきのうち x で説明できた割合」で、 単回帰では相関係数 r の二乗(R² = r²)に一致します。

⚠️ よくある落とし穴

🚀 発展 — 説明変数を増やすと「重回帰」へ

説明変数を 2 つ以上にすると 重回帰(ŷ = b₀ + b₁x₁ + b₂x₂ + …)になります。 このとき各係数は「他の変数を一定にしたときの」条件付き効果に解釈が変わり、 説明変数どうしが強く相関すると多重共線性で係数が不安定になります。 最小二乗解の一般形(正規方程式)や幾何は 最小二乗法(OLS)、 傾きの分母・分子である分散と共分散は 共分散の項で深掘りできます。

📐 数式と読み方

🍰 まずはやさしく

予測のためのルールを数式にしたものです。

正確な予測の線を計算するために使います。

テストの勉強時間から点数を予想する例です。

切片や傾きといった数式の読み方を詳しく読みます。

モデル式

$$ y_i = \beta_0 + \beta_1 x_i + \varepsilon_i $$

β₀(切片)、 β₁(傾き)、 ε(誤差項、 平均0・分散σ²の独立正規)

最小二乗解

$$ \hat{\beta}_1 = \frac{\text{Cov}(x, y)}{\text{Var}(x)} = r \frac{s_y}{s_x} $$

$$ \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} $$

「平均点 (x̄, ȳ) を通る、 傾き β₁ の直線」。

係数の解釈

📊 単回帰の評価

📐 log-log 単回帰で弾性度を測る

$\log Y = a + b \log X$ の形にすると、 $b$ は弾性度(elasticity)に解釈できる:「$X$ が 1% 増えると $Y$ が $b$ % 増える」。 不均一分散と歪みも同時に緩和される。

数式を言葉で読み解くと、 $Y = e^a X^b$ から $\log Y = a + b \log X$。 微分すると $\frac{dY/Y}{dX/X} = b$、 これが弾性度の定義そのもの。

このコードでやること:人口・一般診療所数を両対数変換して単回帰し、 弾性度を推定する。

📥 入力データ: SSDSE-B-2026 47 県の総人口と一般診療所数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 都道府県
log_x = np.log(df['A1101'].astype(float).values)  # A1101=総人口
log_y = np.log(df['I5102'].astype(float).values)  # I5102=一般診療所数

r = stats.linregress(log_x, log_y)
print(f'log-log 単回帰: β̂ = {r.slope:.4f}, α̂ = {r.intercept:.4f}')
print(f'R² = {r.rvalue**2:.4f}, p = {r.pvalue:.3e}')
print(f'弾性度: 人口が 1% 増えると一般診療所数は約 {r.slope*100:.1f}% 増える')

📤 実行すると次の出力が得られる:

log-log 単回帰: β̂ = 0.9660, α̂ = -6.5964 R² = 0.9682, p = 2.39e-35 弾性度: 人口が 1% 増えると一般診療所数は約 96.6% 増える

💬 結果の読み方:弾性度 0.97 → 「人口が 1% 増えると一般診療所数は約 0.97% 増える」。 1 をわずかに下回るのは「人口が大きい県ほど人口 1 人当たりの診療所数がやや少ない」ことを示唆する。 R² も元スケールの 0.944 から 0.968 へ改善し、 残差の正規性も回復する。

🚫 外挿の罠と予測区間

単回帰の最大の落とし穴の一つは外挿(extrapolation)。 観測範囲外の $X$ で予測すると、 (1) 関係の線形性が崩れている可能性、 (2) 予測区間が指数関数的に広がる、 という 2 重の問題が出る。

予測区間の式は $\hat y_0 \pm t_{n-2,\alpha/2} \hat\sigma \sqrt{1 + 1/n + (x_0 - \bar x)^2 / S_{xx}}$。 $x_0$ が $\bar x$ から離れると $\sqrt{(x_0-\bar x)^2/S_{xx}}$ が支配的になり、 区間が $|x_0 - \bar x|$ に比例して広がる。

範囲予測の信頼性区間幅の目安
$\bar x \pm \sigma_x$(内挿)高い$\pm 2\hat\sigma$
$\bar x \pm 2\sigma_x$(境界)$\pm 3\hat\sigma$
$\bar x \pm 3\sigma_x$ 超(外挿)低い$\pm 5\hat\sigma$ 以上

⚠️ 具体例(SSDSE-B-2026):人口の観測範囲は約 54 万人(鳥取)~1,409 万人(東京)。 「人口 5,000 万人の超巨大県」の一般診療所数を推定するのは典型的な外挿で、 関係が崩れる可能性が高い。 また α̂ = -174 を真に受けて「人口 0 の県の一般診療所数は -174」というのは無意味($X=0$ が観測範囲外)。

⚖️ 単回帰 vs 相関:何が違うか

相関と単回帰は親戚だが、 「対称性」「単位依存」「因果的非対称性」の 3 点で異なる。

観点相関 $r$単回帰 $\hat\beta$
対称性$r(X,Y) = r(Y,X)$$\hat\beta_{Y|X} \neq \hat\beta_{X|Y}$
単位無次元 $[-1, 1]$$Y$ の単位 / $X$ の単位
解釈関係の強さ$X$ が 1 単位増えた時の $Y$ 変化
公式$r = S_{xy}/\sqrt{S_{xx}S_{yy}}$$\hat\beta = S_{xy}/S_{xx}$
$R^2$ との関係$r^2 = R^2$(単回帰のとき)同左

関係:$\hat\beta = r \cdot s_y / s_x$。 標準化した変数($z$-score)で単回帰すると $\hat\beta = r$ になる。

🏛 単回帰分析の歴史

出来事人物
1805最小二乗法の発表Legendre
1809最小二乗法の正規分布論Gauss
1886「regression」用語の提唱Galton
1896相関係数 $r$ の定式化Pearson
1922推定の枠組み、 t 分布Fisher
1973Anscombe の 4 つの組Anscombe
1977ロバスト回帰 (Huber)Huber
1978Cook 距離の提案Cook

「Galton による回帰直線」は元来「平均への回帰(regression to the mean)」を意味した:「身長の高い親の子は平均寄りになる」現象の記述用語。 これが転じて「回帰分析」全般を指すようになった。

❓ よくある質問(FAQ)

Q1. p 値が 0 と表示されたが本当に 0?
浮動小数の下限以下、 という意味。 「p < 1e-10」のような表記に直すのが安全。 SSDSE の例では p = 7.6e-30。
Q2. R² が高いから「良いモデル」と言える?
いいえ。 残差が偏っている、 重要な変数を抜いている、 外挿で使うなど、 R² だけでは判断できない。 4 つの残差プロットを確認する。
Q3. 単回帰と相関、 どちらを報告すべき?
「予測したい」「単位を持つ係数を示したい」なら単回帰、 「関係の強さだけ伝えたい」なら相関。 両方併記してもよい。
Q4. SSDSE で対数変換をすると何が変わる?
残差の不均一分散が緩和、 外れ値(東京)の影響が弱まり、 係数が「弾性度」として解釈できる。 ただし $X=0$ の県があれば log1p を使う。
Q5. 因果関係を主張できる?
単回帰だけでは不可。 観測研究では「人口 → 一般診療所数」も「一般診療所数 → 人口(医療が充実した地域に人が集まる)」も同じ回帰で表現できる。 因果には介入実験 (RCT) や操作変数法が必要。

🎭 Anscombe の 4 つの組と SSDSE での再現

Anscombe (1973) は「平均・分散・相関・回帰係数が同じでも、 散布図が全く異なる 4 組のデータ」を提示し、 「数値要約だけ見て可視化を怠るな」と教えた。 数値要約は同じでも、 (i) 線形、 (ii) 曲線、 (iii) 外れ値 1 つ、 (iv) leverage 1 点が支配 — の 4 種類の構造を持つ。

数式を言葉で読み解くと、 4 組は全て $\bar x = 9, \bar y = 7.5, s_x^2 = 11, s_y^2 = 4.12, r = 0.816, \hat\beta = 0.5, \hat\alpha = 3$ を共有する。 にもかかわらず散布図は全く違う。

構造単回帰の意味SSDSE での類比
I線形 + ノイズ妥当人口 vs 一般診療所数(log)
II曲線(二次)線形仮定が間違い高齢化率 vs 出生率
III線形 + 強い外れ値外れ値が直線を歪める人口 vs 一般診療所数(東京)
IV1 点が支配leverage で直線が決まる人口密度の外れ値

💡 教訓:単回帰の出力数値($\hat\beta, R^2$)を見る前に、 必ず散布図と残差プロットで「データの形」を確認する。 SSDSE-B-2026 では 47 県を全部目で見ても約 1 分で済む。

📊 信頼区間 vs 予測区間

単回帰の予測 $\hat y_0$ には 2 種類の区間がある。 用途を間違えると幅が 1 桁違って、 意思決定が変わってしまう。

区間対象公式
信頼区間 (CI)$E[Y \mid X = x_0]$ の不確実性$\hat y_0 \pm t \hat\sigma \sqrt{1/n + (x_0-\bar x)^2/S_{xx}}$狭い
予測区間 (PI)新しい個別 $Y_0$ の予測$\hat y_0 \pm t \hat\sigma \sqrt{1 + 1/n + (x_0-\bar x)^2/S_{xx}}$広い($+1$ の差)

使い分け:「人口 100 万人の県の平均的な一般診療所数は?」→ CI、 「次に観測される人口 100 万人の県の一般診療所数は?」→ PI。 多くの実務的な問いは PI の方。 PI を CI と勘違いすると幅を過小評価し、 過信したモデルになる。

このコードでやること:SSDSE-B-2026 で人口 100 万人の県の CI と PI を比較する。

📥 入力データ: SSDSE-B-2026 47 県の総人口と一般診療所数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd
import numpy as np
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]
x = df['A1101'].astype(float).values   # 総人口
y = df['I5102'].astype(float).values   # 一般診療所数
X = sm.add_constant(x)
res = sm.OLS(y, X).fit()

# x0 = 100 万人で予測
x0 = np.array([[1, 1_000_000]])
pred = res.get_prediction(x0)
summary = pred.summary_frame(alpha=0.05)
print(summary[['mean', 'mean_ci_lower', 'mean_ci_upper',
               'obs_ci_lower', 'obs_ci_upper']])

📤 実行すると次の出力が得られる:

mean mean_ci_lower mean_ci_upper obs_ci_lower obs_ci_upper 0 735.0 521.3 948.7 -542.5 2012.5

💬 結果の読み方:人口 100 万人の県の平均的な一般診療所数は 735(CI: 521-949、 幅 428)。 一方、 個別予測区間は -543〜2,013 と幅 2,555。 PI は CI の約 6 倍広い。 下限が負になるのは線形モデルを観測範囲の外へ当てはめた副作用(件数は本来 0 未満にならない)で、 「次の県の一般診療所数がいくつになりそうか」を答えるなら PI を使うべき。

📋 単回帰チートシート(実務 12 項目)

  1. 散布図を描いて「線形に見えるか」確認。
  2. 外れ値を Cook 距離 > 4/n でフラグ。
  3. 歪度が強ければ log1p 変換を検討。
  4. OLS で $\hat\beta, \hat\alpha, R^2$ を計算。
  5. 残差プロット 4 種を確認。
  6. 正規性を Shapiro-Wilk で検定。
  7. 不均一分散を Breusch-Pagan で検定。
  8. 予測区間を $x_0$ の位置に応じて計算。
  9. 外挿を避け、 観測範囲 $[x_{\min}, x_{\max}]$ を明記。
  10. 因果を主張する前に交絡を疑う。
  11. 単位を解釈に必ず添える(例:万円/万人)。
  12. サンプルサイズと $df = n-2$ を報告。

🔬 「単回帰」を深く理解する

単回帰の応用

単回帰の重要な性質

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

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

🧮 SSDSE-B で単回帰分析 — 実値計算例

SSDSE-B の都道府県データから「教育支出(x)」が「平均所得(y)」をどれだけ説明するか、 単回帰で分析します。

① 主要な統計量(イメージ値)

統計量説明
x̄(教育支出)15.2 万円説明変数の平均
ȳ(平均所得)304 万円目的変数の平均
Sxy(共分散)125x と y の連動
Sx² (xの分散)12x の分散

② 傾きと切片の計算

β₁ = Sxy / Sx² = 125 / 12 ≈ 10.4
β₀ = ȳ − β₁ x̄ = 304 − 10.4 × 15.2 ≈ 146
回帰式:所得 = 146 + 10.4 × 教育支出
解釈:教育支出を1万円増やすと、 平均所得は約10.4万円増えると推定される(相関であり因果ではない)。

③ 決定係数 R²

R² = 1 − SSres/SStot ≈ 0.62
所得の変動の62%が教育支出で説明できる。 残り38%は他の要因。 単回帰で十分な精度。 さらに精度を上げたいなら重回帰や他の変数を追加検討。

🧮 SSDSE-B-2026 で単回帰:人口 × 一般診療所数

単回帰 $Y = a + bX$ を SSDSE-B-2026 の実データでフルに踏む。 「総人口」を $X$、 「一般診療所数」を $Y$ として、 OLS 解の手計算 → scipy → statsmodels → 残差分析、 と段階的に進める。

📝 データ列について:$X$=総人口(列コード A1101)、 $Y$=一般診療所数(列コード I5102)はいずれも SSDSE-B-2026 に実在する列です。 本ページの係数・図は、 この 2 列の 2023 年・47 都道府県を実際に回帰した実測値。 コードは skiprows=[1] で 1 行目の日本語見出しを除外し、 列コードで参照するので、 そのまま実行すれば再現できます。

このコードでやること:SSDSE-B-2026 の 47 県データから手計算で $\hat\beta$ と $\hat\alpha$ を求め、 scipy.stats.linregress の結果と一致することを確認する。

📥 入力データ:

SSDSE-B-2026 都道府県 総人口(A1101) 一般診療所数(I5102) R01000 北海道 5,092,000 3,403 R13000 東京都 14,086,000 14,894 R47000 沖縄県 1,468,000 928 ... (全 47 県)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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]
x = df['A1101'].astype(float).values   # 総人口
y = df['I5102'].astype(float).values   # 一般診療所数

# 手計算で OLS
xbar = x.mean()
ybar = y.mean()
beta_hat = ((x - xbar) * (y - ybar)).sum() / ((x - xbar) ** 2).sum()
alpha_hat = ybar - beta_hat * xbar
print(f'手計算: β̂ = {beta_hat:.6f}, α̂ = {alpha_hat:.1f}')

# scipy で照合
r = stats.linregress(x, y)
print(f'scipy : β̂ = {r.slope:.6f}, α̂ = {r.intercept:.1f}')
print(f'R²    = {r.rvalue**2:.4f}, p値 = {r.pvalue:.3e}')
print(f'SE(β̂) = {r.stderr:.6f}')

📤 実行すると次の出力が得られる:

手計算: β̂ = 0.000909, α̂ = -174.4 scipy : β̂ = 0.000909, α̂ = -174.4 R² = 0.9442, p値 = 7.645e-30 SE(β̂) = 0.000033

💬 結果の読み方:傾き $\hat\beta = 0.000909$ → 「人口が 1 万人増えると一般診療所数は約 9.1 施設増える」。 R² = 0.944 で約 94% の分散を説明、 p < 0.001 で有意。 ただし α̂ = -174 は人口 0 で一般診療所数が負、 という外挿は意味を持たない(後述の「外挿の罠」を参照)。

🔍 残差分析:4 つの定番プロット

単回帰の信頼性は「残差 $e_i = y_i - \hat y_i$ が iid 正規」かどうかにかかる。 4 つのプロットで仮定を検査する。

数式を言葉で読み解くと、 残差は「実測 - 予測」、 標準化残差は $r_i = e_i / \hat\sigma\sqrt{1 - h_{ii}}$、 $h_{ii}$ は leverage(観測 $i$ が回帰直線をどれだけ引っ張るか)。

プロット縦軸 vs 横軸期待される姿悪い姿
残差 vs 予測値$e_i$ vs $\hat y_i$水平な雲U字/喇叭
QQ プロット$r_i$ vs 正規分位点直線S 字・端の逸脱
Scale-Location$\sqrt{|r_i|}$ vs $\hat y_i$水平な雲右上がり(不均一分散)
Cook's Distance$D_i$ vs index全 < 4/n突出した点

このコードでやること:SSDSE-B-2026 の単回帰について残差の正規性 (Shapiro-Wilk)、 不均一分散 (Breusch-Pagan)、 Cook 距離を計算する。

📥 入力データ: 上と同じ SSDSE-B-2026 の総人口・一般診療所数。

 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
import numpy as np
import statsmodels.api as sm
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]
x = df['A1101'].astype(float).values   # 総人口
y = df['I5102'].astype(float).values   # 一般診療所数
X = sm.add_constant(x)
res = sm.OLS(y, X).fit()

resid = res.resid
# 正規性 (Shapiro-Wilk)
W, p_sw = stats.shapiro(resid)
print(f'Shapiro-Wilk W = {W:.4f}, p = {p_sw:.4e}')

# 不均一分散 (Breusch-Pagan)
from statsmodels.stats.diagnostic import het_breuschpagan
bp = het_breuschpagan(resid, X)
print(f'Breusch-Pagan LM = {bp[0]:.4f}, p = {bp[1]:.4e}')

# Cook's Distance
influence = res.get_influence()
cooks = influence.cooks_distance[0]
print(f'Cook D > 4/n の県数 = {(cooks > 4/len(x)).sum()}')
print(f'最大 D = {cooks.max():.3f} (都道府県 index = {cooks.argmax()})')

📤 実行すると次の出力が得られる:

Shapiro-Wilk W = 0.7851, p = 7.470e-07 Breusch-Pagan LM = 32.83, p = 1.005e-08 Cook D > 4/n の県数 = 6 最大 D = 6.629 (都道府県 index = 12) ← 東京都

💬 結果の読み方:Shapiro p < 0.001 で正規性棄却、 Breusch-Pagan p < 0.001 で等分散性棄却。 Cook D 6.6 の東京都が回帰直線を強く引っ張っている。 対数変換(後述)か東京除外で再分析が必要。

🧮 数式に値を入れて手で計算する: 単回帰の係数と予測

合成データで β, α と x=6 の予測を計算する。

Step 1: データ

x = [2,4,7,5,3], y = [3,7,12,9,4] x̄=4.2, ȳ=7.0 Sxy=28, Sxx=14.8

Step 2: 係数と予測

β = 28/14.8 = 1.892 α = 7 - 1.892·4.2 = -0.946 ŷ(6) = -0.946 + 1.892·6 = 10.405

🐍 Python で再現

1
2
3
4
5
6
import numpy as np
x = np.array([2,4,7,5,3])
y = np.array([3,7,12,9,4])
b, a = np.polyfit(x, y, 1)
print(f"β={b:.3f}, α={a:.3f}")
print(f"ŷ(6)={a + b*6:.3f}")

📤 実行結果

β=1.892, α=-0.946 ŷ(6)=10.405

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python での単回帰

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from scipy import stats
slope, intercept, r, p, se = stats.linregress(x, y)
print(f'傾き: {slope:.3f}, 切片: {intercept:.3f}')
print(f'R²: {r**2:.3f}, p: {p:.4f}')

# statsmodels で詳細
import statsmodels.api as sm
X = sm.add_constant(x)
model = sm.OLS(y, X).fit()
print(model.summary())
print(f'※ n={len(y)} と少ないため、Omnibus / Prob(Omnibus) は nan と表示される'
      '(statsmodels は n>=8 でないと正規性検定を計算しない)。')
📤 実行例(実測) 傾き: 1.892, 切片: -0.946 R²: 0.981, p: 0.0011 OLS Regression Results ============================================================================== Dep. Variable: y R-squared: 0.981 Model: OLS Adj. R-squared: 0.975 Method: Least Squares F-statistic: 154.7 Date: Sun, 16 Aug 2026 Prob (F-statistic): 0.00112 Time: 18:46:37 Log-Likelihood: -3.1378 No. Observations: 5 AIC: 10.28 Df Residuals: …(以下略)

予測区間と信頼区間

predictions = model.get_prediction(X) summary = predictions.summary_frame(alpha=0.05) # mean_ci_lower, mean_ci_upper(平均の信頼区間) # obs_ci_lower, obs_ci_upper(個別予測の予測区間)

🚀 重回帰への拡張

説明変数を増やせば重回帰に:y = β₀ + β₁x₁ + β₂x₂ + ... + βₚxₚ + ε

各係数は「他の変数を一定にしたときの x_j 1単位増の影響」と解釈。 これが偏回帰係数の意味。

🚧 落とし穴と注意点

🐍 Python 実装バリエーション — scikit-learn / statsmodels / scipy / numpy

① scikit-learn(機械学習パイプライン向け)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) I5102(一般診療所数) 北海道 5,092,000 3,403 東京都 14,086,000 14,894 沖縄県 1,468,000 928 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
X = df[['総人口']]  # 単変量でも2次元
y = df['一般診療所数']
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)

model = LinearRegression().fit(X_tr, y_tr)
print(f'切片={model.intercept_:.2f}, 傾き={model.coef_[0]:.3f}')
print(f'訓練R²={model.score(X_tr, y_tr):.3f}, テストR²={model.score(X_te, y_te):.3f}')
📤 実行例(実測) 切片=-114.78, 傾き=0.001 訓練R²=0.942, テストR²=0.945

② statsmodels(推測統計、 詳細サマリ)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) I5102(一般診療所数) 北海道 5,092,000 3,403 東京都 14,086,000 14,894 沖縄県 1,468,000 928 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import statsmodels.api as sm
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
X = sm.add_constant(df['総人口'])  # 切片用の定数列
y = df['一般診療所数']

result = sm.OLS(y, X).fit()
print(result.summary())
# 係数、 標準誤差、 t値、 p値、 95%CI、 R²、 F検定 など一括
print('予測区間:', result.get_prediction(X).summary_frame(alpha=0.05).head())
📤 実行例(実測) OLS Regression Results ============================================================================== Dep. Variable: 一般診療所数 R-squared: 0.943 Model: OLS Adj. R-squared: 0.943 Method: Least Squares F-statistic: 9382. Date: Sun, 16 Aug 2026 Prob (F-statistic): 0.00 Time: 18:46:38 Log-Likelihood: -4378.4 No. Observations: 564 AIC: 8761. Df Residuals: 562 BIC: …(以下略)

③ scipy.stats.linregress(最もシンプル)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) I5102(一般診療所数) 北海道 5,092,000 3,403 東京都 14,086,000 14,894 沖縄県 1,468,000 928 …(全 47 行)
1
2
3
4
5
6
7
8
9
from scipy.stats import linregress
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
res = linregress(df['総人口'], df['一般診療所数'])
print(f'傾き={res.slope:.3f} (SE={res.stderr:.3f})')
print(f'切片={res.intercept:.2f}')
print(f'r={res.rvalue:.3f}, R²={res.rvalue**2:.3f}')
print(f'p値={res.pvalue:.4f}')
📤 実行例(実測) 傾き=0.001 (SE=0.000) 切片=-118.06 r=0.971, R²=0.943 p値=0.0000

④ numpy(行列演算で実装)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) I5102(一般診療所数) 北海道 5,092,000 3,403 東京都 14,086,000 14,894 沖縄県 1,468,000 928 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import numpy as np
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
x = df['総人口'].to_numpy()
y = df['一般診療所数'].to_numpy()

# 正規方程式
X = np.column_stack([np.ones_like(x), x])
beta = np.linalg.lstsq(X, y, rcond=None)[0]
print('β =', beta)  # [切片, 傾き]

# numpy.polyfit でも同じ
beta2 = np.polyfit(x, y, 1)
print('polyfit:', beta2)
📤 実行例(実測) β = [-1.18056291e+02 8.52309700e-04] polyfit: [ 8.52309700e-04 -1.18056291e+02]

⑤ ロバスト回帰(外れ値耐性)

1
2
3
4
5
6
from sklearn.linear_model import HuberRegressor, RANSACRegressor

huber = HuberRegressor().fit(X_tr, y_tr)
ransac = RANSACRegressor(random_state=0).fit(X_tr, y_tr)
print('Huber slope:', huber.coef_[0])
print('RANSAC slope:', ransac.estimator_.coef_[0])
📤 実行例(実測) Huber slope: 0.0007761537476795998 RANSAC slope: 0.0007045398237464341

⑥ 可視化(散布図 + 回帰直線 + 信頼区間)

1
2
3
4
5
6
7
import seaborn as sns
import matplotlib.pyplot as plt

sns.regplot(data=df, x='総人口', y='一般診療所数', ci=95,
            scatter_kws={'alpha':0.6}, line_kws={'color':'red'})
plt.title(f'単回帰:一般診療所数 = β₀ + β₁ × 総人口')
plt.show()

⚠️ 単回帰の落とし穴 — 拡張版(実務で本当に困る5+件)

  1. 因果関係と相関関係の混同:「教育支出を増やすと所得が増える」と単純に解釈すると 因果推論の誤り を犯す。 逆因果(所得が高いから教育に投資できる)、 共通の原因(親の学歴)、 同時性などの可能性を考慮する必要がある。 観察データで因果を主張するには操作変数法、 RCT、 自然実験などが必要。 単回帰の係数は相関の方向性を示すに過ぎない。
  2. 外れ値による傾きの劇的な変化:1点の外れ値で傾きが大きく変わる。 特に「てこ比(leverage)」の高い点(x が極端な点)は影響大。 Cook距離が0.5を超える点は要チェック。 ロバスト回帰(Huber、 RANSAC)の使用、 外れ値の除外と感度分析を行う。 「東京都を含めるか除外するか」で結論が変わる典型例。
  3. 線形仮定の盲信:本当の関係が U字や対数関数なのに線形を当てはめると、 体系的に外れる。 残差プロットで「パターンがない」ことを必ず確認する。 パターンが見えるなら多項式項追加、 対数変換、 ノンパラメトリック回帰(LOESS等)を検討。 外挿(データ範囲外の予測)は特に危険。
  4. 残差の不均一分散(heteroscedasticity):残差の分散が x によって変わると、 標準誤差が誤って計算される。 Breusch-Pagan 検定、 White検定で確認。 対策はロバスト標準誤差(HC0〜HC3)、 加重最小二乗、 対数変換。 信頼区間や p値の解釈を誤らないため必須。
  5. 残差の自己相関(系列相関):時系列データでは隣接時点の残差が相関しやすい。 Durbin-Watson 統計量が 1.5未満 または 2.5超 で自己相関の疑い。 対策は時間的ラグ項の追加、 ARIMA、 一般化最小二乗(GLS)、 Newey-West 標準誤差。 経済データや株価では特に問題になる。
  6. R² だけで判断する:R² が高い ≠ モデルが良い。 過学習、 真の関係が複雑、 説明変数の選び方など多くの問題が背景にある。 R² と一緒に残差プロット、 QQプロット、 Cook距離、 予測誤差(交差検証)を見るべき。 また R² は決して「説明変数を増やすと下がらない」ので、 比較には自由度調整R² を使う。
  7. 係数の有意性と実質的意味の混同:n が大きいと小さな係数でも有意になる。 「p<0.05」だけでなく、 係数の大きさ(経済的・実質的に意味があるか)と信頼区間を併せて議論する。

🧠 直感をもう一段深める — 「標準化すると傾き=相関係数 r」

単回帰の核心を一言で言えば「1 つの説明変数 x で目的変数 y を 1 本の直線で予測し、 傾き β₁ は『x を 1 単位動かしたときの y の平均変化量』を表す」ことです。 最小二乗法は、 各点の縦方向のズレ(残差)の二乗和を最小にする β₀, β₁ を選びます。 ここでは、 上の各節(TL;DR・数式節)で触れた β₁ = r · s_y/s_x という関係を、 SSDSE-B-2026 の実データで数値的に確かめ、 「傾きと相関係数は同じコインの裏表」であることを腹落ちさせます。

傾き β₁ は「y の単位 / x の単位」を持つので、 単位を変えると値が変わります(例: 人口を「人」で測るか「万人」で測るかで β₁ は 1 万倍違う)。 一方、 x と y を標準化(z 得点化: 平均 0・標準偏差 1)してから回帰すると、 s_x = s_y = 1 になるため β₁ = r ちょうどになります。 これを標準化偏回帰係数と呼び、 単位に依存しない「効果の大きさ」の比較に使えます。

📥 入力データ: SSDSE-B-2026 の 2023 年・47 都道府県、 総人口(A1101)と一般診療所数(I5102)。 「🧮 実値計算例」節と同じ 2 列を使い、 生の傾き・相関係数・標準化した傾きの 3 つを並べて確認します。

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] x = df['A1101'].astype(float).values # 総人口 y = df['I5102'].astype(float).values # 一般診療所数 s = stats.linregress(x, y) # 生スケール zx = (x - x.mean()) / x.std(ddof=1) # x を標準化 zy = (y - y.mean()) / y.std(ddof=1) # y を標準化 sz = stats.linregress(zx, zy) # 標準化後 print(f'生の傾き β1 = {s.slope:.6g}') print(f'相関係数 r = {s.rvalue:.4f}, R² = {s.rvalue**2:.4f}') print(f'標準化した傾き = {sz.slope:.4f} ← r と一致するはず')

📤 実行すると次の出力が得られる:

生の傾き β1 = 0.000909452 相関係数 r = 0.9717, R² = 0.9442 標準化した傾き = 0.9717 ← r と一致

💬 結果の読み方:生の傾き 0.000909(「人口 1 人増で診療所 約 0.0009 施設」=「1 万人増で約 9 施設」)は単位に依存する値ですが、 標準化すると 0.9717 = 相関係数 r と完全一致。 さらに R² = r² = 0.9717² = 0.9442 も、 上の「🧮 実値計算例」節の R² と一致します。 つまり単回帰では「傾き・相関・決定係数」は同じ関係を別の角度から見た 3 つの表現に過ぎません。 関係の強さだけ伝えたいなら 相関係数単位を持つ予測式が欲しいなら単回帰、 と使い分けます。

🕳️ 最重要の落とし穴 — 単回帰は交絡を統制しない(実測で係数が符号反転)

単回帰の一番危険な性質は「説明変数が 1 つしかないので、 背後の第 3 の要因(交絡)を一切コントロールできない」ことです。 その結果、 単回帰で見えた傾きの符号すら、 交絡変数を加えると逆転することがあります。 これは架空の話ではなく、 SSDSE-B-2026 の実データでそのまま再現できます。

問い:「高齢者が多い県ほど一般診療所は多い?」 目的変数 y = 一般診療所数(I5102)、 説明変数 x = 65 歳以上人口(A1303)で単回帰してみます。 ところが「県の総人口(A1101)」が交絡です — 人口が多い県は高齢者も診療所も多いのは当たり前だからです。

📥 入力データ: SSDSE-B-2026 の 2023 年・47 都道府県。 I5102(一般診療所数)、 A1303(65 歳以上人口)、 A1101(総人口)。 いずれも SSDSE-B-2026 に実在する列です。

import pandas as pd, numpy as np import statsmodels.api as sm 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] y = df['I5102'].astype(float).values # 一般診療所数 x_old = df['A1303'].astype(float).values # 65歳以上人口 x_tot = df['A1101'].astype(float).values # 総人口(交絡) # ① 単回帰: 診療所数 ~ 高齢者数 s = stats.linregress(x_old, y) print(f'単回帰 β(65歳以上) = {s.slope:+.6f}, R² = {s.rvalue**2:.4f}') # ② 重回帰: 総人口で統制 X = sm.add_constant(np.column_stack([x_old, x_tot])) res = sm.OLS(y, X).fit() print(f'重回帰 β(65歳以上) = {res.params[1]:+.6f} (総人口を統制)') print(f' β(総人口) = {res.params[2]:+.6f}, R² = {res.rsquared:.4f}') print(f'corr(65歳以上, 総人口) = {np.corrcoef(x_old, x_tot)[0,1]:.4f}')

📤 実行すると次の出力が得られる:

単回帰 β(65歳以上) = +0.003574, R² = 0.8968 重回帰 β(65歳以上) = -0.003351 (総人口を統制) β(総人口) = +0.001733, R² = 0.9584 corr(65歳以上, 総人口) = 0.9910
モデル65 歳以上人口の係数符号の意味
単回帰(x = 高齢者数のみ)+0.003574高齢者が多い県ほど診療所も多い(見かけ)
重回帰(+総人口を統制)−0.003351同じ人口規模なら、 高齢化が進んだ県ほど診療所は少ない

💬 結果の読み方:単回帰では係数が プラス(高齢者が多い=診療所が多い)に見えます。 ところが交絡である「総人口」を加えて統制すると、 65 歳以上人口の係数は マイナスに反転します。 解釈は「総人口が同じ 2 県を比べると、 高齢化率が高い(=地方・過疎寄りの)県のほうが一般診療所は少ない」。 単回帰のプラスは、 高齢者数と診療所数がともに「総人口の大きさ」に引っ張られていただけの見かけの関係だったわけです。 これが「単回帰は交絡を統制しない」の生々しい実例で、 交絡を無視した単回帰の係数を因果的に読むと結論が真逆になり得ます。

⚠️ ただし逆向きの注意も:この 2 変数は corr = 0.991 とほぼ完全な共線関係です。 多重共線性が極端だと各係数の標準誤差が膨らみ、 個々の係数(この例の −0.003351 など)は不安定になります。 「単回帰だと交絡で偏る/重回帰でも強共線だと分散が暴れる」という両刃を理解し、 係数の点推定だけでなく信頼区間・VIF を必ず併記するのが実務です。

この落とし穴グループの要点

📈 発展 — 導出・R²=r²・区間・平均への回帰

① 最小二乗解の導出(なぜ β₁ = Cov(x,y)/Var(x) か)

残差二乗和 $S(\beta_0,\beta_1)=\sum_i (y_i-\beta_0-\beta_1 x_i)^2$ を最小にする点では、 各偏微分がゼロになります(正規方程式):

$$ \frac{\partial S}{\partial \beta_0}=-2\sum_i(y_i-\beta_0-\beta_1 x_i)=0,\qquad \frac{\partial S}{\partial \beta_1}=-2\sum_i x_i(y_i-\beta_0-\beta_1 x_i)=0 $$

第 1 式から $\beta_0=\bar y-\beta_1\bar x$(直線は重心 $(\bar x,\bar y)$ を通る)。 これを第 2 式へ代入して整理すると、 傾きの解析解が出ます:

$$ \hat\beta_1=\frac{\sum_i(x_i-\bar x)(y_i-\bar y)}{\sum_i(x_i-\bar x)^2}=\frac{S_{xy}}{S_{xx}}=\frac{\text{Cov}(x,y)}{\text{Var}(x)} $$

$S$ は $\beta$ について凸(二次形式)なので、 この停留点が唯一の最小値です。 一般の説明変数個数への拡張(正規方程式 $X^\top X\hat\beta=X^\top y$)は 最小二乗法(OLS)、 分子・分母の意味は 共分散分散の項へ。

② なぜ単回帰では R² = r² なのか

決定係数は $R^2=\dfrac{SSR}{SST}=1-\dfrac{SSE}{SST}$。 予測値 $\hat y_i=\bar y+\hat\beta_1(x_i-\bar x)$ を使うと、 説明された変動は $SSR=\sum(\hat y_i-\bar y)^2=\hat\beta_1^2\,S_{xx}$。 ここへ $\hat\beta_1=S_{xy}/S_{xx}$ を入れると $SSR=S_{xy}^2/S_{xx}$。 よって

$$ R^2=\frac{SSR}{SST}=\frac{S_{xy}^2/S_{xx}}{S_{yy}}=\left(\frac{S_{xy}}{\sqrt{S_{xx}S_{yy}}}\right)^2=r^2 $$

つまり単回帰に限り「決定係数=相関係数の二乗」がきれいに成立します(上の実測でも R²=0.9442=0.9717²)。 重回帰では説明変数が増えると R² は必ず上がってしまうため、 モデル比較には自由度で罰則を入れた自由度調整 R²を使います(決定係数の項も参照)。

③ 信頼区間 vs 予測区間(要点の再掲)

$x_0$ での予測 $\hat y_0$ の区間は 2 種類あり、 「平均の不確かさ」を測る信頼区間 (CI) より、 「次の 1 個体」を測る予測区間 (PI) のほうが $+1$ の分だけ広くなります(詳細な式・SSDSE の数値例はこの頁の「📊 信頼区間 vs 予測区間」節を参照)。 いずれも $x_0$ が $\bar x$ から離れるほど広がるため、 外挿での予測は急速に信頼できなくなります。 区間推定の一般論は 信頼区間 / 区間推定へ。

④ 平均への回帰(regression to the mean)— 「回帰」の語源

Galton が「regression」と名付けた元の現象がこれです。 標準化した単回帰は $\hat z_y=r\,z_x$ で、 $|r|<1$ なので予測値は必ず平均の側へ縮む。 「今年 x が飛び抜けて高かった対象は、 来年 y は(平均へ戻って)やや低くなりやすい」という統計的必然で、 因果でも実力低下でもありません。 例:極端に成績の良かった生徒は次回やや平均寄りになる、 事故多発地点に対策を打つと(対策と無関係に)翌年は減りやすい。 これを「対策が効いた」と誤読するのが典型的な罠です。 単回帰の傾きが $s_y/s_x$ ではなく $r\cdot s_y/s_x$ である($r$ の分だけ縮む)ことが、 この現象の数式的な正体です。

⑤ 頑健回帰への逃げ道

最小二乗は残差を二乗するため外れ値に弱い。 少数の異常点に結論を左右されたくないときは、 残差を二乗でなく絶対値寄りに扱う Huber 回帰や、 インライアだけで当てはめる RANSAC などのロバスト回帰を使い、 OLS の傾きと比較して感度を確認します(この頁「⑤ ロバスト回帰」のコード参照)。 まず単回帰で 1 変数ずつ関係を見てから重回帰へ進むと、 交絡・共線性・外れ値の罠を切り分けやすくなります。

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

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

📍 体系階層のパス

🌐 統計・データサイエンス関連・回帰回帰単回帰

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

中心に 単回帰分析 を置き、 そこから 最小二乗法・重回帰・相関係数・散布図・共分散・R² など 計 13 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語あとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

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

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

大きな円が小さな円を包含する Circle Packing 図。 「単回帰分析」は緑色でハイライト

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

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

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

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

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

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 単回帰隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス回帰 → 単回帰 という入れ子の位置を示します。 「回帰には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

🔗 隣接手法への橋渡し

「単回帰」は 1 つの説明変数と 1 つの目的変数の線形関係を推定する最小単位 であり、 上流の散布図・相関係数からの自然な発展として、 下流の重回帰・一般化線形モデル・機械学習回帰モデルへ展開する出発点となる。

⬆️ 上流: データの関係性確認

⬌ 並列: 変数を増やす拡張

⬇️ 下流: 診断と予測

単回帰は y = a + bx + ε の最もシンプルな形で、 散布図 → 相関係数 → 単回帰 → 残差診断 → 重回帰 / 正則化 という流れの起点にあたる入門モデル。

🌳 手法選択フロー

単回帰を使うか、 重回帰や他のモデルへ進むかは、 説明変数の数・線形性・データ規模で決まる。

典型シナリオ別の手法選択

シナリオ重視する観点候補手法
説明変数が 1 つ・線形関係が見える解釈性最優先、 教育目的単回帰 y = a + bx + ε
説明変数が 2 つ以上交絡の調整・多重共線性に注意重回帰
関係が曲線的非線形を線形モデルで近似多項式回帰 / 対数変換
外れ値の影響を抑えたい頑健性頑健回帰 / 中央値回帰
変数選択を自動化したい正則化Lasso (L1) / Ridge (L2)
非線形性が強い・複雑予測精度最優先ランダムフォレスト / XGBoost

選んだ後の検証ステップ

  1. 散布図確認: 線形でなければ単回帰の前提を満たさない
  2. 残差分析: 残差プロットでパターンや漏斗形が見えれば前提逸脱
  3. R² と RMSE: 当てはまりの良さと予測誤差を両方確認
  4. 外れ値の影響: Cook 距離・てこ比で影響力ある点を特定
  5. 外挿の禁止: 学習データ範囲外の x で予測しない