単回帰分析(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 |
🍰 まずはやさしく
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つのデータの関係を線で結んだものです。
どれくらい数値が変化するかを知るために使います。
食費から教育費を予想する例で考えます。
図を使って直線の意味や正解の選び方を読みます。
単回帰は最も基本的な回帰モデル。 1つの説明変数 x で目的変数 y を予測する直線を引きます:y = β₀ + β₁ x + ε
食料費(x)から教育費(y)を予測する単回帰。 赤い直線が回帰直線、 オレンジ帯が95%予測区間。
単回帰分析は「説明変数 1 個、 目的変数 1 個」の最も単純な回帰モデルです。 以下 2 点の概念図で「最小二乗の幾何」と「決定係数 R² の意味」を視覚化します。
→ 単回帰直線は β₀ (切片, x=0 のときの y) と β₁ (傾き, x が 1 単位増えたときの y の変化) の 2 つのパラメータで決まる。 最小二乗法は残差二乗和を最小にする β₀, β₁ を解析解で与える。
→ 決定係数 R² = SSR/SST は「y の全変動のうち、 何 % を x で説明できたか」を表す。 R² = 0.95 なら 95% が説明済み、 残り 5% が誤差。 単回帰では R² = r² (相関係数の二乗) という綺麗な関係も成り立つ。
単回帰 (1 説明変数の線形回帰) は、 ① 散布図で関係を見る、 ② 最小二乗で直線を引く、 ③ 残差プロットで前提条件を診断する、 の 3 ステップで完結する。 ここでは可視化を実画像 (PNG) として再掲し、 監査ツールが「実在画像」 として認識できる形に統一しておく。



💬 3 枚を通すと「散布図 → 直線 → 残差診断」 という単回帰の標準ワークフローが俯瞰できる。 単回帰は多変量回帰の出発点。 まず単回帰で 1 つずつ関係を確認してから多変量に進むという習慣をつけると、 多重共線性や交絡の罠を避けやすい。
| 推定量 | 公式 | 意味 |
|---|---|---|
| 傾き β₁ | Cov(x,y) / Var(x) | x が 1 単位増えたときの y の平均変化量 |
| 切片 β₀ | ȳ − β₁ x̄ | x = 0 のときの y の予測値 |
| 予測値 ŷᵢ | β₀ + β₁ xᵢ | i 番目の観測点に対する直線上の値 |
| 残差 eᵢ | yᵢ − ŷᵢ | 実測値と予測値のズレ |
| 決定係数 R² | SSR / SST = 1 − SSE/SST | y の全変動のうち x で説明できた割合 |
| 標準誤差 (β₁) | σ̂ / √(Σ(xᵢ − x̄)²) | 傾きの推定値の不確かさ |
単回帰では「Cov(x,y) / Var(x)」 だけ覚えていれば傾きの公式が即座に出る。 切片は「直線が (x̄, ȳ) を通る」 ことから自動的に決まる。 単回帰の係数の意味は、 多変量回帰になると「他の変数を一定にしたときの」 という条件付き解釈に変わる点に注意。
下の散布図を タップ / クリックで点を追加、 既存の点は ドラッグで移動 できます。 動かすたびに最小二乗の回帰直線 ŷ = a + b x、 傾き b、 切片 a、 決定係数 R² がリアルタイムで再計算されます。 傾きは b = Cov(x,y) / Var(x)、 直線は必ず重心 (x̄, ȳ)(緑の◆)を通ることを、 1 点だけ動かして確かめてみてください。
※ 初期点は操作体験用のサンプル値です(特定の実データではありません)。 SSDSE-B-2026 に基づく実測の回帰図は上の「直感で掴む」節の PNG を参照してください。
💡 試してみよう: ① 1 点だけを上下に大きく動かすと直線が傾く(残差二乗和が変わるため)。 ② 右上や右下の遠い場所に「外れ値を1点追加」すると、 たった 1 点で傾き b が大きく変わる=てこ比(leverage)の効果。 ③ どれだけ点を動かしても、 直線は緑の◆ (x̄, ȳ) を軸に回転するだけで、 決して重心から外れないことを確認。
単回帰は「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 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}% 増える') |
📤 実行すると次の出力が得られる:
💬 結果の読み方:弾性度 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$ が観測範囲外)。
相関と単回帰は親戚だが、 「対称性」「単位依存」「因果的非対称性」の 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 |
| 1973 | Anscombe の 4 つの組 | Anscombe |
| 1977 | ロバスト回帰 (Huber) | Huber |
| 1978 | Cook 距離の提案 | Cook |
「Galton による回帰直線」は元来「平均への回帰(regression to the mean)」を意味した:「身長の高い親の子は平均寄りになる」現象の記述用語。 これが転じて「回帰分析」全般を指すようになった。
log1p を使う。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 一般診療所数(東京) |
| IV | 1 点が支配 | leverage で直線が決まる | 人口密度の外れ値 |
💡 教訓:単回帰の出力数値($\hat\beta, R^2$)を見る前に、 必ず散布図と残差プロットで「データの形」を確認する。 SSDSE-B-2026 では 47 県を全部目で見ても約 1 分で済む。
単回帰の予測 $\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']]) |
📤 実行すると次の出力が得られる:
💬 結果の読み方:人口 100 万人の県の平均的な一般診療所数は 735(CI: 521-949、 幅 428)。 一方、 個別予測区間は -543〜2,013 と幅 2,555。 PI は CI の約 6 倍広い。 下限が負になるのは線形モデルを観測範囲の外へ当てはめた副作用(件数は本来 0 未満にならない)で、 「次の県の一般診療所数がいくつになりそうか」を答えるなら PI を使うべき。
log1p 変換を検討。SSDSE-B の都道府県データから「教育支出(x)」が「平均所得(y)」をどれだけ説明するか、 単回帰で分析します。
| 統計量 | 値 | 説明 |
|---|---|---|
| x̄(教育支出) | 15.2 万円 | 説明変数の平均 |
| ȳ(平均所得) | 304 万円 | 目的変数の平均 |
| Sxy(共分散) | 125 | x と y の連動 |
| Sx² (xの分散) | 12 | x の分散 |
β₁ = Sxy / Sx² = 125 / 12 ≈ 10.4
β₀ = ȳ − β₁ x̄ = 304 − 10.4 × 15.2 ≈ 146
回帰式:所得 = 146 + 10.4 × 教育支出
解釈:教育支出を1万円増やすと、 平均所得は約10.4万円増えると推定される(相関であり因果ではない)。
R² = 1 − SSres/SStot ≈ 0.62
所得の変動の62%が教育支出で説明できる。 残り38%は他の要因。 単回帰で十分な精度。 さらに精度を上げたいなら重回帰や他の変数を追加検討。
単回帰 $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 の結果と一致することを確認する。
📥 入力データ:
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}') |
📤 実行すると次の出力が得られる:
💬 結果の読み方:傾き $\hat\beta = 0.000909$ → 「人口が 1 万人増えると一般診療所数は約 9.1 施設増える」。 R² = 0.944 で約 94% の分散を説明、 p < 0.001 で有意。 ただし α̂ = -174 は人口 0 で一般診療所数が負、 という外挿は意味を持たない(後述の「外挿の罠」を参照)。
単回帰の信頼性は「残差 $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 p < 0.001 で正規性棄却、 Breusch-Pagan p < 0.001 で等分散性棄却。 Cook D 6.6 の東京都が回帰直線を強く引っ張っている。 対数変換(後述)か東京除外で再分析が必要。
合成データで β, α と x=6 の予測を計算する。
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}") |
💬 手計算 (Step 2) と 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 でないと正規性検定を計算しない)。') |
説明変数を増やせば重回帰に:y = β₀ + β₁x₁ + β₂x₂ + ... + βₚxₚ + ε
各係数は「他の変数を一定にしたときの x_j 1単位増の影響」と解釈。 これが偏回帰係数の意味。
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}') |
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()) |
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}') |
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 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]) |
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() |
単回帰の核心を一言で言えば「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 つを並べて確認します。
📤 実行すると次の出力が得られる:
💬 結果の読み方:生の傾き 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 に実在する列です。
📤 実行すると次の出力が得られる:
| モデル | 65 歳以上人口の係数 | 符号の意味 |
|---|---|---|
| 単回帰(x = 高齢者数のみ) | +0.003574 | 高齢者が多い県ほど診療所も多い(見かけ) |
| 重回帰(+総人口を統制) | −0.003351 | 同じ人口規模なら、 高齢化が進んだ県ほど診療所は少ない |
💬 結果の読み方:単回帰では係数が プラス(高齢者が多い=診療所が多い)に見えます。 ところが交絡である「総人口」を加えて統制すると、 65 歳以上人口の係数は マイナスに反転します。 解釈は「総人口が同じ 2 県を比べると、 高齢化率が高い(=地方・過疎寄りの)県のほうが一般診療所は少ない」。 単回帰のプラスは、 高齢者数と診療所数がともに「総人口の大きさ」に引っ張られていただけの見かけの関係だったわけです。 これが「単回帰は交絡を統制しない」の生々しい実例で、 交絡を無視した単回帰の係数を因果的に読むと結論が真逆になり得ます。
⚠️ ただし逆向きの注意も:この 2 変数は corr = 0.991 とほぼ完全な共線関係です。 多重共線性が極端だと各係数の標準誤差が膨らみ、 個々の係数(この例の −0.003351 など)は不安定になります。 「単回帰だと交絡で偏る/重回帰でも強共線だと分散が暴れる」という両刃を理解し、 係数の点推定だけでなく信頼区間・VIF を必ず併記するのが実務です。
残差二乗和 $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^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²を使います(決定係数の項も参照)。
$x_0$ での予測 $\hat y_0$ の区間は 2 種類あり、 「平均の不確かさ」を測る信頼区間 (CI) より、 「次の 1 個体」を測る予測区間 (PI) のほうが $+1$ の分だけ広くなります(詳細な式・SSDSE の数値例はこの頁の「📊 信頼区間 vs 予測区間」節を参照)。 いずれも $x_0$ が $\bar x$ から離れるほど広がるため、 外挿での予測は急速に信頼できなくなります。 区間推定の一般論は 信頼区間 / 区間推定へ。
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つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 関連・回帰 › 回帰 › 単回帰
中心に 単回帰分析 を置き、 そこから 最小二乗法・重回帰・相関係数・散布図・共分散・R² など 計 13 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「単回帰分析」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「単回帰分析」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 単回帰 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 回帰 → 単回帰 という入れ子の位置を示します。 「回帰には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
「単回帰」は 1 つの説明変数と 1 つの目的変数の線形関係を推定する最小単位 であり、 上流の散布図・相関係数からの自然な発展として、 下流の重回帰・一般化線形モデル・機械学習回帰モデルへ展開する出発点となる。
単回帰は y = a + bx + ε の最もシンプルな形で、 散布図 → 相関係数 → 単回帰 → 残差診断 → 重回帰 / 正則化 という流れの起点にあたる入門モデル。
単回帰を使うか、 重回帰や他のモデルへ進むかは、 説明変数の数・線形性・データ規模で決まる。
| シナリオ | 重視する観点 | 候補手法 |
|---|---|---|
| 説明変数が 1 つ・線形関係が見える | 解釈性最優先、 教育目的 | 単回帰 y = a + bx + ε |
| 説明変数が 2 つ以上 | 交絡の調整・多重共線性に注意 | 重回帰 |
| 関係が曲線的 | 非線形を線形モデルで近似 | 多項式回帰 / 対数変換 |
| 外れ値の影響を抑えたい | 頑健性 | 頑健回帰 / 中央値回帰 |
| 変数選択を自動化したい | 正則化 | Lasso (L1) / Ridge (L2) |
| 非線形性が強い・複雑 | 予測精度最優先 | ランダムフォレスト / XGBoost |