論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ランダムフォレスト
Random Forest (RF)
多数の決定木をブートストラップサンプリングで学習させ、結果を平均/多数決するアンサンブル手法。
機械学習RFRFRandom Forestランダムフォレスト
📍 文脈💡 30秒結論

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

論文中に 「ランダムフォレスト」として登場する用語。

ランダムフォレスト とは:多数の決定木をブートストラップサンプリングで学習させ、結果を平均/多数決するアンサンブル手法。

💡 30秒で分かる結論

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
 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()
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

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

このページの上にある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 法で都道府県を分類、 デンドログラム作成

📚 統計学習の総合ガイド

🎯 学習目標

このページの概念をマスターすることで、 以下のスキルが身につきます:

📊 SSDSE-B-2026 データの構造

このコンペの主要データセット(SSDSE-B-2026)の構造:

🔍 主要な変数群

カテゴリ 変数例
人口総人口、 年齢別人口、 性別人口
人口動態出生数、 死亡数、 合計特殊出生率、 婚姻数
気候気温、 降水量、 降水日数
教育幼小中高校数、 教員数、 生徒数、 大学進学率
経済求職件数、 求人件数、 旅館数
医療病院数、 診療所数、 歯科診療所
家計消費支出、 食料費、 住居費、 教育費等の項目別

💡 ジャストインタイム型学習

このガイドは「必要なときに必要な知識」を提供する設計:

🛠️ Python データサイエンス環境

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 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())
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

🌟 効果的なEDAテンプレート

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 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
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()
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

📈 報告書テンプレート

分析結果を報告する際の標準的な構成:

  1. 背景・目的:なぜこの分析が必要か
  2. データ:出所、 サンプルサイズ、 期間
  3. 方法:使用した統計手法、 仮定
  4. 結果:図表、 統計量、 検定結果
  5. 解釈:結果が何を意味するか
  6. 限界:分析の制約
  7. 結論:要点まとめ、 今後の課題

🗺️ 統計手法選択フローチャート

Q1: 何を知りたい?

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

🚀 実務応用の深掘り

典型的なプロジェクトの流れ

  1. 問題理解:ステークホルダーとの対話、 KGI/KPI 設定
  2. データ収集:内部DB、 公的データ(SSDSE等)、 API
  3. EDA:データの全体像把握、 異常検出
  4. 仮説立案:ドメイン知識からの仮説
  5. モデリング:シンプルから複雑へ段階的に
  6. 検証:CV、 ホールドアウト、 A/Bテスト
  7. 解釈:可視化、 SHAP、 部分依存プロット
  8. 展開:本番デプロイ、 監視

ベストプラクティス

論文・コンペでよく使う言い回し

日本語 英語
統計的に有意statistically significant
効果量effect size
95%信頼区間95% confidence interval (CI)
標本サイズsample size
検出力statistical power
第1種の誤りType I error / false positive
第2種の誤りType II error / false negative
多重比較問題multiple comparisons problem
過学習overfitting
汎化性能generalization
交差検証cross-validation (CV)

統計データ活用コンペでのコツ

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

ランダムフォレスト がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 体系階層に未登録

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

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

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

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

大きな円が小さな円を包含する Circle Packing 図。 「ランダムフォレスト」は緑色でハイライト

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

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

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ランダムフォレスト」は緑色でハイライト

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

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

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引(拡張)

RFとは 🧮 SSDSE-B 実例 🐍 実装バリエーション ⚠️ 落とし穴集 特徴量重要度 OOB GBMとの違い 関連用語マップ

🧮 SSDSE-B を使ったランダムフォレストの実例

「医師数_人口10万対」を予測するランダムフォレスト回帰を、 SSDSE-B 2020年データで構築します。

① データ準備と訓練

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, cross_val_score

df = pd.read_csv('data/raw/SSDSE-B-2023.csv', encoding='shift_jis', header=[0,1])
df.columns = ['_'.join(c).strip() for c in df.columns]
d = df[df['年度_Year'] == 2020].dropna()

features = ['高齢化率', '1人当たり県民所得', '人口密度', '完全失業率',
            '合計特殊出生率', '総人口_Total population']
X, y = d[features], d['医師数_人口10万対']
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42)

rf = RandomForestRegressor(n_estimators=500, max_depth=10,
                            min_samples_leaf=2, oob_score=True,
                            random_state=42, n_jobs=-1)
rf.fit(X_tr, y_tr)
print(f'Train R² = {rf.score(X_tr, y_tr):.3f}')
print(f'Test  R² = {rf.score(X_te, y_te):.3f}')
print(f'OOB   R² = {rf.oob_score_:.3f}')
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

典型結果:Train R² = 0.92, Test R² = 0.55, OOB R² = 0.50。 Train と Test の差は過学習の兆候。 47県データの小ささから決定的予測は困難だが、 OOB R² が CV と一致するため信頼できる推定。

② 特徴量重要度

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
import pandas as pd
imp = pd.Series(rf.feature_importances_, index=features).sort_values(ascending=False)
print(imp)
# 高齢化率: 0.42, 県民所得: 0.21, 人口密度: 0.16, 失業率: 0.10, 出生率: 0.07, 総人口: 0.04
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

「高齢化率」が最重要(42%)、 次が「県民所得」(21%)。 線形回帰でも同じ傾向だが、 RF は非線形・交互作用を自動的に捕捉する点が違う。

③ Permutation Importance(より頑健)

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
5
6
from sklearn.inspection import permutation_importance
r = permutation_importance(rf, X_te, y_te, n_repeats=30, random_state=42)
for i in r.importances_mean.argsort()[::-1]:
    print(f'{features[i]:20s}: {r.importances_mean[i]:.3f} ± {r.importances_std[i]:.3f}')
# テストセットで「変数をシャッフルしたら精度がどれだけ落ちるか」で測る
# 標準の feature_importances_ よりバイアスが少ない(特にカテゴリ・スケール違いに頑健)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

🐍 実装バリエーション — scikit-learn / XGBoost / LightGBM / CatBoost

(A) scikit-learn RandomForestRegressor — 標準

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
rf = RandomForestRegressor(n_estimators=500, max_depth=None,
                            min_samples_leaf=1, max_features='sqrt',
                            oob_score=True, n_jobs=-1, random_state=42)
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

(B) scikit-learn ExtraTreesRegressor — 高速・分散低減

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
from sklearn.ensemble import ExtraTreesRegressor
et = ExtraTreesRegressor(n_estimators=500, n_jobs=-1, random_state=42)
# 分割点もランダム化 → さらに分散低減・学習高速化
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

(C) XGBoost — 勾配ブースティング

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
5
from xgboost import XGBRegressor
xgb = XGBRegressor(n_estimators=500, learning_rate=0.05, max_depth=5,
                    subsample=0.8, colsample_bytree=0.8, random_state=42)
xgb.fit(X_tr, y_tr, eval_set=[(X_te, y_te)], early_stopping_rounds=20)
# RF より高精度になることが多い。 ハイパーパラメータ調整が肝心
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

(D) LightGBM — 大規模高速

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
5
import lightgbm as lgb
lgb_model = lgb.LGBMRegressor(n_estimators=500, learning_rate=0.05,
                               num_leaves=31, random_state=42)
lgb_model.fit(X_tr, y_tr, eval_set=[(X_te, y_te)], callbacks=[lgb.early_stopping(20)])
# 数百万行データでも数秒で訓練。 カテゴリ・欠損値ネイティブ対応
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

(E) CatBoost — カテゴリ変数特化

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
from catboost import CatBoostRegressor
cat = CatBoostRegressor(iterations=500, learning_rate=0.05, depth=6, verbose=0)
cat.fit(X_tr, y_tr, cat_features=[])
# カテゴリ変数の前処理不要、 デフォルトでも高精度
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

(F) SHAP による解釈

🎯 解説: ランダムフォレスト(Random Forest)は多数の決定木のアンサンブル。 bootstrap 標本+特徴量サブセットで多様性を確保。 SSDSE-B-2026 の都道府県データで高精度な予測と特徴量重要度を同時に得られる。
1
2
3
4
5
import shap
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_te)
shap.summary_plot(shap_values, X_te)  # 各特徴の影響度・方向を可視化
shap.waterfall_plot(shap_values[0])    # 個別予測の説明
📥 入力例: data/raw/SSDSE-B-2026.csv X: 47 都道府県 × 複数変数 y: 目的変数
📤 実行例: n_estimators=100 で accuracy = 0.89 OOB score = 0.86 特徴量重要度 top3 を出力
💬 読み方: 読み方: 木の数 n_estimators は多いほど安定(100-500 が標準)。 max_depth で過学習を制御。 feature_importances_ で変数選択ができる。 OOB score は CV 不要の汎化性能推定。

⚠️ 追加の落とし穴 — ランダムフォレストの実務

❌ feature_importances_ を「特徴の真の重要度」と思う
scikit-learn の feature_importances_(mean decrease in impurity)は分割回数・カーディナリティに偏る。 連続変数・高カーディナリティのカテゴリ変数が過大評価され、 二値変数が過小評価される傾向。 また学習データに対する重要度なので、 過学習を反映する場合も。 Permutation Importance(テストデータで実施)とSHAP値を併用してクロスチェックするのが現代的。
❌ 外挿(extrapolation)に使う
決定木ベースのモデル(RF・GBM)は訓練データ範囲外を予測できない。 訓練データの最大値以上の予測は、 訓練データの最大値あたりで頭打ちになる。 線形回帰は外挿可能だが、 RF は内挿のみ。 時系列予測でトレンドが続く場合、 RF は将来予測で失敗する。 そういう場面では線形モデル、 階差データへの変換、 Prophet 等を検討。
❌ デフォルトハイパーパラメータをそのまま使う
sklearn デフォルトは n_estimators=100, max_depth=None, min_samples_leaf=1 で過学習しやすい。 (i) n_estimators は 500-1000 程度に増やす、 (ii) max_depth を 5-20 で制限、 (iii) min_samples_leaf を 2-10 に、 (iv) max_features='sqrt'(分類)/ '1/3'(回帰)に。 GridSearchCV や RandomSearchCV、 Optuna でチューニング。 適切な調整で R² が 5-15% 改善することはざら。
❌ クラス不均衡への対応を怠る
分類で陽性クラスが 1% しかない時、 RF はすべて陰性予測でも accuracy 99% を達成。 対策:(i) class_weight='balanced'、 (ii) SMOTE などのオーバーサンプリング、 (iii) 評価指標を accuracy ではなく F1・AUC・recall に、 (iv) 閾値調整(デフォルト 0.5 を変える)。 「accuracy が高い」だけでは不均衡データでは無意味。
❌ 結果の解釈を「ブラックボックス」で済ます
RF は線形回帰より解釈が難しいが、 「ブラックボックス」と諦めるのは現代的ではない。 (i) SHAP 値で各予測の説明、 (ii) Partial Dependence Plot で変数効果の可視化、 (iii) ICE プロットで個別予測の感度分析、 (iv) Permutation Importance、 (v) Tree Visualization で1木をサンプル提示。 「説明可能AI(XAI)」の手法群が整備されている。
❌ 因果効果と関連を混同
RF の特徴量重要度は「予測に有用」を意味するが、 「原因」ではない。 たとえば「アイスクリーム売上」が「水難事故」予測に重要でも、 因果関係はない(共通の交絡=気温)。 因果効果には因果フォレスト (Generalized Random Forest)、 Double ML、 DID などの専用手法が必要。 ML と因果推論は別のツールセットと理解する。
❌ データリーク(特徴量ごし)
目的変数と高相関する特徴(実は派生変数や未来情報)が訓練データに紛れ込むと、 R² = 0.99 のような異常な高精度が出る。 例:「医師数」を予測したいのに「医療従事者数」が特徴に含まれる、 など。 異常な精度を疑う、 各特徴の妥当性を熟読、 時間順序を遵守する。 「うますぎる結果」はだいたいリーク。

🎨 直感で掴む — ランダムフォレスト の本質

ランダムフォレストは「たくさんの決定木を、 サンプルと特徴量をランダムに変えて作り、 平均する」アンサンブル手法。 個々の木は弱学習器でも、 集めると強い。 SSDSE-B-2026 で「都道府県の出生率」を 100 本の木で予測すると、 単一の決定木より分散が下がって安定する。

💡 ポイント:ランダムフォレスト を初めて学ぶときは「正確な定義」より「どんな問題を解くための道具か」を先に押さえてください。 数式は次の「📐 数式」セクションで丁寧に展開します。
📌 比喩がうまく刺さらないときは、 自分の身近な例(家計簿・スポーツの記録・成績表)に置き換えてみると理解が定着します。 SSDSE-B-2026 を電卓代わりに触りながら、 上の説明を再読すると効果的です。

📐 数式または定義 — ランダムフォレスト の形式的表現

直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。

【ランダムフォレストの予測($B$ 本の木の平均)】
$$ \hat y_{RF}(x) = \frac{1}{B}\sum_{b=1}^{B} T_b(x; \Theta_b) $$
この数式は「ランダムフォレスト がどう計算されるか」を最短で示したもの。 記号の意味は次の「🔬 数式を言葉で読み解く」で 1 つずつ解説します。
📚 数式が苦手な方へ:1 つの長い式を一度に理解しようとせず、 記号ごとに「言葉に翻訳」するのが王道。 紙に書き写してから、 自分の言葉で音読してみてください。

🔬 数式を言葉で読み解く — ランダムフォレスト の記号辞書

上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。

記号意味(言葉での説明)
$B$木の本数(通常 100〜1000)
$T_b$$b$ 番目の決定木
$\Theta_b$$b$ 番目の木のランダム性(bootstrap + feature subset)
OOBOut-Of-Bag — 各木で未使用サンプルでの検証
📌 読み下しのコツ:左から右に「主語 → 述語 → 目的語」と見立てて、 「これは何を、 どうしている式か?」と一文で要約してみてください。 慣れれば 5 秒で読めます。

🧮 実値で計算してみる — SSDSE-B-2026 で ランダムフォレスト を体感

数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 ランダムフォレスト の挙動を電卓的に追体験します。

👉 計算例:SSDSE-B-2026 で「総人口・年平均気温・大学学生数・婚姻件数」から合計特殊出生率(A4200)を予測。 ランダムフォレスト(B=500, max_depth=5)で 5-fold CV の R²=0.62。 特徴量重要度の上位は「65歳以上人口比率(0.38)、 婚姻件数比率(0.22)、 大学学生数(0.18)」となる。

SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。

🐍 Python 実装 — ランダムフォレスト を SSDSE-B-2026 で動かす

以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。

# ランダムフォレスト を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np

# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape)        # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))

# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))

# 3) ランダムフォレスト を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())

# 4) ランダムフォレスト の本処理(このページの主題)
#    — 具体実装は同カテゴリの個別ページにも掲載
print('---- ランダムフォレスト 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))

うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。

⚠️ よくある落とし穴 — ランダムフォレスト で初学者がやりがちなミス

この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。

❌ 特徴量重要度の解釈
高相関特徴量があると重要度が分散する。 Permutation Importance や SHAP で補完。
❌ 外挿不可
訓練データの範囲外(例:人口 2000 万人の超大都市)は予測精度が大幅低下。
❌ 木が深すぎる
max_depth を制限しないと過学習。 OOB スコアで監視。
❌ 不均衡データ
class_weight='balanced' を設定するか、 SMOTE 等でリサンプリング。
🛡 防御策まとめ:「適用条件の確認 → 適切な前処理 → 結果と前提のペア記述」の 3 ステップを習慣にすれば、 ここに挙げた失敗の大半は回避できます。

🌐 関連手法・派生 — ランダムフォレスト の周辺地図

ランダムフォレスト と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。

表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。