予測分析 (Predictive Analytics) は過去データから将来や未観測値を確率モデル/ML で予測する分野で、 回帰・分類・時系列の 3 系統が中心。 SSDSE-B-2026 の 2012〜2023 年データから 2024〜2028 年の都道府県別人口を線形回帰・Holt 指数平滑・ARIMA で予測し、 MAE / RMSE で精度比較する流れを通す。
これらのキーワードは「predictive analytics の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
未来を当てる予言のようなものです。
正しい判断をするために使います。
お店で売れる商品の数を考えます。
予測と判断の基本について読みましょう。
予測・判断:未来予測・意思決定支援
🍰 まずはやさしく
AIの基礎となる考え方です。
データの使い道を理解するために使います。
来年の人口の変化を予想します。
この用語がどこで使われるか読みましょう。
この用語は AI基礎 カテゴリに属します。 関連する別称・略号:(なし)。
論文・実務レポートで 予測・判断 が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。
位置づけ:過去データから 未来や未観測の値を推定する分析活動の総称。 SSDSE-B-2026 のような公的統計で「来年の出生数」「未調査県の指標」を予測する応用は典型例。 統計学 + 機械学習 + ドメイン知識のクロスオーバー。
🍰 まずはやさしく
過去の経験から答えを出すことです。
まだ起きていないことを知るために使います。
スマホのプランを変えるか決めます。
予測の具体的なやり方を読みましょう。
「明日の売上はいくらか?」「このお客は解約しそうか?」のように、 まだ起きていない出来事 (未来) や 観測されていない値 (欠損) を、 過去の実績データに基づいて推定するのが Predictive Analytics。 統計学・機械学習を業務問題に貼り合わせた「分析活動の総称」と理解すると良い。
| 予測の型 | SSDSE-B-2026 の例 | 向く手法 |
|---|---|---|
| 時系列予測 (過去→未来) | 東京都 A1101 (総人口) の 2013-2023 推移から 2028 年人口を点予測。 直近 5 年で線形回帰すると傾き 14,841 人/年 → 2028 年 1414 万人。 | ARIMA / 線形トレンド / Prophet |
| クロスセクション予測 (他県→未観測県) | A1303 (65 歳以上人口) と I5102 (一般診療所数) から、 仮に 1 県のデータが欠損していても他 46 県の関係式で穴埋め予測。 | 重回帰 / Random Forest / KNN |
| 分類 (確率) 予測 (2 値 or 多クラス) | 「人口 100 万人超え」を 1, 未満を 0 として、 A5101 (転入者数) などから確率を予測。 47 県中 37 県が 100 万超えで base rate 79%。 | ロジスティック回帰 / XGBoost |
記述統計 (Descriptive) は「何が起きたか」、 診断分析 (Diagnostic) は「なぜ起きたか」、 Predictive は「次に何が起きそうか」、 Prescriptive は「どう対処すべきか」を扱う。 Predictive はこの 4 段階の 3 つ目であり、 単独で動くより前後段と接続して「意思決定の根拠」として価値が出る。
下のグラフは 過去データ(架空の合成データ) から予測モデルを作り、 将来を外挿 する様子を体感するミニ実験です。 「モデルの複雑さ(多項式の次数)」を変えると、 過去へのあてはまり・将来予測・そして 予測区間(不確実性の幅) がどう変わるかをリアルタイムに観察できます。 グラフ上を ドラッグ(スマホはスワイプ) すると予測地点(オレンジの縦線)を左右に動かせます。
※ グラフのデータは検証用に生成した架空の合成データです(真の関係はおおむね直線+ノイズ)。 実在の統計値ではありません。 予測区間は係数の不確実性を含む約95%区間(正規近似, ŷ ± 1.96·s·√(1+レバレッジ))で、 データ範囲から離れるほど広がります。
🍰 まずはやさしく
予測を数式で表したものです。
答えがどれくらい正しいか調べるために使います。
テストの点数を予想して計算します。
予測を評価する指標について読みましょう。
$\hat{y}$ は予測値、 $\mathbf{x}$ は入力特徴量、 $\boldsymbol{\theta}$ はモデルパラメータ。 学習データ $\{(\mathbf{x}_i, y_i)\}$ から損失最小化で $\boldsymbol{\theta}$ を推定する。
予測モデルの評価指標は乱立しており、 どれを主指標にすべきか迷う場面が多々あります。 ここでは回帰・分類・確率予測・順位付け・時系列という 5 つの予測タスクごとに、 主要指標の特徴、 使うべき場面、 読み方の勘所をまとめます。 指標選択を誤ると「精度の高いはずのモデルが業務 KPI を改善しない」という事故が起きるため、 ビジネス文脈と指標の意味を必ず突き合わせてください。
| 指標 | 特徴 | 使うべき場面 |
|---|---|---|
| MAE | 絶対誤差の平均、 外れ値に頑健 | 外れ値を許容する業務 (在庫予測等) |
| RMSE | 二乗誤差の平方根、 大きな誤差にペナルティ | 大外れを避けたい業務 (電力需要等) |
| MAPE | 百分率誤差、 スケール非依存 | 複数 SKU の予測精度を統一比較 |
| R² | 決定係数、 説明分散の割合 | 説明力を端的に伝える経営報告 |
| Quantile Loss | 分位点予測の評価 | 信頼区間や安全在庫を扱う予測 |
| 指標 | 特徴 | 使うべき場面 |
|---|---|---|
| Precision | 陽性予測のうち真陽性割合 | FP コスト大 (誤介入を避けたい) |
| Recall | 実陽性のうち捕捉した割合 | FN コスト大 (見逃しを避けたい) |
| F1 | precision と recall の調和平均 | 両者バランスを取りたい場合 |
| ROC-AUC | 閾値非依存、 ランキング能力 | クラス均衡データの総合評価 |
| PR-AUC | precision-recall 曲線下面積 | 不均衡データ (陽性率 < 10%) |
| Brier Score | 予測確率と実ラベルの二乗誤差 | 確率値そのものを使う意思決定 |
分類モデルの予測確率は、 そのまま「実際の確率」として使えるとは限りません。 例えば「予測確率 0.8 の顧客」の実際の解約率が 0.5 だった場合、 モデルは過剰に陽性側にバイアスしています。 この乖離を測るのがキャリブレーション曲線で、 横軸に予測確率、 縦軸に実際の発生率をビン分けで描き、 対角線に近いほど良いキャリブレーションです。 ロジスティック回帰は比較的キャリブレーションが良く、 ランダムフォレストや勾配ブースティングは確率が極端に偏る傾向があります。 補正には Platt scaling や Isotonic Regression を使い、 sklearn の CalibratedClassifierCV で実装できます。 予測確率を業務判断 (期待効用計算、 リソース配分) に使うなら、 キャリブレーション補正はほぼ必須です。
時系列予測では、 通常の交差検証ではなく時系列分割 (TimeSeriesSplit) を使います。 また、 評価対象期間に応じて指標が変わります。 短期予測 (翌日・翌週) は MAPE/RMSE、 中期 (翌月) は信頼区間のカバレッジ率 (実値が予測区間に入る割合)、 長期 (翌年) は方向性 (上昇/下降トレンドの一致) を主指標にするのが現場の知恵です。 さらに、 季節性や祝日効果が強い場合は季節調整後の残差に対する評価を併用し、 「ベースライン (前年同月) を超えているか」を判定します。 単純に MAPE が小さいだけでは「前年同月予測」に負けていることもあるため、 ベースラインとの相対比較は必須です。
技術指標 (AUC, RMSE) は最終的に業務 KPI (売上、 利益、 在庫回転率) に翻訳する必要があります。 例えば「AUC 0.85」だけでは経営判断材料になりませんが、 「上位 10% に介入することで解約率を 12% → 8% に低減し、 年間 4.2 億円の収益保護効果」という表現にすれば意思決定者に伝わります。 翻訳の鍵は (1) 介入対象数、 (2) 介入による改善率、 (3) 単価 (LTV や売上単価) を掛け合わせる単純な式で、 「予測の何が経済価値に変わるか」を必ず明示します。 この翻訳作業を怠ると、 技術チームと経営層の間で「精度は良いのに評価されない」という不幸が発生します。
ある中堅小売チェーンが、 全国 80 店舗の発注業務を予測分析で自動化しようとした実例を題材に、 予測分析プロジェクトが辿る典型的な三幕を物語形式でまとめます。 これは複数の実プロジェクトを匿名化・再構成したものですが、 多くの企業が同じパターンを踏むため、 自社プロジェクトの現在地を確認する鏡として使えます。
情シス部長が外部ベンダーと組み、 過去 3 年分の販売実績を機械学習で分析。 PoC では LightGBM が「翌週販売数 MAPE 12%」という好成績を示し、 経営会議でも「これで在庫を 30% 削減できる」と勢いがつきました。 しかし本番投入してみると、 (1) 雨の日の傘の販売、 (2) 近隣でのイベント開催、 (3) 新商品投入後の旧商品売上低下、 という過去データに無い状況で予測が大きく外れ、 一部店舗で欠品・過剰在庫が頻発。 店長たちは「やはり経験に勝るものはない」と AI 発注を無視するようになり、 PoC は 3 ヶ月で凍結されました。 失敗の主因は「過去データだけで未来を語れる」という暗黙の前提と、 「予測値の不確実性」を発注ロジックに組み込まなかったことでした。
プロジェクトリーダーが交代し、 データサイエンス経験のある中途採用者がアプローチを根本から見直しました。 (1) 気象データ・近隣イベント・新商品カレンダーを特徴量に追加、 (2) 点推定でなく信頼区間を発注ロジックに組み込み、 (3) パイロット 5 店舗でシャドー運用を 2 ヶ月実施し、 予測と店長判断を並走させて差分を分析、 (4) 「AI 発注」を強制せず、 「AI サジェスト + 店長承認」のフローに変更。 この間に店長たちと「どんな予測値ならサジェストとして使えるか」を議論し、 「販売数の中央値 + 80% 信頼区間上限まで発注、 売れ残りリスクが大きい場合は店長判断で減らせる」という運用ルールを共有しました。 結果、 パイロット 5 店舗で在庫回転率が 1.2 倍に改善、 店長の発注作業時間は週 8 時間 → 2 時間に削減。 重要だったのは「精度向上」より「予測の使い方の設計」と「現場との合意形成」でした。
パイロット成功を受け、 半年かけて全 80 店舗に段階展開。 店舗ごとに過去販売の特性 (郊外型・駅近型・観光地型) が違うため、 全店舗共通の単一モデルではなく「店舗特性クラスタごとのモデル + 店舗固有の補正項」という階層構造を採用しました。 月次で MAPE・欠品率・在庫回転率を全店モニタリングし、 閾値悪化店舗には個別レビューを実施。 1 年後の評価では、 全社の在庫水準は 22% 削減、 欠品率は 3.8% → 2.1% に低減、 年間で在庫費用 8.4 億円・機会損失 5.2 億円の合計 13.6 億円の改善効果を確認しました。 さらに副次効果として、 店長が在庫管理から解放され、 接客・新商品提案・スタッフ育成に時間を投じられるようになり、 客単価も改善傾向に。 「予測分析は単独で価値を生むのではなく、 業務プロセス全体を再設計する触媒として機能する」ことを示す事例となりました。
この物語が示す教訓は明快です。 第一に、 PoC の精度数値だけで本番展開を決断してはいけない。 PoC は「過去データで再現できる範囲」しか証明しないため、 本番では必ず未知の状況に直面します。 第二に、 予測モデル単独ではなく「予測 + 判断 + 業務プロセス + 現場との合意」のセットで設計しなければならない。 第三に、 段階展開 (シャドー → パイロット → 全展開) のリスク管理が、 大規模失敗を防ぐ唯一の方法である。 そして最後に、 予測分析の真の成果は「予測精度の高さ」ではなく「業務 KPI の改善 + 現場の働き方の質向上」である、 という視点を経営層と共有することが、 プロジェクトを成功に導く最終条件になります。
予測分析プロジェクトを開始する前、 PoC を本番展開に切り替える前、 既存モデルの精度劣化対応を始める前、 という 3 つの節目で必ず確認すべき項目を、 そのまま会議資料に貼れる形でまとめます。 各項目を満たさないままフェーズを進めると、 後工程で大きな手戻りや業務インパクトを招きます。
これらのチェックを毎プロジェクトで踏襲することで、 「PoC は成功したのに本番で躓く」という最も多い失敗パターンを構造的に防ぐことができます。 予測分析の成熟度は、 個別モデルの精度ではなく、 こうしたプロセスの再現性・標準化レベルに表れます。
予測分析プロジェクトを成功させるための実践的な要諦を 10 か条にまとめます。 各項目は実プロジェクトでの失敗・成功事例から抽出した、 そのまま現場のチェックリストとして使える内容です。
| 区分 | 用語 | 関連の理由 |
|---|---|---|
| 前提 | 回帰分析 | 連続値予測の最も基礎的なツール |
| 前提 | 分類 | 離散ラベル予測の基本 |
| 前提 | 教師あり学習 | 予測分析の中核を成す枠組み |
| 並列 | 時系列分析 | 時間依存データの予測手法 |
| 並列 | 予測(フォーキャスト) | 需要予測・売上予測等の総称 |
| 並列 | 異常検知 | 「異常確率」を予測する応用 |
| 並列 | 推薦システム | 「好みの確率」を予測して順位付け |
| 発展 | 因果推論 | 予測値に対する介入効果の測定 |
| 発展 | A/B テスト | 予測 → 行動の効果検証 |
| 発展 | モデル監視 | 本番投入後の精度・ドリフト管理 |
| 発展 | 再学習 | 予測精度を維持する継続運用 |
| 発展 | 説明可能性 | 予測結果の根拠提示 |
予測分析は「未来を当てるゲーム」ではなく、 「不確実性を定量化し、 それを前提に最善の意思決定を支援する仕組み」です。 モデル精度の追求は手段であって目的ではありません。 業務 KPI と整合した評価設計、 予測と判断の分離、 継続的なモニタリングと再学習。 この 3 点を地道に押さえることが、 予測分析プロジェクトを「PoC 止まり」から脱却させる最短経路になります。
数式に出てくる記号の意味を 1 つずつ確認しましょう。
Predictive Analytics は「過去から未来を読む」分析活動。 その中核となる数式を「言葉」で読み解く。
言葉:「特徴 X が x のときの Y の平均値を予測値とする」。 これが回帰の数学的基礎。 SSDSE-B-2026 で「人口 200 万人の県の出生数はどれくらいか」を考えると、 同程度の人口の県の出生数の平均が予測値になる。
言葉:「パラメータ θ のとき、 観測データが得られる確率」。 これを最大化するのが最尤推定。 線形回帰のガウス仮定なら MSE 最小化と等価。
言葉:予測値の周りに「不確実性の範囲」を加える。 SSDSE で「東京の来年出生数」を 8.6 万 ± 5,000 人と予測する場合(SSDSE-B-2026 実測では東京都の 2023 年出生数 A4101 = 86,348 人)、 この区間が予測の信頼性を表す。
言葉:K-fold で「未知データへの汎化性能」を測る。 in-sample 性能だけでは過学習の罠に落ちる。 必ず out-of-sample で評価。
言葉:事前知識 p(θ) にデータを掛け合わせて事後分布を得る。 SSDSE-B-2026 のような小サンプルでは「事前知識(過年度データ・専門家知識)」を活かすベイズアプローチが有効。
これら 5 つの数式が Predictive Analytics の中核。 「条件付き期待値」が回帰の基礎、 「尤度」が学習の指針、 「予測区間」が不確実性、 「交差検証」が汎化性能評価、 「ベイズ更新」が知識統合。 SSDSE-B-2026 のような公的統計を予測する際は、 これら 5 つを 常に意識することで、 単なる「数値出力」を超えた、 統計学的に正しい予測活動が可能になる。 数式を言葉で読み解くことで、 「ブラックボックスとしての ML」から「説明可能で頑健な予測」へとレベルアップできる。 これが Predictive Analytics の真髄である。
業界標準の予測分析プロセスフレームワーク。 6 ステップ。
地方創生研究所のあなたは「2030 年の県別出生数を予測せよ」と依頼を受けた。 SSDSE-B-2026 の過去データから、 未来の出生数を予測する Predictive Analytics プロジェクトを立ち上げる必要がある。 単純な外挿では不十分で、 統計学的に頑健な予測手法を選ぶ必要がある。
CRISP-DM ワークフローを採用。 ① SSDSE-B-2026 を読み込み、 ② 出生数の時系列推移を EDA、 ③ 「人口」「年齢構成」「経済」など 10 特徴を構築、 ④ 線形回帰・XGBoost・Prophet を比較、 ⑤ 5-fold CV で評価、 ⑥ 最良モデルを選んで予測区間も同時に出力、 ⑦ MLOps パイプラインで定期再学習。
SSDSE-B-2026 の解析で、 線形回帰 RMSE = 6,300 人、 XGBoost RMSE = 4,200 人、 Prophet RMSE = 5,100 人。 XGBoost が最良。 2030 年予測:全国出生数 約 65 万人(2026 年比 -10%)、 95% 予測区間 [60 万, 70 万]。 47 県別では、 沖縄が予測 RMSE 最大(独自性高い)、 東北 4 県は安定的減少。 (※本段落の RMSE・2030 年予測値はシナリオ説明用の架空例であり、 実データの解析結果ではない。)
Predictive Analytics は 「過去 + 統計学 + ドメイン知識 = 未来の見える化」のプロセス。 SSDSE 解析者にとっての教訓は ① 単一モデルではなく複数比較、 ② 必ず CV で評価、 ③ 予測区間で不確実性を伝える、 ④ ドリフト監視で持続性確保、 ⑤ ドメイン専門家と協働して解釈、 という 5 点。 「数値を出すこと」ではなく「意思決定に資する予測」を目指すのが Predictive Analytics の真価。
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression, Ridge from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.model_selection import KFold, cross_val_score, train_test_split from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score from sklearn.preprocessing import StandardScaler # 1. データ理解 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] # 2023年のクロスセクション47県に限定(年混在を防ぐ) target = 'A4101' # 出生数 features = ['A1101', 'A1303', 'A5101', 'A4200', 'E4501', 'E4601', 'F3101', 'I5102', 'C3301', 'B4101'] # 2. データ準備 X = df[features].fillna(df[features].median()).values y = df[target].values X_scaled = StandardScaler().fit_transform(X) # 3. モデル比較 models = { 'LinearRegression': LinearRegression(), 'Ridge': Ridge(alpha=10), 'RandomForest': RandomForestRegressor(n_estimators=100, random_state=42), 'GradientBoosting': GradientBoostingRegressor(n_estimators=100, random_state=42), } kf = KFold(n_splits=5, shuffle=True, random_state=42) results = {} for name, model in models.items(): cv_mse = -cross_val_score(model, X_scaled, y, cv=kf, scoring='neg_mean_squared_error') results[name] = { 'CV-MSE': cv_mse.mean(), 'CV-RMSE': np.sqrt(cv_mse.mean()), 'CV-RMSE-std': np.sqrt(cv_mse).std() } pd.DataFrame(results).T.round(0).sort_values('CV-RMSE') # 4. 最良モデルで予測 best_model = GradientBoostingRegressor(n_estimators=100, random_state=42) best_model.fit(X_scaled, y) y_pred = best_model.predict(X_scaled) # 5. 予測区間(簡易版:CV-RMSE × z_0.975) ci = 1.96 * np.sqrt(results['GradientBoosting']['CV-MSE']) for i, pref in enumerate(df['Prefecture']): print(f'{pref}: 予測 {y_pred[i]:,.0f} ± {ci:,.0f} (95% CI)') # 6. 特徴量重要度 importance = pd.DataFrame({ 'feature': features, 'importance': best_model.feature_importances_ }).sort_values('importance', ascending=False) print(importance) |
| モデル | タスク | 特徴 | SSDSE 適合度 |
|---|---|---|---|
| 線形回帰 | 回帰 | シンプル、 解釈可能 | ★★★★★(小サンプル向き) |
| ロジスティック回帰 | 分類 | 解釈可能、 確率出力 | ★★★★★ |
| Ridge / Lasso | 回帰 | 正則化、 過学習対策 | ★★★★★(多変量に強い) |
| Random Forest | 分類・回帰 | 非線形、 ロバスト | ★★★★ |
| XGBoost / LightGBM | 分類・回帰 | 高精度、 Kaggle 標準 | ★★★★(小サンプルでも有効) |
| SVM | 分類・回帰 | カーネル法、 高次元対応 | ★★★ |
| ニューラルネット | 汎用 | 高表現力、 大量データ必要 | ★★(47 サンプルでは過剰) |
| ARIMA | 時系列 | 古典的時系列モデル | ★★★(時系列拡張時) |
| Prophet | 時系列 | 季節性自動、 解釈可能 | ★★★★ |
| LSTM | 時系列 | 深層学習 | ★★ |
| ベイズ階層モデル | 汎用 | 不確実性定量化 | ★★★★★(小サンプル + 階層) |
予測分析 (Predictive Analytics) は「過去の観測から将来の数値・カテゴリを推定する」一連の手続きを指します。 ここでは SSDSE-B-2026 の都道府県別人口 (A1101) を題材に、 線形トレンド・ARIMA・指数平滑・Prophet 風モデル・回帰アンサンブルまで 4 つ以上の Python コードブロックを段階的に積み上げ、 各手法の予測誤差と挙動の違いを実値で比較します。 数式を言葉で読み解くことで、 「なぜそのモデルが選ばれるのか」を腹落ちさせるのが本節の狙いです。
時刻 $t$ における目的変数 $y_t$ を、 過去の自分自身と外生変数 $x_t$ で表現する一般形は次のとおりです。
$$ y_{t+h} = f(y_t, y_{t-1}, \dots, y_{t-p}, x_t, x_{t-1}, \dots) + \varepsilon_{t+h} $$
$h$ はホライズン (何期先か)、 $p$ はラグ次数、 $\varepsilon_{t+h}$ は予測誤差です。 線形 AR(p) なら $f(\cdot) = c + \sum_{i=1}^{p} \phi_i y_{t-i}$、 木モデルなら非線形分割、 Prophet なら $f(t) = g(t) + s(t) + h(t)$ (トレンド + 季節 + 休日) と分解されます。
SSDSE-B-2026 から東京都の A1101 (総人口) を時系列に並べると次のとおりです。
直近 5 年 (2019-2023) を線形回帰すると、 傾き $a \approx 14{,}841$ 人/年、 切片 $b \approx -1.595\times 10^7$ となり、 5 年先 (2028) の点予測は約 14,141,603 人。 ただし 2020-2021 のコロナ減を踏まえれば、 95% 予測区間は ±25 万人程度に開きます。
🎯 このコードでやること: SSDSE-B-2026 の東京都人口について、 過去 5 年を訓練データとして線形回帰 (sklearn.linear_model.LinearRegression) を当てはめ、 2024〜2028 年の 5 期先まで人口を予測する。
📥 入力データ (SSDSE-B-2026 から東京都を抽出):
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tk = df[df['Prefecture']=='東京都'][['SSDSE-B-2026', 'A1101']] tk = tk.rename(columns={'SSDSE-B-2026':'year', 'A1101':'pop'}).sort_values('year') train = tk.tail(5) # 2019-2023 model = LinearRegression().fit(train[['year']], train['pop']) future = pd.DataFrame({'year': [2024, 2025, 2026, 2027, 2028]}) future['forecast'] = model.predict(future[['year']]).astype(int) print(f'slope={model.coef_[0]:.1f} people/year') print(future.to_string(index=False)) |
📤 実行すると次の出力が得られる:
💬 結果の読み方: 過去 5 年の東京人口は年あたり約 1.48 万人ペースで増加。 そのままトレンドを延長すると 2028 年で約 1414 万人 (+0.4%)。 ただし 2021 年の減少をモデルが「ノイズ」と見なしているため、 出生率・転入の構造変化が起きると外挿の信頼性は急速に落ちる。
🎯 このコードでやること: SSDSE-B-2026 の同じ東京都人口時系列に対し、 statsmodels の Holt 線形トレンド指数平滑モデルを適用し、 1〜5 期先の予測値・level・slope を出力する。 線形回帰との違いは「最近の観測ほど重みが大きい」点。
📥 入力データ: 上と同じ東京都人口の全期間 2012-2023 の 12 点シリーズ(コードは年フィルタなしで全年を使う)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd from statsmodels.tsa.holtwinters import Holt # 英字の項目コード(A1101)と Prefecture を使うので、2 行目の日本語名を読み飛ばす df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tk = df[df['Prefecture'] == '東京都'].sort_values('SSDSE-B-2026') y = tk['A1101'].values fit = Holt(y, initialization_method='estimated').fit() fc = fit.forecast(5) # statsmodels の新しい版では傾きの属性名は slope ではなく trend print(f'level={fit.level[-1]:.0f} trend={fit.trend[-1]:.0f}') for yr, v in zip(range(2024, 2029), fc): print(f'{yr}: {v:.0f}') |
📤 実行すると次の出力が得られる (おおむね):
💬 結果の読み方: Holt 法は直近の傾きを強く反映するため、 2022→2023 の +48,000 を毎年継続すると見積もる。 線形回帰 (年 +14,841) よりも強気な予測。 どちらが正しいかではなく「直近重視か、 全期間重視か」の仮定の違いが結果に効いている、 という読み方が重要。
🎯 このコードでやること: 同じ東京都人口に ARIMA(1,1,1) を当てはめ、 差分系列の自己回帰構造を捉えた上で 5 期先まで予測。 加えて 95% 予測区間も出力する。
📥 入力データ: 同じ東京都 A1101 シリーズ (2012-2023、 12 点)。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd from statsmodels.tsa.arima.model import ARIMA df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tk = df[df['Prefecture']=='東京都'].sort_values('SSDSE-B-2026') y = tk['A1101'].values fit = ARIMA(y, order=(1, 1, 1)).fit() pred = fit.get_forecast(steps=5) mean = pred.predicted_mean ci = pred.conf_int(alpha=0.05) for yr, m, lo, hi in zip(range(2024, 2029), mean, ci[:,0], ci[:,1]): print(f'{yr}: {m:.0f} [95%: {lo:.0f} .. {hi:.0f}]') |
📤 実行すると次の出力が得られる (概略):
💬 結果の読み方: ARIMA は 95% 予測区間がホライズンとともに開く。 5 年先には ±63 万人の幅。 「点予測 1422 万人」だけに目を奪われず、 区間を意思決定に反映するのが予測分析のリテラシー。
🎯 このコードでやること: 2012-2017 を訓練、 2018-2023 をテストに分け、 線形回帰・Holt・ARIMA の予測 MAE と MAPE を比較。 どのモデルが過去再現に強かったかを定量化する。
📥 入力データ: 同じ A1101 12 点 (2012-2023)。 train=6 点 (2012-2017)、 test=6 点 (2018-2023)。
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 | import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from statsmodels.tsa.holtwinters import Holt from statsmodels.tsa.arima.model import ARIMA df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tk = df[df['Prefecture']=='東京都'].sort_values('SSDSE-B-2026') y = tk['A1101'].values x = tk['SSDSE-B-2026'].values ytr, yte = y[:6], y[6:] xtr, xte = x[:6], x[6:] lr = LinearRegression().fit(xtr.reshape(-1,1), ytr) p_lr = lr.predict(xte.reshape(-1,1)) p_holt = Holt(ytr, initialization_method='estimated').fit().forecast(len(yte)) p_ar = ARIMA(ytr, order=(1,1,1)).fit().forecast(len(yte)) def eval_(name, pred): mae = np.mean(np.abs(pred-yte)) mape = np.mean(np.abs((pred-yte)/yte)) * 100 print(f'{name:10} MAE={mae:9.0f} MAPE={mape:5.2f}%') eval_('Linear', p_lr) eval_('Holt', p_holt) eval_('ARIMA111', p_ar) |
📤 実行すると次の出力が得られる:
💬 結果の読み方: 12 点の系列を前半6点で学習し後半6点を予測すると、 この東京都のケースでは差分を1階とる ARIMA(1,1,1) が MAPE 0.34% で最良。 単純な線形外挿 (Linear) や Holt は直近トレンドを長いホライズンに引き伸ばして誤差が拡大した。 「単純=常に安全」でも「複雑=常に良い」でもなく、 データの構造 (トレンドの直線性・変化点の有無) とホライズン・サンプル数を突き合わせて選ぶのが現実解。
| 年 | 線形回帰 | Holt 平滑 | ARIMA(1,1,1) | 単純平均 (アンサンブル) |
|---|---|---|---|---|
| 2024 | 14,082,241 | 14,134,000 | 14,116,000 | 14,110,747 |
| 2025 | 14,097,081 | 14,182,000 | 14,143,000 | 14,140,694 |
| 2026 | 14,111,922 | 14,230,000 | 14,170,000 | 14,170,641 |
| 2027 | 14,126,762 | 14,278,000 | 14,196,000 | 14,200,587 |
| 2028 | 14,141,603 | 14,326,000 | 14,222,000 | 14,229,868 |
3 モデルのレンジは 2028 年で約 18 万人。 業務利用ではこの「不確実性レンジ」自体を意思決定の入力にする。
予測分析(predictive analytics)は「過去から未来を写す」一連の手続きです。 線形回帰 $\hat{y} = X\beta$、 分類 $P(y=1|x) = \sigma(x^\top\beta)$、 時系列 $\hat{y}_{t+h} = f(y_t, y_{t-1}, \ldots)$ — どれも「過去のデータ $(X, y)$ から関数 $f$ を推定し、 新しい $x$ に当てはめて $\hat{y}$ を出す」という同じ枠組みに乗っています。 本セクションでは、 数式の各記号が現場でどんな意味を持つかを 業務の意思決定言語 に翻訳します。
| 記号 | 数学的意味 | 業務における意味 |
|---|---|---|
| $y$ | 目的変数(実測値) | 予測したい KPI(売上、 来店数、 解約率) |
| $\hat{y}$ | モデルの予測値 | 来週の発注量、 来月の予算配分の根拠 |
| $X$ | 説明変数行列 | 手元にある過去の顧客属性・気温・販促履歴 |
| $\beta$ | 回帰係数 | 「広告費を 1 万円増やすと売上はいくら増えるか」の感度 |
| $\varepsilon$ | 誤差項 | 説明変数では捉えきれない不確実性(季節要因、 競合の動向) |
| $R^2$ | 決定係数 | 予測が「使い物になる」基準(業務では 0.5 以上を目安) |
分類は「Yes/No、 A/B/C のどれか」を予測する問題です。 ロジスティック回帰の式 $P(y=1|x) = 1/(1+e^{-x^\top\beta})$ は、 シグモイド関数で確率に押し込めるという意味で、 業務では「解約しそうな顧客に印を付ける」「不正取引のスコアを出す」場面で使います。 閾値(threshold)を 0.5 にするか 0.3 にするかで、 適合率(precision)と再現率(recall)のバランスが変わります。 マーケティング部門は「無駄打ちを減らしたい」ので precision 重視(閾値高め)、 リスク部門は「見逃しを減らしたい」ので recall 重視(閾値低め)という具合に、 同じモデルでも閾値設計は組織横断の交渉事項になります。
時系列の予測式 $\hat{y}_{t+h} = f(y_t, y_{t-1}, \ldots, y_{t-p})$ は、 「直近 $p$ 期分の値を使って $h$ 期先を予測する」というシンプルな表現に見えますが、 業務では「$h$(予測期間)」と「$p$(参照期間)」の選び方が成否を分けます。 例えば四半期売上を予測するのに、 直近 1 ヶ月しか参照しないと季節性を取り逃します。 反対に過去 5 年分を全部使うと、 事業環境の構造変化(コロナ前/後など)を一緒くたに学習してしまい、 直近のトレンドを過小評価します。 backtesting で「窓幅を変えた時に精度がどう変わるか」を必ず可視化するのが定石です。
予測は点推定だけでなく区間推定を必ず併記すべきです。 線形回帰なら $\hat{y} \pm t_{\alpha/2} \cdot \text{SE}(\hat{y})$、 機械学習なら quantile regression や conformal prediction を使って予測区間を出します。 業務では「来月の売上は 1,200 万円」と単一の数字を出すよりも、 「80% の確率で 1,050〜1,380 万円の範囲」と幅を示した方が、 在庫発注や人員配置の意思決定が現実的になります。 経営層への報告で「点推定だけ」を出すと、 当たれば称賛、 外れれば全責任という不毛な構図に陥りやすいので、 区間を出す習慣を組織文化として根付かせるのが分析者の重要な仕事です。
予測値 $\hat{y}$ をそのまま意思決定に使うのは危険です。 予測には「期待値の側面」と「コストの側面」があります。 例えば在庫発注なら、 「予測通り発注した場合の期待コスト」と「過剰在庫のリスクコスト」「欠品のリスクコスト」を比較し、 期待コストを最小化する発注量(newsvendor model)を選ぶのが正しい使い方です。 つまり予測モデルの出力は意思決定モデルの入力に過ぎず、 予測精度(RMSE、 MAPE)だけで評価せず、 最終的な業務 KPI(在庫回転率、 廃棄率)で評価する習慣をつけましょう。



Q1. 予測モデルで $R^2 = 0.85$ だったが、 実際の業務 KPI(在庫回転率)は改善しなかった。 考えられる原因を 2 つ挙げよ。
(1) 予測精度(RMSE)と業務 KPI の最適化目標がズレている — 期待値ベースの予測だけで、 欠品・過剰在庫のコスト構造を考慮していない。 (2) train/test 分割が時系列を無視してシャッフルされていて、 leakage が起きている可能性。 → backtest で再評価すべき。
Q2. 顧客解約予測モデルの閾値を 0.5 から 0.3 に下げた。 precision と recall はそれぞれどう変化するか。
recall は上がる(解約候補を多めに拾う)、 precision は下がる(誤検知が増える)。 業務的には「介入コストが安く、 見逃しコストが大きい」場合は閾値を下げ、 逆に「介入コストが高い」場合は閾値を上げる。
Q3. 「来月の売上は 1,200 万円」という点推定だけを経営報告した。 何を追加すべきか。
予測区間(例: 80% 信頼区間 1,050〜1,380 万円)と、 過去の予測精度(MAPE)の実績、 さらに「どんな前提が崩れたら予測が大きく外れるか」のシナリオ分析。 点推定だけだと意思決定者が不確実性を過小評価する。
予測分析の真価は、 一度作って終わりではなく 予測 → 行動 → 結果検証 → 再学習 のループを回せた時に発揮されます。 例えば需要予測で「過剰発注」と判定されたら、 翌月の値引き販促を打ち、 その結果を次回モデルに反映する。 解約予測で「リスク高」と判定された顧客に特別オファーを出し、 オファー後の解約率を観測して処置効果(treatment effect)を推定する。 こうした PDCA を回すには、 予測 ID と行動ログを紐付けるデータ基盤と、 月次で精度をモニタリングする運用体制が不可欠です。 モデルだけ作っても、 組織にこのループが無ければ宝の持ち腐れになります。
予測分析を現場に投入する際に最も多い失敗は、 予測(予測値の出力)と判断(その値を使って何をするか)を区別せずに設計してしまうことです。 例えば「来月の解約確率 0.72」という予測値が出ても、 そこから「特別オファーを送る」「営業電話をかける」「何もしない」のどれを選ぶかは、 予測モデルとは別の意思決定ロジックが必要です。 この境界を曖昧にすると、 モデル精度をいくら磨いても業務 KPI が改善しないという悲劇が起きます。 対策としては、 予測層(モデル)と判断層(閾値・優先順位・コスト関数)を独立のコンポーネントに分離し、 それぞれを別々にチューニングできるアーキテクチャを採用するのが定石です。
予測値 $\hat{p}$(解約確率)に対し、 取り得る行動 $a \in \{\text{介入}, \text{放置}\}$ の期待効用 $U(a, \hat{p})$ は次のように書けます。
$$U(a, \hat{p}) = \hat{p} \cdot V_{\text{解約阻止}}(a) - C(a)$$ここで $V_{\text{解約阻止}}(a)$ は行動 $a$ が解約を阻止したときの便益(例: LTV 50,000 円)、 $C(a)$ は行動コスト(例: クーポン 3,000 円 + オペレーション 500 円)です。 「介入」と「放置」のうち $U$ が大きい方を選ぶのが最適行動です。 解約確率が同じ 0.72 でも、 LTV の高い顧客には介入、 LTV の低い顧客には放置、 というように同じ予測値でも判断が変わるのが期待効用ベースの設計の強みです。
| 業界 | 予測対象 | 判断ロジックの特徴 |
|---|---|---|
| 通信キャリア | 解約確率 | LTV × 解約阻止率でランキング、 上位 5% のみに割引クーポン |
| EC | 商品需要 | 在庫コストと欠品損失を比較し発注量を決定 (新聞売り問題) |
| 医療 | 再入院確率 | FN コスト > FP コストなので閾値を低めに設定 (recall 重視) |
| 金融 | 不正取引確率 | 取引額別に閾値を変える、 高額は人手レビュー |
| 人事 | 離職リスク | 予測値は本人に開示せず、 上長への 1on1 トリガーとして使用 |
| 製造業 | 設備故障 | 予防保全コスト vs ライン停止コストで判断 (RUL 推定) |
| 広告 | CTR | RTB の入札額 = CTR × CVR × LTV、 ミリ秒単位で判断 |
| エネルギー | 電力需要 | 需給バランス制約のもとで発電機を最適配分 (Unit Commitment) |
「解約確率 0.9 の顧客に特別オファーを送ったら解約率が 0.3 に下がった」というケースを考えてみましょう。 一見オファーが効いたように見えますが、 因果推論の観点では その顧客はそもそも解約確率 0.3 だった可能性もあります。 予測モデルは「介入無しの世界」を観測しているのに、 「介入有り」の効果を測ろうとすると、 介入効果と予測誤差が混ざってしまうのです。 厳密に効果を測るには、 同じ予測スコアの顧客をランダムに介入群と対照群に分けた A/B テスト、 もしくは因果推論手法(傾向スコア、 二重機械学習)を併用する必要があります。 予測分析の出口は、 必ず因果推論とセットで設計してください。
本番投入前に予測モデルが満たすべき品質ゲートは多層的です。 (1) オフライン精度(MAPE, AUC 等) → (2) シャドー運用(本番データで予測だけ生成、 判断には使わない) → (3) カナリア運用(5% のトラフィックのみ判断に使用) → (4) フル運用、 という 4 段階を経るのが安全策です。 各段階で予測分布、 判断分布、 業務 KPI を観測し、 想定外のドリフトや偏りがないか確認します。 特にカナリア段階で「予測の高い顧客にだけ介入する」とサンプル選択バイアスが発生し、 次回の再学習でモデルが歪むため、 一定割合の対照群(介入しないグループ)を維持することが重要です。
例:SSDSE-B の都道府県別データから、 高齢化率を使って医療費を予測する。
合成データで予測モデル導入の費用対効果を計算する。
| 項目 | 導入前 | 導入後 |
|---|---|---|
| 在庫過剰損失 | 500 | 200 |
| 機会損失 | 300 | 100 |
| モデル運用費 | 0 | 100 |
1 2 3 4 5 6 | before = 500 + 300 after = 200 + 100 + 100 saving = before - after roi = saving / 100 print(f"純削減: {saving} 万円") print(f"ROI: {roi}") |
💬 手計算 (Step 2) ROI=4.0 と Python 出力が完全一致。
最小実装の例。 SSDSE のような実データに対して、 まずはコピペで動かしてみるのが理解の早道です。
1 2 3 4 5 6 7 8 | from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932') X = df[['高齢化率']]; y = df['医療費'] Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.25, random_state=42) model = LinearRegression().fit(Xtr, ytr) print('R^2:', model.score(Xte, yte)) |
予測分析(predictive analytics)の信頼性を担保する最後の一押しは、 時系列に整合した backtesting・sklearn pipelines による前処理込みの再現可能化・予測専用 metrics の使い分けの 3 点だ。 SSDSE-B-2026 の都道府県人口を題材に、 単発予測ではなく「将来時点を順に予測して評価する」rolling-origin backtest を行い、 加えて pipeline + 多種 metrics で総合評価する。
このコードでやること:SSDSE-B-2026 の各都道府県人口を時系列とみなし、 過去 N 年で学習 → 翌年を予測 → 1 年進めて再学習、 を繰り返して MAE/MAPE/RMSE を集計する。 単純な train/test split では将来漏洩が起きうるため backtesting が必須。
📥 入力データ (SSDSE-B-2026 から年次都道府県人口を long 形式で展開):
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 | import pandas as pd import numpy as np from sklearn.linear_model import Ridge from sklearn.metrics import mean_absolute_error, mean_squared_error df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) hokkaido = (df[df['Prefecture'] == '北海道'][['SSDSE-B-2026', 'A1101']] .rename(columns={'SSDSE-B-2026': 'Year'}).dropna()) hokkaido = hokkaido.sort_values('Year').reset_index(drop=True) errors = [] for split in range(5, len(hokkaido) - 1): train = hokkaido.iloc[:split] test = hokkaido.iloc[split:split+1] X_tr = train[['Year']].values; y_tr = train['A1101'].values X_te = test[['Year']].values; y_te = test['A1101'].values model = Ridge(alpha=1.0).fit(X_tr, y_tr) pred = model.predict(X_te) errors.append((int(X_te[0, 0]), float(y_te[0]), float(pred[0]))) bt = pd.DataFrame(errors, columns=['year', 'actual', 'pred']) bt['ape'] = (bt['actual'] - bt['pred']).abs() / bt['actual'] * 100 print(bt.tail(6)) print('MAE :', mean_absolute_error(bt['actual'], bt['pred'])) print('RMSE:', np.sqrt(mean_squared_error(bt['actual'], bt['pred']))) print('MAPE[%]:', bt['ape'].mean()) |
📤 実行結果(北海道で rolling backtest した一例):
💬 北海道では MAPE 0.29 % と高精度だが、 直近で系統的に過大予測(人口減少を線形 Ridge が追い切れていない)。 → backtest の残差プロットで「最近の年ほど誤差が大きい」傾向が見えれば、 非線形特徴量や trend break を導入すべき。
このコードでやること:欠損補完→標準化→Ridge を pipeline 化し、 予測専用 metrics(MAE / RMSE / MAPE / R²)を一括算出。 pipeline 化することで joblib.dump(pipe, ...) 1 行で本番デプロイ可能になり、 学習・推論の差異(training-serving skew)を防ぐ。
📥 入力データ (SSDSE-B-2026 / 2023年: A1101 総人口 / 高齢化率=A1303÷A1101×100 / A4103 合計特殊出生率) — 以下の数値は実測値 (2023年):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Ridge from sklearn.model_selection import cross_validate import numpy as np df['aging'] = df['A1303'] / df['A1101'] * 100 # 高齢化率(%) = 65歳以上人口 / 総人口 X = df[['aging','A4103']].values # 高齢化率 / 合計特殊出生率(A4103) y = df['A1101'].values # 都道府県人口 pipe = Pipeline([ ('imp', SimpleImputer(strategy='median')), ('sc', StandardScaler()), ('m', Ridge(alpha=1.0)), ]) scoring = {'MAE':'neg_mean_absolute_error', 'RMSE':'neg_root_mean_squared_error', 'R2':'r2'} cv = cross_validate(pipe, X, y, scoring=scoring, cv=5, return_train_score=False) for k in scoring: print(k, ':', -cv[f'test_{k}'].mean() if k!='R2' else cv['test_R2'].mean())</td></tr></table></div> |
📤 実行結果(47 都道府県 / 2023年 / 5-fold CV):
💬 高齢化率と出生率だけでは都道府県人口の説明力は極めて弱い(R² < 0)。 R² が負値ということは、 定数予測(全県平均)にも負けているという意味。 → 実務では人口は直接の従属変数ではなく 増減率 を予測対象に置き換える、 あるいは経済指標・産業構造を追加するのが定石。 pipeline にすることで「欠損 → 標準化 → モデル」の順を本番でも再現できる。
この用語を使うときに陥りがちな失敗パターン。 経験者ほどここに 1 度はハマっています。
予測分析を「学問」から「業務システム」に変換するには、 モデル開発以前と以後にやるべき工程が圧倒的に多い。 CRISP-DM や Microsoft TDSP の手順をベースに、 SSDSE 利用の場合に置き換えると次のような流れになります。
「7 工程のうちモデリングは 15% に過ぎない」という Andrew Ng の言葉どおり、 80% の時間はデータ準備とモニタリングに向ける。
「平均誤差」と一口に言っても、 平均の取り方で結論は変わります。 4 指標の数式と使い分けを比較。
| 指標 | 数式 | 特性 | 向く場面 |
|---|---|---|---|
| MAE | $\frac{1}{n}\sum|y_i-\hat y_i|$ | 外れ値にロバスト、 単位が読みやすい | 物理量予測、 在庫最適化 |
| RMSE | $\sqrt{\frac{1}{n}\sum(y_i-\hat y_i)^2}$ | 大きな誤差を強く罰する | 電力需要、 安全在庫 |
| MAPE | $\frac{100}{n}\sum|\frac{y_i-\hat y_i}{y_i}|$ | スケール非依存、 0 近傍で爆発 | 売上、 経済指標 |
| SMAPE | $\frac{200}{n}\sum\frac{|y_i-\hat y_i|}{|y_i|+|\hat y_i|}$ | 対称、 0-200% 範囲 | M4 などコンペ標準 |
| WAPE | $\frac{\sum|y_i-\hat y_i|}{\sum |y_i|}$ | 小さい $y$ に強い | 小売・需要予測 |
| Pinball Loss | $\alpha(y-\hat y)_+ + (1-\alpha)(\hat y-y)_+$ | 分位点予測の評価 | 電力市場、 リスク管理 |
同じ予測でも MAE と MAPE で順位が逆転することがある。 「業務的に最も痛い誤差」を反映する指標を選ぶのが正解。
プロジェクトの失敗事例を分析すると、 同じ罠を踏んでいるケースが大半です。 ここでは現場で遭遇しがちな落とし穴と、 経営層から頻出する質問への回答パターンをまとめます。
Q1. AI で需要予測すれば在庫はゼロにできますか?
A1. できません。 予測には必ず誤差(予測区間)があり、 ゼロ在庫を目指すと欠品リスクが急増します。 適切なゴールは「欠品コストと過剰在庫コストの合計を最小化する在庫水準」を求めることであり、 これを新聞売り問題として定式化します。 完全ゼロは予測誤差が完全にゼロでない限り不可能、 という前提を共有してください。
Q2. モデルの精度を 90% から 95% に上げれば売上は 5% 増えますか?
A2. 比例しません。 精度向上の効果は「判断の改善余地」と「介入のレバレッジ」に依存します。 例えば既に上位 20% にのみ介入しているなら、 残り 80% の予測精度が上がっても売上はほぼ変わりません。 重要なのは精度ではなく、 意思決定が変わるかどうかを測ること(uplift modeling)。
Q3. 競合 A 社が同じデータで作ったモデルと精度を比較できますか?
A3. 直接比較は困難です。 精度はデータ分布、 評価指標、 期間、 セグメント定義に強く依存し、 公開数値だけで優劣は判断できません。 自社が比較すべきは「現状の業務 KPI」 vs 「モデル投入後の業務 KPI」であり、 そこに A/B テストの差分が出るかを見るのが本筋です。
Q4. ブラックボックス AI は規制上問題ありませんか?
A4. 用途と地域によります。 金融与信や採用判断など「個人の機会に影響する意思決定」では、 EU AI 法、 米国 ECOA、 日本のガイドライン等で説明責任が求められます。 SHAP・LIME 等の説明手法、 線形モデルの併用、 監査ログの保管が最低要件です。 マーケティング用途であれば説明性要求は比較的緩いですが、 内部ガバナンス上は同等の管理を推奨します。
Q5. ChatGPT で予測できる時代に独自モデルは必要ですか?
A5. LLM は汎用テキスト推論に強い反面、 自社固有の時系列・需要・解約パターン予測には独自モデルの方が一般に精度・コスト・遅延の面で優位です。 LLM は「特徴量エンジニアリング・コード生成・結果説明」を支援する補助役として、 予測本体は scikit-learn / LightGBM / Prophet 等の専用モデル、 という併用が現実的です。
予測分析は、 業界ごとに「予測値が業務プロセスのどこで効くか」が大きく異なります。 同じ「LightGBM で確率を出す」処理であっても、 通信業界では夜間バッチで翌朝のオペレーターに渡され、 EC では発注画面のサジェスト枠に出て、 製造業ではセンサー DB に書き戻されて閾値判定に使われる、 といった具合です。 ここでは代表的な 6 業界について、 予測モデルがどのワークフロー段階に組み込まれ、 意思決定者がどう動くのかを整理します。
毎月 1 日に過去 90 日分のコール履歴、 利用量、 請求トラブル、 競合乗り換えキャンペーンの時期等を特徴量化し、 LightGBM で「翌月解約確率」を全契約者に対して算出します。 確率上位 5% (例 : 200 万契約 × 5% = 10 万件) をリテンション部門に共有し、 LTV 上位のセグメントから順に「3 ヶ月割引」「機種変更クーポン」「コール対応」を出し分けます。 翌月の実際の解約率を集計し、 介入群と (5% 程度残した) 対照群を比較して uplift を測定。 uplift がプラスのセグメントだけ翌月以降も介入を継続、 マイナスのセグメントは介入停止、 というサイクルを回します。 重要なのは、 「解約予測精度の向上」よりも「介入対象セグメントの最適化」の方が解約抑止効果に直結する点で、 これは予測と判断を分離設計しているからこそ達成できます。
SKU 数十万点に対し、 過去 2 年の販売実績、 価格、 検索ヒット数、 競合価格、 気象データ、 イベント情報等を特徴量とし、 LightGBM + Prophet のアンサンブルで「翌週の販売数の点推定 + 80%/95% 信頼区間」を生成します。 自動発注ロジックは新聞売り問題の枠組みで、 「欠品コスト (機会損失 + 顧客離反)」と「過剰在庫コスト (倉庫費用 + 廃棄リスク)」のバランスから発注量を決めます。 重要なのは点推定でなく信頼区間を使うことで、 ロングテール SKU (販売数が少なく不確実性が大きい商品) は安全在庫を多めに、 売れ筋 SKU は逆に発注量を絞る、 という不確実性ベースの差別化を実現できます。 月次で MAPE と欠品率、 在庫回転率を観測し、 KPI 悪化があれば特徴量追加または再学習を実施します。
退院前に「30 日以内の再入院確率」を電子カルテ、 投薬履歴、 過去入院歴、 居住地域の社会経済要因等から予測。 重要な設計判断は「FN (再入院を見逃す) コストが FP (誤って高リスク判定する) コストよりはるかに大きい」点で、 閾値は recall を優先する低めに設定します。 高リスク判定された患者には退院後 1 週間以内に看護師から電話フォロー、 服薬確認、 通院リマインダーを実施し、 同時に主治医にもアラートを送信。 注意すべきは「予測値を本人に開示するか」という倫理判断で、 多くの医療機関では本人開示はせず、 医療スタッフへの内部情報として運用しています。 また、 予測モデルが特定属性 (年齢、 地域、 保険種別) に偏った判定を出していないか、 月次でフェアネス指標 (Demographic Parity, Equalized Odds) をモニタリングするのが標準実務になりつつあります。
クレジットカード取引に対し、 取引額、 加盟店カテゴリ、 時刻、 位置情報、 過去取引パターンとの差分を特徴量とし、 100 ミリ秒以内に不正確率を返す必要があります。 通常のオフラインバッチ学習に加え、 オンライン学習で直近の不正パターンを継続反映する設計が一般的です。 判定ロジックは取引額別に閾値を変える設計が定石で、 少額取引 (例: 5,000 円未満) は閾値を高くして承認、 高額取引は閾値を低くして人手レビュー or 一時保留 + SMS 認証要求、 という形を取ります。 PR-AUC、 false positive rate (誤って正常取引を弾く率) と true positive rate (実際の不正を捕捉する率) のバランスを業務 KPI として継続監視します。
工場の生産設備からセンサーデータ (振動、 温度、 電流、 騒音) を毎秒収集し、 Survival Analysis (生存時間分析) や LSTM で「残り寿命 (Remaining Useful Life, RUL)」を予測します。 判断ロジックは「予防保全コスト (部品代 + 計画停止)」と「故障時コスト (緊急停止 + ライン停止 + 品質損失)」の比較で、 RUL の下限 (95% 信頼区間下側) がしきい値を下回ったタイミングで保全計画を発動します。 ここでも重要なのは予測の不確実性で、 RUL を点推定だけで運用すると「まだ動くはず」と判定して直前で故障する事故が起きます。 予測区間を計画判断に組み込むのが基本です。
電力会社では翌日の 30 分単位の電力需要を、 気象予報、 カレンダー (休日・イベント)、 過去同曜日・同時刻データから予測します。 予測値は Unit Commitment 問題 (どの発電機をいつ起動・停止するか) の入力になり、 発電コスト・起動コスト・予備力確保制約のもとで最適化されます。 予測誤差が大きいと「足りなければ高コストガスタービンを急遽起動」「余れば揚水発電に回す」など調整コストが発生するため、 需要予測精度はそのまま運用コストに直結します。 近年は太陽光・風力の出力予測も組み合わせ、 不確実性を考慮した確率的最適化 (Stochastic Unit Commitment) に発展しています。
業界が違っても、 成功事例には共通の構造があります。 (1) 業務 KPI から逆算した予測ターゲット設定、 (2) 予測 → 判断 → 実行 → 検証のループの組織的な仕組み化、 (3) 不確実性 (予測区間) を判断に組み込む設計、 (4) 一定の対照群を残して uplift を継続測定、 (5) 月次でドリフト・フェアネス・KPI を監視。 これらはツールやアルゴリズムが進化しても変わらない原則で、 「どの業界で何を予測するか」よりも「予測をどう業務に埋め込むか」の設計力が、 プロジェクトの成否を分ける最大の要因になります。
予測分析 (Predictive Analytics) を中心に、 上位概念 (データ分析の 4 段階: 記述 → 診断 → 予測 → 処方)、 並列概念 (回帰分析・分類・時系列予測・異常検知)、 応用 (需要予測・解約予測・与信スコア・SSDSE-B 人口推計) を関係づけて整理する。
予測分析 (predictive analytics) は過去データから「これから起こること」を統計モデル・機械学習で推定する分野で、 記述分析 (descriptive)・診断分析 (diagnostic)・予測分析 (predictive)・処方分析 (prescriptive) という分析成熟度の階段の 3 段目に位置する。 SSDSE-B-2026 で「人口・産業構造から 5 年後の出生数を予測する」「過去の気象データから収穫量を予測する」のように、 応用 (顧客流出予測・需要予測)、 対比 (記述統計との違い)、 統合 (BI ツール・ML パイプラインへの組み込み) の各観点で実務的価値が高い。
予測分析は「データ取得 → モデル学習 → 評価 → 運用」のパイプラインで、 隣接する分析カテゴリと階層的に結合する。
予測分析の成否は「予測精度」だけでなく「予測値を意思決定に反映できる仕組み」の構築にあり、 単にモデル精度を上げる作業ではなく、 業務プロセス全体を再設計する取り組みである。
問題の性質ごとに、 まず試すべきモデルは次のように決まります。
| 問題 | 第一候補 | 第二候補 | 使ってはいけない |
|---|---|---|---|
| 線形傾向 + 短系列 (n < 30) | 線形回帰 | 指数平滑 | LSTM・Transformer |
| 季節性あり (週・月) | SARIMA・Prophet | ETS | 単純線形 |
| 説明変数が多い回帰 | LightGBM | Ridge / Lasso | 単純平均 |
| 分類 (不均衡) | XGBoost + class_weight | SMOTE + LR | accuracy のみ最適化 |
| 画像・音声・テキスト | CNN / Transformer (pretrained) | 特徴量抽出 + GBM | 線形回帰 |
| 長期トレンド (5 年以上先) | 構造モデル + 専門家 | ベイズ階層 | 単一機械学習モデル |
「予測・判断」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。
このフローに沿って判断することで、 「予測・判断」を中核とした適切な手法選択ができる。
予測分析を一言でいえば「過去に観測したデータから、 まだ観測していない値(未来 or 欠損)を推定する」営みです。 ここで大事なのは、 予測分析が問うのは「変数どうしの関係が統計的に有意か(相関・因果)」ではなく、 「未知のデータに対して当たるか(予測性能)」だという一点です。 有意な相関がまったく無くても予測が当たることはあり(多数の弱い特徴の合算)、 逆に強い相関があっても分布がずれれば予測は外れます。 評価軸が「説明」ではなく「的中」に移る、 これが記述統計・仮説検定との決定的な違いです。
予測分析は、 データ活用の成熟度モデルの 3 段目に位置します。 各段は「問い」の形で区別すると腹落ちします。
| 段階 | 問い | SSDSE-B-2026 での例 |
|---|---|---|
| 記述 (Descriptive) | 何が起きたか | 2023 年の県別出生数 (A4101) を集計・可視化 |
| 診断 (Diagnostic) | なぜ起きたか | 出生数と人口・年齢構成の関係を相関・回帰で分析 |
| 予測 (Predictive) | 次に何が起きそうか | 未観測県・翌年の出生数を 回帰/時系列 で推定 |
| 処方 (Prescriptive) | どう対処すべきか | 予測を入力に施策を 最適化(例: 予算配分) |
予測は単独でも動きますが、 前段(記述・診断)で「予測して意味があるか」を確かめ、 後段(処方)で「予測をどの意思決定に流し込むか」を設計してはじめて価値が出ます。 モデルは $\hat{y}=f(\mathbf{x};\boldsymbol{\theta})$ という関数で「未知を推定する装置」に過ぎず、 その前後の設計こそが実務の本体です。
「予測性能で評価する」を具体化するため、 SSDSE-B-2026 の 2023 年クロスセクション 47 県を実測で使い、 出生数 A4101 を 総人口 A1101・65 歳以上人口 A1303 の 2 特徴から予測する 5-fold 交差検証の MAE(平均絶対誤差, 人)を比較しました。 下表は下記コードの実測出力です(合成ではありません)。
| モデル | 5-fold CV MAE(人) |
|---|---|
| ベースライン(全県平均を返すだけ) | 11,984 |
| 線形回帰 | 1,270 |
| Ridge (alpha=10) | 2,268 |
| Random Forest (200 本) | 2,357 |
| Gradient Boosting (200 本) | 2,415 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import pandas as pd, numpy as np from sklearn.linear_model import LinearRegression, Ridge from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.dummy import DummyRegressor from sklearn.model_selection import KFold, cross_val_score from sklearn.preprocessing import StandardScaler df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] # 2023年のクロスセクション47県 X = StandardScaler().fit_transform(d[['A1101', 'A1303']].astype(float)) # 総人口・65歳以上 y = d['A4101'].astype(float).values # 出生数 kf = KFold(n_splits=5, shuffle=True, random_state=42) models = {'Baseline(平均)': DummyRegressor(strategy='mean'), 'LinearRegression': LinearRegression(), 'Ridge(alpha=10)': Ridge(alpha=10), 'RandomForest': RandomForestRegressor(n_estimators=200, random_state=42), 'GradientBoosting': GradientBoostingRegressor(n_estimators=200, random_state=42)} for name, m in models.items(): mae = -cross_val_score(m, X, y, cv=kf, scoring='neg_mean_absolute_error') print(f'{name:20s} MAE={mae.mean():8.0f}') |
読み方: 出生数は総人口とほぼ比例(2023 年の相関 0.995)するため、 直線関係を素直に引く線形回帰が MAE 1,270 人で最良で、 高表現力の Random Forest・Gradient Boosting(MAE 2,300〜2,400 人)を上回りました。 「複雑なモデルほど当たる」わけではなく、 n=47 と小さく関係が線形に近いデータでは単純モデルが汎化で勝つという、 予測分析の基本感覚が実測で確認できます。 同時に、 どのモデルも「全県平均を返すだけ」のベースライン(MAE 11,984 人)を大きく下回っており、 特徴量に予測情報が確かに含まれることも分かります。 ベースライン比較を省くと「精度が高い/低い」の基準を見失うため、 必ず素朴な基準線を置いてください。
予測分析の失敗は、 モデルの選択より「過去と未来は同じ分布だ」という暗黙の前提が崩れる場面に集中します。 以下は特に事故が多く、 かつ気づきにくい 8 つの落とし穴です。
予測分析の基本を押さえたら、 次の 7 方向へ広げると実務・研究の両面で武器になります。
いずれの発展も、 上の「落とし穴」で挙げた分布シフト・リーク・外挿・過学習の問題からは逃れられません。 手法を高度化するほど、 未知データでの評価と不確実性の明示という基本原則を守ることが、 むしろ効いてきます。