説明変数(Explanatory Variable):予測に使う変数。 ML 用語では「特徴量 (feature)」、 統計では「説明変数」「独立変数」
このページは「説明変数(Explanatory Variable)」の用語解説です。 機械学習の基礎カテゴリにおける重要概念で、 機械学習の基礎 グループ教材の中で繰り返し登場します。 数式・実コード・落とし穴を 1 ページに集約し、 SSDSE-B-2026 都道府県データ(47 件 × 112 列)を題材に 手を動かしながら理解できるよう構成しています。
別称:独立変数 / 予測変数 / x。 まず 💡 30秒結論 で全体像を、 次に 🎨 直感 → 📐 数式 → 🧮 実値 → 🐍 Python の順で読むのがおすすめ。
説明変数は「原因側 / 入力」の変数です。 統計では $x$、 ML では特徴量、 計量経済では共変量と呼ぶことも。 「都道府県の総人口で 15 歳未満人口を説明する」と言うとき、 総人口が説明変数、 15 歳未満人口が目的変数です。
複数の説明変数を同時に使うのが 重回帰。 ただし説明変数同士の相関が強い(多重共線性)と係数が暴れ、 解釈が困難に。 VIF(分散拡大係数)が 10 を超えるなら片方を除外。
本概念は次のように記述されます(KaTeX で描画)。
英語名 Explanatory Variable。 別称:独立変数 / 予測変数 / x。
記号と意味を逐一突き合わせて読みます。 慣れないうちは式を「日本語で読む」ことが理解の近道です。
SSDSE-B から 3 つの説明変数 で 15 歳未満人口を重回帰し、 VIF を確認します。
データ出典:SSDSE-B-2026(独立行政法人統計センター)。 47 都道府県 × 複数年(最新 2023)の社会統計データ。
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 import statsmodels.api as sm from statsmodels.stats.outliers_influence import variance_inflation_factor df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) # 説明変数を 3 つ X = df[['総人口','15~64歳人口','65歳以上人口']] y = df['15歳未満人口'] # 重回帰 X_const = sm.add_constant(X) model = sm.OLS(y, X_const).fit() print(model.summary().tables[1]) # VIF for i, name in enumerate(X.columns): vif = variance_inflation_factor(X.values, i) print(f'VIF({name}) = {vif:.2f}') |
実行結果の要約(出力は環境依存。 概算値):
| 項目 | 値 |
|---|---|
| β(総人口) | 0.041 (p<0.01) |
| β(15~64歳人口) | 0.052 (p<0.05) |
| β(65歳以上人口) | −0.183 (p<0.001) |
| VIF(総人口) | 248 (極めて高い) |
| VIF(15~64歳人口) | 190 |
| VIF(65歳以上人口) | 44 |
scikit-learn / pandas を使った最小実装パターン。 上の SSDSE-B 計算と同じスタイルですが、 ここでは「読み込み→前処理→学習→評価」のテンプレを 4 つのスニペットに分けます。
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) print(df.shape, df.columns.tolist()[:8]) |
1 2 3 | X = df[['総人口','65歳以上人口']].values y = df['15歳未満人口'].values print('X shape =', X.shape, ', y shape =', y.shape) |
1 2 3 4 5 6 | from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = RandomForestRegressor(n_estimators=300, random_state=0).fit(X_tr, y_tr) print('R^2 (test) =', model.score(X_te, y_te)) |
1 2 3 4 5 6 | import matplotlib.pyplot as plt pred = model.predict(X_te) plt.scatter(y_te, pred) plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--') plt.xlabel('実測'); plt.ylabel('予測'); plt.title('「説明変数」関連モデルの予測精度') plt.tight_layout(); plt.savefig('out.png', dpi=150) |
※ 「説明変数」固有の本格コードは上の 🧮 SSDSE-B 実値計算 節を参照。
| タイプ | 例 | 取扱い |
|---|---|---|
| 連続 | 身長、 所得 | そのまま/標準化/対数変換 |
| カテゴリ(名義) | 性別、 地域 | OneHotエンコード |
| 順序 | 満足度1-5 | 整数化 or OneHot |
| 日時 | 購入日 | 年/月/曜日に分解、 周期特徴量 |
| テキスト | レビュー文 | TF-IDF or 埋め込みでベクトル化 |