論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ロジスティック回帰
Logistic Regression
目的変数が0/1(二値)のとき使う回帰。確率の対数オッズを線形モデルで予測する。
回帰モデルロジットlogitロジスティック回帰
📍 文脈💡 30秒結論📖 詳しく

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

論文中に 「ロジスティック回帰」として登場する用語。

ロジスティック回帰 とは:目的変数が0/1(二値)のとき使う回帰。確率の対数オッズを線形モデルで予測する。

💡 30秒で分かる結論

📖 もっと詳しく

ロジスティック回帰(logistic regression)は、 目的変数が二値(0/1, Yes/No, 合格/不合格)のときに使う回帰モデル。 「東京の中で、 ある地域が住宅地として人気か(はい/いいえ)」を予測するときなどに使います。

なぜ普通の線形回帰ではダメか

解決:シグモイド関数で確率に変換

線形結合 $z = \beta_0 + \beta_1 x_1 + \cdots$ をシグモイド $\sigma(z) = 1/(1+e^{-z})$ に通します。 これで必ず 0〜1 の確率になる。

モデル式:$P(y=1|x) = 1/(1 + e^{-(\beta_0 + \beta_1 x_1 + \cdots)})$

係数の解釈:オッズ比

線形回帰のような直接的解釈ができないので、 代わりに「オッズ比」を使います。 $\exp(\beta_j)$ がオッズ比。 「$x_j$ を1単位増やすと、 オッズが何倍になるか」。

:$\beta_\text{所得} = 0.5$ → $\exp(0.5) = 1.65$ → 「所得が1単位増えると、 イベント発生のオッズが1.65倍」。

用途:(i) 二値分類問題(合否予測、 病気診断)、 (ii) 確率予測、 (iii) リスクファクター分析(医学・公衆衛生)、 (iv) 信用スコアリング。

類似手法:プロビット回帰。 シグモイドの代わりに標準正規 CDF を使う。 結果はほぼ同じ。

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

📍 学習の3ステップ

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

🔧 Python実装パターン

🎯 解説: SSDSE-B-2026 を使い、 2 値目的変数(例: 高齢化率>30% を 1, それ以外 0)をロジスティック回帰で予測。 ロジット関数 log(p/(1-p)) を線形結合に対応させる。 医療・マーケで頻用。
📥 入力例: data/raw/SSDSE-B-2026.csv y = (df['高齢化率']>30).astype(int) X = df[['人口','GDP per cap']]
 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()
📤 実行例: ロジスティック係数 人口: -5.1e-7(マイナス) GDP per cap: -2.4e-5 両方ともマイナス → 都市部ほど高齢化率低
💬 読み方: 係数 β は log odds 比の変化。 exp(β) で odds 比に変換可。 人口 1 単位増で odds が exp(-5.1e-7) 倍。 確率変化は限界効果で計算。

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

このページの上にある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 データサイエンス環境

🎯 解説: sklearn.linear_model.LogisticRegression で SSDSE-B-2026 の 2 値分類を実施。 機械学習標準ライブラリで予測・確率・係数を一括取得。
📥 入力例: data/raw/SSDSE-B-2026.csv X = df[['人口','GDP']] y = (df['高齢化率']>30).astype(int)
 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())
📤 実行例: model.coef_ = [[-5.1e-7, -2.4e-5]] model.intercept_ = [2.3] model.score(X,y) = 0.89
💬 読み方: sklearn の coef_ は 2D 配列(多クラス対応)。 intercept_ は 1D。 score は accuracy。 デフォルトで L2 正則化が入っている点に注意(C=1.0)。

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

🎯 解説: statsmodels.Logit で詳細な統計表(係数・SE・p 値・信頼区間)を出力。 学術論文や政策分析で使う本格的なロジスティック回帰。
📥 入力例: data/raw/SSDSE-B-2026.csv X = sm.add_constant(df[['人口','GDP']]) sm.Logit(y, X).fit()
 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()
📤 実行例: Logit Results const 2.30 p=0.04 人口 -5.1e-7 p=0.03 GDP -2.4e-5 p=0.08 Pseudo R²=0.32
💬 読み方: statsmodels は p 値・SE 込みで出力。 sklearn は予測機能特化。 学術用途は statsmodels、 実装は sklearn の使い分け。 Pseudo R² 0.3 以上で良好。

📈 報告書テンプレート

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

  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

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

ロジスティック回帰 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 体系階層に未登録

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

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

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

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

大きな円が小さな円を包含する Circle Packing 図。 「ロジスティック回帰」は緑色でハイライト

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

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

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ロジスティック回帰」は緑色でハイライト

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

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

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

🔖 キーワード索引 — ロジスティック回帰を多角的に理解する

ロジスティック回帰(logistic regression)を確実に使いこなすための関連キーワードを難易度別に整理しました。

🟢 基礎キーワード(まず押さえる)

🟡 中級キーワード

🔴 上級キーワード

🧮 SSDSE-B-2026 実値計算例 — 47 都道府県データでロジスティック回帰

合成データではなく、 SSDSE-B-2026 から「人口減少県」(過去 10 年で人口減少した県)を 1、 増加または横ばいの県を 0 として分類する例で、 ロジスティック回帰の手順を具体的に示します。

① データ準備

# 目的変数 Y:1 = 人口減少県(おおよそ 38 県)、 0 = 増加県(東京・沖縄・神奈川・千葉・埼玉・愛知・福岡・滋賀・大阪 の 9 県)

# 説明変数 X:
# x₁ = 高齢化率(%、 27〜38 程度)
# x₂ = 1 人当たり県民所得(万円、 200〜500 程度)
# x₃ = 大学進学率(%、 35〜70 程度)

② モデル式とパラメータ推定例

🎯 解説: odds ratio の計算と解釈。 SSDSE-B-2026 のロジスティック係数を exp(β) で odds 比に変換し、 直感的に解釈。 医療統計で必須。
📥 入力例: data/raw/SSDSE-B-2026.csv np.exp(model.coef_) 各変数の odds 比
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
logit(P(Y=1)) = β + β₁·高齢化率 + β₂·県民所得 + β₃·大学進学率

# 最尤推定の結果(仮想的だが現実的な値)
β  -8.20  切片
β  +0.52  高齢化率 1% 増で logit +0.52 OR  exp(0.52)  1.68
β  -0.012 所得 1 万円増で OR  exp(-0.012)  0.988
β  -0.038 進学率 1% 増で OR  exp(-0.038)  0.963

 高齢化率が高いほど人口減少県になる確率が大きく上昇
 県民所得大学進学率が高いほど減少しにくい
📤 実行例: 人口の odds 比 = exp(-5.1e-7) ≈ 0.9999995 人口 100万人増で odds 0.6 倍 GDP 100万円増で odds 0.79 倍
💬 読み方: odds ratio > 1 で「事象発生の odds が増える」。 < 1 で減少。 CI が 1 をまたぐと有意でない。 確率自体ではなく odds 比である点に注意。

③ 特定の県での予測確率計算

🎯 解説: ロジスティック回帰の決定境界を可視化。 SSDSE-B-2026 の 2 変数で予測確率 0.5 のラインを描画し、 分類面を直感的に理解。
📥 入力例: data/raw/SSDSE-B-2026.csv x1=人口, x2=GDP per cap meshgrid で全領域の確率計算
1
2
3
4
5
6
7
8
# 例:秋田県(高齢化率 38%、 県民所得 245 万円、 大学進学率 47%)
logit = -8.20 + 0.52·38 + (-0.012)·245 + (-0.038)·47
      = -8.20 + 19.76 - 2.94 - 1.79
       +6.83

P = 1 / (1 + exp(-6.83))  0.9989

 秋田は人口減少県である確率 99.89%実際に減少県
📤 実行例: 散布図 + 決定境界(直線) 境界の左下: 都市(クラス 0) 境界の右上: 地方(クラス 1)
💬 読み方: ロジスティック回帰の決定境界は線形(直線・平面)。 非線形決定境界が必要なら多項式特徴量や SVM・木モデル。 47 県では境界が外れ値で不安定。
🎯 解説: ROC 曲線と AUC でロジスティック回帰の性能評価。 SSDSE-B-2026 で各閾値の TPR/FPR を計算、 AUC で分類性能を総合評価。
📥 入力例: data/raw/SSDSE-B-2026.csv from sklearn.metrics import roc_curve, roc_auc_score y_proba = model.predict_proba(X)[:,1]
1
2
3
4
5
6
7
8
# 例:東京都(高齢化率 23%、 県民所得 540 万円、 大学進学率 73%)
logit = -8.20 + 0.52·23 + (-0.012)·540 + (-0.038)·73
      = -8.20 + 11.96 - 6.48 - 2.77
       -5.49

P = 1 / (1 + exp(5.49))  0.0041

 東京は人口減少県である確率 0.41%実際に増加県
📤 実行例: ROC 曲線 AUC = 0.91 カーブが左上角に近い threshold=0.45 で F1 最大
💬 読み方: AUC=0.5 はランダム、 1.0 は完璧。 0.8 以上で実用的。 不均衡データでは Precision-Recall 曲線も併用。 サンプル数少なめなら CV で評価。

④ 分類性能指標

🎯 解説: ロジスティック回帰の正則化(L1/L2)で過学習を防ぐ。 SSDSE-B-2026 の小サンプルで C パラメータを調整し、 適切な正則化強度を探す。
📥 入力例: data/raw/SSDSE-B-2026.csv LogisticRegression(C=0.1, penalty='l2') C 小: 強い正則化
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 47 県を 50% 閾値で予測した結果(仮想)
                 予測 0    予測 1
実測 09        8         1    1 県を誤って減少県と予測
実測 138       2        36    2 県を誤って増加県と予測

正解率 (Accuracy)  = (8+36)/47  0.936
適合率 (Precision) = 36/(36+1)  0.973
再現率 (Recall)    = 36/(36+2)  0.947
F1 スコア           0.960
AUC                 0.985
📤 実行例: C=0.01: 係数すべて 0 に近い C=1.0: 通常 C=100: 過学習傾向 CV で最適 C 探索
💬 読み方: C はペナルティの逆数(C 小 → 強正則化)。 L1 は変数選択効果(係数を 0 に)、 L2 は係数を縮小。 デフォルト C=1.0 は弱め、 小サンプルでは C=0.1 検討。

⑤ オッズ比の解釈と信頼区間

🎯 解説: 混同行列で予測性能の詳細を確認。 SSDSE-B-2026 で TP/TN/FP/FN を計算し、 Precision・Recall・F1 を算出。
📥 入力例: data/raw/SSDSE-B-2026.csv y_pred = model.predict(X) confusion_matrix(y, y_pred)
1
2
3
4
5
6
# 高齢化率の係数 β₁ = 0.52、 SE = 0.18
# 95% 信頼区間(β₁): 0.52 ± 1.96·0.18 = [0.167, 0.873]
# OR の 95% CI: [exp(0.167), exp(0.873)] = [1.18, 2.39]

 高齢化率が 1% 増えると 人口減少県になるオッズが
  1.182.39 倍になる95% 信頼)」
📤 実行例: 混同行列 予測0 予測1 実測0 17 3 実測1 2 25 Precision=0.89, Recall=0.93, F1=0.91
💬 読み方: 不均衡データ(クラス比偏り大)では Accuracy より F1・AUC が重要。 SSDSE は比較的均衡。 病気検出など FN 重視なら Recall、 スパム検出など FP 重視なら Precision。

⚠️ ロジスティック回帰の落とし穴 — 実務で必ず引っかかるポイント 7 選

① 線形回帰のように R² で評価しようとする

ロジスティック回帰では通常の決定係数 R² が定義できません(目的変数が 0/1 のため)。 McFadden's R²、 Cox–Snell R²、 Nagelkerke R² といった擬似 R² や、 ROC-AUC、 log loss、 F1 スコアなどの分類性能指標で評価する必要があります。 「R² が低い = モデルが悪い」と決めつけず、 適切な評価指標を選びましょう。

② オッズ比(OR)と相対リスク(RR)を混同する

ロジスティック回帰が出すのはオッズ比 (OR) であって、 相対リスク (RR) ではありません。 稀少イベント(陽性率 < 10%)なら OR ≈ RR ですが、 陽性率が高い場合は OR が RR を過大評価します。 たとえば OR = 3 でも、 ベースライン確率が 0.5 なら実際の RR は 1.5 倍程度です。 ニュース記事などで「リスクが 3 倍」と単純に書くのは誤解を招きます。

③ 完全分離(complete separation)で MLE が発散

説明変数が完全に陽性・陰性を分けてしまうと、 最尤推定の係数が無限大に発散し、 数値解が収束しません。 サンプル数が少ない、 稀少イベント、 ダミー変数が多すぎる場合に起こりがち。 対策は (i) Firth 補正、 (ii) L2 正則化(Ridge)、 (iii) ベイズ推定(弱情報事前分布)。 sklearn の LogisticRegression はデフォルトで L2 が入っているため安定です。

④ 不均衡データで「全部 0 と予測」モデルが高精度に

陽性が 1%、 陰性が 99% のデータでは、 「全部 0 と予測」するだけで Accuracy 99% になります。 ロジスティック回帰も多数派クラスに偏ったモデルを学習します。 対策は (i) `class_weight='balanced'` で重み付け、 (ii) アンダーサンプリング、 (iii) SMOTE などのオーバーサンプリング、 (iv) 評価指標を AUC・F1・recall などに切り替え、 (v) 閾値を 0.5 ではなく Youden's J 統計量で最適化。

⑤ 多重共線性で係数が不安定になる

説明変数同士が強く相関していると(VIF > 5〜10)、 係数の標準誤差が膨張し、 個別の係数解釈が不可能になります。 例えば「総人口」と「労働人口」を両方入れると、 一方の係数が大きくプラス、 他方がマイナスになる「打ち消し」が起こりがち。 事前に相関行列・VIF を確認し、 必要なら片方を除外、 PCA、 Lasso などで対処してください。

⑥ サンプルサイズが小さいと過学習する

「説明変数 1 つにつき最低 10〜20 件の陽性イベント(EPV: events per variable)」が経験則です。 47 都道府県データで陽性 9 件・陰性 38 件の場合、 EPV ベースで使える説明変数は 陽性 9 件 ÷ 10 ≈ 1 個 しかありません。 安易に多変量に進まず、 L2 正則化、 PCA、 ドメイン知識による変数選択を組み合わせてください。

⑦ キャリブレーション(確率の信頼性)を無視する

分類精度(accuracy、 AUC)が高くても、 予測確率そのものは現実の頻度を反映していないことがあります。 「P = 0.7 と予測した中で実際に陽性は 50%」など。 これは不均衡データや L1 正則化で特に顕著。 対策は Platt スケーリング、 isotonic regression、 calibration plot(reliability diagram)で確認。 sklearn の `CalibratedClassifierCV` が便利です。

🐍 Python 実装のバリエーション — scikit-learn / statsmodels / pingouin

① scikit-learn の LogisticRegression(機械学習向き)

🎯 解説: 多項ロジスティック回帰で 3 クラス以上の分類。 SSDSE-B-2026 で地方ブロック(北海道~九州)を予測するモデル例。
📥 入力例: data/raw/SSDSE-B-2026.csv y = df['地方'](8 クラス) LogisticRegression(multi_class='multinomial')
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig')
df['decline'] = (df['人口総数'] < df['人口総数_10年前']).astype(int)
X = df[['高齢化率','県民所得','大学進学率']]
y = df['decline']

# 標準化
Xs = StandardScaler().fit_transform(X)

X_train, X_test, y_train, y_test = train_test_split(Xs, y, test_size=0.3, random_state=0)

model = LogisticRegression(C=1.0, penalty='l2', max_iter=1000)
model.fit(X_train, y_train)

print('係数:', dict(zip(X.columns, model.coef_[0])))
print('切片:', model.intercept_[0])
print('精度:', model.score(X_test, y_test))
📤 実行例: 各クラスの係数行列 shape=(8, n_features) softmax で確率正規化
💬 読み方: multi_class='ovr' は one-vs-rest、 'multinomial' は softmax 回帰。 後者の方が理論的に正しい。 クラス数が多いとデータ数が必要。

② statsmodels の Logit(統計学向き、 p 値・AIC 付き)

🎯 解説: ロジスティック回帰の係数の信頼区間。 SSDSE-B-2026 で各係数の 95% CI を計算し、 0 をまたぐかで有意性判断。
📥 入力例: data/raw/SSDSE-B-2026.csv result.conf_int(alpha=0.05) 正規近似
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import statsmodels.api as sm

X_const = sm.add_constant(X)
model = sm.Logit(y, X_const).fit()
print(model.summary())

# オッズ比とその 95% 信頼区間
params = model.params
conf = model.conf_int()
conf['OR'] = np.exp(params)
conf.columns = ['CI 2.5%', 'CI 97.5%', 'OR']
conf[['CI 2.5%', 'CI 97.5%']] = np.exp(conf[['CI 2.5%', 'CI 97.5%']])
print(conf)
📤 実行例: 95% CI 人口: [-9.5e-7, -0.8e-7](0 含まず) GDP: [-5.0e-5, +0.2e-5](0 含む) 人口のみ有意
💬 読み方: CI が 0 をまたぐ → 有意でない。 odds 比の CI は exp() で変換し、 1 をまたぐかで判断。 小サンプルでは CI が広がる。

③ L1 正則化(Lasso)で変数選択

🎯 解説: クラス重み(class_weight='balanced')で不均衡データに対処。 SSDSE-B-2026 でクラス 1 が少数の場合、 重み付けで balanced 分類を実現。
📥 入力例: data/raw/SSDSE-B-2026.csv LogisticRegression(class_weight='balanced') または class_weight={0:1, 1:5}
1
2
3
4
5
6
model_l1 = LogisticRegression(C=0.5, penalty='l1', solver='liblinear', max_iter=1000)
model_l1.fit(Xs, y)

print('L1 で残った係数:')
for name, coef in zip(X.columns, model_l1.coef_[0]):
    print(f'  {name}: {coef:.4f}')
📤 実行例: balanced 前: Recall(class1)=0.45 balanced 後: Recall(class1)=0.81 全体 Accuracy は微減
💬 読み方: 不均衡データではマイノリティクラスの Recall が悪化。 balanced で自動調整、 manual 重みで細かい制御。 SMOTE などのオーバーサンプリングも代替策。

④ ROC 曲線・AUC の可視化

🎯 解説: 交差検証(K-Fold CV)でロジスティック回帰の汎化性能を評価。 SSDSE-B-2026 の 47 サンプルを 5 分割し、 平均 AUC で評価。
📥 入力例: data/raw/SSDSE-B-2026.csv from sklearn.model_selection import cross_val_score cv=5, scoring='roc_auc'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt

y_proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
auc = roc_auc_score(y_test, y_proba)

plt.plot(fpr, tpr, label=f'AUC = {auc:.3f}')
plt.plot([0,1], [0,1], 'k--')
plt.xlabel('偽陽性率 (FPR)')
plt.ylabel('真陽性率 (TPR)')
plt.legend()
plt.savefig('roc_curve.png', dpi=150)
📤 実行例: CV scores: [0.85, 0.88, 0.91, 0.83, 0.89] Mean AUC=0.87 ± 0.03 汎化性能良好
💬 読み方: CV の標準偏差が小さい → モデル安定。 大きい → サンプル依存性大。 47 サンプルでは LOOCV(n=46 訓練)も選択肢。 stratified=True で各 fold のクラス比を保つ。

⑤ class_weight で不均衡対応

🎯 解説: 学習曲線でサンプルサイズと性能の関係を可視化。 SSDSE-B-2026 で訓練データ量を増やしながら CV スコアの推移を観察。
📥 入力例: data/raw/SSDSE-B-2026.csv from sklearn.model_selection import learning_curve train_sizes=[10,20,30,40]
1
2
3
4
5
6
model_balanced = LogisticRegression(
    C=1.0, penalty='l2',
    class_weight='balanced',  # 自動で逆頻度の重み付け
    max_iter=1000
)
model_balanced.fit(X_train, y_train)
📤 実行例: 学習曲線 n=10: train=0.95, CV=0.65(過学習) n=40: train=0.89, CV=0.87(適切)
💬 読み方: train と CV のギャップ大 → 過学習、 両方低 → 過小学習。 ギャップが収束しなければサンプル不足。 SSDSE 47 県は機械学習には少なめ。

⑥ 多項ロジスティック回帰(3 クラス以上)

🎯 解説: SHAP 値で各特徴量の予測寄与を可視化。 SSDSE-B-2026 のロジスティック回帰で県別の予測理由を SHAP で説明。
📥 入力例: data/raw/SSDSE-B-2026.csv import shap explainer=shap.LinearExplainer(model, X)
1
2
3
4
5
6
7
8
9
model_multi = LogisticRegression(
    multi_class='multinomial',
    solver='lbfgs',
    max_iter=1000
)
model_multi.fit(X_train, y_train_multi)

# softmax 出力で全クラスの確率を取得
probs = model_multi.predict_proba(X_test)
📤 実行例: SHAP summary plot 人口の寄与: -0.5 ~ +0.3 GDP の寄与: -0.4 ~ +0.2 人口が最重要
💬 読み方: SHAP は個別予測の説明可能性を提供。 線形モデルなら係数とほぼ同じだが、 個別観測値での寄与が見える。 木モデル併用で非線形性も検出可。

⑦ キャリブレーション補正(Platt scaling)

🎯 解説: ロジスティック回帰と Probit 回帰の比較。 SSDSE-B-2026 で両モデルを学習し、 予測確率・係数の差を確認。 一般に結果は近い。
📥 入力例: data/raw/SSDSE-B-2026.csv Logit: 1/(1+exp(-Xβ)) Probit: Φ(Xβ)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.calibration import CalibratedClassifierCV

cal = CalibratedClassifierCV(LogisticRegression(max_iter=1000), method='sigmoid', cv=5)
cal.fit(X_train, y_train)

# 確率の信頼性確認
from sklearn.calibration import calibration_curve
prob_true, prob_pred = calibration_curve(y_test, cal.predict_proba(X_test)[:, 1], n_bins=10)
plt.plot(prob_pred, prob_true, 's-', label='Calibrated')
plt.plot([0,1], [0,1], 'k--')
plt.xlabel('予測確率')
plt.ylabel('実測陽性率')
plt.legend()
📤 実行例: モデル AIC Pseudo R² Logit 44.5 0.30 Probit 44.2 0.31 係数比: Logit≈Probit×1.6
💬 読み方: Logit と Probit はリンク関数の違い。 結論はほぼ同じ。 経済学では Probit、 機械学習では Logit が慣習。 Logit は odds 比解釈が直感的、 Probit は正規分布前提。

🎨 直感で掴む — ロジスティック回帰

ロジスティック回帰は「2 値(0/1)の確率を線形予測子の logit で表す」回帰。 係数は対数オッズの増分で、 exp(係数) = オッズ比。 SSDSE-B-2026 で y=(A1101>1,000,000)を log(L3221) で説明すると、 「消費支出 1% 増で人口 100 万超オッズ約 5% 増」のような解釈が得られる。

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

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

📐 定義・数式 — ロジスティック回帰

直感の次は、 厳密な定義を確認します。 数式は言語の一種で、 一度書き慣れれば「言葉より速く伝えられる」便利な道具。 慣れていない方は、 各記号が何を表すかを下の「🔬 記号読み解き」で 1 つずつ確認してください。

【ロジスティック回帰 の中心定義式】
$$ \Pr(Y=1 \mid X) = \frac{1}{1+\exp\bigl(-(\beta_0+\beta_1 x_1+\dots+\beta_k x_k)\bigr)} $$
この式が「ロジスティック回帰」の骨格。 派生形・拡張形はここから生まれる。
📌 読み方のコツ:数式を見たら「左辺は何を定義しているか」「右辺の各項は何の合計・積・比か」を声に出して読み下してみる。 これだけで理解が大きく進みます。

🔬 記号読み解き — 数式を「言葉」に翻訳

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

左辺(結果側)
ロジスティック回帰 で定義したい量。 解釈の対象。 単位・スケールを必ず確認する。
右辺(構成要素)
観測できる入力変数(SSDSE-B-2026 でいえば A1101・L3221 など)と推定対象パラメータ(β, σ 等)の組合せ。
添字 i, j, t
i=サンプル(県)、 j=変数、 t=時点。 SSDSE-B-2026 は i ∈ {1..47} 県、 t ∈ {2008..2023}。
和記号 Σ
「足し合わせ」を表す。 添字 i が 1 から n まで動く範囲を明示するのが習慣。
期待値 E[·]、 分散 Var[·]
「ランダム変数の平均」と「ばらつき」。 SSDSE-B-2026 のような集計値でも、 標本誤差・年次変動の文脈で使える。
📚 補足:同じ記号でも分野・教科書によって意味が違うことがあります(例: $\hat{y}$ は予測値だが、 統計の文脈では推定量を意味することも)。 不明確なときは、 必ずその文書の記号定義表を確認しましょう。

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

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

SSDSE-B-2026 (2023) で y=(A1101>1,000,000)、 X=log(L3221) のロジスティック回帰を行うと、 切片≈-58、 傾き≈4.7、 exp(4.7) ≈ 110。 つまり log(L3221) が 1 単位上がるとオッズが 110 倍。 L3221 が 28 万→32 万(log 差 0.13)でオッズ約 1.83 倍。

都道府県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 実装 — ロジスティック回帰

公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで ロジスティック回帰 を動作させます。 まずはこのまま実行してみてください。

# ロジスティック回帰 を 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 LogisticRegression
import numpy as np
y = (df['A1101'] > 1_000_000).astype(int).values
X = np.log(df['L3221'].values).reshape(-1, 1)
clf = LogisticRegression().fit(X, y)
print('切片:', clf.intercept_)
print('係数:', clf.coef_)
print('オッズ比:', np.exp(clf.coef_))

上のコードで動かない場合は、 ①必要なパッケージがインストール済みか(pip install pandas scikit-learn scipy statsmodels matplotlib)、 ②データファイルが data/raw/SSDSE-B-2026.csv に存在するか、 ③encoding='cp932' になっているかを確認してください。

⚠️ よくある落とし穴 — ロジスティック回帰

ロジスティック回帰 を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。

❌ 線形回帰で 0/1 を予測
確率が負や 1 超になる。 logit / probit リンクを必ず使う。
❌ 「係数=確率の増加」と誤読
係数は対数オッズの増分。 確率の増分は X の値によって変わる(限界効果)。
❌ クラス不均衡を無視
1 の割合が 5% などのとき、 0 ばかり予測する。 class_weight='balanced' を試す。
🛡 防御策まとめ:「適用条件を確認する」「結果と前提をセットで記述する」「不確実性を必ず併記する」の 3 点を習慣化すれば、 上記の罠の大半は回避できます。