論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ステップワイズ法
Stepwise Selection
AIC等を基準に、説明変数を1つずつ追加・削除して最適なモデルを探索する自動変数選択法。
回帰モデルstepwise段階的選択ステップワイズ

🔖 増補ノート:ステップワイズ法を実データで読む

この増補は、定義を暗記するページではなく、実データで確かめ、数式を言葉に戻し、レポートで使える判断まで進むための学習ブロックです。対象データは data/raw/SSDSE-B-2026.csv で、合成データは使いません。

🔖 💡 📍 🎨 📐 🔬 🧮 🐍 ⚠️ 🌐 🔗 📚

💡 まず何を判断する概念か

ステップワイズ法は、手法名だけではなく「どの問いに、どの単位で、どの程度の根拠を持って答えるか」を整理するための枠組みです。SSDSEのような地域統計に適用すると、観測単位は都道府県、年次は2012-2023年、列は人口・医療・教育・住宅・商業などに分かれます。

📍 SSDSE-B-2026での位置づけ

SSDSE-B-2026は47都道府県を複数年で持つ横断時系列データです。ここでは2023年を中心に、人口 A1101、年少人口 A1301、65歳以上人口 A1303、出生数 A4101、死亡数 A4200、転入 A5101、婚姻件数 A9101、年平均気温 B4101、着工建築物数 C3301、一般診療所数 I5102、延べ宿泊者数 G7101 を使います。

🎨 可視化するときの設計

棒グラフは都道府県ランキング、散布図は量的変数どうしの関係、ヒートマップは複数指標の相関、折れ線は年次変化に向きます。ステップワイズ法の説明では、色を結論そのものにせず、単位と凡例を明示することが重要です。

📐 数式を言葉で読み解く

追加または削除で AIC を最も改善する変数を逐次選ぶ

🔬 候補変数を一つずつ足す、または外すたびにモデルの当てはまりと複雑さの罰則を同時に見て、改善が止まったところで探索を止めます。

🧮 実値計算の前提

実データでの前進選択の計算例(CSV読み込みから AIC 基準の変数選択まで)は、下の「🐍 Python 実値計算」および巻末の実装パターン①〜④にまとめています。ここでは前提と読み方の整理に集中します。

⚠️ 誤用しやすいポイント

落とし穴対処
総数だけで比較する人口あたり、世帯あたり、率指標など分母を置く。
相関を因果と読む時間順序、交絡、政策背景を別途確認する。
コードだけを示して結果を説明しないこのページのように実行結果と読み方を必ず併記する。

🌐 レポートでの書き方

「SSDSE-B-2026の2023年都道府県データを用い、ステップワイズ法の観点から、列コード、集計単位、分母、推定手順を明示した」と書くと、再現性と解釈の範囲が読者に伝わります。

🔗 関連用語

ols.html multiple-regression.html aic.html lasso.html multicollinearity.html

📚 実務チェックリスト

  1. 目的と単位:目的変数・候補変数の列コード、対象年(2023年)、集計単位(都道府県)、総数か率かを最初に明記する。
  2. 候補設計:目的変数の派生列や未来情報を除外し、相関0.9超の変数群からは代表を1つに絞ってから投入する。
  3. 選択基準:AICだけでなくBICや交差検証誤差でも試し、選ばれる変数がどの程度一致するかを確認する。
  4. 多重共線性:VIFを点検し、共線性の強い候補では「どちらが残るか」が不安定になる点を織り込む。
  5. 安定性:東京都など影響の大きい観測を除いた感度分析、別年度での再実行、ブートストラップ選択頻度で頑健性を見る。
  6. 選択後推論:選択後のp値・信頼区間はそのまま解釈せず、予測誤差や係数符号の安定性で語る。
  7. 再現性:ファイル名・cp932・skiprows・フィルタ条件・乱数種・選択経路をログに残し、読み手が同じCSVで検算できるようにする。

💡 30秒で分かる結論

🍰 まずはやさしく

必要な材料を一つずつ選ぶ方法です。

最適な予測モデルを作るために使います。

テストの点数に関わる要因を選ぶ時に便利です。

この手法の結論を短くまとめます。

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

📍 学習の3ステップ

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

🔧 Python実装パターン

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) A4200(死亡数) 北海道 5,092,000 514,000 1,681,000 24,430 75,120 東京都 14,086,000 1,513,000 3,205,000 86,348 137,241 沖縄県 1,468,000 236,000 350,000 12,549 15,110 …(全 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
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].dropna()

y = df['A4101'].astype(float)  # 目的変数: 出生数
candidate_cols = ['A1101', 'A1301', 'A1303', 'A4200', 'A5101',
                  'A9101', 'B4101', 'L3221', 'C3301', 'I5102', 'G7101']
X_pool = df[candidate_cols].astype(float)
X_pool = (X_pool - X_pool.mean()) / X_pool.std(ddof=0)

def forward_selection(X_pool, y, threshold=2.0):
    selected = []
    current_aic = sm.OLS(y, sm.add_constant(pd.DataFrame(index=y.index), has_constant='add')).fit().aic
    while True:
        rest = [c for c in X_pool.columns if c not in selected]
        if not rest:
            break
        aics = {c: sm.OLS(y, sm.add_constant(X_pool[selected + [c]], has_constant='add')).fit().aic
                for c in rest}
        best = min(aics, key=aics.get)
        if current_aic - aics[best] < threshold:
            break
        selected.append(best)
        current_aic = aics[best]
        print(f'add {best}, AIC={current_aic:.2f}')
    return selected

selected = forward_selection(X_pool, y)
print(f'selected: {selected}')

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

🍰 まずはやさしく

変数を自動で選ぶ仕組みのことです。

分析に使う項目を絞り込むために使います。

スマホの利用時間と成績の関係を調べる時に使えます。

この用語がどう使われるかを確認します。

論文中に 「ステップワイズ法」として登場する用語。

ステップワイズ法 とは:AIC等を基準に、説明変数を1つずつ追加・削除して最適なモデルを探索する自動変数選択法。

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

ステップワイズ法 (Stepwise selection) は説明変数を AIC・BIC・p 値を判定基準として 1 個ずつ追加 (forward)・削除 (backward)・両方向 (both) で選択する変数選択手法である。 計算量が小さい反面、 多重検定問題・解の不安定性が指摘されており、 現代では LASSO や Elastic Net、 情報量規準による全モデル比較が代替候補となる。

🎨 直感で掴む

🍰 まずはやさしく

パズルを一つずつ組み立てるイメージです。

効率よく正解に近い組み合わせを探します。

部活の成果を出す要因を絞り込む時に似ています。

直感的に仕組みを理解しましょう。

ステップワイズ変数選択(stepwise selection)は、 重回帰の説明変数を「1 個ずつ追加 or 削除して AIC 等の規準値を最小化」する手続き。 例えば SSDSE-B-2026 で出生数を予測したい場合、 候補 100 変数から最良 10 変数を選ぶ際、 全 $2^{100}$ 通りは試せないので、 「空モデル → 最も AIC を下げる変数を追加 → さらに追加 ... → 規準悪化で停止」と greedy に進める。

3 方式: 前進選択 (forward) = 0 変数から追加開始、 後退削除 (backward) = 全変数から削除、 両方向 (stepwise) = 追加と削除を交互に検討。 R では step()、 Python では scikit-learnSequentialFeatureSelectorstatsmodels の手動実装が定番。

注意点: ステップワイズは「後で同じデータで p 値・信頼区間を報告すると過小評価」「選ばれた変数集合の安定性が低い (n を少し変えると別の集合に)」が指摘され、 現代的には Lasso・Elastic Net・情報量規準ベース全数比較が推奨される。 が、 教育・小規模問題では今も健在。

📐 数式または定義

🍰 まずはやさしく

ルールに従って項目を選ぶ手続きです。

数値的な基準で変数の追加や削除を決めます。

買い物で予算に合わせて品物を選ぶ感覚です。

詳しい定義と計算のルールを学びます。

ステップワイズ法そのものは1つの式ではなく、「候補モデルを情報量規準で比較し、最も改善する変数を逐次採用・削除する」手続きです。前進選択では、現在のモデル $M_k$ に未採用の変数 $x_j$ を1つ加えた候補をすべて評価し、規準値が最小になる変数を選びます。

$$x_{j^{*}} = \arg\min_{x_j \notin M_k}\ \mathrm{AIC}(M_k + x_j),\qquad \mathrm{AIC} = -2\log L + 2p$$

ここで $L$ は最大尤度、 $p$ は推定パラメータ数、 $M_k + x_j$ は変数 $x_j$ を加えたモデルです。AICの改善が閾値を下回った時点で探索を止めます。BICを使う場合は罰則が $2p$ から $p\log n$ になり、標本サイズ $n$ が大きいほど単純なモデルが選ばれます。

🔬 追加ケース演習:ステップワイズ法を別の列で言い換える

同じ用語でも、使う列と分母が変わると解釈が変わります。以下の追加ケースは、SSDSE-B-2026を使った説明を単発のコード例で終わらせず、複数の指標に横展開するための練習です。

🧭 ステップワイズ法を発表で扱うための補強ノート

ステップワイズ法は、 説明変数を一つずつ追加・削除しながら、 AIC、BIC、交差検証誤差、調整済み決定係数などの基準が改善する組み合わせを探す方法です。 便利な自動選択法ですが、 「選ばれた変数が真の原因である」ことを保証する方法ではありません。 変数候補の作り方、サンプル数、相関の強い説明変数、外れ値、評価基準の選び方によって、 選ばれるモデルは大きく変わります。 したがって、 コンペ発表では「自動で最適化した」ではなく、 「候補変数をどう定義し、どの基準で、どの安定性確認を行ったか」を説明します。

SSDSE-B-2026 のように都道府県が47件しかないデータでは、 ステップワイズ法を特に慎重に使います。 説明変数候補を数十個入れると、 たまたま目的変数と合った列が選ばれやすくなり、 係数の符号や選択変数が少しのデータ変更で揺れます。 まず人口構成、経済活動、産業構成、教育、医療などの概念グループを作り、 各グループから代表変数を絞ります。 その上で、 選択されたモデルを交差検証、ブートストラップ、外れ値除外、別年度データで確認します。

典型的な前進選択では、 現在のモデル $M_k$ に未採用変数 $x_j$ を一つ加えた候補 $M_k + x_j$ をすべて評価し、 評価基準が最も改善する変数を採用します。 AIC なら $AIC = -2\log L + 2p$、 BIC なら $BIC = -2\log L + p\log n$ で、 $p$ は推定パラメータ数、 $n$ はサンプル数です。 BIC はAICより複雑なモデルへの罰則が強いため、 変数数をより抑えやすくなります。

選択方式動き長所注意点
前進選択空モデルから1変数ずつ追加候補が多い時でも比較的軽い最初に入った変数に後続が影響される
後退消去全変数モデルから1変数ずつ削除候補全体から出発できるサンプル数が少ないと全変数モデルが不安定
双方向選択追加と削除を交互に検討途中で不要になった変数を落とせる探索経路に依存しやすい
交差検証型CV誤差で追加・削除を判断予測性能を直接見やすい小標本では折分割で結果が揺れる

🔎 キーワード索引・別名

ステップワイズ法は、 文献やソフトウェアによって Stepwise selectionstepwise regressionsequential feature selection逐次変数選択段階的選択法前進選択後退消去双方向選択 と呼ばれます。 scikit-learn では SequentialFeatureSelector、 R では step 関数、 statsmodels では自作ループとして実装されることが多いです。 名称が違っても、 候補変数を段階的に増減させ、 ある評価基準でモデルを選ぶという考え方は共通しています。

用語意味関連する注意
AIC尤度とパラメータ数からモデルを比較する情報量規準同じデータ・同じ目的変数の候補モデル間で比較する
BICAICより複雑性罰則が強い情報量規準小標本では単純なモデルを選びやすい
多重共線性説明変数同士が強く相関する状態どちらの変数が選ばれるかが不安定になる
データスヌーピング同じデータで何度も探索し、偶然よいモデルを拾うこと選択後のp値をそのまま解釈しない
Lasso正則化で係数を0へ縮める変数選択法標準化と正則化強度の選び方が重要

📊 図で見るステップワイズ法の診断

散布図: 候補変数と目的変数の関係を確認
図1: 候補変数を入れる前に、 散布図で目的変数との関係を確認する。 外れ値や非線形が強い場合、 ステップワイズ法はその構造をうまく扱えないことがある。
ヒストグラム: 候補変数の分布と歪み
図2: 候補変数の分布が強く歪んでいる場合、 対数変換や外れ値処理を検討する。 変換前後で選択変数が変わるなら、 結果は前処理に敏感である。
箱ひげ図: 層ごとの候補変数のばらつき
図3: 地域ブロックや人口規模で層別した箱ひげ図は、 候補変数が特定層だけで極端な値を持っていないかを確認するのに役立つ。

ステップワイズ法の診断では、 選択された最終モデルだけを見るのではなく、 候補変数の分布、変数同士の相関、外れ値、層別のばらつきを確認します。 例えば東京都だけが極端に大きい人口や延べ宿泊者数を持つ場合、 その変数が選ばれた理由は全国的な関係ではなく、 特定観測の影響かもしれません。 図を併用すると、 自動選択の結果を人間が読み直すための材料が増えます。

🧮 数式に値を入れて手で計算する: 変数選択の AIC 比較

SSDSE-B-2026 (47 都道府県) で「出生数」A4101 を目的変数、候補説明変数を年少人口 A1301、婚姻件数 A9101、人口 A1101、一般診療所数 I5102、着工建築物数 C3301 の 5 つとし、前進選択 (Forward) で各段階の AIC を計算する。

Step 1: 前進選択の各段階 AIC (SSDSE-B-2026, n=47)

段階モデルlogLk (パラメータ数)AIC = -2logL + 2k
M0定数のみ-524.43811050.876
M1+ 年少人口 A1301-397.5452799.089
M2+ 婚姻件数 A9101-370.2543746.509
M3+ 人口 A1101-355.6674719.333
M4+ 一般診療所数 I5102-346.7855703.570
M5+ 着工建築物数 C3301-344.6576701.314

Step 2: 最良モデル選択

M5 (年少人口 + 婚姻件数 + 人口 + 一般診療所数 + 着工建築物数) の AIC が 701.314 で最小 → 次候補の延べ宿泊者数 G7101 を足すと AIC は 701.420 で改善しない → 2023年の実データでは M5 で停止と読む

🐍 Python で再現

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1301(15歳未満人口) A4101(出生数) A9101(婚姻件数) C3301(着工建築物数) 北海道 5,092,000 514,000 24,430 17,281 15,872 東京都 14,086,000 1,513,000 86,348 71,774 41,817 沖縄県 1,468,000 236,000 12,549 6,316 5,217 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd
import 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].copy()
y = d['A4101'].astype(float)
features = ['A1301', 'A9101', 'A1101', 'I5102', 'C3301']
X0 = d[features].astype(float)
Xz = (X0 - X0.mean()) / X0.std(ddof=0)

models = [[]] + [features[:i] for i in range(1, len(features) + 1)]
aic_values = []
for cols in models:
    X = sm.add_constant(Xz[cols], has_constant='add')
    aic_values.append(float(sm.OLS(y, X).fit().aic))

print([round(v, 3) for v in aic_values])
print(f"最良: M{min(range(len(aic_values)), key=aic_values.__getitem__)}")

📤 実行結果

[1050.876, 799.089, 746.509, 719.333, 703.57, 701.314] 最良: M5

💬 表の AIC と Python 出力は、同じ CSV・同じ2023年フィルタから計算した値です。

🎮 触って学ぶ:前進選択/後退消去を1ステップずつ

下のミニ実験は 架空の教材用データ(n=30、説明変数 x1〜x5、目的変数 y。SSDSE の実測値ではなく、挙動を見せるための合成データです)に対して、前進選択(空モデルから最良の変数を1つずつ追加)と後退消去(全変数から最良の1つを削除)を「1ステップ進む」で実行します。各ステップで、どの変数を出し入れすると AIC がどれだけ下がるかをその場で計算し、選ばれた変数集合と AIC の推移をリアルタイム表示します。回帰と AIC はこのページ内で厳密計算しており、statsmodels の OLS().fit().aic と一致することを確認済みです($\mathrm{AIC}=n\ln(2\pi)+n\ln(\mathrm{RSS}/n)+n+2k$、$k$=定数項込みの係数の数)。

選択方式:
🔎 このステップの候補評価(AICを最も下げる手を緑で表示)
📉 AIC の推移
🧾 選択経路(トレース)
⚖️ 前進 vs 後退:最終モデルは一致するか?
⚠️ 貪欲法の限界と選択後推論の危うさ:前進選択は「今いちばんAICを下げる変数」を足すだけなので、後で不要になった変数を外せません。一方この例では後退消去のほうがより低いAICに到達します(=前進の解は最適とは限らない)。さらに、同じデータで多数のモデルを試して選んだ後に、その最終モデルの p 値・信頼区間をそのまま報告すると過小評価(楽観的)になります。選ばれた変数は「候補集合と基準の下で相対的に良かった」だけで、真の原因である保証はありません。少しデータを変えると選ばれる集合が揺れる(不安定)点、多重比較で偽陽性が増える点にも注意し、交差検証・ブートストラップ選択頻度・別基準(BIC)での再確認を添えて報告します。

🐍 Python 実値計算: SSDSE-B-2026.csv

このコードでやることdata/raw/SSDSE-B-2026.csv を読み込み、都道府県別の実データからこの用語の判断に必要な集計量を計算します。合成データは使いません。

入力例:2023年、47都道府県、人口 A1101、年少人口 A1301、婚姻件数 A9101、一般診療所数 I5102、着工建築物数 C3301 など。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) A4200(死亡数) 北海道 5,092,000 514,000 1,681,000 24,430 75,120 東京都 14,086,000 1,513,000 3,205,000 86,348 137,241 沖縄県 1,468,000 236,000 350,000 12,549 15,110 …(全 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
import pandas as pd
import statsmodels.api as sm

path = 'data/raw/SSDSE-B-2026.csv'
df = pd.read_csv(path, encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023].copy()
target = 'A4101'
features = ['A1101','A1301','A1303','A4200','A5101','A9101','B4101','L3221','C3301','I5102','G7101']
X0 = d[features].astype(float)
Xz = (X0 - X0.mean()) / X0.std(ddof=0)
y = d[target].astype(float)

def fit(cols):
    X = sm.add_constant(Xz[cols], has_constant='add')
    model = sm.OLS(y, X).fit()
    return float(model.aic), float(model.rsquared)

selected, remaining, trace = [], features.copy(), []
current_aic, _ = fit([])
while remaining:
    best = min((fit(selected + [c])[0], c, fit(selected + [c])[1]) for c in remaining)
    if current_aic - best[0] < 2:
        break
    selected.append(best[1])
    remaining.remove(best[1])
    current_aic = best[0]
    trace.append(best)

print([(round(a, 1), c, round(r2, 4)) for a, c, r2 in trace])
print(selected)

実行結果

[(799.1, 'A1301', 0.9955), (746.5, 'A9101', 0.9986), (719.3, 'A1101', 0.9992), (703.6, 'I5102', 0.9995), (701.3, 'C3301', 0.9995)]
['A1301', 'A9101', 'A1101', 'I5102', 'C3301']

結果の読み方:ここで出てくる数値は教材用の例ではなく、SSDSE-B-2026に記録された自治体データから直接計算した値です。値の大小だけで結論を急がず、単位、分母、年次、外れ値、政策的な解釈を分けて読みます。

⚠️ 落とし穴

stepwise を実務で使う際に頻発する誤用・落とし穴を列挙する。 多くは「前提の確認不足」「結果の過信」「他手法との比較不足」が原因で、 事前にチェックリスト化することで回避できる。

🗺️ 概念マップ: ステップワイズ法の位置づけ

ステップワイズ法は、 回帰分析、モデル選択、特徴量選択、正則化、交差検証、解釈可能性の交差点にあります。 上流には候補変数の設計、欠損処理、標準化、外れ値処理があり、 下流には係数解釈、予測性能評価、残差診断、発表での説明があります。 この概念マップを意識すると、 ステップワイズ法を単体の自動処理としてではなく、 モデル構築ワークフローの一部として扱えます。

周辺概念ステップワイズ法との関係確認すべきこと
重回帰分析候補変数を組み合わせて目的変数を説明する基盤線形性、独立性、等分散性、残差
AIC/BIC追加・削除の判断基準同一データ上の相対比較であること
交差検証選択モデルの予測性能を評価選択も訓練データ内で行う
Lasso/Ridge正則化による代替的な変数選択・縮小推定標準化、正則化強度、係数の安定性
因果推論選択された変数を原因と読むかどうかの判断領域交絡、逆因果、測定誤差、識別仮定

この概念マップの中心にある実務判断は、 「自動選択の結果をどこまで信じるか」です。 ステップワイズ法で選ばれた変数は、 候補集合と評価基準の下で相対的に良かった変数であって、 研究上必ず重要な変数ではありません。 ドメイン知識、診断図、交差検証、別基準での再選択を合わせて、 初めて発表で使える根拠になります。

✅ 理解度チェック: ステップワイズ法を安全に使えるか

  1. AICを基準にしたステップワイズ法で選ばれた変数を、なぜそのまま因果原因と呼べないのか。
    解答例: AICは予測・当てはまりと複雑性の相対比較であり、交絡や逆因果を調整する識別設計ではないため。
  2. 47都道府県データで候補変数を30個入れると何が問題になるか。
    解答例: サンプル数に対して候補が多く、偶然の相関を拾いやすい。係数や選択変数が不安定になり、外れ値の影響も大きくなる。
  3. 前進選択と後退消去の違いを説明せよ。
    解答例: 前進選択は空モデルから変数を追加する。後退消去は全変数モデルから不要変数を削除する。後退消去は初期の全変数モデルが推定可能である必要がある。
  4. ステップワイズ法の結果を発表する時、最終モデル以外に何を示すべきか。
    解答例: 候補変数リスト、選択基準、選択経路、交差検証性能、外れ値・多重共線性の確認、別基準での安定性を示す。
  5. Lassoとステップワイズ法を比較する時の観点を一つ挙げよ。
    解答例: Lassoは正則化で係数を連続的に縮小し、ステップワイズ法は変数を離散的に追加・削除する。どちらも標準化や候補変数設計に影響される。

自己採点の目安は、 各問について「評価基準」「候補変数」「小標本」「安定性」「因果ではない」のいずれかを自分の言葉で説明できるかです。 ステップワイズ法は便利ですが、 便利さの分だけ過信されやすい方法です。 発表で使うなら、 選択された変数よりも、 その選択がどれだけ安定しているかを丁寧に示します。

🧪 SSDSE-B-2026での実務ウォークスルー

例として、 目的変数を「出生数 A4101」または「合計特殊出生率 A4103」とし、候補変数を人口構成、人口動態、気象、住宅、医療、宿泊の実在列から選ぶとします。 最初に全候補を機械的に入れるのではなく、 目的変数より後に観測される変数、目的変数から直接作った派生指標、単位が不明な列、欠損が多すぎる列を除外します。 次に、 相関が0.9を超えるような近い変数群から代表を選びます。 ここまでの前処理が、 ステップワイズ法の結果を大きく左右します。

実行後は、 選ばれた変数の数、AIC/BICの推移、係数の符号、標準誤差、残差図、VIF、交差検証誤差を確認します。 もし人口総数と死亡数のような規模変数ばかりが選ばれるなら、 それは出生の構造ではなく都市規模を拾っている可能性があります。 一人当たり化、対数変換、地域ブロック固定効果、東京都を除いた感度分析を試し、 結論がどの程度変わるかを見ます。

発表では、 「ステップワイズ法によりA、B、Cが選ばれた」とだけ書くのではなく、 「候補20変数から、AIC基準の双方向選択で5変数が残った。交差検証では候補全体モデルより誤差が小さく、東京都を除いても主要3変数は残った」のように書きます。 この書き方なら、 自動選択の過程、性能、安定性、外れ値への頑健性が一文で伝わります。 ステップワイズ法を使う価値は、 変数を減らすことそのものではなく、 比較可能で説明しやすいモデルへ整理することにあります。

最後に、 選ばれなかった変数も捨てっぱなしにしません。 理論上重要だが選ばれなかった変数は、 サンプル数不足、測定の粗さ、他変数との重複、外れ値の影響によって落ちた可能性があります。 除外理由を短く記録し、 補助分析や考察で扱うと、 「モデルに入らなかったから重要でない」という誤読を避けられます。 ステップワイズ法は探索の道具であり、 研究判断の代替ではありません。

選択経路を記録する

ステップワイズ法を使う時は、 最終的に残った変数だけでなく、 どの順番で追加・削除されたかを記録します。 例えば、 第1ステップで年少人口、 第2ステップで婚姻件数、 第3ステップで一般診療所数が入ったなら、 その順番自体がモデルの説明になります。 途中で一度入った変数が後で削除された場合は、 他の変数が入ることで説明力が重複した可能性があります。 選択経路を表に残すと、 自動選択の内部がブラックボックスになりません。

選択経路には、 各ステップの評価基準値も添えます。 AICがどれだけ下がったのか、 BICでは同じ変数が残るのか、 交差検証誤差では改善しているのかを並べると、 選択が実質的な改善だったのか、 ごく小さな差を拾っただけなのかが分かります。 差が小さい場合は、 変数を一つ増やして複雑にするより、 解釈しやすい単純なモデルを採用する判断もあります。 数値基準は自動的な命令ではなく、 モデル選択を議論する材料です。

選択後推論の注意

ステップワイズ法の大きな落とし穴は、 変数選択後のp値や信頼区間を通常の回帰分析と同じように読んでしまうことです。 実際には、 同じデータを使って多数のモデルを探索した後に最終モデルを選んでいるため、 p値は楽観的になりやすく、 有意に見える変数が増えます。 これは「選択後推論」の問題です。 厳密な推論を行いたい場合は、 事前に変数を決めた検証用モデルを別に用意する、 データを選択用と評価用に分ける、 交差検証やブートストラップで安定性を見る、 といった対応が必要です。

コンペ発表では、 p値を強調するよりも、 予測誤差、係数の符号の安定性、選択頻度、外れ値感度を示す方が安全です。 例えば100回のブートストラップで同じ変数が80回以上選ばれるなら、 その変数は候補集合の中で比較的安定していると説明できます。 反対に、 毎回違う変数が選ばれるなら、 ステップワイズ法の結果は探索的な仮説として扱い、 強い結論は避けます。 自動選択の結果をそのまま確証として扱わない姿勢が重要です。

候補変数セットの作り方

ステップワイズ法の品質は、 入力する候補変数セットでほぼ決まります。 候補が粗すぎれば重要な構造を見逃し、 候補が多すぎれば偶然の相関を拾います。 SSDSE-B-2026では、 まず目的変数と同時に定義される派生列や、 目的変数から直接計算した列を除外します。 次に、 総数指標と一人当たり指標を混在させる場合は、 どちらが研究の問いに合うかを整理します。 県を単位に比較するのか、住民一人当たりの状態を比較するのかで、 適切な候補変数は変わります。

候補変数表には、 変数名、列コード、単位、出典、観測年、変換方法、採用理由、除外理由を書きます。 この表を作るだけで、 目的変数の未来情報が混ざっていないか、 同じ概念を重複して測っていないか、 欠損や外れ値が多すぎないかを確認できます。 ステップワイズ法は候補変数を自動で評価しますが、 候補変数を作る責任は分析者にあります。 候補表の品質が低ければ、 どれだけ洗練された探索をしても結果は信頼できません。

発表スライドでの見せ方

ステップワイズ法を発表する時は、 1枚のスライドに最終モデルの係数表だけを載せるより、 3枚構成にすると誤解が減ります。 1枚目で候補変数セットと除外基準を示し、 2枚目で選択経路と評価基準の推移を示し、 3枚目で最終モデルの解釈と安定性確認を示します。 この構成なら、 聴き手は「何を候補にしたか」「どう選ばれたか」「選ばれた結果をどこまで信じてよいか」を順に追えます。

最終モデルの係数を読む時は、 変数の単位と標準化の有無を必ず明記します。 人口を人単位で入れた係数と、対数人口や標準化人口を入れた係数では、 数値の意味がまったく違います。 標準化係数なら変数間の相対的な影響を比較しやすく、 元単位の係数なら政策的な解釈をしやすいです。 どちらを使ったかを明示しないと、 係数の大小だけで誤った解釈が生じます。

代替手法との併用

ステップワイズ法だけに依存せず、 Lasso、Ridge、Elastic Net、ランダムフォレストのPermutation importance、単純な相関分析などと比較すると、 結果の頑健性を確認できます。 複数の手法で同じ変数が重要なら、 その変数は候補集合の中で安定した情報を持つ可能性があります。 一方、 手法ごとに重要変数が大きく変わるなら、 データが小さい、変数が相互に重複している、非線形関係が強い、外れ値の影響が大きい、 といった可能性を疑います。

ただし、 代替手法で一致したからといって因果効果が証明されたわけではありません。 どの手法も観測データ内の関連を使っているだけなら、 交絡や逆因果の問題は残ります。 因果を主張したい場合は、 ステップワイズ法で選ばれた変数を出発点に、 DAG、自然実験、差の差分法、操作変数法、固定効果モデルなど、 別の識別設計を検討します。 ステップワイズ法は、 因果推論の前処理や仮説生成には使えても、 因果効果を単独で証明する道具ではありません。

再現性を守る実行ログ

ステップワイズ法は探索的な処理なので、 実行ログを残さないと結果を再現しにくくなります。 ログには、 データファイル名、対象年、目的変数、候補変数、除外した変数、欠損処理、標準化の有無、評価基準、開始モデル、探索方向、乱数種、選択経路、最終モデル、評価結果を記録します。 特に交差検証型の選択では、 折分割の乱数種や層化の有無によって結果が変わるため、 実験設定を固定しておく必要があります。 発表後に「なぜこの変数が選ばれたのか」と聞かれた時、 ログがあれば選択過程を説明できます。

再現性の観点では、 最終モデルだけを保存するのでは不十分です。 候補変数を作る前処理コード、 標準化や対数変換の設定、 欠損除外後の行数、 使用したライブラリのバージョンも結果に影響します。 例えば statsmodels と scikit-learn では、 同じ「逐次特徴選択」でも既定の評価指標や停止条件が異なることがあります。 そのため、 実装名と引数を明記し、 可能なら選択結果をCSVとして保存します。 これにより、 スライドの係数表と実行コードが対応します。

小標本での現実的な使い方

47都道府県のような小標本では、 ステップワイズ法を「結論を決める機械」としてではなく、 「候補変数を整理する補助線」として使うのが現実的です。 最終モデルを一つに固定する前に、 候補変数の概念グループごとに単純モデルを作り、 それぞれの説明力と残差を確認します。 その後でステップワイズ法を使うと、 どのグループから変数が残ったかを解釈しやすくなります。 いきなり全候補を投入するより、 概念ごとの比較を挟む方が、 発表での説明はずっと安定します。

また、 小標本では「選ばれた変数の数」を控えめにします。 変数を増やすほど訓練データへの当てはまりは良くなりますが、 汎化性能や係数の安定性は悪化しやすくなります。 候補が多い場合は、 AICだけでなくBICや交差検証誤差も見て、 単純なモデルを基準にします。 発表では、 最小モデル、ステップワイズモデル、全候補モデルの3つを比較し、 ステップワイズモデルが本当に妥協点として妥当かを示すと説得力が増します。

結論の書き方

ステップワイズ法を使った結論は、 断定を避けて書きます。 「A、B、Cが目的変数を決定する」ではなく、 「候補変数群の中では、A、B、Cを含むモデルがAIC基準で最もよく、交差検証でも比較的安定だった」と書きます。 この表現なら、 方法の限界を認めつつ、 分析から得られた知見を正確に伝えられます。 さらに、 「因果解釈には追加の識別設計が必要」と添えれば、 予測・説明・因果の区別も明確になります。

最終的に、 ステップワイズ法の価値は、 変数を自動で選ぶことそのものではなく、 候補変数の多い状況でモデル比較の議論を始めやすくすることにあります。 その結果を信頼できるものにするには、 候補変数の設計、選択経路の記録、別基準での再確認、診断図、安定性評価、ドメイン知識による解釈が必要です。 これらを合わせて示せば、 ステップワイズ法は危うい自動化ではなく、 透明な探索手順として活用できます。

チェックリストとしての使い方

実務のチェックリストとしては、 まず候補変数を投入する前に、 目的変数との時間順序、単位、欠損、外れ値、相関、変換方法を確認します。 次に、 ステップワイズ法をAIC、BIC、交差検証誤差の少なくとも二つの基準で試し、 選ばれる変数がどの程度一致するかを見ます。 さらに、 東京都のような影響の大きい観測を除いた感度分析、 別年度での再実行、 ブートストラップによる選択頻度を確認します。 最後に、 選ばれた変数をドメイン知識で読み直し、 係数の符号が社会的に説明可能かを点検します。

この手順を守ると、 ステップワイズ法は「自動で都合のよい変数を拾う危険な方法」ではなく、 候補変数の中から説明しやすいモデルを探索するための監査可能な手順になります。 特に統計データ解析コンペでは、 審査員はモデルの精度だけでなく、 なぜその変数を採用したのか、 他の候補をどう扱ったのか、 結論がどの程度安定しているのかを見ます。 ステップワイズ法を使うなら、 その問いに答えられる記録を残すことが不可欠です。

発表後の改善にも、 ステップワイズ法のログは役立ちます。 追加データが手に入った時、 候補変数が増えた時、 外れ値処理を変更した時、 同じ選択手順を再実行して、 以前のモデルと比較できます。 選択変数が変わった場合は、 データの増加による自然な変化なのか、 前処理の変更によるものなのかを切り分けます。 このように、 ステップワイズ法は一回限りのモデル選択ではなく、 分析の更新履歴を管理する枠組みとしても使えます。

stepwise 前進選択 後退消去 AIC / BIC 基準 Lasso 正則化 VIF / 多重共線性 交差検証 CV

🔗 隣接手法への橋渡し

ステップワイズ法は「変数選択」の貪欲アルゴリズム。 SSDSE-B-2026 で出生数 A4101 を候補変数 (人口 A1101 / 年少人口 A1301 / 婚姻件数 A9101 / 一般診療所数 I5102 等) から予測するモデル構築で、 AIC / BIC を逐次最小化しながら変数を追加 (forward) ・削除 (backward) する。 候補を多数に広げる場合は、 n=47 に対して過剰適合しやすいため Lasso と比較して使う。

SSDSE のように p=60, n=47 の高次元では Lasso / Elastic Net が安定。 ステップワイズは教育用 / 既存研究との互換性確保用と位置付け、 実務では Lasso 推奨。

🌳 手法選択フロー

SSDSE-B-2026 で変数選択を行う際のフロー。

  1. ① 候補変数の数は? p ≤ 10 → 全部分集合探索 (2^10=1024 で実行可能)。 p = 10〜50 → ステップワイズ (forward / backward)。 p > 50 → Lasso / Elastic Net (SSDSE 110 列はここ)。
  2. ② 多重共線性は? 事前に VIF > 10 の変数を除去 → ステップワイズの選択結果が安定。 共線性が残るなら主成分回帰 (PCR) or PLS 回帰を検討。
  3. ③ 選択後の検証は? 選択された変数で最終モデルを再構築し、 Leave-One-Out CV で RMSE を確認。 p 値や CI は post-selection inference (selectiveInference パッケージ等) で調整する。

ステップワイズは AIC 最小化が局所最適に終わる保証しかない。 結果を Lasso と比較し、 両方で選ばれる頑健な変数を主結論にすると安全。

🎨 直感を深める:探索の3方式と3つの停止基準

ステップワイズ法の核心は「全 $2^p$ 通りのモデルを試す代わりに、今より少しでも良くなる1手を貪欲に選び続ける」ことです。上の🎮ウィジェットで見たように、探索の向きと停止基準を決めれば、あとは機械的に候補を1つずつ出し入れするだけで進みます。ここでは、その「1手をどう選ぶか」をもう一段深く言葉にします。

探索の向き:どこから出発するか

方式出発点1ステップの操作向いている状況
前進選択 (forward)空モデル(定数のみ)未採用変数のうち基準を最も改善する1つを追加候補 $p$ が多い、$p>n$ に近く全変数モデルが推定できない場合でも走る
後退消去 (backward)全変数モデル残っている変数のうち基準を最も改善する1つを削除$n$ が変数数より十分大きく、全変数モデルが安定して推定できる場合
双方向 (stepwise/both)空 or 全変数各ステップで追加と削除の両方を評価し最良の1手前進で一度入れた変数が後で不要になるケースを取り戻したい場合

重要なのは、この3方式が同じ最終モデルに収束するとは限らないことです。🎮ウィジェットの「前進 vs 後退」比較でも、同じデータ・同じAIC基準なのに到達点がずれることがありました。出発点と経路が結果を左右するのは、貪欲法が「途中の局所的に最良な1手」しか見ていないからです。

停止基準:いつ探索を止めるか

「良くなる1手」の良さを測る物差しが停止基準です。代表的な3つは性格が異なります。

AIC $=-2\log L + 2p$:予測の当てはまりを重視。罰則が定数 $2$ なので、標本が増えても変数を足しやすい。
BIC $=-2\log L + p\log n$:$n$ が大きいほど罰則 $\log n$ が強まり、より単純なモデルを選ぶ。
p値:追加候補の偏回帰係数が有意 ($p<\alpha$) かで判断する古典的な方法。多重検定になるため後述の注意が必要。

$n=47$(本ページの2023年データ)では $\log 47 \approx 3.85$ なので、BICの罰則 $3.85p$ はAICの罰則 $2p$ よりかなり強くなります。したがって「AICでは残るがBICでは落ちる」変数が現れやすく、これは基準の優劣ではなく目的の違い(予測精度を優先するか、真のモデルの簡潔な同定を優先するか)です。詳しくは AICBICp値 の各ページを参照してください。

⚠️ 落とし穴を深掘り:選択バイアスと同じデータの二重利用

ステップワイズ法が現代の統計・機械学習の教科書で「原則として避けよ」と繰り返し警告される理由は、便利さの裏にある推論の歪みにあります。ここでは本ページの実データ(SSDSE-B-2026, 2023年, $n=47$, 出生数 A4101 を目的変数)で選ばれた5変数を素材に、5つの落とし穴を具体的に確認します。

① 過学習と選択バイアス

候補を1つずつ試して「最もよく当てはまる」変数を選ぶ操作は、偶然データに合った変数を優先的に拾い上げる装置でもあります。$n=47$ に対し候補を数十個投入すると、真の関係がなくても標本のノイズにたまたま一致した列が選ばれます。上の🐍実値計算で、変数を1つ入れただけ(A1301のみ)で調整済み決定係数がすでに $0.9954$、5変数で $0.9995$ に達しますが、この高い当てはまりは「訓練データ上の」値であり、新しい年・別の県集合での予測精度を保証しません。訓練当てはまりの楽観性が過学習(overfitting)です。

② 多重共線性下での不安定性(実データで確認)

選ばれた5変数(年少人口 A1301/婚姻件数 A9101/人口 A1101/一般診療所数 I5102/着工建築物数 C3301)は、いずれも「県の規模」を映すため互いに極端に強く相関します。SSDSE-B-2026(2023)の実測相関は下表のとおりで、最小でも $0.89$、最大は $0.997$ です。

A1301A9101A1101I5102C3301
A1301 年少人口1.0000.9840.9970.9650.970
A9101 婚姻件数0.9841.0000.9890.9890.933
A1101 人口0.9970.9891.0000.9720.964
I5102 一般診療所数0.9650.9890.9721.0000.890
C3301 着工建築物数0.9700.9330.9640.8901.000

この5変数モデルの分散拡大係数(VIF)を実際に計算すると、A1101≈252.6、A1301≈189.6、A9101≈125.6、I5102≈85.9、C3301≈42.2 と、経験則の閾値 $10$ を大きく超えます。VIFがここまで高いと、係数の標準誤差が膨らみ、符号すら不安定になります。実務上の含意は明快で、「どの1変数が最終モデルに残るか」は本質的な優劣ではなく、標本のわずかな揺れで簡単に入れ替わるということです。A1101A1301 は相関 $0.997$ でほぼ同じ情報を持つため、片方が入ればもう片方は「追加の説明力なし」として弾かれますが、県を数件入れ替えれば逆転しても不思議はありません。多重共線性の一般論は 多重共線性 を参照してください。

③ p値の多重性と偽の有意

1ステップごとに複数の候補変数を検定し、最も有意なものを採用する——これは検定を何十回も繰り返すのと同じで、ファミリーワイズに偽陽性が累積します。名目5%水準でも、20個の無関係な候補を試せば少なくとも1つが偶然「有意」になる確率は $1-0.95^{20}\approx 0.64$ に達します。ステップワイズの各段階で選ばれた変数のp値を、あたかも「あらかじめ1回だけ検定した」かのように読むと、有意性を大きく過大評価します(多重比較の問題。※glossaryに multiple-comparison.html は未整備のためテキストで補足)。

④ 同じデータで選択と推論を行う二重利用(post-selection inference)

最大の落とし穴は、変数を選んだデータと、その係数のp値・信頼区間を計算するデータが同じである点です。選択の段階で「よく効く変数」だけを残しているので、残った係数はもともと大きめ・有意側に偏っています。この偏りを無視して通常の回帰出力をそのまま報告すると、p値は楽観的、信頼区間は狭すぎ、効果量は過大になります。これが「選択後推論(post-selection inference)」の問題で、データスヌーピングの一種です。回避には、選択用と検証用にデータを分割する、選択を含めた手続き全体を交差検証やブートストラップで包む、といった対応が要ります。

⑤ 貪欲法は「最良部分集合」を保証しない

ステップワイズは各段階で局所的に最良な1手を選ぶだけなので、全 $2^p$ 通りの中の真の最適部分集合に到達する保証はありません。🎮ウィジェットで前進と後退の最終AICがずれたのは、この限界の可視化です。さらに実データのBIC経路を見ると、$M_4$(4変数)のBICが $712.821$、$M_5$(5変数)が $712.415$ で、5番目の変数 C3301 を足してもBICはわずか $0.41$ しか改善しません。AICは「改善」と判定して採用しますが、BICなら「実質差なし」で止める判断もあり得ます。停止のわずかな差で最終モデルが変わるのが貪欲逐次探索の宿命です。

なぜ現代は Lasso / 正則化が好まれるのか:Lassoは L1 罰則で係数を連続的に $0$ へ縮めるため、選択と推定を1つの凸最適化として同時に行い、離散的な「入れる/外す」の不安定さを緩和します。罰則の強さ $\lambda$ を交差検証で選ぶ枠組みが確立しており、選択の安定性(選択頻度)も測りやすいのが利点です。多重共線性が強い本データのような場面では、L1+L2 を混ぜた Elastic Net が相関の強い変数群をまとめて残しやすく、ステップワイズより挙動が素直になります。詳細は LassoRidge正則化 を参照。

🚀 発展:情報量規準の使い分け・交差検証での安定性・正則化との対比

情報量規準の使い分け

AICとBICは同じ「$-2\log L$ + 罰則」の形ですが、目指すものが違います。AICは未知の真の分布への予測的なあてはまり(Kullback-Leibler情報量の最小化)を近似し、BICは候補の中から真のモデルを一致選択する($n\to\infty$ で真のモデルを選ぶ一致性)ことを狙います。標本が小さい局面では、AICを標本サイズで補正した AICc($=\mathrm{AIC}+\dfrac{2p(p+1)}{n-p-1}$)が使われます。$n=47$ で $p$ が大きいと $n-p-1$ が小さくなり補正項が効くため、本ページのように候補が多い小標本では AICc の併記が有効です。

規準罰則性格使いどころ
AIC$2p$予測志向・やや多めに変数を残す予測精度を優先したいとき
AICc$2p+\frac{2p(p+1)}{n-p-1}$小標本でのAIC補正$n/p$ が小さいとき(本データが該当)
BIC$p\log n$簡潔志向・変数を絞る一致性真のモデルの同定・過剰投入を避けたいとき

交差検証で「選択そのもの」の安定性を測る

情報量規準は同じ全データ1回の相対比較なので、選択の再現性(別の標本でも同じ変数が選ばれるか)は分かりません。そこで交差検証やブートストラップで、選択手続きそのものを繰り返し、各変数の選択頻度を見ます。$n=47$ と小さいので、Leave-One-Out CV やK分割CV、あるいはブートストラップ標本での再選択が現実的です。重要な注意は、変数選択をCVの内側(各foldの訓練部分)で行うことです。全データで選んでからCVで評価すると、テスト部分の情報が選択に漏れ、性能を過大評価します(リーク)。「100回のブートストラップで80回以上選ばれた変数だけを主結論にする」といった閾値運用にすると、選択後推論の危うさをある程度緩和できます。

正則化(Lasso / Ridge / Elastic Net)との対比

観点ステップワイズLasso (L1)Ridge (L2)Elastic Net
変数選択離散的に入れる/外す係数を厳密に0にして選択選択しない(縮小のみ)L1で選択+L2で安定化
多重共線性どれが残るか不安定相関群から1つに偏りがち係数を分け合い安定相関群をまとめて残しやすい
調整パラメータ停止閾値・探索方向$\lambda$(CVで選ぶ)$\lambda$(CVで選ぶ)$\lambda$ と混合比 $\alpha$
前処理標準化推奨標準化ほぼ必須標準化ほぼ必須標準化ほぼ必須

本データのようにVIFが数百に達する強い共線性では、Lassoは相関群からどれか1つに係数を寄せてしまい「Lasso自体も不安定」になり得ます。この弱点をL2罰則で補うのが Elastic Net で、相関の強い変数をグループとして残しやすくなります。一方 Ridge は変数を0にしないため選択には使えませんが、係数の分散を抑えて予測を安定させます。実務では、ステップワイズの結果を単独の結論にせず、Lasso/Elastic Net の選択と突き合わせ、複数手法で共通して残る変数を頑健な主結論に据えるのが安全です。上位概念の整理は モデル選択、基盤モデルは 重回帰分析 を参照してください。

まとめると、ステップワイズ法は「候補が多い状況で比較議論の入口を作る探索の道具」として今も有用ですが、そこで得た変数集合やp値をそのまま確証扱いしないことが肝心です。情報量規準は目的に応じて AIC/AICc/BIC を使い分け、選択の安定性は交差検証・ブートストラップで測り、最終的には正則化手法との一致を確認する——この三段構えが、$n=47$ の小標本で発表に耐える結論を作ります。

① データ準備と候補変数の定義

以降の②〜④は、この df / candidate_cols / X / y を共通の入力として使います。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) A4200(死亡数) 北海道 5,092,000 514,000 1,681,000 24,430 75,120 東京都 14,086,000 1,513,000 3,205,000 86,348 137,241 沖縄県 1,468,000 236,000 350,000 12,549 15,110 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].dropna()

candidate_cols = ['A1101', 'A1301', 'A1303', 'A4200', 'A5101',
                  'A9101', 'B4101', 'L3221', 'C3301', 'I5102', 'G7101']
X = df[candidate_cols].astype(float)  # 説明変数候補
y = df['A4101'].astype(float)         # 目的変数: 出生数

② scikit-learn の SequentialFeatureSelector

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.model_selection import KFold, cross_val_score

cv = KFold(n_splits=5, shuffle=True, random_state=42)
sfs = SequentialFeatureSelector(LinearRegression(),
                                n_features_to_select='auto',
                                tol=0.001,
                                direction='forward',
                                scoring='r2',
                                cv=cv)
sfs.fit(X, y)
selected_cols = [c for c, keep in zip(candidate_cols, sfs.get_support()) if keep]
score = cross_val_score(LinearRegression(), X[selected_cols], y, scoring='r2', cv=cv).mean()
print(f'選ばれた特徴量: {selected_cols}')
print(f'CV R²: {score:.3f}')

③ scikit-learn の SequentialFeatureSelector / RFE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.feature_selection import SequentialFeatureSelector, RFECV
from sklearn.model_selection import KFold

cv = KFold(n_splits=5, shuffle=True, random_state=42)
sfs = SequentialFeatureSelector(LinearRegression(), n_features_to_select=5,
                                direction='forward', scoring='r2', cv=cv)
sfs.fit(X, y)
print(f'選択: {[c for c, keep in zip(candidate_cols, sfs.get_support()) if keep]}')

rfe = RFECV(LinearRegression(), step=1, cv=cv, scoring='r2')
rfe.fit(X, y)
print(f'最適変数数: {rfe.n_features_}')
print('ランキング:', {c: int(v) for c, v in zip(candidate_cols, rfe.ranking_)})

④ Lasso による正則化ベース変数選択(推奨代替)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.linear_model import LassoCV
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler

cv = KFold(n_splits=5, shuffle=True, random_state=42)
X_scaled = StandardScaler().fit_transform(X)
lasso = LassoCV(cv=cv, random_state=42, max_iter=100000).fit(X_scaled, y)
nonzero = [c for c, v in zip(candidate_cols, lasso.coef_) if abs(v) > 1e-6]
coef = {c: round(float(v), 3) for c, v in zip(candidate_cols, lasso.coef_)}
print(f'最適 α: {lasso.alpha_:.4f}')
print(f'非ゼロ係数の変数: {nonzero}')
print(f'係数: {coef}')

🧭 まとめ:ステップワイズ法を安全に使うために

ステップワイズ法は、AIC・BIC・交差検証誤差などを基準に説明変数を1つずつ追加(前進選択)・削除(後退消去)・両方向で選ぶ自動変数選択法です。計算が軽く既存研究とも互換ですが、選ばれた変数が真の原因である保証はなく、候補設計・標本サイズ・多重共線性・外れ値・評価基準の選び方で結果が揺れます。SSDSE-B-2026のように n=47 の小標本では特に慎重に扱い、選択経路の記録、別基準での再確認、感度分析、ドメイン知識による解釈を添えて初めて発表で使える根拠になります。高次元では Lasso / Elastic Net が安定するため、ステップワイズは教育用・比較用と位置づけ、両手法で共通して選ばれる変数を主結論にすると安全です。