論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
調整済み決定係数
Adjusted R² (adj.R²)
R²はモデルに変数を増やすほど大きくなるバイアスを持つ。それを変数の数で調整した指標。
回帰モデルadj.R²自由度調整済み R²adjusted R squared

🔖 キーワード索引

adjusted r squared」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「adjusted r squared」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

adjusted r squared統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「adjusted r squared の理解 → 適用 → 検証」のプロセスを構成する。 以降の各セクションで詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

データの当てはまりを測る、厳しめの物差しです。

変数を増やしすぎたときのミスを防ぐために使います。

テスト勉強で、関係ない暗記を増やしても点数が上がらない例に似ています。

この章では、計算式や使いどころについて読みます。

調整済み決定係数 $\bar{R}^2$(Adjusted R²)=説明変数を闇雲に増やしても上がりにくくなるように、 R² を 変数の数 k で罰則調整した指標。 重回帰のモデル比較で第一に見るべき値。

📖 詳細な解説

この用語は、 統計データ解析・データサイエンスの世界で重要な概念の1つです。 ジャストインタイム型学習では、 必要なときに参照し、 関連概念と合わせて学ぶことで定着を図ります。

基本的な定義

この用語の基本的な意味、 数学的定義、 直感的理解について、 ページ後半「🗺️ 概念マップ」節の3つの概念マップを通じて、 関連する用語と一緒に把握しましょう。

使い時の判断基準

Python による実装例

🎯 解説: まず SSDSE-B-2026 を読み込み、 基本統計と分布を確認する(重回帰の前段の EDA)。 続く入力・実行例は、 説明変数を段階的に追加したときの R² と調整済み R² の比較。 調整済み R² は説明変数数 k に罰則を加えるため、 「無駄な変数を追加すると下がる」性質を持つ。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A1303(65歳以上人口) A1101(総人口) L3221(消費支出(二人以上の世帯)) Prefecture(都道府県) 北海道 2,023 1,681,000 5,092,000 296,888 北海道 東京都 2,023 3,205,000 14,086,000 341,320 東京都 沖縄県 2,023 350,000 1,468,000 251,222 沖縄県 …(全 47 行)
 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
28
29
30
31
32
33
34
35
# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()]
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')
df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100

# 見本でよく使われる仮の列名を、実データから作っておく
df['income'] = df['消費支出(二人以上の世帯)']
df['population'] = df['総人口']
_region = {'北海道': '北海道', '青森県': '東北', '岩手県': '東北', '宮城県': '東北',
           '秋田県': '東北', '山形県': '東北', '福島県': '東北', '茨城県': '関東',
           '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東',
           '東京都': '関東', '神奈川県': '関東'}
df['region'] = df['都道府県'].map(_region).fillna('その他')
df['地域'] = df['region']

import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# SSDSE データの読み込み

# 基本統計
df.describe()
df.info()

# 可視化
df.hist(bins=30, figsize=(15, 10))
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv X1: A1101(総人口)のみ X2: A1101 + A4101(出生数) X3: A1101 + A4101 + ランダム変数
📤 実行例(実測) <class 'pandas.core.frame.DataFrame'> Index: 47 entries, 0 to 552 Columns: 117 entries, 年度 to 地域 dtypes: float64(7), int64(106), object(4) memory usage: 43.3+ KB
💬 読み方: ランダム変数を加えても R² は維持されるが、 調整済み R² は下がる。 これが「意味のない変数を見抜く」フィルター機能。 モデル比較・変数選択では必ず調整済み R² を見る。

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 解説: 基本の分析パターン(読み込み → df.describe() で記述統計 → sns.pairplot で散布図行列)。 まず変数どうしの関係を目で見てから回帰に進む。 R-squared と Adj. R-squared の比較は次のブロックで statsmodels の summary() を使って行う。
 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', header=1)

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費(二人以上の世帯)', '教育費(二人以上の世帯)', '住居費(二人以上の世帯)']])
plt.show()
📥 入力例: data/raw/SSDSE-B-2026.csv formula = 'L3221 ~ A1101 + B4101 + A1303' 47 都道府県
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。
💬 読み方: F-stat が大きいほどモデル全体が有意。 AIC/BIC は小さいほど良いモデル(モデル比較用)。 調整済み R² と AIC は変数選択の主要な基準。 BIC のほうがパラメータ罰則が強く、 よりシンプルなモデルを好む。

📚 統計概念マップでの位置

ページ後半「🗺️ 概念マップ」節の3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションの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、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

📍 あなたが今見ているもの

🍰 まずはやさしく

分析モデルの良さを正しく判断するための指標です。

変数の数による偏りをなくすために使います。

スマホのアプリで、不要な機能が増えて使いにくくなる状況に似ています。

このページでは、定義や実装方法など6つの視点で解説します。

論文中に 「調整済み決定係数」として登場する用語。

調整済み決定係数 とは:R²はモデルに変数を増やすほど大きくなるバイアスを持つ。それを変数の数で調整した指標。

本ページでは「adjusted r squared」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「adjusted r squared」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む — 自由度調整済み決定係数

🍰 まずはやさしく

変数を増やした分だけ、点数を引くルールのようなものです。

本当に必要な変数だけを選んでいるか確かめるために使います。

部活の練習メニューを増やしても、効率が落ちる場合があります。

ここでは、図を使って直感的に仕組みを理解します。

Adjusted R² は「説明変数を増やすと自動で上がる R² を、 自由度で罰則を入れて補正したもの」。 モデル比較に使う。 SSDSE-B-2026 で説明変数を A1101 → +A1303 → +B4101 と増やすと、 R² は単調増加するが Adjusted R² は途中で下がりうる。

💡 学習のコツ:直感で全体像を掴んだら、 次の「📐 定義・数式」で正確な意味を押さえ、 最後に「🧮 実値で計算してみる」で SSDSE-B-2026 の都道府県データを使った計算をなぞるのが効率的です。 比喩は厳密ではないので、 必ず数式と並べて確認してください。

自由度調整済み決定係数 は「回帰」カテゴリの中核概念。 初めて触れる読者は、 まずこの「🎨 直感」セクションだけ通読し、 必要になった時点で「📐 数式」「🐍 Python」「⚠️ 落とし穴」へ戻る読み方が定着しやすいです。

🎨 概念図で押さえる(調整済み決定係数の可視化)

調整済み決定係数($\bar{R}^2$)は「変数を増やしても自動的に上がる $R^2$ の弱点」を補正した指標。 回帰直線・残差プロット・多重共線性の 3 枚で、 $\bar{R}^2$ が捉える適合度のニュアンスを把握する。

単回帰の基本(R² の出発点)
単回帰での $R^2$ は決定係数の最も素朴な形。 重回帰になると変数追加で $R^2$ は単調増加する性質が露呈する。
残差プロット(モデル適合度の視覚的判定)
$\bar{R}^2$ が高くても残差に系統的パターンが残れば過適合の疑い。 数値だけでなく残差プロットで検証が必須。
多重共線性(変数増による $R^2$ 膨張)
多重共線性下では変数追加で $R^2$ は上がるが、 $\bar{R}^2$ は逆に下がる場合がある。 ペナルティ項が効いている証拠。

→ 単回帰(基準)、 残差(適合度の質)、 多重共線性(ペナルティ効果)の 3 段階で、 $\bar{R}^2$ が「変数の質」を測る理由が理解できる。

✅ 理解度チェック

  1. $R^2$ と $\bar{R}^2$ の数式上の違いを 1 行で説明できるか?
  2. 変数を追加したとき、 $\bar{R}^2$ が下がるのはどのような場合か?
  3. $\bar{R}^2$ と AIC・BIC の関係はどう整理されるか?
  4. $\bar{R}^2$ がマイナス値になる場合の解釈は?
  5. サンプルサイズ $n$ が大きいとき、 $\bar{R}^2$ と $R^2$ の差はどうなるか?

→ すべて即答できれば、 重回帰モデル選択で $\bar{R}^2$ を適切に使い分けられる基礎力は十分。

🧾 発表前の最終確認

自由度調整済み決定係数は、 説明変数を増やすほど単純に上がる通常の決定係数を補正する指標です。 ただし高い値は因果関係や外部データでの予測性能を保証しないため、 残差診断や交差検証と併用します。

📐 定義・数式 — 自由度調整済み決定係数

🍰 まずはやさしく

数式で決めた、厳密なルールのことです。

計算によって客観的にモデルを比較するために使います。

買い物で、予算に合わせて最適な品物を組み合わせる感覚に似ています。

ここでは、数式の意味を一つずつ丁寧に読み解きます。

やさしい説明で掴んだ感覚を、ここで 自由度調整済み決定係数 の定義式に対応づけます。下の式は左辺 $\bar{R}^2$ が何で決まるかを右辺で書き下したもので、R̄²(自由度で調整した決定係数)、分数(割り算) が現れます。それぞれの記号が何の量を指すのかは、次の「🔬 数式を言葉で読み解く」で 1 つずつ確かめてください。

【自由度調整済み決定係数 の中心定義式】
$$ \bar{R}^2 = 1 - (1 - R^2)\cdot\frac{n - 1}{n - k - 1} $$
この式が「自由度調整済み決定係数」の骨格。 派生形・拡張形はここから生まれる。

なぜ R² は変数を増やすと「必ず」上がるのか

最小二乗法(OLS)は残差平方和 SSE を最小化する。 新しく追加した変数の係数を 0 と置けば元のモデルをそのまま再現できるため、 変数追加後に最適化した SSE は必ず元以下になる。 したがって 決定係数 $R^2 = 1 - \mathrm{SSE}/\mathrm{SST}$ は変数追加で決して下がらず、 全く無関係な変数でも標本内の偶然の相関を拾ってわずかに上がる。 この「必ず上がる」バイアスを打ち消すのが自由度比 $(n-1)/(n-k-1)$ のペナルティで、 変数を 1 つ増やしたときの R² の増分が自由度 1 個分の偶然の説明力に見合わなければ $\bar{R}^2$ はむしろ低下する。 だからこそ $\bar{R}^2$ は説明変数の数が異なるモデル同士の比較(モデル選択)に使える。 なお常に $\bar{R}^2 \le R^2$ であり、 モデルが「全体平均で予測する」より悪ければ $\bar{R}^2$ は負にもなる。

📌 読み方のコツ:数式を見たら「左辺は何を定義しているか」「右辺の各項は何の合計・積・比か」を声に出して読み下してみる。 これだけで理解が大きく進みます。

🔬 数式を言葉で読み解く — 数式を「言葉」に翻訳

上の数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。

左辺 $\bar{R}^2$(調整済み決定係数)
このページで定義したい量。 1 以下の無単位量で、 R² と違って負にもなり得る(モデルが全体平均より悪い場合)。
$R^2$(通常の決定係数)
$R^2 = 1 - \mathrm{SSE}/\mathrm{SST}$。 目的変数の分散のうちモデルが説明できた割合。 詳細は 決定係数 R² を参照。
$n$(サンプルサイズ)
観測数。 SSDSE-B-2026 の 1 時点クロスセクションなら n=47(都道府県)。 n が大きいほど自由度比が 1 に近づき、 ペナルティは小さくなる。
$k$(説明変数の数)
モデルに入れた説明変数の個数(切片は数えない)。 教科書によっては p と書く。 k が増えるほど分母 $n-k-1$ が小さくなり、 罰則が強まる。
自由度比 $\dfrac{n-1}{n-k-1}$
全体平方和の自由度 $n-1$ と残差の自由度 $n-k-1$ の比。 常に 1 以上で、 $(1-R^2)$(説明できなかった割合)をこの比で「拡大」してから 1 から引くことがペナルティの実体。 k=0 のとき比は 1 になり $\bar{R}^2 = R^2$ に一致する。
📚 補足:同じ記号でも分野・教科書によって意味が違うことがあります(例: $\hat{y}$ は予測値だが、 統計の文脈では推定量を意味することも)。 不明確なときは、 必ずその文書の記号定義表を確認しましょう。

🎮 触って理解する

スライダーを動かすと、 説明変数の数 pサンプルサイズ n本当に効く変数の割合 に応じて、 通常の決定係数 $R^2$ と調整済み決定係数 $\bar{R}^2 = 1-(1-R^2)\dfrac{n-1}{n-p-1}$ が下の図でリアルタイムに変化します。 役に立つ変数を先に、 無意味な変数を後から投入したときに、 「R² は必ず上がるのに、 調整済み R² はどこかで頭打ち・下降に転じる」様子を体感してください。 図はタップ/ドラッグで任意の変数個数 k を選べます。

SSDSE-B-2026 の都道府県クロスセクションは n=47。 大きくするとペナルティが弱まる。

モデルに入れる説明変数の総数(切片は数えない)。 p を増やすほど R² は上がりやすい。

先頭の 3 本が真に有効、 残りは無意味(ノイズ)変数として投入される。

通常の R²(k=8
0.000
調整済み R̄²(k=8
0.000
水増し分 R² − R̄²
0.000

※ この図は調整済み R² の性質を体感するための模擬モデルです(有効変数は残差の一定割合を説明、 無意味変数はブレークイーブン未満のノイズを与える設定)。 実データの具体値は「🧮 SSDSE-B-2026 実値計算例」の節を参照してください。

💡 直感 — 「ペナルティ」として読む

調整済み R² は、 通常の R² から説明変数を増やした代償を差し引いた指標です。 式の $(1-R^2)$ は「まだ説明できていない割合」で、 これに自由度比 $\dfrac{n-1}{n-p-1}\ (\ge 1)$ を掛けて水増ししてから 1 から引きます。 変数 p を 1 本足すと分母 $n-p-1$ が小さくなり罰則が強まるので、 その変数が罰則を上回る説明力を持たない限り、 調整済み R² は下がります。 上のスライダーで「本当に効く変数の割合」を下げると、 R² と R̄² の差(水増し分)が広がるのが見えるはずです。

⚠️ よくある落とし穴 — 過学習と変数選択

🚀 発展 — AIC / BIC との関係

調整済み R² は「自由度で罰則を与える」という発想の入口です。 同じ発想を尤度ベースで一般化したのが情報量規準で、 AIC は罰則項 $2p$、 BIC は罰則項 $p\log n$ を用います($n$ が大きいほど BIC の罰則が強い=一致性重視)。 線形回帰・正規誤差なら調整済み R² と AIC は概ね同じ変数を選びますが、 GLM や非線形モデルでは R² 自体が定義しづらいため AIC/BIC が標準になります。 「変数を足す価値があるか」をより厳密に測りたい場面では、 調整済み R² から情報量規準へステップアップしましょう。 通常の R² の定義自体は 決定係数 R² を参照。

🧮 SSDSE-B-2026 実値計算例 — 変数を増やすと R² と調整 R² はどう変わるか

「消費支出(L3221、 1世帯あたり)」を目的変数として、 説明変数の数を段階的に増やしながら R² と調整 R² を比較します。 R² は単調に増えるが、 調整 R² は変数追加が無意味なら逆に下がるのがポイントです。

モデル k 調整 R² 差分 ΔR̄²
M1: 総人口 A1101 のみ10.1110.091
M2: + 気温 B410120.1850.148+0.057
M3: + 65歳以上人口 A130330.2080.153+0.005
M4: + 標準地価 C540140.2090.133−0.020
M5: + ランダムノイズ列50.2090.112−0.021

※ n=47(2023 年の 47 都道府県)、 目的変数は L3221(1 世帯あたり消費支出)。 M1〜M5 はいずれも実データで実測した値(M4 は標準地価 C5401、 M5 は np.random.RandomState(2) で生成した無相関のランダム列を追加)。 いずれも定義式 $\bar{R}^2 = 1-(1-R^2)(n-1)/(n-k-1)$ で検算できる(例: M4 は $1-(1-0.209)\times46/42=0.133$、 M5 は $1-(1-0.209)\times46/41=0.112$)。 気温 B4101 の追加(M2)は R² も調整 R² も押し上げるが、 標準地価 C5401(M4)やランダム列(M5)は R² をほぼ動かさない一方、 調整 R² は罰則で 0.153→0.133→0.112 と低下する。 調整 R² は M3(k=3)で最大となり、 変数選択の観点でこれが最良のモデルである。

🎯 解説: 説明変数を 1 個 → 2 個 → 3 個と増やしながら、 statsmodels の r.rsquared と r.rsquared_adj を並べて出す。 R² は変数を足せば必ず上がるが、 自由度調整済み R² は無駄な変数を足すと下がる、 という違いが数値で見える。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) B4101(年平均気温) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 11.0 296,888 東京都 14,086,000 3,205,000 17.6 341,320 沖縄県 1,468,000 350,000 23.8 251,222 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd, statsmodels.api as sm
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]          # 2023年・47都道府県
y = d['L3221']                               # 消費支出(世帯あたり)
for cols in [['A1101'], ['A1101','B4101'],
             ['A1101','B4101','A1303']]:
    X = sm.add_constant(d[cols])
    r = sm.OLS(y, X).fit()
    print(f'k={len(cols)}: R²={r.rsquared:.3f}, '
          f'adj R²={r.rsquared_adj:.3f}')
📥 入力例: data/raw/SSDSE-B-2026.csv y = L3221(消費支出) 説明変数を 3 段階で追加 (k=1, 2, 3) 47 都道府県
📤 実行例: k=1: R²=0.111, adj R²=0.091 k=2: R²=0.185, adj R²=0.148 k=3: R²=0.208, adj R²=0.153
💬 読み方: 変数を追加するたびに R² は上昇するが、 adj R² は k=3 でほぼ頭打ち(+0.005)。 特に気温 B4101 の追加(k=2)が有意義で adj R² を 0.091→0.148 へ押し上げる。 R² と adj R² の差 (k=1 で 0.020、 k=2 で 0.037、 k=3 で 0.055) が説明変数数 k に対する罰則の大きさを表す。 上の冒頭表 (M1〜M3) と本コードの k=1〜3 が対応する。

🧮 数式に値を入れて手で計算する

合成設定 ($R^2 = 0.84$、 $n = 10$、 $k = 2$) を調整済み R² の数式に代入し、 Step 1〜3 で手計算する。 同じ計算を Python で再現し、 結果が完全一致することを確認する。

📐 調整済み R² (再掲)

$$ \bar{R}^2 = 1 - \frac{(1-R^2)(n-1)}{n-k-1} $$

Step 1: データ準備 (合成)

項目
$R^2$ (決定係数)0.84
$n$ (サンプル数)10
$k$ (説明変数の数、 切片を除く)2

Step 2: 数式の各部品

項目計算結果
$1 - R^2$$1 - 0.84$0.16
$n - 1$$10 - 1$9
$n - k - 1$$10 - 2 - 1$7
$(1-R^2)(n-1)$$0.16 \times 9$1.44
$\dfrac{(1-R^2)(n-1)}{n-k-1}$$1.44 / 7$0.205714

Step 3: 調整済み R²

項目計算結果
$\bar{R}^2$$1 - 0.205714$0.794286
$R^2 - \bar{R}^2$ (罰則の大きさ)$0.840000 - 0.794286$0.045714

🐍 同じ計算を Python で再現

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
R2 = 0.84
n = 10
k = 2

# Step 2 の各部品
num = (1 - R2) * (n - 1)   # 分子
den = n - k - 1             # 分母
ratio = num / den           # 引き算する項

# Step 3 の調整済み R²
adj_R2 = 1 - ratio

print(f"1 - R^2          = {1 - R2}")
print(f"(1 - R^2)(n - 1) = {num}")
print(f"n - k - 1        = {den}")
print(f"ratio            = {ratio:.6f}")
print(f"adjusted R^2     = {adj_R2:.6f}")

📤 実行結果

1 - R^2 = 0.16 (1 - R^2)(n - 1) = 1.44 n - k - 1 = 7 ratio = 0.205714 adjusted R^2 = 0.794286

💬 手計算 (Step 2〜3) と Python 出力が完全一致 (調整済み R² = 0.794286)。 R² = 0.84 から 0.045714 だけ下方修正されており、 これが「説明変数の数 $k=2$ に対する罰則」の実体である。

🧮 実値で計算してみる — SSDSE-B-2026

数式だけでは「実感」が湧きにくいので、 実データ data/raw/SSDSE-B-2026.csv(47 都道府県 × 16 年)で 1 度手計算してみると理解が定着します。

SSDSE-B-2026 (2023, n=47) で y=L3221 に対して、 X1=A1101 単独では R²=0.111(Adjusted R²=0.091)、 X={A1101, A1303} では R²=0.115(Adjusted R²=0.075)と、 65 歳以上人口 A1303 を足しても R² はほとんど動かず Adjusted R² はむしろ低下する。 つまり A1303 追加に意味がない可能性が高い。 一方 X={A1101, B4101}(気温を追加)では R²=0.185・Adjusted R²=0.148 へ実質的に上昇する。

都道府県A1101 総人口A1303 65 歳以上L3221 消費支出
東京都14,086,0003,205,000341,320
神奈川県9,229,0002,390,000306,565
大阪府8,763,0002,424,000271,246
愛知県7,477,0001,923,000300,221
埼玉県7,331,0002,012,000344,092
千葉県6,257,0001,756,000306,943

上記は SSDSE-B-2026 (2023) からの抜粋。 手計算で確認した値が、 後述の Python 実装で得る値と一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。

🐍 Python 実装バリエーション(statsmodels / scikit-learn / 自前計算)

🅰️ statsmodels — 一番素直

🎯 解説: 調整済み R² の手計算と statsmodels 出力が一致するかを確認する。 式は 1 - (1-R²)(n-1)/(n-k-1)。 n: サンプル数, k: 説明変数の数。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) B4101(年平均気温) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 11.0 296,888 東京都 14,086,000 3,205,000 17.6 341,320 沖縄県 1,468,000 350,000 23.8 251,222 …(全 47 行)
1
2
3
4
5
6
7
import pandas as pd, statsmodels.api as sm
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]
X = sm.add_constant(d[['A1101','B4101','A1303']])
r = sm.OLS(d['L3221'], X).fit()
print(f'R² = {r.rsquared:.3f}')
print(f'adj R² = {r.rsquared_adj:.3f}')
📥 入力例: n = 47 (2023年), k = 3 (説明変数), R² = 0.208
📤 実行例: 1 - (1-0.208)*(47-1)/(47-3-1) = 1 - 0.792 * 46/43 = 1 - 0.8473 = 0.1527 ≒ 0.153
💬 読み方: n が小さく k が大きいほど補正幅が大。 同じ R² でもサンプルが少ない・変数が多いモデルは調整済み R² が大きく下がる。 競技データでは n=47 と少ないので過学習リスクが高い。

🅱️ scikit-learn — 自前計算(score は R² だが調整版なし)

🎯 解説: sklearn の score() が返すのは R² のみで調整版は無い。 定義式 1 - (1-R²)(n-1)/(n-k-1) を 1 行で自作する。 続く入力・実行例は、 説明変数を段階的に追加したときの R² と調整済み R² の比較。
1
2
3
4
5
6
7
8
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(d[['A1101','B4101','A1303']])
y = d['L3221']
r2 = LinearRegression().fit(X, y).score(X, y)
n, k = len(y), 3
adj_r2 = 1 - (1 - r2) * (n - 1) / (n - k - 1)
print(f'R² = {r2:.3f}, adj R² = {adj_r2:.3f}')
📥 入力例: data/raw/SSDSE-B-2026.csv X = A1101・B4101・A1303 (k=3) y = L3221(消費支出)、 47 都道府県(2023)
📤 実行例: R² = 0.208, adj R² = 0.153
💬 読み方: sklearn の score() は R² のみを返すため、 定義式で adj R² を自作する。 得られた adj R²=0.153 は R² より低い。 ここに標準地価 C5401 やランダム列を足すと R² はほぼ横ばいでも adj R² は 0.133→0.112 と下がる(冒頭 M4・M5 表)。 これが「意味のない変数を見抜く」フィルター機能。

🅲 scipy.stats.linregress — 単回帰のみ

🎯 解説: scipy.stats.linregress は単回帰 (k=1) 専用。 戻り値 r の 2 乗が R²。 説明変数が 1 つだけなら調整の影響は小さいが、 モデル比較の場面では statsmodels で調整済み R² を確認する。
1
2
3
from scipy import stats
slope, intercept, r, p, se = stats.linregress(d['A1101'], d['L3221'])
print(f'R² = {r**2:.3f}')  # 単回帰なので調整版は意味が薄い
📥 入力例: data/raw/SSDSE-B-2026.csv X = A1101(総人口, k=1)、 y = L3221(消費支出) 47 都道府県
📤 実行例: R² = 0.111(上の実行例の k=1 モデルと同一)
💬 読み方: 単回帰 (k=1, n=47) では R² と調整済み R² の差は小さい(R²=0.111 に対し調整済み R²=0.091)。 調整済み R² が本領を発揮するのは、 k の異なる重回帰モデルを比較するとき。

🅳 CV-R² で過学習を見抜く

🎯 解説: cross_val_score でサンプル外 (out-of-sample) の R² を推定する。 調整済み R² が「サンプル内の罰則付き指標」なのに対し、 CV-R² は未知データへの予測性能を直接測る、 より厳しい評価。
1
2
3
from sklearn.model_selection import cross_val_score
cv_r2 = cross_val_score(LinearRegression(), X, y, cv=5, scoring='r2').mean()
print(f'CV-R² = {cv_r2:.3f}')   # 調整 R² より厳しい
📥 入力例: X = A1101・B4101・A1303 (k=3)、 y = L3221(消費支出)、 5-fold CV
📤 実行例: CV-R² ≒ -0.71(5 分割の平均、 fold により -0.07〜-1.69 と激しく変動)。 訓練 R²=0.208 を大きく下回り、 負値すなわち「平均を予測するだけのモデルより悪い」ことを示す。
💬 読み方: 訓練 R²・調整済み R² と CV-R² の乖離が大きいほど過学習の疑いが強い。 n=47 と小さい競技データでは fold 分割の偶然にも左右されるため、 leave-one-out CV や AIC と併用して頑健に判断する。

📦 R² 系統指標早見表

指標 特徴 使用場面
説明分散割合単一モデルの記述
調整 R²変数数で罰則変数数が異なるモデル比較
CV-R²未知データ性能予測モデル評価
予測 R²(PRESS ベース)leave-one-out ベース小標本での汎化性能
McFadden's pseudo R²対数尤度比ロジスティック回帰・GLM
Nagelkerke R²0-1 に標準化GLM の解釈

🐍 Python 実装 — 自由度調整済み決定係数

公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで 自由度調整済み決定係数 を動作させます。 まずはこのまま実行してみてください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 自由度調整済み決定係数 を 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.linear_model import LinearRegression
import numpy as np
y = df['L3221'].astype(float).values
for cols in [['A1101'], ['A1101','A1303'], ['A1101','A1303','B4101']]:
    X = df[cols].astype(float).values
    lr = LinearRegression().fit(X, y)
    n = len(y); k = X.shape[1]
    r2 = lr.score(X, y)
    adj = 1 - (1-r2)*(n-1)/(n-k-1)
    print(f'{cols}: R^2={r2:.3f}  Adj R^2={adj:.3f}')
📤 実行例(実測) (47, 112) Prefecture A1101 A1303 L3221 0 北海道 5092000 1681000 296888 12 青森県 1184000 417000 263371 24 岩手県 1163000 407000 298536 36 宮城県 2264000 662000 305541 48 秋田県 914000 357000 272086 ['A1101']: R^2=0.111 Adj R^2=0.091 ['A1101', 'A1303']: R^2=0.115 Adj R^2=0.075 ['A1101', 'A1303', 'B4101']: R^2=0.115 Adj R^2=0.053

▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install matplotlib numpy pandas scikit-learn scipy seaborn が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。

⚠️ 落とし穴(補強版 — 調整 R² で踏みやすい7つの罠)

① 調整 R² が「予測性能」だと思う
調整 R² はあくまでサンプル内の指標で、 未知データへの予測誤差は別物です。 過学習が深刻な場合、 調整 R² が 0.95 でも CV-R² が 0.3 ということは普通にあります。 予測性能を語るなら必ず CV-R² または PRESS 統計量を併記しましょう。 「調整 R²=0.8 だから良いモデル」は浅い分析の代表例で、 査読でも頻繁に指摘されます。
② 異なる y で計算した調整 R² を比較する
log(y) と y を別々に予測したモデルの調整 R² を比較しても、 単位の比較ができていないので無意味です。 標本標準偏差で割られる R² は y のスケールに依存します。 異なる目的変数(あるいは変換版)のモデルを比較するなら RMSE をオリジナルスケールに戻すか、 AIC を使う方が筋がいい。 「対数変換した方が R² 高かった」は誤り。
③ 調整 R² が負になっても無視する
サンプル数に対して変数が多すぎる、 または完全に無関係な変数しかない場合、 調整 R² は負になり得ます。 「平均で予測する方がマシ」というシグナルなので、 重大な警告として受け取ってください。 マイナスを「ほぼ 0」と丸めて報告するのは隠蔽。 SSDSE-B(n=47)で k>25 のような状況では普通に起きるので注意。
④ 切片なしモデルで通常の R² を計算する
切片を含めないと SST(全平方和)と SSE(残差平方和)の関係が崩れ、 R² の解釈が変わります。 statsmodels では fit()uncentered オプションに応じて挙動が変わり、 rsquared の意味が違ってきます。 切片なしの R² と切片ありの R² を直接比較しないこと。 必要なら「分散の何割を説明したか」ではなく F 検定や対数尤度で比較すべきです。
⑤ ロジスティック回帰や GLM で調整 R² を語る
調整 R² は OLS の概念。 ロジスティック回帰や GLM では擬似 R²(McFadden, Cox-Snell, Nagelkerke)を使います。 sklearn の LogisticRegression.score は精度(accuracy)であって R² ではありません。 GLM の説明力を語るときは pseudo-R² の種類を明示し、 R² と混同しないように記述しましょう。 「ロジスティック回帰の R² は 0.5 でした」は誤った表現です。
⑥ 調整 R² を「だけ」で変数選択する
変数選択を調整 R² 最大化で行うと、 AIC とは違う結果になり、 ノイズ変数が残りやすい傾向があります。 AIC・BIC・CV-R² と組み合わせ、 複数の規準で頑健に選ばれた変数だけを採用するのが現代的な作法。 「調整 R² が最大だから採用」は古典的アプローチで、 機械学習文脈では不十分です。
⑦ 調整 R² の絶対値だけで「良いモデル」と判定する
分野ごとに R² の「目安」は全く違います。 経済学のクロスセクション分析なら 0.3 でも十分立派、 物理計測なら 0.99 を超えないと不安。 SSDSE-B の社会データなら 0.5〜0.7 が良好な目安。 「調整 R²=0.4 だから悪い」は分野文脈を無視した判断。 過去文献との相対比較や、 ベースラインモデルとの差分(ΔR̄²)で語るのが筋。

⚠️ よくある落とし穴 — 自由度調整済み決定係数

自由度調整済み決定係数 を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。

❌ Adjusted R² が高ければ良いモデル と誤解
予測誤差(CV)と一致しない。 AIC・BIC・CV を併用する。
❌ 負の Adjusted R²
切片だけのモデルに負ける場合 0 以下になる。 異常ではない。
❌ 非線形モデルに使う
ロジスティック・ポアソンなどでは別の Pseudo R² を使う。
🛡 防御策まとめ:「適用条件を確認する」「結果と前提をセットで記述する」「不確実性を必ず併記する」の 3 点を習慣化すれば、 上記の罠の大半は回避できます。

🗺️ 概念マップ — 自由度調整済み決定係数の位置づけ

調整済み R² は「モデルの当てはまり指標」のうち、 説明変数の数で R² を罰則修正したもの。 中心ノードを「調整済み R²」とし、 上位 (回帰モデル評価)、 並列 (R²、 AIC、 BIC、 Mallows Cp)、 下位 (重回帰、 多項式回帰、 ステップワイズ選択) を放射状に配置する。

調整済み R² 回帰モデル評価 (上位) R² (並列) AIC (並列) BIC (並列) 重回帰 (下位手法) ステップワイズ (下位) Mallows Cp (並列) 多項式回帰 (下位)

調整済み R² は R²・AIC・BIC・Mallows Cp と並列の「モデル選択基準」群を成し、 重回帰・多項式回帰・ステップワイズ選択など複数の説明変数を含む回帰モデルの比較で用いる。

Q1: 何を知りたい?(調整済み R² が登場するのはどの段階か)

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

🗺️ 概念マップ — 3つの視点で体系を理解する

調整済み決定係数 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス › 関連・回帰 › 回帰 › 調整済み決定係数

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に 調整済み決定係数 を置き、 そこから R²・重回帰・残差・分散・最小二乗法・単回帰 など 計 7 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語あとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「調整済み決定係数」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「調整済み決定係数」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 3 つの図は同じことを違う角度から見ています。 関係マップでは 調整済み決定係数 の隣に何が並ぶかが、 包含マップとツリーマップでは 統計・データサイエンス から 回帰 へ絞り込んだ先に 調整済み決定係数 がある、 という入れ子の位置が見えます。 「回帰に何が含まれるか思い出せない」ときは包含マップを、 「次に何を読むか決めたい」ときは関係マップを開いてください。

🔗 隣接手法への橋渡し

「自由度調整済み決定係数」は単独で読む数字ではなく、 周辺指標との接続・統合・比較の中で意味を持つ。 「🌐 関連手法・派生」の節が「派生指標カタログ」、 「🌳 手法選択フロー」の節が「最初に何を見るか」のフローなら、 本節は「隣接指標とどう切り替え・組み合わせるか」の意思決定マップ。

① 接続 — 上流から下流への橋

② 統合 — 同時に使う組合せ

③ 比較 — 隣接モデル選択指標の使い分け

候補切り替えると良い場面利点注意点
R²_adj線形回帰でネスト型の変数比較解釈が直感的 (説明率)、 単位なし非線形・GLM で意味薄い、 罰則が弱い
AIC非線形・GLM・時系列含む幅広いモデル比較尤度ベースで一般性高い、 K-L 情報量に基づく絶対値に意味なし、 差で評価、 標本小だと AICc 必要
BIC真のモデル発見、 n が大きい時の節約モデル選択大標本で一致性 (真モデル選択確率→1)真モデル存在仮定、 予測には AIC が優位の場合多い
CV MSE / R²_cv予測精度を重視する実務 (将来データ予測)out-of-sample 性能を直接評価、 仮定に依存しない計算コスト、 fold 分割の偶然依存、 小標本で不安定
Mallows' Cpフル変数モデルがあり、 部分集合選択をする場面σ² 既知前提で MSE と直結、 AIC と漸近等価σ² 推定誤差に敏感、 GLM では未定義

役割分離: 「🌐 関連手法・派生」の節が「派生指標のカタログ」、 本節(🔗 隣接手法への橋渡し)が「指標間の接続・統合・比較」、 「🌳 手法選択フロー」の節が「最初に何を見るかの分岐」。 まず本節で隣接指標との関係を把握 → 「🌳 手法選択フロー」で初期選択 → 結果が直感に反したら本節に戻って AIC/BIC/CV の三角検証、 のループで運用する。

🌳 手法選択フロー

調整済み R² を使うか、 別のモデル選択規準に切り替えるかは モデル種類・目的・サンプル規模・多重共線性・運用評価 の 5 段で判定する。 状況を見ずに「R² が高いほうがいい」と言うのは禁物。

5 段分岐フロー

  1. 分岐 1(モデルの種類): 線形回帰 (OLS) か? Yes → 調整済み R² + 残差プロットを主指標に。 No (GLM / ロジスティック / ポアソン / 非線形) → AIC / BIC / Pseudo R² (McFadden / Nagelkerke) へ切替。 OLS 前提が崩れた状態で R² を語ると誤解釈になる。
  2. 分岐 2(評価目的): 「同データで複数モデル比較」なら 調整済み R²、 「未知データへの予測性能」なら CV による予測 R² / PRESS 統計量、 「真モデル選択 (一致性)」なら BIC。 目的に応じて指標を変えるのが最重要。
  3. 分岐 3(サンプルサイズ): n ≥ 30 → 調整済み R² で実用可。 n < 30 → 調整済み R² + leave-one-out CV 併用、 もしくは AICc (補正版 AIC) を採用。 小標本では自由度の効きが過剰で R² が負になりやすい。
  4. 分岐 4(多重共線性): VIF ≤ 5 → 調整済み R² をそのまま信頼。 5 < VIF ≤ 10 → 調整済み R² は使うが係数推定の標準誤差に注意。 VIF > 10 → 調整済み R² だけでは不足 → Ridge / Lasso の正則化指標 (CV-MSE / Information Criterion) に切替。
  5. 分岐 5(運用後の検証ループ): 残差診断 (等分散・正規性・独立性) → 異常 → 分岐 1 へ戻り GLM 検討。 Cook 距離で影響点検出 → 該当値除外で R² が劇変 → モデル再定式化。 5-fold CV R² と訓練 R² の差大 → 過学習、 分岐 4 (正則化) へ戻る。 「🔗 隣接手法への橋渡し」の節と本節を往復するループ運用が前提。

分岐 1-5 は順に進めるが、 単独で固定するのではなく 分岐 5 で検証 → 分岐 1-4 のどこかへ戻る ループ運用が必須。 「🗺️ 概念マップ」で全体像、 「🔗 隣接手法への橋渡し」で関連指標、 本節(🌳 手法選択フロー)で初期選択、 と階段状に使い分けると迷いが減る。

調整済み R² 選択の 4 判定(参考表)

判定軸条件推奨指標
モデルの種類線形回帰(OLS)調整済み R² + 残差プロット
ロジスティック・ポアソン等の GLM、 非線形回帰AIC / BIC / Pseudo R²
目的複数モデル間の説明力比較(同データセット内)調整済み R²
予測性能の汎化評価CV による予測 R² / PRESS 統計量
真モデルの存在を仮定し一致性のある選択BIC(罰則項 = k log n)
サンプルサイズn ≥ 30 程度(小さくない)調整済み R² で可
n < 30 で過学習懸念調整済み R² + leave-one-out CV を併用
多重共線性VIF ≤ 5(無視できる)調整済み R² をそのまま信頼
VIF > 10(強い共線性)調整済み R² だけでは不足 → Ridge/Lasso 系の正則化指標へ

選択後の検証 5 ステップ

  1. 残差診断: 残差プロットで等分散・正規性・独立性を確認(OLS の前提が崩れていると調整済み R² は嘘をつく)
  2. 外れ値・影響点: Cook 距離 / レバレッジで R² を歪める観測値を特定
  3. 変数選択の感度: 1 変数追加 / 削除で調整済み R² がどう動くか確認(劇的に変わるなら多重共線性疑い)
  4. CV との整合: 5-fold CV の R² と訓練 R² の差が大きすぎないか(差大 → 過学習)
  5. 分野知識との照合: 変数の符号・大きさが理論と整合するか(統計的に有意でも理論に反すれば再検討)

🎨 直感をさらに深める — なぜ「罰則」が必要なのか

通常の決定係数 $R^2$ には、 説明変数を 1 本増やすたびに必ず(少なくとも同じか)大きくなるという構造的なクセがある。 これは新しい変数が完全な乱数であっても、 最小二乗法が「その乱数を使えば残差をほんの少しでも減らせる」係数を必ず見つけてしまうため。 つまり $R^2$ の上昇には「本物の説明力」と「偶然の当てはめ(過大評価)」の 2 つが混ざっている。

そこで、 変数を 1 本足すごとに「その 1 本ぶんの当てはめは、 偶然でもこれくらいは上がるはず」という下駄を差し引くのが調整済み決定係数 $\bar{R}^2$ の発想。 数式 $\bar{R}^2 = 1 - (1 - R^2)\cdot\dfrac{n-1}{n-k-1}$ の $\dfrac{n-1}{n-k-1}$ が、 まさに「変数の数 $k$ が増えるほど大きくなる拡大鏡(=罰則)」として残差ぶんを膨らませている。 無意味な変数を足したときの $R^2$ の微増よりも、 この罰則の効きが勝てば $\bar{R}^2$ は下がる。 これが「無駄な変数を混ぜると値が悪化する」フィルター機能の正体。

💡 一言で:$R^2$ は「使った変数が全部タダ」だと仮定した楽観指標。 $\bar{R}^2$ は「変数 1 本ごとに自由度という会費を払わせる」現実的な指標。 会費に見合う説明力がない変数を足すと、 収支(=$\bar{R}^2$)は赤字(低下)になる。

📊 実データで「R² は上がるのに調整済み R² は下がる」を確認(SSDSE-B-2026・2023年・47県)

出生数(A4101)を総人口(A1101)で予測する強いモデルに、 出生数とは本質的に無関係な家計支出変数(住居費 L322102 → 食料費 L322101)を順に足していく。 総人口だけでほぼ説明が尽きているため、 追加変数は $R^2$ をほとんど動かさない(あるいは 6 桁目でしか動かさない)。 一方で罰則が効くため $\bar{R}^2$ は毎回はっきり下がり、 AICBIC も悪化(増加)する。

モデル(目的変数=出生数 A4101, n=47) k 調整済み R² AIC BIC
M1: 総人口 A110110.9908710.990668832.2835.9
M2: +住居費 L32210220.9908710.990456 ↓834.1 ↑839.7 ↑
M3: +食料費 L32210130.990908 ↑0.990274 ↓836.0 ↑843.4 ↑

出典: SSDSE-B-2026.csv(cp932, skiprows=[1])から 2023 年の 47 都道府県を抽出し、 statsmodels.OLS(...).fit()rsquared / rsquared_adj / aic / bic を実測。 M1→M3 で $R^2$ は 0.990871→0.990908 と(非減少で)微増するのに対し、 $\bar{R}^2$ は 0.990668→0.990274 と単調減少。 「$R^2$ の増加=改善」ではないことが実データで確認できる。

⚠️ 落とし穴を深掘り — 調整済みでも「唯一の基準」にはならない

$\bar{R}^2$ は $R^2$ の過大評価を和らげるが、 それでもモデルの良し悪しを 1 つの数字で決められるわけではない。 ここでは特に誤解の多い点を、 既出の 7 罠を補う形で整理する。

A. モデル選択の「唯一の基準」ではない
$\bar{R}^2$ の最大化と AIC 最小化・BIC 最小化はしばしば異なるモデルを選ぶ。 $\bar{R}^2$ の罰則(自由度)は AIC の罰則($2k$)や BIC の罰則($k\log n$)より緩いことが多く、 $\bar{R}^2$ 基準は変数を残しがち。 説明が目的なら $\bar{R}^2$、 予測なら CV、 真のモデル探索なら BIC、 と目的で使い分け、 複数規準が同意する変数だけを信頼するのが安全。
B. 負値になり得る(異常ではなくシグナル)
$n$ に対して $k$ が大きい、 または無関係な変数ばかりのとき $\bar{R}^2 < 0$ になる。 これは「全体平均で予測するほうがマシ」という明確な警告で、 バグではない。 SSDSE-B(n=47)で説明変数を 20 本以上詰め込めば普通に発生する。 0 に丸めて報告するのは隠蔽にあたる。
C. 標本外(out-of-sample)予測性能とは別物
$\bar{R}^2$ はあくまで手元の標本内で計算される罰則付き指標。 自由度で軽く罰則を入れても、 未知データでの予測誤差を保証しない。 汎化性能を語るなら 交差検証による予測 R²(CV-R²)や PRESS 統計量を別途出すこと。 標本内 $\bar{R}^2$ が高くても CV-R² が大きく落ちるなら過学習を疑う。
D. AIC / BIC とは「罰則の設計思想」が違う
$\bar{R}^2$ は「分散をどれだけ説明したか」を自由度で補正した当てはまりの指標。 AIC / BIC は対数尤度に基づく情報量規準で、 OLS 以外(GLM・時系列など)にも使える。 スケールも解釈も異なるため、 $\bar{R}^2$ と AIC を直接足し引きしたり同一軸で比べたりしない。 AIC は予測志向、 BIC は一致性志向(大標本で真モデルを選ぶ)という性格差も押さえる。
E. 変数選択の過学習は防ぎきれない
「$\bar{R}^2$ が最大になる変数集合」を全探索やステップワイズで選ぶと、 選択という行為そのものが偶然のノイズに過適合する(selection bias / 多重比較問題)。 $\bar{R}^2$ の 1 変数ぶんの罰則は、 何十通りも試した中からベストを拾う行為の楽観性までは補正できない。 選択後は必ず別のホールドアウトや 交差検証で検証し、 ステップワイズの結果を鵜呑みにしない。
F. R² 系の比較は「同じ従属変数」でのみ
$R^2$・$\bar{R}^2$ は目的変数 $y$ の全変動(SST)を基準に正規化される値。 したがって $y$ と $\log y$、 あるいは水準と差分など目的変数が違うモデルの $\bar{R}^2$ を並べても比較にならない。 変換をまたぐ比較は、 元スケールに戻した RMSE や、 尤度ベースの AIC で行う。

🚀 発展 — 情報量規準・交差検証・予測R²への地図

$\bar{R}^2$ は「当てはまりに変数数の罰則を入れる」という発想の最も素朴な実装。 同じ発想をより厳密・汎用にした一群がモデル選択規準と検証手法である。 それぞれの位置づけを表で俯瞰する。

指標 罰則・考え方 $\bar{R}^2$ との違い・使いどころ
AIC$-2\log L + 2k$。 対数尤度に $2k$ の罰則。OLS 以外にも使える汎用性。 予測志向。 罰則が $\bar{R}^2$ より強く、 変数を絞りやすい。 小標本は AICc を使う。
BIC$-2\log L + k\log n$。 罰則が標本数 $n$ で増大。$n$ が大きいほど強罰則=シンプル志向。 真モデルを選ぶ一致性。 説明変数を最も厳しく削る。
Mallows' $C_p$$C_p = \dfrac{\text{SSE}_p}{\hat\sigma^2} - n + 2p$。 残差平方和+変数数の罰則。OLS の部分集合選択用。 $C_p \approx p$ が目安。 AIC とほぼ等価な選択を与える。 モデル選択で扱う(本サイトに単独ページなし)。
交差検証 R²(CV-R²)データを分割し、 学習に使っていない分割で $R^2$ を測る。標本内罰則ではなく実際の標本外予測を直接評価。 過学習検出に最も直接的。 交差検証参照。
予測 R²(PRESS ベース)$1 - \text{PRESS}/\text{SST}$。 PRESS は leave-one-out 残差の平方和。1 点ずつ抜いた予測誤差から算出。 $\bar{R}^2$ より過学習に敏感で、 追加変数で悪化しやすい(本サイトに単独ページなし・テキストで補足)。

🧭 決定係数そのものの限界

🧩 まとめ:$\bar{R}^2$ は「変数の水増しを見抜く最初のフィルター」。 だが最終判断は、 AICBIC(情報量規準)、 交差検証(標本外性能)、 残差診断(前提確認)を重ねて下す。 単一指標ではなく複数規準の合意でモデルを選ぶのが現代的な作法。

🔖 キーワード索引(拡張版 — 自由度調整済み R²)

調整済み R² と他の予測誤差規準を比較できる用語を集めました。

SSDSE-B 実値 決定係数 R² 自由度 残差平方和 予測 R² PRESS統計量 AIC との関係 負の調整 R² サンプル外性能 statsmodels scikit-learn scipy.stats