論文中に 「単回帰分析」として登場する用語。
単回帰分析 とは: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変数だけでは交絡因子を制御できません。 多くの社会現象は複数の要因が絡むので、 単回帰だけで因果を語るのは危険。 重回帰へ進むのが筋。
単回帰は最も基本的な回帰モデル。 1つの説明変数 x で目的変数 y を予測する直線を引きます:y = β₀ + β₁ x + ε
食料費(x)から教育費(y)を予測する単回帰。 赤い直線が回帰直線、 オレンジ帯が95%予測区間。
$$ 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̄, ȳ) を通る、 傾き β₁ の直線」。
1 2 3 4 5 6 7 8 9 10 | 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()) |
説明変数を増やせば重回帰に:y = β₀ + β₁x₁ + β₂x₂ + ... + βₚxₚ + ε
各係数は「他の変数を一定にしたときの x_j 1単位増の影響」と解釈。 これが偏回帰係数の意味。
| 目的 | 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 |
これらは互いに深く関連します:
単回帰分析 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 関連・回帰 › 回帰 › 単回帰
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「単回帰分析」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「単回帰分析」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
単回帰分析(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 |
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%は他の要因。 単回帰で十分な精度。 さらに精度を上げたいなら重回帰や他の変数を追加検討。
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-2024.csv', encoding='shift_jis', 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-2024.csv', encoding='shift_jis', 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-2024.csv', encoding='shift_jis', 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-2024.csv', encoding='shift_jis', 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() |