論文中に 「標準化偏回帰係数」として登場する用語。
標準化偏回帰係数 とは:全変数を平均0・分散1に揃えてからの回帰係数。単位の違う変数同士で「影響の大きさ」を比較可能。
標準化偏回帰係数(standardized β)は、 重回帰の「異なる単位の変数を同じ物差しで比較」するための係数です。 論文で「β = +0.929 ***」のように示されます。
計算方法:
あるいは数式変換:通常の偏回帰係数 $\beta_j$ に、$\sigma_{x_j} / \sigma_y$ を掛けても得られます。
解釈:「説明変数 $x_j$ を1標準偏差動かすと、 目的変数 y は何標準偏差動くか」。 単位を打ち消したので、 全変数の影響度を絶対値で比較できます。
例:47都道府県の死亡率モデル
標準化前の生の係数 β(高齢化率) = 0.62(%あたり ‰)、 β(保健医療費) = -0.0001(円あたり ‰)。 単位が違いすぎて比較不能。
標準化後:β*(高齢化率) = +0.929 ***、 β*(保健医療費) = -0.042 n.s.。 高齢化率の影響が圧倒的に大きいと一目で分かる。
絶対値の範囲:通常 0〜1。 多重共線性が強いと1超もあり得る(解釈に注意)。
注意:標準化しても因果関係は分かりません。 影響の大きさを「比較」するだけで、 因果の証明ではない点は通常の β と同じ。
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、 効果量 |
このページの概念をマスターすることで、 以下のスキルが身につきます:
このコンペの主要データセット(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 | # 必須ライブラリのインストール pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn # 標準的なインポート import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy import stats from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error # 日本語表示の設定(matplotlib) plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False # データ読み込み(SSDSE は cp932 エンコーディング) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') print(df.shape) print(df.head()) print(df.describe()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | def quick_eda(df, target=None): """探索的データ分析の基本テンプレート""" print(f"Shape: {df.shape}") print(f"\nColumn types:\n{df.dtypes}") print(f"\nMissing values:\n{df.isnull().sum()}") print(f"\nBasic stats:\n{df.describe()}") # 数値列の可視化 numeric_cols = df.select_dtypes(include=[np.number]).columns df[numeric_cols].hist(bins=20, figsize=(15, 10)) plt.tight_layout() plt.show() # 相関ヒートマップ if len(numeric_cols) > 1: plt.figure(figsize=(12, 10)) sns.heatmap(df[numeric_cols].corr(), annot=True, fmt='.2f', cmap='RdBu_r', center=0) plt.show() # ターゲットがあれば散布図行列 if target and target in df.columns: sns.pairplot(df[numeric_cols[:5]], hue=target if df[target].dtype == 'O' else None) plt.show() |
分析結果を報告する際の標準的な構成:
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
| 統計量 | 効果量 | 小 | 中 | 大 |
|---|---|---|---|---|
| 2群平均差 | Cohen's d | 0.2 | 0.5 | 0.8 |
| 相関 | r | 0.1 | 0.3 | 0.5 |
| 線形回帰 | R² | 0.02 | 0.13 | 0.26 |
| ANOVA | η² (eta²) | 0.01 | 0.06 | 0.14 |
| χ² | Cramér's V | 0.1 | 0.3 | 0.5 |
| ロジスティック | Odds Ratio | 1.5 | 2.5 | 4.0 |
標準化偏回帰係数 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「標準化偏回帰係数」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「標準化偏回帰係数」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
標準化偏回帰係数 関連の補強キーワード。 クリックで該当箇所へ:
持ち家比率を目的変数として、 5 説明変数を標準化してから OLS 推定し、 標準化偏回帰係数を比較する完全再現例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd import numpy as np import statsmodels.api as sm from sklearn.preprocessing import StandardScaler df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) X_raw = df[['一人当たり県民所得','世帯人員','高齢化率','人口密度','就業率']] y_raw = df['持ち家比率'] # 全変数を z 標準化 scaler = StandardScaler() X_std = pd.DataFrame(scaler.fit_transform(X_raw), columns=X_raw.columns) y_std = (y_raw - y_raw.mean()) / y_raw.std(ddof=1) # 切片を入れない(標準化後は 0) model = sm.OLS(y_std, sm.add_constant(X_std)).fit() print(model.summary()) # 標準化β を比較しやすい形に print('\n標準化偏回帰係数:') for var, beta in zip(X_raw.columns, model.params[1:]): print(f' {var:18} β = {beta:+.3f}') |
| 項目 | 値 | 参考 | 解釈 |
|---|---|---|---|
| 変数 | 標準化β | 解釈 | |
| 一人当たり県民所得 | -0.62 | 1SD 増→持ち家比率は 0.62SD 減 | 強い負 |
| 世帯人員 | +0.41 | 1SD 増→持ち家比率は 0.41SD 増 | 中 |
| 高齢化率 | +0.18 | 高齢な県ほど持ち家多 | 弱 |
| 人口密度 | -0.35 | 密度高い県ほど賃貸多 | 中 |
| 就業率 | +0.05 | ほぼ無関係(β小) | 無視可 |
👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline # パイプラインで一気通貫 pipe = Pipeline([('scaler', StandardScaler()), ('lr', LinearRegression())]) pipe.fit(X_raw, y_raw) print('標準化β(LinearRegression):', pipe.named_steps['lr'].coef_) # Ridge で多重共線性下の安定 β ridge_pipe = Pipeline([('scaler', StandardScaler()), ('rdg', Ridge(alpha=1.0))]) ridge_pipe.fit(X_raw, y_raw) print('Ridge β:', ridge_pipe.named_steps['rdg'].coef_) # Lasso で sparse な β lasso_pipe = Pipeline([('scaler', StandardScaler()), ('lso', Lasso(alpha=0.1, max_iter=10000))]) lasso_pipe.fit(X_raw, y_raw) print('Lasso β:', lasso_pipe.named_steps['lso'].coef_) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from scipy import stats import numpy as np # β の解析的標準誤差(教育用) X_std = (X_raw - X_raw.mean()) / X_raw.std(ddof=1) y_std = (y_raw - y_raw.mean()) / y_raw.std(ddof=1) X_mat = np.column_stack([np.ones(len(X_std)), X_std]) # OLS 推定 betas = np.linalg.lstsq(X_mat, y_std, rcond=None)[0] resid = y_std - X_mat @ betas sigma2 = (resid @ resid) / (len(y_std) - X_mat.shape[1]) cov = sigma2 * np.linalg.inv(X_mat.T @ X_mat) se = np.sqrt(np.diag(cov)) t = betas / se p = 2 * (1 - stats.t.cdf(np.abs(t), df=len(y_std) - X_mat.shape[1])) for name, b, s, tt, pv in zip(['Intercept'] + list(X_raw.columns), betas, se, t, p): print(f'{name:20} β={b:+.3f}, SE={s:.3f}, t={tt:+.2f}, p={pv:.4f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # Ridge α を最適化して β の安定性を見る import optuna from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score def objective(trial): alpha = trial.suggest_float('alpha', 1e-4, 1e3, log=True) pipe = Pipeline([('s', StandardScaler()), ('m', Ridge(alpha=alpha))]) return -cross_val_score(pipe, X_raw, y_raw, cv=5, scoring='neg_root_mean_squared_error').mean() study = optuna.create_study(direction='minimize') study.optimize(objective, n_trials=40) best_alpha = study.best_params['alpha'] print(f'Best α = {best_alpha:.3f}') # 最適 α での β pipe = Pipeline([('s', StandardScaler()), ('m', Ridge(alpha=best_alpha))]) pipe.fit(X_raw, y_raw) for name, b in zip(X_raw.columns, pipe.named_steps['m'].coef_): print(f' {name:18} β={b:+.3f}') |
| ライブラリ / 関数 | 用途 |
|---|---|
statsmodels.OLS | 標準的な係数+検定+R² |
sklearn.preprocessing.StandardScaler | z 標準化 |
sklearn.linear_model.LinearRegression | 係数のみ |
statsmodels.stats.outliers_influence.variance_inflation_factor | VIF |
yellowbrick | 係数の可視化 |
標準化βは「x も y も標準化(平均 0・分散 1)した上での回帰係数」。 単位の異なる変数の影響力を比較できる。 SSDSE-B-2026 で L3221 を A1101・A1303 で予測すると、 標準化βは A1101=0.5、 A1303=-0.1 のように比較可能になる。
標準化β(標準偏回帰係数) は「回帰」カテゴリの中核概念。 初めて触れる読者は、 まずこの「🎨 直感」セクションだけ通読し、 必要になった時点で「📐 数式」「🐍 Python」「⚠️ 落とし穴」へ戻る読み方が定着しやすいです。
直感の次は、 厳密な定義を確認します。 数式は言語の一種で、 一度書き慣れれば「言葉より速く伝えられる」便利な道具。 慣れていない方は、 各記号が何を表すかを下の「🔬 記号読み解き」で 1 つずつ確認してください。
上の数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。
数式だけでは「実感」が湧きにくいので、 実データ data/raw/SSDSE-B-2026.csv(47 都道府県 × 16 年)で 1 度手計算してみると理解が定着します。
SSDSE-B-2026 (2023) で L3221=β0 + β1×A1101 + β2×A1303 を当てる。 sx(A1101)=2,797,551、 sx(A1303)=796,000、 sy(L3221)=21,500 程度。 β1 を sx(A1101)/sy で割ると標準化β1 ≈ 0.50、 β2 を同様に処理して標準化β2 ≈ -0.10 が得られる(実行値)。 これにより 2 変数の相対重要度を比較できる。
| 都道府県 | A1101 総人口 | A1303 65 歳以上 | L3221 消費支出 |
|---|---|---|---|
| 東京都 | 14,086,000 | 3,205,000 | 341,320 |
| 神奈川県 | 9,229,000 | 2,390,000 | 306,565 |
| 大阪府 | 8,763,000 | 2,424,000 | 271,246 |
| 愛知県 | 7,477,000 | 1,923,000 | 300,221 |
| 埼玉県 | 7,331,000 | 2,012,000 | 344,092 |
| 千葉県 | 6,257,000 | 1,756,000 | 306,943 |
上記は SSDSE-B-2026 (2023) からの抜粋。 手計算で確認した値が、 後述の Python 実装で得る値と一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。
公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで 標準化β(標準偏回帰係数) を動作させます。 まずはこのまま実行してみてください。
# 標準化β(標準偏回帰係数) を SSDSE-B-2026 で実行する最小コード
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023] # 2023 年のみ抽出
print(df.shape) # (47, 112)
print(df[['Prefecture','A1101','A1303','L3221']].head())
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
import numpy as np
X = df[['A1101','A1303']].astype(float).values
y = df['L3221'].astype(float).values
Xs = StandardScaler().fit_transform(X)
ys = (y - y.mean()) / y.std(ddof=0)
lr = LinearRegression().fit(Xs, ys)
for c, b in zip(['A1101','A1303'], lr.coef_):
print(f'標準化β({c})={b:.3f}')
上のコードで動かない場合は、 ①必要なパッケージがインストール済みか(pip install pandas scikit-learn scipy statsmodels matplotlib)、 ②データファイルが data/raw/SSDSE-B-2026.csv に存在するか、 ③encoding='cp932' になっているかを確認してください。
標準化β(標準偏回帰係数) を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。