STEP 12:決定係数(R²)の解釈

📊 STEP 12: 決定係数(R²)の解釈

モデルの説明力を正しく理解しよう

📋 このステップで学ぶこと

  • 決定係数(R²)とは何か – 基本概念の理解
  • R²の計算方法と意味
  • 調整済みR²(Adjusted R²)の重要性
  • R²の目安と分野による違い
  • 過学習の危険性とモデル選択

学習時間の目安:2.5時間

🎯 1. 決定係数(R²)とは

R²の基本概念

📌 決定係数(R²、アールじじょう)とは

回帰モデルが、目的変数の変動をどれだけ説明できるかを表す指標

範囲:0 〜 1(または 0% 〜 100%)
読み方:アール二乗、決定係数、寄与率

意味:
・R² = 0.8 → モデルが80%の変動を説明できる
・R² = 0.5 → モデルが50%の変動を説明できる
・R² = 1.0 → 完璧な予測(すべての点が回帰直線上)

R²をイメージで理解する

💡 わかりやすい例え

例:テストの点数を予測

  • 平均点で予測:「全員60点」と予測 → 当たらない
  • 勉強時間で予測:勉強時間から点数を予測 → まあまあ当たる

R² = 0.7の意味:
「平均点で予測」よりも、「勉強時間で予測」の方が、70%も当たりやすくなった!
→ モデルが70%の変動を説明できている

R²の計算式

【R²の計算式】 R² = 1 – (残差平方和 / 全変動) または R² = (説明された変動 / 全変動) 【用語の説明】 1. 全変動(Total Sum of Squares, TSS) = データのバラつき全体 = Σ(実際の値 – 平均値)² 2. 残差平方和(Residual Sum of Squares, RSS) = モデルで説明できなかった変動 = Σ(実際の値 – 予測値)² 3. 説明された変動(Explained Sum of Squares, ESS) = モデルで説明できた変動 = 全変動 – 残差平方和

具体例で計算

📊 実際にR²を計算してみよう

データ:

X(勉強時間) Y(実際の点数) 予測点数 残差
25052-2
47068+2
68584+1
895100-5

計算:

平均点 = (50+70+85+95)/4 = 75点

全変動 = (50-75)² + (70-75)² + (85-75)² + (95-75)²
   = 625 + 25 + 100 + 400 = 1150

残差平方和 = (-2)² + (2)² + (1)² + (-5)²
     = 4 + 4 + 1 + 25 = 34

R² = 1 – (34 / 1150) = 1 – 0.0296 = 0.9704

結果:R² = 0.97 = 97%
→ モデルが点数の変動の97%を説明できている!

📈 2. R²の解釈

R²の値の目安

R²の値 評価 説明
0.9 〜 1.0 非常に良い ほぼ完璧な予測
0.7 〜 0.9 良い 実務で十分使える
0.5 〜 0.7 まあまあ 改善の余地あり
0.3 〜 0.5 低い 他の変数を追加検討
0 〜 0.3 非常に低い モデルが不適切

分野による目安の違い

⚠️ 分野によって「良いR²」の基準は異なる

自然科学・工学:R² > 0.8が期待される
物理法則に基づくので、予測精度が高い

ビジネス・経済:R² > 0.5でも十分
人間の行動は予測が難しいので、ハードルが低め

社会科学・心理学:R² > 0.3でも「良い」
人間の心理や社会現象は複雑で、予測が非常に難しい

重要:
「R²が低い = ダメなモデル」とは限らない!
分野や目的に応じて、適切な基準で評価しましょう。

R²が高ければ良いモデルか?

🚨 R²が高くても、良いモデルとは限らない

問題1:過学習(Overfitting)
説明変数を増やせば増やすほど、R²は高くなる。
でも、新しいデータでの予測精度は悪化することがある。
→ STEP 14で詳しく学習

問題2:外れ値の影響
1つの極端な値が、R²を大きく変えることがある。
→ 散布図で外れ値を確認する

問題3:因果関係の誤解
R²が高くても、因果関係があるとは限らない。
例:アイスクリームの売上と溺死者数(R²は高いが因果関係なし)

重要:
R²だけでなく、残差分析、ビジネス的妥当性、理論的根拠も確認する!

🔧 3. 調整済みR²(Adjusted R²)

なぜ調整済みR²が必要か

📌 通常のR²の問題点

問題:説明変数を追加すると、R²は必ず上がる(または同じ)

例:
・広告費だけで予測 → R² = 0.70
・広告費 + 気温で予測 → R² = 0.75
・広告費 + 気温 + 価格 → R² = 0.80
・広告費 + 気温 + 価格 + 全く関係ない変数 → R² = 0.81
→ 無意味な変数を追加してもR²が上がってしまう!

解決策:
調整済みR²を使う!
→ 不要な変数を追加すると、逆に下がる

調整済みR²の計算式

【調整済みR²の計算式】 調整済みR² = 1 – [(1 – R²) × (n – 1) / (n – p – 1)] n : サンプルサイズ(データ数) p : 説明変数の数 【通常のR²との違い】 通常のR²: ・説明変数を追加すると、必ず上がる(または同じ) 調整済みR²: ・不要な変数を追加すると、下がる ・本当に重要な変数を追加した時だけ、上がる

具体例で比較

📊 通常のR² vs 調整済みR²

状況:サンプルサイズ n = 100

モデル 説明変数の数 調整済みR²
モデル1 2 0.70 0.69
モデル2 5 0.75 0.74
モデル3 10 0.78 0.76
モデル4 20 0.80 0.75

解釈:
・通常のR²:モデル4が最も高い(0.80)
・調整済みR²:モデル3が最も高い(0.76)
モデル3が最適! モデル4は変数が多すぎる

調整済みR²の使い方

✅ 実務での活用

1. モデル選択

複数のモデルを比較する時、調整済みR²が最も高いモデルを選ぶ

2. 変数の追加判断

新しい変数を追加して、調整済みR²が上がれば採用、下がれば却下

3. 過学習の防止

調整済みR²を見ることで、変数の入れすぎを防げる

💻 4. ExcelとPythonでの確認

Excelでの確認

【Excelの分析ツールでR²を確認】 1. 「データ」タブ → 「データ分析」 → 「回帰」 2. 入力Y範囲、入力X範囲を設定してOK 3. 結果シートの「回帰統計」セクションを確認: 重相関R: 0.9823 重決定R²: 0.9645 ← これが通常のR² 補正R²: 0.9570 ← これが調整済みR² 標準誤差: 15.234 観測数: 24

Pythonでの確認

# ============================================ # R²(決定係数)と調整済みR²の計算 # ============================================ import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # ============================================ # サンプルデータの作成 # ============================================ data = { ‘広告費’: [50, 60, 70, 55, 80, 90, 85, 75], # 説明変数1 ‘気温’: [25, 28, 30, 26, 32, 33, 31, 29], # 説明変数2 ‘売上’: [310, 420, 480, 330, 600, 650, 550, 500] # 目的変数 } df = pd.DataFrame(data) # ============================================ # 回帰分析の実行 # ============================================ X = df[[‘広告費’, ‘気温’]] # 説明変数(2つ) y = df[‘売上’] # 目的変数 model = LinearRegression() model.fit(X, y) # ============================================ # R²(決定係数)の計算 # ============================================ # r2_score(実際の値, 予測値): R²を計算 # → モデルがデータをどれだけ説明できているか # → 0〜1の値、1に近いほど良い y_pred = model.predict(X) r2 = r2_score(y, y_pred) # ============================================ # 調整済みR²の計算 # ============================================ # 調整済みR² = 1 – (1-R²) × (n-1) / (n-p-1) # # なぜ調整済みR²が必要か? # → 変数を増やすとR²は必ず上がる(たとえ無関係な変数でも) # → 調整済みR²は「変数の数」を考慮する # → 無駄な変数を追加すると、調整済みR²は下がる # # n: サンプルサイズ(データの行数) # p: 説明変数の数(Xの列数) n = len(y) # サンプルサイズ p = X.shape[1] # 説明変数の数(shape[1]は列数) # 調整済みR²の計算式 adjusted_r2 = 1 – (1 – r2) * (n – 1) / (n – p – 1) print(“【R²と調整済みR²の比較】”) print(f”R²: {r2:.4f}”) print(f”調整済みR²: {adjusted_r2:.4f}”) print(f”\nサンプルサイズ(n): {n}”) print(f”説明変数の数(p): {p}”) print(f”\n【解釈】”) print(f”・R²が{r2*100:.1f}% → 売上の変動の{r2*100:.1f}%を説明できる”) print(f”・調整済みR²は変数の数を考慮した値”) print(f”・両者の差が小さい → 適切な変数の数”)
# 出力例 【R²と調整済みR²の比較】 R²: 0.9645 調整済みR²: 0.9570 サンプルサイズ(n): 8 説明変数の数(p): 2 【解釈】 ・R²が96.5% → 売上の変動の96.5%を説明できる ・調整済みR²は変数の数を考慮した値 ・両者の差が小さい → 適切な変数の数

statsmodelsでの詳細確認

# ============================================ # statsmodelsで詳細な統計情報を取得 # ============================================ # statsmodelsのメリット: # → R²と調整済みR²が自動で計算される # → p値、F値など追加の統計情報も得られる import statsmodels.api as sm # ============================================ # 定数項(切片)の追加 # ============================================ # sm.add_constant(): 定数列(全て1)を追加 # → statsmodelsは切片を自動計算しないため必要 X_with_const = sm.add_constant(X) # ============================================ # OLS回帰(最小二乗法)の実行 # ============================================ # sm.OLS(y, X): Ordinary Least Squaresモデルを作成 model_sm = sm.OLS(y, X_with_const) results = model_sm.fit() # ============================================ # サマリー(詳細レポート)を表示 # ============================================ # .summary(): R²、調整済みR²、係数、p値などが全て含まれる print(results.summary()) print(“\n【結果の読み方】”) print(“R-squared: 通常のR²(決定係数)”) print(“Adj. R-squared: 調整済みR²(変数の数を考慮)”)
# 出力例(一部抜粋) OLS Regression Results ============================================================================== Dep. Variable: 売上 R-squared: 0.965 Model: OLS Adj. R-squared: 0.957 Method: Least Squares F-statistic: 67.86 ============================================================================== R-squared: 0.965 ← 通常のR² Adj. R-squared: 0.957 ← 調整済みR² 【結果の読み方】 R-squared: 通常のR²(決定係数) Adj. R-squared: 調整済みR²(変数の数を考慮)

複数モデルの比較

# ============================================ # 複数のモデルを比較してR²と調整済みR²を確認 # ============================================ # 目的:「変数を追加する価値があるか」を判断 # → R²は変数を増やすと必ず上がる # → 調整済みR²は無駄な変数で下がる # → 調整済みR²が上がれば、変数追加の価値あり def calculate_r2_metrics(X, y): “”” R²と調整済みR²を計算する関数 Parameters: ———– X : DataFrame – 説明変数 y : Series – 目的変数 Returns: ——– r2 : float – 決定係数 adj_r2 : float – 調整済み決定係数 “”” model = LinearRegression() model.fit(X, y) y_pred = model.predict(X) # R²の計算 r2 = r2_score(y, y_pred) # 調整済みR²の計算 n = len(y) # サンプルサイズ p = X.shape[1] # 説明変数の数 adj_r2 = 1 – (1 – r2) * (n – 1) / (n – p – 1) return r2, adj_r2 # ============================================ # モデル1:広告費のみ(シンプルモデル) # ============================================ X1 = df[[‘広告費’]] r2_1, adj_r2_1 = calculate_r2_metrics(X1, y) # ============================================ # モデル2:広告費 + 気温(変数追加) # ============================================ X2 = df[[‘広告費’, ‘気温’]] r2_2, adj_r2_2 = calculate_r2_metrics(X2, y) # ============================================ # 結果の比較 # ============================================ print(“【モデル比較】”) print(f”モデル1(広告費のみ) : R²={r2_1:.4f}, 調整済みR²={adj_r2_1:.4f}”) print(f”モデル2(広告費+気温): R²={r2_2:.4f}, 調整済みR²={adj_r2_2:.4f}”) # 調整済みR²で判断 print(“\n【どちらのモデルが良いか?】”) if adj_r2_2 > adj_r2_1: improvement = adj_r2_2 – adj_r2_1 print(f”→ モデル2の方が良い(調整済みR²が+{improvement:.4f}向上)”) print(f”→ 「気温」を追加する価値あり!”) else: print(f”→ モデル1の方が良い”) print(f”→ 「気温」は追加しても改善しない = 不要な変数”)
# 出力例 【モデル比較】 モデル1(広告費のみ) : R²=0.9421, 調整済みR²=0.9325 モデル2(広告費+気温): R²=0.9645, 調整済みR²=0.9570 【どちらのモデルが良いか?】 → モデル2の方が良い(調整済みR²が+0.0245向上) → 「気温」を追加する価値あり!

⚠️ 5. 過学習とモデル選択

過学習(Overfitting)とは

🚨 過学習の危険性

過学習:モデルが過去のデータに合いすぎて、未来の予測が悪くなること

例:
・過去のデータ:R² = 0.99(ほぼ完璧!)
・新しいデータ:予測が全然当たらない…
→ これが過学習

原因:
・説明変数が多すぎる
・サンプルサイズが小さい
・ノイズ(たまたまの変動)まで学習してしまう

過学習を防ぐ方法

✅ 過学習の防止策

1. 調整済みR²を確認

変数を追加して、調整済みR²が下がったら、その変数は不要

2. 説明変数の数を制限

サンプルサイズの10分の1程度まで
例:データが100件 → 説明変数は最大10個

3. テストデータで検証

データを「学習用」と「テスト用」に分けて、テストデータでの精度を確認
→ STEP 14で詳しく学習

4. 交差検証(Cross-Validation)

データを複数のグループに分けて、順番にテストする
→ STEP 14で詳しく学習

5. 重要な変数だけを選ぶ

ビジネス的に意味がある変数、p値が小さい変数だけを使う

適切なモデルの選び方

📌 モデル選択のフロー

ステップ1:シンプルなモデルから始める
まず、最も重要と思われる1〜2個の変数で回帰分析

ステップ2:変数を追加
次に重要と思われる変数を1つずつ追加
各ステップで調整済みR²を確認

ステップ3:最適なモデルを選択
調整済みR²が最も高いモデルを選ぶ

ステップ4:テストデータで検証
選んだモデルが、新しいデータでも予測精度が高いか確認

ステップ5:ビジネス的妥当性を確認
係数の符号(+/-)が、理論的に正しいか確認

📌 オッカムの剃刀(Occam’s Razor)

「同じくらいの精度なら、よりシンプルなモデルを選ぶ」という原則です。シンプルなモデルは解釈しやすく、過学習のリスクも低くなります。

📝 STEP 12 のまとめ

✅ このステップで学んだこと

1. 決定係数(R²)の基本

  • モデルの説明力を表す指標(0〜1)
  • 目的変数の変動のうち、モデルで説明できる割合
  • 0.7以上で良い(ただし分野による)

2. 調整済みR²

  • 不要な変数を追加すると下がる改良版
  • モデル選択の重要な指標
  • 変数追加の判断に使用

3. 過学習の防止

  • R²が高くても、新しいデータで予測が外れる現象
  • 調整済みR²、テストデータ、交差検証で防止
  • シンプルなモデルを優先(オッカムの剃刀)
💡 最も大切なポイント

R²は、回帰モデルの説明力を評価する最も基本的な指標です。ただし、R²が高い = 良いモデルとは限りません。

実務では:

  • 調整済みR²でモデルを選択
  • テストデータで予測精度を確認(STEP 14)
  • 残差分析でモデルの妥当性を検証(STEP 13)
  • ビジネス的妥当性を常に確認

これらを総合的に判断して、最適なモデルを選びましょう。次のSTEP 13では、残差分析とモデル診断を学びます!

🎯 次のステップの予告

STEP 13では、「残差分析とモデル診断」を学びます。残差プロット、Q-Qプロット、等分散性の確認など、モデルの妥当性を確認する方法を習得します!

📝 理解度チェック

学んだ内容を確認しましょう。解答を見る前に、まず自分で考えてみてください。

問題 1 基礎

R² = 0.85 の回帰モデルがあります。
これはどういう意味ですか?わかりやすく説明してください。

【解答】

R² = 0.85 = 85%

意味:
目的変数(例:売上)の変動のうち、85%が説明変数(例:広告費、気温)で説明できる

残りの15%は、モデルに含まれていない他の要因(季節、競合の動向、経済状況など)や、ランダムな変動によるもの。

評価:
85%は非常に高い説明力で、実務で十分使えるモデルと言えます。このモデルを使って、かなり正確な予測ができます。

問題 2 基礎

調整済みR²が必要な理由を説明してください。

【解答】

通常のR²の問題点:
説明変数を追加すると、R²は必ず上がる(または同じ)。たとえ無意味な変数を追加しても、R²は上がってしまう。

調整済みR²のメリット:

  • 不要な変数を追加すると、逆に下がる
  • 本当に重要な変数を追加した時だけ、上がる
  • 変数の数とサンプルサイズを考慮している

使い方:
複数のモデルを比較する際、調整済みR²が最も高いモデルを選ぶことで、過学習を防ぎつつ最適なモデルを選択できる。

問題 3 応用

以下の2つのモデルを比較してください。どちらが良いモデルですか?

モデルA:説明変数2個、R² = 0.75、調整済みR² = 0.74
モデルB:説明変数10個、R² = 0.80、調整済みR² = 0.72

【解答】モデルAの方が良い

理由:

項目 モデルA モデルB
説明変数の数 2個(シンプル) 10個(複雑)
0.75 0.80
調整済みR² 0.74(高い) 0.72(低い)

判断:
・モデルBは、通常のR²は高いが、調整済みR²はモデルAより低い
・これは、モデルBが変数を入れすぎていることを示している
・モデルAの方が、シンプルで、かつ説明力も十分

結論:モデルAを採用すべき。オッカムの剃刀の原則:「同じくらいの精度なら、よりシンプルなモデルを選ぶ」

問題 4 応用

過学習(Overfitting)とは何ですか?また、過学習を防ぐ方法を3つ挙げてください。

【解答】

過学習とは:
モデルが過去のデータに合いすぎて、新しいデータでの予測精度が悪くなる現象。学習データではR²が高くても、テストデータでは予測が当たらなくなる。

過学習を防ぐ方法:

  1. 調整済みR²を確認:変数を追加して調整済みR²が下がったら、その変数は不要
  2. 説明変数の数を制限:サンプルサイズの10分の1程度まで
  3. テストデータで検証:データを学習用とテスト用に分けて精度を確認
  4. 交差検証(Cross-Validation):データを複数のグループに分けて順番にテスト
  5. 重要な変数だけを選ぶ:ビジネス的に意味がある変数、p値が小さい変数のみ使用
問題 5 発展

以下の状況で、調整済みR²を計算してください。

・サンプルサイズ:n = 50
・説明変数の数:p = 4
・R² = 0.80

また、説明変数を1つ追加して p = 5 にしたところ、R² = 0.82 になりました。
この変数は追加すべきですか?

【解答】

計算式:

調整済みR² = 1 – [(1 – R²) × (n – 1) / (n – p – 1)]

元のモデル(p = 4):

調整済みR² = 1 – [(1 – 0.80) × (50 – 1) / (50 – 4 – 1)]
     = 1 – [0.20 × 49 / 45]
     = 1 – 0.2178
     = 0.7822

新しいモデル(p = 5):

調整済みR² = 1 – [(1 – 0.82) × (50 – 1) / (50 – 5 – 1)]
     = 1 – [0.18 × 49 / 44]
     = 1 – 0.2004
     = 0.7996

比較:

モデル 調整済みR²
元のモデル(p=4) 0.80 0.7822
新しいモデル(p=5) 0.82 0.7996

結論:
調整済みR²が 0.7822 → 0.7996 に上がったので、この変数は追加すべきです。ただし、上昇幅は小さい(+0.0174)ので、ビジネス的な重要性やp値も確認して、最終判断しましょう。

❓ よくある質問

Q1: R²が1.0(100%)になることはありますか?

理論的にはあり得ますが、現実ではほとんどありません。

R² = 1.0の意味:
すべてのデータ点が、回帰直線上にぴったり乗っている → 完璧な予測

現実では:

  • 物理法則に基づく実験データなら、R² = 0.99以上もあり得る
  • ビジネスデータでR² = 1.0なら、何か間違っている可能性が高い(データの入力ミス、目的変数と説明変数が同じ、など)

注意:R² = 0.999…のような非常に高い値も、過学習の可能性があるので注意!

Q2: R²がマイナスになることはありますか?

通常の回帰分析では、R²は0〜1の範囲です。

ただし、以下の場合にマイナスになることがあります:

1. テストデータでの評価
学習データとは別のテストデータで予測精度を評価する場合、予測が平均値よりも悪いと、R²がマイナスになることがある。
→ これは過学習のサインです!

2. 切片なしの回帰
切片(定数項)を含めずに回帰分析を行うと、R²がマイナスになることがある。

対処:

  • 通常は切片を含めて分析する
  • R²がマイナスなら、モデルが不適切なので見直す
Q3: 単回帰のR²と、重回帰のR²は、どう違いますか?

計算方法は同じですが、意味が少し異なります。

単回帰のR²:

  • 1つの説明変数による説明力
  • 相関係数rの2乗と同じ(R² = r²)
  • 例:R² = 0.64 → 相関係数 r = 0.8

重回帰のR²:

  • 複数の説明変数による総合的な説明力
  • 相関係数とは直接の関係なし
  • 通常、単回帰より高くなる(変数が増えるため)

重要:重回帰では、調整済みR²を使ってモデルを比較しましょう。

Q4: R²を改善する方法はありますか?

はい、いくつかの方法があります。

1. 重要な説明変数を追加
目的変数に影響する他の要因を見つけて追加(ただし、むやみに増やすと過学習のリスク)

2. 外れ値を除去
極端な値がR²を下げることがある(ただし、外れ値にも意味がある場合は残す)

3. 変数変換
対数変換、平方根変換など。非線形の関係を線形に近づける

4. 交互作用項の追加
X1×X2のような項を追加。2つの変数の相乗効果を捉える

5. 多項式回帰
X、X²、X³など。曲線的な関係を捉える

注意:R²を高くすることが目的ではなく、予測精度を高めることが目的!調整済みR²やテストデータでの精度を必ず確認しましょう。

Q5: R²が低い場合、そのモデルは使えませんか?

必ずしもそうとは限りません。

R²が低くても使える場合:

1. 分野による
社会科学や心理学では、R² = 0.3でも「良い」とされる。人間の行動は予測が難しいため。

2. ビジネス的価値がある
R² = 0.4でも、ROIが高ければ十分使える。例:広告費と売上の関係が40%でも説明できれば、広告戦略に役立つ。

3. 他に良い手法がない
R²が低くても、何も予測しないよりはマシ。ただし、限界を認識して使う。

R²が低い時の対応:

  • 他の説明変数を探す
  • 別の分析手法を検討(機械学習など)
  • 予測ではなく、要因分析に使う
  • 「予測精度は低い」と明記して使う
Q6: R²と相関係数rの関係は?

単回帰の場合:R² = r²(相関係数の2乗)

例:

  • 相関係数 r = 0.9 → R² = 0.81
  • 相関係数 r = 0.8 → R² = 0.64
  • 相関係数 r = 0.7 → R² = 0.49
  • 相関係数 r = -0.8 → R² = 0.64(マイナスの相関でも同じ)

重回帰の場合:
複数の変数があるため、単純にr²とはならない。重相関係数R(重決定係数の平方根)を使う。

注意:相関係数は-1〜1の範囲ですが、R²は0〜1の範囲です。

📝

学習メモ

ビジネスデータ分析・意思決定 - Step 12

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE