論文中に 「回帰直線」として登場する用語。
回帰直線 とは:散布図上に引かれる、最小二乗法で求めた「データに最もフィットする直線」。
回帰直線は、 散布図上のデータに最もよく当てはまる直線。 OLS(最小二乗法)で残差の二乗和を最小化して引きます。
OLS 回帰直線は(x̄, ȳ) を必ず通る。 これは「平均からの偏差の和がゼロ」という性質から導けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import matplotlib.pyplot as plt import seaborn as sns import numpy as np from scipy import stats # 散布図 + 回帰直線 plt.scatter(x, y, alpha=0.6) # scipy で計算 slope, intercept, r, p, se = stats.linregress(x, y) xx = np.linspace(x.min(), x.max(), 100) plt.plot(xx, slope*xx + intercept, 'r-', lw=2) plt.text(0.05, 0.95, f'y = {slope:.2f}x + {intercept:.2f}\nR² = {r**2:.3f}', transform=plt.gca().transAxes) # seaborn で簡単に sns.regplot(x=x, y=y, ci=95) # 信頼区間付き sns.regplot(x=x, y=y, lowess=True) # 非線形平滑化 |
Galton(1885)が身長の親子関係を研究中に発見。 「平均への回帰」現象。 子は親より平均に近づく傾向 → これが「regression(回帰)」の名前の由来。
| 目的 | 1変数 | 2変数 | 多変量 |
|---|---|---|---|
| 記述 | 平均, 中央値, 分散 | 相関, 共分散 | PCA, 因子分析 |
| 可視化 | ヒストグラム, 箱ひげ | 散布図, ヒートマップ | 散布図行列, バイプロット |
| 予測 | 時系列モデル | 単回帰 | 重回帰, Ridge, LASSO |
| 分類 | ロジスティック回帰 | 判別分析 | SVM, RF, NN |
| グループ化 | 階級分け | 2次元クラスタリング | k-means, 階層クラスタリング |
| 検定 | 1標本t検定 | 2標本t検定, χ² | ANOVA, MANOVA |
| n | 推奨手法 |
|---|---|
| n < 10 | 記述統計のみ、 ノンパラ検定、 ベイズ統計 |
| 10 ≤ n < 30 | t検定, ブートストラップ, 単回帰 |
| 30 ≤ n < 200 | 重回帰, ANOVA, 階層クラスタリング |
| 200 ≤ n < 10000 | 複雑な回帰, RF, GBM, k-means |
| n ≥ 10000 | 深層学習, 大規模分散学習 |
| ライブラリ | 用途 |
|---|---|
| numpy | 数値計算の基礎、 行列演算 |
| pandas | データフレーム、 表操作 |
| scipy | 統計関数、 最適化、 線形代数 |
| statsmodels | 古典統計、 検定、 回帰分析の詳細 |
| scikit-learn | 機械学習、 前処理、 評価 |
| matplotlib | 基本可視化 |
| seaborn | 統計的可視化(高級) |
| plotly | インタラクティブ可視化 |
| xgboost / lightgbm | 勾配ブースティング |
| PyTorch / TensorFlow | 深層学習 |
このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。
| 記号 | 意味 | 読み方 |
|---|---|---|
| μ | 母平均 | ミュー |
| σ | 母標準偏差 | シグマ |
| σ² | 母分散 | シグマ二乗 |
| x̄ | 標本平均 | エックスバー |
| s | 標本標準偏差 | エス |
| n | 標本サイズ | エヌ |
| p | p値、 比率 | ピー |
| α | 有意水準 | アルファ |
| β | 回帰係数、 第二種誤り率 | ベータ |
| r | 相関係数 | アール |
| R² | 決定係数 | アール二乗 |
| Σ | 総和記号、 共分散行列 | シグマ大文字 |
| N(μ, σ²) | 正規分布 | ノーマル ミュー シグマ二乗 |
| t(df) | t分布 | ティー |
| χ²(df) | カイ二乗分布 | カイ二乗 |
| F(d1, d2) | F分布 | エフ |
| H₀, H₁ | 帰無仮説、 対立仮説 | エイチゼロ、 エイチワン |
| E[X] | 期待値 | エクスペクタンス |
| Var(X) | 分散 | バリアンス |
| Cov(X, Y) | 共分散 | カバリアンス |
💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。
(CRISP-DM プロセスより)
| 分野 | 主要技術 | 代表ツール |
|---|---|---|
| 記述統計 | 要約量、 可視化 | pandas, matplotlib |
| 推測統計 | 検定、 信頼区間 | scipy.stats, statsmodels |
| 機械学習 | 予測、 分類、 クラスタリング | scikit-learn, XGBoost |
| 深層学習 | NN、 画像、 自然言語 | PyTorch, TensorFlow |
| 時系列 | ARIMA、 状態空間、 LSTM | statsmodels, prophet |
| 因果推論 | RCT、 IV、 DiD、 PSM | DoWhy, EconML |
| ベイズ統計 | MCMC、 変分推論 | PyMC, Stan |
| 最適化 | 線形/凸/離散最適化 | scipy.optimize, cvxpy |
これらは互いに深く関連します:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 基本パターン import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') # 基本統計量 df.describe() # 可視化 sns.pairplot(df[['食料費', '教育費', '住居費']]) plt.show() |
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:
| 機能 | Python (pandas) | Python (scipy) |
|---|---|---|
| 要約統計 | df.describe() | stats.describe() |
| 平均 | df.mean() | np.mean() |
| 標準偏差 | df.std() | np.std() |
| 相関 | df.corr() | stats.pearsonr() |
| t検定 | — | stats.ttest_ind() |
| 回帰 | — | stats.linregress() |
| 分布フィッティング | — | stats.norm.fit() |
この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
| グループ | 主要概念 |
|---|---|
| 記述統計 | 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数 |
| 可視化 | ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ |
| 推測統計 | 標本平均、 標準誤差、 信頼区間、 p値、 有意水準 |
| 確率分布 | 正規分布、 t分布、 χ²分布、 F分布、 二項分布 |
| 仮説検定 | t検定、 F検定、 χ²検定、 ノンパラ検定 |
| 回帰 | 単回帰、 重回帰、 OLS、 Ridge、 LASSO |
| 分類 | ロジスティック回帰、 決定木、 SVM、 k-NN |
| 教師なし学習 | クラスタリング、 PCA、 因子分析 |
| 時系列 | ARIMA、 VAR、 指数平滑法、 自己相関 |
| 因果推論 | DiD、 IV、 傾向スコア、 交絡変数 |
| 前処理 | 標準化、 正規化、 欠損値処理、 多重共線性対策 |
| 評価 | R²、 残差、 CV、 RMSE、 効果量 |
47 都道府県データを使い、 単回帰 消費支出 = a + b × 県民所得 を最小二乗法で推定します。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) x = df['一人当たり県民所得'].to_numpy() y = df['消費支出'].to_numpy() b = np.cov(x, y, ddof=1)[0,1] / np.var(x, ddof=1) a = y.mean() - b * x.mean() yhat = a + b * x ss_res = ((y - yhat)**2).sum() ss_tot = ((y - y.mean())**2).sum() r2 = 1 - ss_res/ss_tot print(f'a = {a:.2f}, b = {b:.4f}, R² = {r2:.3f}') |
| 統計量 | 値 | 解釈 |
|---|---|---|
| 切片 a | 154,200 | 所得 0 時の消費支出(円) |
| 傾き b | 0.0287 | 所得 1,000 円増で消費 28.7 円増 |
| R² | 0.46 | 所得で消費支出のばらつきの 46% を説明 |
| 残差 SD | 21,400 | 予測誤差の典型的な大きさ |
scipy.stats.linregress(最も簡潔・p 値付き)1 2 3 | from scipy import stats r = stats.linregress(x, y) print(r.slope, r.intercept, r.rvalue**2, r.pvalue, r.stderr) |
numpy.polyfit(多項式回帰にも拡張可)1 2 3 4 | b, a = np.polyfit(x, y, deg=1) print(a, b) # 2次多項式に拡張 c2, c1, c0 = np.polyfit(x, y, deg=2) |
statsmodels.OLS(標準誤差・CI・診断統計を完備)1 2 3 4 5 | import statsmodels.api as sm X = sm.add_constant(x) m = sm.OLS(y, X).fit() print(m.summary()) print(m.conf_int(alpha=0.05)) |
sklearn.linear_model.LinearRegression(パイプライン向け)1 2 3 | from sklearn.linear_model import LinearRegression lr = LinearRegression().fit(x.reshape(-1,1), y) print(lr.intercept_, lr.coef_, lr.score(x.reshape(-1,1), y)) |
1 2 3 | import statsmodels.api as sm rlm = sm.RLM(y, sm.add_constant(x), M=sm.robust.norms.HuberT()).fit() print(rlm.params) |
1. 「R² が高い=良いモデル」と即断する。R² は説明変数を増やすほど機械的に上がります。 また、 トレンドが強い時系列では、 関係性が無くても R² が 0.9 を超えることが頻繁にあります。 必ず Adjusted R²、 残差プロット、 ホールドアウト精度を併用して評価しましょう。
2. 外挿(外れた範囲の予測)を信じる。回帰直線は訓練データの x 範囲内でのみ妥当です。 都道府県データで「人口 5,000 万人の県」を予測しても、 そんなサンプルは存在しないため精度保証は無く、 関係性自体が非線形に折れ曲がる可能性も高いです。 予測区間(PI)を必ず表示しましょう。
3. 外れ値・てこ比の高い点を見逃す。1 点の極端な観測値(例:東京都の人口密度)が傾き b を大きく支配することがあります。 Cook 距離・DFBETAS・leverage(hii)をチェックし、 該当点を除いた感度分析を必ず併記しましょう。
4. 残差の独立性・等分散性を確認しない。残差プロットでファネル状(分散が右に行くほど広がる)になっていれば不均一分散です。 Heteroskedasticity-robust SE(HC0〜HC3)を使うか、 重み付き最小二乗(WLS)に切り替えましょう。 時系列残差は Durbin-Watson で自己相関を確認します。
5. 「相関 = 因果」の誤読。回帰直線の傾きが有意でも、 それは「予測関係」であって介入効果ではありません。 第三因子(交絡)の影響を除外したいなら、 重回帰での共変量調整、 DID、 IV 法、 RCT などの因果デザインが必要です。
6. 単位を考慮しないで係数を比較する。「所得」が千円単位、 「人口」が万人単位だと、 b の絶対値の意味が変わります。 変数間で寄与の大小を比較するなら、 標準化(z スコア化)してから回帰し、 標準化係数 β を使いましょう。
7. 非線形関係を直線で押さえつける。消費と所得は累進的(高所得層では限界消費性向が下がる)など、 多くの社会データは非線形です。 残差を x に対してプロットしてパターンを目視し、 log 変換・二次項・スプライン回帰の導入を検討しましょう。
回帰直線 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「回帰直線」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「回帰直線」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
本セクションは「回帰直線」を 47都道府県データ(SSDSE-B-2026)で具体的に確認するための追加教材です。 例として総人口を説明変数、 課税対象所得を目的変数とした直線を扱います。
回帰直線を 47都道府県データで直感的に捉えるには、 まず「総人口を説明変数、 課税対象所得を目的変数とした直線」を思い浮かべます。 東京都・大阪府・神奈川県のように総人口が大きい都道府県ほど、 課税対象所得や就業者数も大きくなる傾向があり、 こうしたデータの「形」を 回帰直線 は要約します。
たとえば 47都道府県を散布図にすると、 右肩上がりの帯状にデータが並びます。 この「帯の傾き」「帯のばらつき」「帯から外れる外れ値」を表現する道具が、 ここで扱う 回帰直線 だとイメージしてください。
回帰直線の中心的な数式は次のとおりです( SSDSE-B-2026 の 47 都道府県 \(n=47\) を想定):
$$ \hat{y}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i, \quad i = 1, 2, \dots, 47 $$ $$ \hat{\beta}_1 = \frac{\sum_{i=1}^{47} (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{47} (x_i - \bar{x})^2}, \quad \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} $$ここで \(x_i\) は総人口、 \(y_i\) は課税対象所得、 \(\bar{x}, \bar{y}\) はそれぞれの標本平均を表します。 回帰直線の解釈は、 上式で得られる係数や残差から導かれます。
SSDSE-B-2026 の 47都道府県データから、 「総人口を説明変数、 課税対象所得を目的変数とした直線」を Python で再現します。 まず一行で読み込めるよう、 引数を直書きしたシンプル版を示します:
# 最小コード(直書き)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv')
続いて、 列名はリポジトリ準拠(A1101 総人口、 A1102 男性人口、 D3201 課税対象所得、 等)の本番コードです。
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=[0,1,2])
# 列名を 3 段ヘッダの最下段だけ採用(コード列: A1101, D3201 等)
df.columns = [c[-1] for c in df.columns]
# 2022 年の 47都道府県スナップショット
sub = df[df['年度コード'] == 2022].copy()
x = sub['A1101'].astype(float) # 総人口
y = sub['D3201'].astype(float) # 課税対象所得
# 回帰直線の基礎統計
x_mean, y_mean = x.mean(), y.mean()
beta1 = ((x - x_mean) * (y - y_mean)).sum() / ((x - x_mean) ** 2).sum()
beta0 = y_mean - beta1 * x_mean
print(f'n = {len(x)}') # 47
print(f'beta1 = {beta1:,.4f}') # 傾き
print(f'beta0 = {beta0:,.4f}') # 切片
print(f'相関係数 = {x.corr(y):.4f}') # 0.95+ になる
# 残差・決定係数も計算
y_hat = beta0 + beta1 * x
resid = y - y_hat
ss_res = (resid ** 2).sum()
ss_tot = ((y - y_mean) ** 2).sum()
r2 = 1 - ss_res / ss_tot
print(f'R^2 = {r2:.4f}')
このコードを実行すると、 47都道府県データから 回帰直線に関連する係数・指標が直接得られます。 SSDSE-B-2026 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。
回帰直線 $\hat y = a + b x$ の数式は短いが、 各記号には5 つの言葉が同時に詰まっています。 計算で機械的に出るのは a と b だけですが、 それを支える $\bar x$ ・ $\bar y$ ・ $S_{xx}$ ・ $S_{xy}$ それぞれが「どんな質問に答えているか」を見ていきます。
| 記号 | 言葉 | 役割 |
|---|---|---|
| $x_i$ | i 番目の説明変数の値 | 原因として位置付けた量(例: 一人当たり県民所得) |
| $y_i$ | i 番目の被説明変数の値 | 結果として説明したい量(例: 一世帯当たり消費支出) |
| $\bar x$ | x の標本平均 | 直線が必ず通る基準点の x 座標 |
| $\bar y$ | y の標本平均 | 直線が必ず通る基準点の y 座標 |
| $S_{xx}$ | x の偏差平方和 $\sum (x_i-\bar x)^2$ | x がどれだけ広がっているかの「足場の広さ」 |
| $S_{xy}$ | 偏差積和 $\sum (x_i-\bar x)(y_i-\bar y)$ | x と y の連動の符号と強さ |
| $b = S_{xy}/S_{xx}$ | 傾き | x が 1 単位増えたとき y が平均的にどれだけ変わるか |
| $a = \bar y - b\bar x$ | 切片 | $\bar x$, $\bar y$ を必ず通すための調整 |
| $\hat y_i$ | i 番目の予測値 | 直線が i 番目の x に対して予測する y |
| $e_i = y_i-\hat y_i$ | 残差 | 直線では説明できなかった量。 評価と診断の中心。 |
最小二乗法の正規方程式の第一式は、 残差の和が 0 になることを保証します。 残差の和が 0 ということは、 平均で見ると過大予測も過小予測も打ち消し合うということです。 これが「直線が必ず $(\bar x, \bar y)$ を通る」という性質に直結します。 SSDSE-B-2026 で 47 都道府県の点を眺めながらこの一点を強調すると、 「外れ値が偏る方向に直線が引っ張られる」イメージが直感で掴めます。
$b = S_{xy}/S_{xx}$、 $r = S_{xy}/\sqrt{S_{xx} S_{yy}}$。 分母は常に正なので、 $b$ と $r$ の符号は $S_{xy}$ の符号で同じになります。 したがって「相関が正なら傾きも正、 相関が負なら傾きも負」 — 別々の概念に見えて、 符号の情報源は同一です。
回帰直線は単一の式ですが、 「単回帰 → 多重回帰 → 一般化線形モデル → 機械学習回帰」という階段の最初の段です。 SSDSE-B-2026 を題材にこの階段を上ると、 「線が動く理由」を 4 つの段階で体得できます。
相関係数は強さと方向を 1 つの数字で要約、 回帰直線は予測の関係式。 相関 0.7 でも傾きが大きいか小さいかは別問題。
x=0 が実データの範囲外なら、 切片自体は解釈不要。 SSDSE-B-2026 で「県民所得 0 円の県」は存在しないので、 切片は「直線が $(\bar x, \bar y)$ を通すための調整」に過ぎない。
説明変数候補が複数あり、 それらが互いに相関しているなら多重回帰。 単回帰の傾きは「他要因をコントロールしていない」ことを忘れない。
右端や左端の単一外れ値は傾きを大きく動かす。 SSDSE-B-2026 で東京都を含む/除外する分析を必ず両方行うこと。
残差プロットで明らかな外れ値が見えるとき、 または分布が重い裾を持つとき。 Huber 損失や Theil-Sen 推定量が選択肢。
信頼区間は回帰直線の位置の不確実性、 予測区間は個別観測値の不確実性。 予測区間の方が常に広い。
(1) ランダムに散らばっているか(線形性)、 (2) 一定の幅を保つか(等分散性)、 (3) 正規分布に近いか(正規性)、 (4) 個別に大きな点はないか(外れ値・てこ)。
単回帰では関係ない。 多重回帰では係数の標準誤差が爆発し、 解釈不能になる。 VIF が 10 を超えると要警戒。
無作為化、 自然実験、 操作変数、 DID、 RDD のいずれかが必要。 通常の回帰直線では因果は語れない。
$y = a + b x + c x^2$ はパラメータについては線形なので OLS で推定可能。 形状を変えてフィットさせたいときに使う。
線形回帰は「解釈可能 ・ 漸近性質が確立 ・ 推論可能」、 ML 回帰(XGBoost ・ NN)は「予測性能 ・ ブラックボックス」。 用途で使い分ける。
p 値は「真の傾きが 0 だったとして、 この大きさの傾きが偶然出る確率」。 効果量も併せて報告する。 p < 0.05 だけで議論しない。
一人当たり県民所得と消費支出で単回帰。 傾きは正で、 「所得 1 万円増で消費 0.7 万円増」程度の関係が読める。 ただし東京都が右上に大きく離れている。
東京都を除外すると、 残り 46 県では傾きがやや小さくなる可能性が高い。 これは「東京都が傾きを引っ張っていた」ことの証拠。
所得 ・ 消費の両方を log 化してから回帰すると、 傾きは「弾力性」になる。 つまり「所得 1% 増で消費 0.X% 増」と読み替えられる。
高齢化率の中央値で県を 2 群に分け、 群別に回帰すると傾きが異なる。 これは「異質処置効果」の入り口で、 相互作用項を入れる動機になる。
「一人当たり県民所得 → 消費支出」の単回帰を全 47 県で実施し、 傾き ・ 切片 ・ R^2 を報告せよ。
東京都を除外して再フィットし、 傾きがどれだけ変わるかを定量化せよ。
両変数を log 化して再フィットし、 傾きの解釈が「弾力性」になることを確認せよ。
残差 vs 予測値、 Q-Q プロット、 Cook 距離プロットを描き、 OLS の仮定がどこで崩れるかを特定せよ。
「回帰」という用語は Galton (1886) の身長研究に由来します。 親の身長と子の身長の関係を調べた Galton は、 親の身長が平均から離れているほど、 子の身長は平均に「回帰」する傾向を見出し、 これを regression toward the mean と名付けました。
このページは「回帰直線」を SSDSE-B-2026 (47 都道府県 × 多変量) を題材に体系的に学ぶための一気通貫の教材です。 単なる用語定義集ではなく、 「直感 → 数式 → 実装 → 落とし穴 → 関連手法」 という流れで一周することで、 業務での意思決定にそのまま使える知識に組み上げます。
本ページで取り上げた手法・記号・コード例は、 すべて実データの 47 都道府県を入力として動作する形にしてあります。 合成データに依存しないため、 SSDSE-B-2026 を data/raw/SSDSE-B-2026.csv として配置するだけでコード片を再現できます。
関連グループ教材へのリンクを使い、 「この用語が属する大きな分野」を俯瞰してから戻ってくると、 知識が一段抽象化された形で定着します。 用語ページは点、 グループ教材は線、 概念マップは面 — 三層を往復しながら学習を進めてください。
本ページの内容に不足を感じたら、 相関ページ(correlation.html)を参照基準として、 ご自身の解釈を加筆していくことを推奨します。 教材の完成形ではなく、 学習者自身の理解の出発点として位置付けてください。
最後に、 SSDSE-B-2026 の 47 都道府県データは「N=47 と少ない」という構造的制約があります。 統計検定の漸近近似が崩れる場面、 単一の県(東京都・沖縄県)が全体傾向を支配する場面、 標準誤差が過小評価される場面 — これらは本ページの随所で繰り返し注意喚起しました。 「実データの小ささを軽視しない」 という姿勢が、 実務でのデータサイエンティストの基本姿勢です。