論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
データ駆動型社会
Data-Driven Society
リテラシー

🔖 キーワード索引

このページ内のセクションへ素早く飛べます(クリックで該当箇所へジャンプ):

💡 30秒結論📍 文脈🎨 直感📐 数式・定義🔬 数式を言葉で読み解く🧮 SSDSE実値計算🐍 Python実装⚠️ 落とし穴🌐 関連手法🔗 関連用語📚 関連グループ

「データ駆動型社会 (data-driven society)」は政策・経営・社会的意思決定をデータと統計的根拠に基づいて行う社会像。 Society 5.0・スマートシティ・EBPM (Evidence-Based Policy Making) などが代表的概念。 本ページではデータ駆動の前提 (品質・公開性・リテラシー)・参加型データガバナンス・統計的根拠の限界 (倫理・公平性) を整理する。

Society 5.0EBPM (証拠に基づく政策立案)スマートシティオープンデータデータリテラシー教育参加型データガバナンスアルゴリズミック公平性プライバシー保護市民参加 / オープンガバメント

これらのキーワードは「オープンなデータ → 全市民のリテラシー → 参加型ガバナンス → 公平な意思決定」というデータ駆動型社会の循環構造を構成する。

💡 30秒で分かる結論 — データ駆動型社会

🍰 まずはやさしく

データが地図のような役割を果たす社会です。

正しい判断や新しい価値を作るために使います。

スマホのアプリが好みを分析する仕組みに似ています。

この章では社会全体の仕組みについて読みます。

💡 30秒で分かる結論

データに基づいて意思決定や価値創造が行われる社会

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

🍰 まずはやさしく

今の時代の大きな流れのことです。

社会の基盤を整えるために使います。

学校で統計の勉強が増えているのもこのためです。

ここでは今起きている変化について読みます。

EBPM(証拠に基づく政策立案)、 スマートシティ、 ヘルスケア DX — いずれも「勘ではなくデータで」を合言葉に進む。 データ品質とリテラシーが社会基盤になる。

本ページは データ駆動型社会(Data-Driven Society) を、 ジャストインタイム型データサイエンス教育の文脈で 12 のセクションに分けて解説します。 上から順に読まなくても、 「🔖 キーワード索引」から必要箇所だけ拾い読みすることもできます。

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

「データサイエンス系学部の新設ラッシュ」「学習指導要領で統計教育拡充」 — これらはすべて、 国全体でデータ駆動型社会を目指す動きの一部です。

🎨 直感で掴む — データ駆動型社会とは何者か

🍰 まずはやさしく

勘ではなく根拠で動く社会のことです。

間違いを減らして効率よく運営するために使います。

部活の練習メニューを記録に基づいて決める感覚です。

ここでは具体的なイメージについて読みます。

データ駆動型社会とは「政策・経営・医療・教育・都市運営などの意思決定を、 勘や慣例ではなく観測データと統計的根拠 に基づいて行う社会」のこと。 SSDSE-B-2026 のような公的統計の公開、 EBPM (証拠に基づく政策立案)、 ヘルスケアの電子カルテ統合、 スマートシティのセンサ網が代表的な構成要素となる。 一方で、 データ品質・プライバシ・市民のリテラシ・アルゴリズム説明責任を欠くと、 同じ仕組みが 監視社会や 誤情報の最適化に転落するため、 制度と倫理の設計が車の両輪となる。

場面データ駆動型社会が登場する例何が分かるか
論文の Methods 節「データ駆動型社会を用いて分析した」手法の前提と限界が文脈に乗る
実務レポート「データ駆動型社会の観点で評価」意思決定の根拠が明確化
教育・学習SSDSE-B-2026 を題材に演習実データで本物の感覚が得られる
政策・社会社会 分野で標準的に登場EBPM や DX の議論に直結

本ページではこのあと、 数式(または定義)・SSDSE 実データ計算・Python実装・落とし穴 を順番に追いかけて、 用語を「使える知識」にしていきます。

🎨 直感で掴む

たとえばコロナ対応:

  • 感染者数・接触履歴・ワクチン接種率 → リアルタイムダッシュボード
  • 予測モデル → 病床確保・行動制限の判断
  • 結果検証 → 政策修正

これら全部が「データを根拠に意思決定」というデータ駆動の例です。

📐 数式・定義

🍰 まずはやさしく

データの活用度を測る考え方です。

どれだけデータが判断に影響したかを知るために使います。

テストの点数の変化で勉強法を変える仕組みに似ています。

ここでは数式を使った定義について読みます。

データ駆動型社会は概念的フレームワークだが、 ジャストインタイム教育として「データ → 政策 → 結果 → データ」の閉ループを 2 つの計量で記述する。

① EBPM サイクルの利得関数: 政策 $a$ をデータ $D$ から推定した期待効用

$$ \mathbb{E}[U(a) \mid D] = \int u(a, s)\, p(s \mid D)\, ds $$

ここで $s$ は社会状態、 $u(a, s)$ は効用関数、 $p(s \mid D)$ は観測データを条件とした事後分布。 データが増えれば $p(s \mid D)$ が鋭くなり、 $\mathbb{E}[U]$ の推定誤差が縮む。

② データ駆動度: 意思決定がデータ依存である度合いを情報量で測る

$$ \text{DataDriven}(a) = 1 - \frac{H(a \mid D)}{H(a)} $$

ここで $H(a)$ は決定 $a$ の事前エントロピー、 $H(a \mid D)$ はデータ観測後の条件付きエントロピー。 完全データ駆動なら 1、 データ無視なら 0。

📐 定義/数式

データ駆動型社会(Data-Driven Society):データに基づいて意思決定や価値創造が行われる社会

【EBPM のサイクル】
$$ \text{Data} \to \text{Evidence} \to \text{Decision} \to \text{Outcome} \to \text{Data} $$
データから根拠を抽出 → 意思決定 → 結果を再びデータで測る、 という閉ループ。

📐 因果推論の基礎: 潜在結果モデルと数式を言葉で読み解く

データ駆動社会の意思決定は「相関の発見」では足りず、「因果の推定」まで踏み込む必要があります。 ここでは Rubin の潜在結果モデル(Potential Outcomes Framework)と、 政策効果の平均処置効果(ATE)の数式を確認します。

$$ \tau_i = Y_i(1) - Y_i(0), \quad \text{ATE} = \mathbb{E}[\tau_i] = \mathbb{E}[Y_i(1)] - \mathbb{E}[Y_i(0)] $$

$$ \text{ATT} = \mathbb{E}[Y_i(1) - Y_i(0) \mid T_i = 1] $$

🔬 数式を言葉で読み解く

記号意味EBPM 例(保育政策)
$Y_i(1)$処置を受けたとき個人 $i$ の結果保育所が整備された場合の女性就労率
$Y_i(0)$処置を受けないとき個人 $i$ の結果未整備時の女性就労率(反実仮想)
$\tau_i$個別処置効果(観測不可)「保育整備が i 県の就労率を何 pt 押し上げたか」
ATE平均処置効果(母集団平均)全 47 県平均で見たときの就労率上昇幅
ATT処置群における平均処置効果実際に保育整備した県だけの平均効果

因果推論の根本問題:1 つの個体について $Y_i(1)$ と $Y_i(0)$ は同時には観測できない。 一方が必ず反実仮想(counterfactual)となる。 EBPM はこのギャップを RCT(無作為化対照試験)、 傾向スコア、 差分の差分(DID)、 回帰不連続デザイン(RDD)、 操作変数法(IV)で埋める。

🎯 このコードでやること:都道府県の「高齢化率」と「出生率」の相関を回帰分析で推定し、 信頼区間を示す。 因果ではなく「相関の見える化」までを担当。

📥 入力データ:SSDSE-B-2026 の実在列のみ。 高齢化率 = A1303(65歳以上人口)/ A1101(総人口)、 出生率 = A4101(出生数)/ A1101。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
year_col = df.columns[0]                       # 年度コード列
d = df[df[year_col] == df[year_col].max()].copy()   # 最新年度の47都道府県

# 高齢化率と出生率(いずれも実在列から算出)
d['高齢化率'] = d['A1303'] / d['A1101'] * 100    # A1303=65歳以上人口
d['出生率']   = d['A4101'] / d['A1101'] * 1000   # A4101=出生数

X = sm.add_constant(d[['高齢化率']])
model = sm.OLS(d['出生率'], X).fit()
print(model.summary().tables[1])

📤 実行結果(典型例):

============================================================== coef std err t P>|t| [0.025 0.975] -------------------------------------------------------------- const 9.8229 0.788 12.465 0.000 8.236 11.410 高齢化率 -0.1297 0.025 -5.227 0.000 -0.180 -0.080 ==============================================================

💬 結果の読み方:高齢化率が 1 pt 上がると、 出生率(人口千人当たり出生数)が約 0.13 下がる負の関係が観測される(95% CI [-0.180, -0.080]、 p<0.001、 R²≈0.38)。 ただしこれは相関であって因果ではない。 「高齢化が進んだ県は出生率も低い」という観測にすぎず、 「高齢化が出生率を下げた」と結論するには年齢構成など交絡の統制が必要。 これが EBPM 入門者が真っ先に混同するポイント。

🔬 数式・定義を「言葉」で読み解く

先ほどの数式・定義に出てきた記号や概念を、 一つずつ確認します。 とくに データ駆動型社会 の文脈で意味を取り違えやすい部分を強調します。

記号意味と注意点
$Y_i(1), Y_i(0)$潜在結果。 個体 $i$ が処置を受けた/受けなかった場合の結果(一方は反実仮想)
$\tau_i$個別処置効果 $\tau_i = Y_i(1) - Y_i(0)$。 観測不可だが ATE/ATT で平均量は推定できる
ATE / ATT平均処置効果(母集団全体)/処置群における平均処置効果
$T_i$処置割当インジケータ。 $T_i = 1$ なら処置群、 $T_i = 0$ なら対照群
$\beta_0, \beta_1$線形回帰の切片と傾き。 EBPM では「政策変数 1 単位あたりのアウトカム変化」と読む
EBPM / DX証拠に基づく政策立案 (Evidence-Based Policy Making) / デジタルトランスフォーメーション

EBPM 文献では「相関係数の高さ」と「因果効果の大きさ」を取り違えないことが鉄則です。 とくに観察データから ATE を推定する場合、 共変量の交絡(confounding)と選択バイアスを切り分ける識別戦略(DID / IV / RDD など)を明示しないと「保育所が多い県は就業率も高い」という相関が「保育整備が就業を増やした」という因果に誤読される危険があります。

🔬 記号・用語の読み解き

記号意味
オープンデータ誰でも利用できる形で公開された公共データ
EBPMエビデンスに基づく政策立案
DXデジタルトランスフォーメーション
Society 5.0サイバー空間と現実空間を融合した次期社会像

他の概念との関係

データ駆動型社会は単独の技術ではなく、 データの収集・流通・活用・統治を支える概念群のネットワークとして成立しています。

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

データ駆動の議論は、まず「数字をそろえて並べる」ところから始まります。SSDSE-B-2026 の 2023 年度から、人口規模も年齢構成も違う 4 都府県を並べます。高齢化率は 65 歳以上人口 A1303 ÷ 総人口 A1101、有効求人倍率は月間有効求人数 F3103 ÷ 月間有効求職者数 F3102(いずれも一般)で自分で計算した値です。

都道府県総人口(千人)高齢化率(%)TFR有効求人倍率
東京都14,08622.80.991.56
大阪府8,76327.71.191.23
沖縄県1,46823.81.601.12
秋田県91439.11.101.40
47 都道府県計124,35329.11.29(47 県の単純平均)1.30

同じ「若い県」でも、東京都は高齢化率 22.8% なのに合計特殊出生率は 0.99 と 47 県で最も低く、沖縄県は 23.8% で出生率 1.60 と最も高い。高齢化率だけを見て「若い県は子どもが増える」と判断すると、東京都で外れます。秋田県は高齢化率 39.1% で最も高い一方、有効求人倍率は 1.40 と全国の 1.30 を上回ります(求職者が少ないことの裏返しでもある)。1 つの指標で県を順位づけず、複数の指標をそろえて並べることが、データ駆動の判断の最初の一歩です。なお合計特殊出生率は県ごとの値しかないので、最終行は 47 県の単純平均で、国全体の値(人口で重み付けした値)とは一致しません。

🧮 SSDSE-B-2026 実値: 都道府県 EBPM 効果指標

データ駆動社会の核心は、 政策・施策の効果を 因果推論と定量評価で語れることです。 ここでは SSDSE-B-2026 の都道府県データを用いて、 「高齢化率(A1303/A1101)と出生率(A4101/A1101)の関係」を OLS 回帰で推定し、 EBPM の典型的な分析フレームを再現します。

📊 分析シナリオ

フェーズ分析タスク使用列(SSDSE-B-2026)
① 課題定義少子化と高齢化の関係を把握したいA1101 総人口 / A4101 出生数 / A1303 65歳以上
② データ収集47 都道府県の指標を SSDSE-B-2026 から抽出全 132 列のうち約 30 列
③ 推定OLS で「高齢化率 → 出生率」係数推定A1303 / A4101 / A1101 (比率化)
④ 評価95% 信頼区間 + 効果量 + p 値で判断scipy.stats / statsmodels
⑤ 政策提言効果量を予算配分の根拠に解釈テンプレ出力

🎯 このコードでやること:SSDSE-B-2026 から 47 都道府県の総人口と出生数を読み込み、 「出生率」(出生数 / 人口 × 1000)を作って都道府県別に並べる。 政策効果を測る前段の「データ整備」工程を体験する。

📥 入力データ(SSDSE-B-2026 抜粋・2023 年度):

Code Prefecture A1101(総人口) A4101(出生数) R01000 北海道 5092000 24430 R13000 東京都 14086000 86348 R27000 大阪府 8763000 55292 R47000 沖縄県 1468000 12549
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
year_col = df.columns[0]
d = df[df[year_col] == df[year_col].max()].copy()   # 最新年度(2023)

# 出生率 = 出生数(A4101) / 総人口(A1101) * 1000 (人口千人当たり)
d['出生率'] = d['A4101'] / d['A1101'] * 1000

print(d[['Prefecture', 'A1101', 'A4101', '出生率']]
      .sort_values('出生率', ascending=False).head(8).to_string(index=False))

📤 実行結果:

Prefecture A1101 A4101 出生率 沖縄県 1468000 12549 8.55 福岡県 5103000 33942 6.65 滋賀県 1407000 9249 6.57 熊本県 1709000 11189 6.55 愛知県 7477000 48402 6.47 佐賀県 795000 5144 6.47 鹿児島県 1549000 9868 6.37 大阪府 8763000 55292 6.31

💬 結果の読み方:沖縄が突出して出生率が高い(8.55 / 千人)。 これは「政策の効果」ではなく「年齢構成」の影響も大きい(若年層人口比率が高い)。 EBPM ではこのような交絡因子を統制してから因果効果を語る必要がある。

🧮 数式に値を入れて手で計算する: IoT 機器普及曲線

合成データで世帯あたり IoT 機器数の年次推移と成長率を計算する。

Step 1: 年別 IoT 機器数

年世帯平均台数前年比
20213—
2022566.7%
2023860.0%
20241250.0%
20251741.7%

Step 2: 5 年成長

2021→2025: 3→17 = 5.67 倍 年率 CAGR = (17/3)^(1/4) - 1 ≈ 0.5429 = 54.3%

🐍 Python で再現

1
2
3
4
5
6
import numpy as np
y = np.array([3, 5, 8, 12, 17])
yoy = np.diff(y) / y[:-1] * 100
cagr = (y[-1]/y[0])**(1/4) - 1
print(f"前年比: {yoy.round(1)}%")
print(f"CAGR: {cagr*100:.1f}%")

📤 実行結果

前年比: [66.7 60. 50. 41.7]% CAGR: 54.3%

💬 手計算 (Step 2) の (17/3)^(1/4) − 1 ≈ 0.5429、 つまり CAGR 54.3% と Python 出力が一致。 前年比は 66.7% → 60.0% → 50.0% → 41.7% と下がっており、 台数は増え続けていても伸び率は年々鈍っている。

🧮 数式に値を入れて手で計算する: 「県の平均」と「全国の値」はちがう

ダッシュボードで 47 都道府県の指標を 1 つの「全国値」にまとめるとき、県の率をそのまま平均するか、分子と分母をそれぞれ合計してから割るかで、値が変わります。前者は人口 91 万人の秋田県と 1,409 万人の東京都を同じ重みで数え、後者は人口に比例した重みで数えるからです。

$$\bar{r}_{\text{単純}} = \frac{1}{K}\sum_{k=1}^{K} \frac{a_k}{n_k}, \qquad r_{\text{全体}} = \frac{\sum_k a_k}{\sum_k n_k} = \sum_{k} \frac{n_k}{\sum_j n_j}\cdot\frac{a_k}{n_k}$$

$a_k$ は県 $k$ の 65 歳以上人口(A1303)、$n_k$ は総人口(A1101)。右の式を変形すると、全体の率は「県の率を人口の割合で重み付けした平均」になっていることが分かります。2023 年度の 3 都県で計算します。

Step計算結果
1. 県ごとの率東京都 3,205,000 ÷ 14,086,000 / 秋田県 357,000 ÷ 914,000 / 沖縄県 350,000 ÷ 1,468,00022.75% / 39.06% / 23.84%
2. 単純平均(22.75 + 39.06 + 23.84) ÷ 3 = 85.65 ÷ 328.55%
3. 合計どうしの比(3,205,000 + 357,000 + 350,000) ÷ (14,086,000 + 914,000 + 1,468,000) = 3,912,000 ÷ 16,468,00023.76%
4. 差28.55 − 23.764.79 ポイント

人口の 86% を占める東京都(14,086 ÷ 16,468 = 0.855)の率 22.75% に、合計どうしの比 23.76% が引き寄せられています。単純平均は、高齢化率の高い秋田県の 39.06% を東京都と同じ重さで数えるので 4.79 ポイント高く出ます。

🎯 このコードでやること:Step 1〜3 の 3 都県の計算を pandas で再現し、同じ比較を 47 都道府県の高齢化率と有効求人倍率(F3103 ÷ F3102)に広げる。

📥 入力例 SSDSE-B-2026.csv から 2023 年度の 47 行 Prefecture A1303(65歳以上) A1101(総人口) F3102(有効求職者) F3103(有効求人) 東京都 3,205,000 14,086,000 1,598,409 2,500,539 秋田県 357,000 914,000 … … 沖縄県 350,000 1,468,000 … …
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df.iloc[:, 0] == 2023].set_index('Prefecture')   # 2023 年度・47 行

# Step 1〜3: 3 都県で手計算を再現する
s = d.loc[['東京都', '秋田県', '沖縄県'], ['A1303', 'A1101']]
rate = s['A1303'] / s['A1101'] * 100
print((rate.round(2)).to_string())
print(f'単純平均 {rate.mean():.2f}%   合計どうしの比 {s["A1303"].sum() / s["A1101"].sum() * 100:.2f}%')

# 47 都道府県に広げる
d['高齢化率'] = d['A1303'] / d['A1101'] * 100
print(f'高齢化率(%)   47県の単純平均 {d["高齢化率"].mean():.2f}  全国 {d["A1303"].sum() / d["A1101"].sum() * 100:.2f}')
d['倍率'] = d['F3103'] / d['F3102']     # 有効求人倍率 = 有効求人数 / 有効求職者数
print(f'有効求人倍率  47県の単純平均 {d["倍率"].mean():.3f}  全国 {d["F3103"].sum() / d["F3102"].sum():.3f}')
📤 実行例(実測) Prefecture 東京都 22.75 秋田県 39.06 沖縄県 23.84 単純平均 28.55% 合計どうしの比 23.76% 高齢化率(%) 47県の単純平均 31.59 全国 29.13 有効求人倍率 47県の単純平均 1.349 全国 1.296

💬 3 都県の単純平均 28.55%・合計どうしの比 23.76% は、Step 2・3 の手計算と一致します。47 都道府県でも、高齢化率は単純平均 31.59% に対し全国 29.13%、有効求人倍率は 1.349 に対し 1.296 と、単純平均のほうが高く出ます。人口の少ない県ほど高齢化率が高く、求職者の少ない県ほど倍率が高いので、県を同じ重さで数えると、そうした県の値が全国像を押し上げるためです。「全国の高齢化率」として報告するなら 29.13%、「典型的な県の姿」を知りたいなら単純平均や中央値、と目的で使い分け、どちらを使ったかを必ず書き添えます。

🐍 Python 実装

以下は データ駆動型社会 を SSDSE-B-2026 で扱うときの典型コード。 encoding='cp932' は政府統計の Shift-JIS 対応。 skiprows=1(header=1 と同じ)は 1 行目の英字コード行を飛ばし、2 行目の日本語項目名を列名にする定石。

① 基本パターン(読み込み・確認・主要列抽出)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 Prefecture(都道府県) A1303(65歳以上人口) A1101(総人口) 北海道 北海道 1,681,000 5,092,000 東京都 東京都 3,205,000 14,086,000 沖縄県 沖縄県 350,000 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd

# データ駆動型社会 に関連する SSDSE-B-2026 分析の基本パターン
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
# 見出しの下に地域コード以外の行が混ざるので、47 都道府県だけ残して数値に直す
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

print(df.shape)            # (564, 112) = 47 都道府県 × 12 年度
print(df.dtypes.head(10))
print(df.describe().T.head(10))

# 主要列にエイリアス(header=1 なので列名は日本語。'Prefecture' ではなく '都道府県')
df['65歳以上'] = df['65歳以上人口']
df['高齢化率'] = df['65歳以上'] / df['総人口'] * 100
print(df[['都道府県', '総人口', '高齢化率']].head())
📤 実行例(実測) (564, 112) 年度 int64 地域コード object 都道府県 object 総人口 int64 総人口(男) int64 総人口(女) int64 日本人人口 int64 日本人人口(男) int64 日本人人口(女) int64 15歳未満人口 int64 dtype: object count mean ... 75% max 年度 564.0 2.017500e+03 ... 2020.25 2023.0 総人口 564.0 2.690688e+06 ... 2784925.50 14086000.0 総人口(男) 564.0 1.308956e+06 ... 1349539.00 6914000.0 総人口(女) 564.0 1.381723e+06 ... 1422000.00 7172000.0 日本人人口 564.0 2.637011e+06 ... 2717122.25 13459000.0 日本人人口(男) 564.0 1.283092e+06 ... 1315342.25 6612000.0 日本人人口(女) 564.0 1.353872e+06 ... 1385624.50 6854000 …(以下略)

💬 形は (564, 112) で、47 都道府県が 2012〜2023 年度の 12 回ずつ並ぶパネル。describe の総人口平均 269 万人は 564 行を混ぜた値なので、「ある年の県の平均人口」として引用すると年度が特定できない。最後の head() は北海道の 2023〜2019 年度が 5 行続き(高齢化率 33.0% → 31.8% と遡るほど下がる)、県を見比べるには年度で絞るか pivot する必要がある。

② 可視化テンプレ(matplotlib / seaborn)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) 北海道 5,092,000 1,681,000 東京都 14,086,000 3,205,000 沖縄県 1,468,000 350,000 …(全 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
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# データ駆動型社会 の探索的データ分析(EDA)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)

# 見出しの下に地域コード以外の行が混ざるので、47 都道府県だけ残して数値に直す
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# 同じ県が 12 年度ぶん入っているので、最新年度(2023)の 47 行だけを使う
df = df[df['年度'] == df['年度'].max()].copy()

# 主要変数を取り出して名前を分かりやすく
df['65歳以上'] = df['65歳以上人口']
df['高齢化率']  = df['65歳以上'] / df['総人口'] * 100
df['TFR']      = df['合計特殊出生率']

# ヒストグラム
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
sns.histplot(df['高齢化率'], kde=True, ax=axes[0])
axes[0].set_title('高齢化率の分布(47都道府県)')
sns.histplot(df['TFR'], kde=True, ax=axes[1])
axes[1].set_title('TFRの分布')
plt.tight_layout()
plt.savefig('eda_distribution.png', dpi=120)
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。

③ 前処理:欠損・外れ値・型変換

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 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
import pandas as pd
import numpy as np

# データ駆動型社会 に関わる前処理の典型パターン
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)

# 見出しの下に地域コード以外の行が混ざるので、47 都道府県だけ残して数値に直す
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# ① 欠損値の確認
print('欠損数:')
print(df.isna().sum().sort_values(ascending=False).head(10))

# ② 数値変換(カンマ・%除去 など)
#    地域コード 'R01000' や都道府県名は数値にできないので、そのまま残す
def to_num(s):
    if isinstance(s, str):
        try:
            return float(s.replace(',', '').replace('%', ''))
        except ValueError:
            return s
    return s
df = df.map(to_num)

# ③ 外れ値検出(IQR)
q1 = df.quantile(0.25, numeric_only=True)
q3 = df.quantile(0.75, numeric_only=True)
iqr = q3 - q1
num = df[q1.index]                      # 数値列だけを比較の対象にする
outlier_mask = ((num < q1 - 1.5*iqr) | (num > q3 + 1.5*iqr)).any(axis=1)
print('外れ値を含む行数:', outlier_mask.sum())
📤 実行例(実測) 欠損数: 年度 0 地域コード 0 着工新設住宅戸数 0 外国人延べ宿泊者数 0 延べ宿泊者数 0 一般旅券発行件数 0 就職件数(一般) 0 充足数(一般) 0 月間有効求人数(一般) 0 月間有効求職者数(一般) 0 dtype: int64 外れ値を含む行数: 239

💬 欠損は上位 10 列とも 0 件で、合計しても全 112 列で 0 件、このファイルは欠損処理の練習台にはならない。IQR で外れ値を含む行は 564 行中 239 行と 4 割を超え、東京都・大阪府・北海道など 13 都道府県は 12 年度すべてで引っかかる。人口や事業所数のような「規模」の列は右裾が長く、大きな県が毎年はみ出すだけなので、これを誤りとして除くのではなく人口当たりに直してから外れ値を見る。

④ 検定・推定の最小例(scipy.stats)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A1303(65歳以上人口) A1101(総人口) Prefecture(都道府県) 北海道 2,023 1,681,000 5,092,000 北海道 東京都 2,023 3,205,000 14,086,000 東京都 沖縄県 2,023 350,000 1,468,000 沖縄県 …(全 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
import pandas as pd
from scipy import stats

# データ駆動型社会 文脈での基本的な仮説検定
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
# 見出しの下に地域コード以外の行が混ざるので、47 都道府県だけ残して数値に直す
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# 同じ県が 12 年度ぶん入っているので、最新年度の 47 行だけを使う
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()].copy()

# 列は名前で取る(番号で取ると読み方が変わったとき別の列を指す)
df['aging'] = df['65歳以上人口'] / df['総人口'] * 100
df['region'] = df['都道府県'].apply(lambda p: '東日本' if p in ['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県'] else '西日本')

east = df.loc[df['region']=='東日本', 'aging']
west = df.loc[df['region']=='西日本', 'aging']

t, p = stats.ttest_ind(east, west, equal_var=False)
print(f'東日本 平均高齢化率: {east.mean():.2f}%')
print(f'西日本 平均高齢化率: {west.mean():.2f}%')
print(f't = {t:.3f}, p = {p:.4f}')
print('判定:', '有意差あり' if p < 0.05 else '有意差なし')
📤 実行例(実測) 東日本 平均高齢化率: 31.18% 西日本 平均高齢化率: 31.97% t = -0.804, p = 0.4259 判定: 有意差なし

💬 2023 年度 47 行で、東日本 23 都道府県の平均高齢化率 31.18%、西日本 24 府県 31.97% と差は 0.79 ポイント。高齢化率は県によって 22.8%(東京都)〜39.1%(秋田県)と 16 ポイント以上ばらつくので、この程度の平均差は t = −0.804、p = 0.43 で偶然の範囲に収まる。有意差なしは「差が無い」の証明ではなく、東西の 2 区分が粗すぎる可能性もあるので、地方別や都市規模別に分けて見直す。

※ より高度な例(クロス集計、 機械学習、 ベイズ推定)は AI と社会 や データガバナンス のグループ教材を参照。

🐍 Python での実装例

SSDSE-B-2026 などの実データを使った最小コード(7行):

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
5
6
7
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
# オープンデータ活用例:県別の指標を集計
key = df.columns[1]
print('都道府県数:', df[key].nunique())
print('利用可能な指標数:', df.select_dtypes('number').shape[1])
print('データ駆動的な可視化の起点:'); print(df.describe().T.head(3))
📤 実行例(実測) 都道府県数: 47 利用可能な指標数: 110 データ駆動的な可視化の起点: count mean std ... 50% 75% max 年度 564.0 2.017500e+03 3.455117e+00 ... 2017.5 2020.25 2023.0 総人口 564.0 2.690688e+06 2.730951e+06 ... 1620000.0 2784925.50 14086000.0 総人口(男) 564.0 1.308956e+06 1.345905e+06 ... 761500.0 1349539.00 6914000.0 [3 rows x 8 columns]

💬 df.columns[1] は地域コードで、nunique は 47 都道府県。数値列 110 には年度も含まれるので、実際の指標は 112 列から年度・地域コード・都道府県を除いた 109 列になる。describe の count 564 は 47 県 × 12 年度を混ぜた数なので、平均人口 269 万人・最大 1,408.6 万人(2023 年の東京都)はどれも年度をまたいだ要約として読む。

※ data/raw/SSDSE-B-2026.csv は e-Stat SSDSE から取得した実データを想定。

🐍 EBPM 効果指標ダッシュボード(最小実装)

🎯 このコードでやること:47 都道府県の「高齢化率」と「出生率」を散布図にし、 さらに回帰直線と 95% 信頼帯を描いてダッシュボード化する。 EBPM ダッシュボードの最小構成を体験。

📥 入力データ:上記コードと同じ 47 県の latest テーブル。

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
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
year_col = df.columns[0]
d = df[df[year_col] == df[year_col].max()].copy()   # 最新年度の47都道府県
d['高齢化率'] = d['A1303'] / d['A1101'] * 100    # A1303=65歳以上人口
d['出生率']   = d['A4101'] / d['A1101'] * 1000   # A4101=出生数

plt.figure(figsize=(8, 6))
sns.regplot(data=d, x='高齢化率', y='出生率',
            scatter_kws={'s': 70, 'alpha': 0.7}, line_kws={'color': '#D32F2F'})
plt.title('高齢化率 vs 出生率(47 都道府県)')
plt.grid(alpha=0.3)
plt.tight_layout(); plt.savefig('ebpm_dashboard.png', dpi=110)

# 図に描いた回帰直線の中身と、直線から最も上に外れた県を数値でも確かめる
b1, b0 = np.polyfit(d['高齢化率'], d['出生率'], 1)
resid = d['出生率'] - (b0 + b1 * d['高齢化率'])
r2 = 1 - (resid**2).sum() / ((d['出生率'] - d['出生率'].mean())**2).sum()
print('保存先: ebpm_dashboard.png')
print(f'回帰直線: 出生率 ≈ {b0:.2f} − {-b1:.3f} × 高齢化率')
print(f'R² = {r2:.3f}')
top = d.assign(残差=resid).nlargest(3, '残差')
print(top[['Prefecture', '高齢化率', '出生率', '残差']].round(2).to_string(index=False))

📤 実行結果(実測):

保存先: ebpm_dashboard.png 回帰直線: 出生率 ≈ 9.82 − 0.130 × 高齢化率 R² = 0.378 Prefecture 高齢化率 出生率 残差 沖縄県 23.84 8.55 1.82 鹿児島県 33.83 6.37 0.94 熊本県 32.30 6.55 0.91

💬 結果の読み方:R² = 0.378 で、高齢化率だけで出生率の県差の約 4 割を説明する。直線から最も上に外れるのは沖縄県(高齢化率 23.84% と低く、出生率 8.55 は直線の予測より 1.82 高い)で、「高齢化率が高いのに出生率も相対的に高い」のは鹿児島県(33.83%、+0.94)・熊本県(32.30%、+0.91)の側。赤線の周りの陰影は seaborn が bootstrap で描く 95% 信頼帯で、±1.96×SE の式で引いたものではない。 ダッシュボードはこのように「外れ値の発見 → 個別ヒアリング → 政策修正」のサイクルを担う。

🐍 KPI の決め方で「良い県」が入れ替わる — ごみの 3 指標

データ駆動の意思決定は、何を KPI(成果指標)にするかを決めた時点で結論の大半が決まります。同じ「ごみ対策」でも、総排出量・1 人 1 日あたり排出量・リサイクル率のどれで測るかで、評価される県がまったく変わることを実データで確かめます。

🎯 このコードでやること:2023 年度の 47 県について、ごみ総排出量(少ないほど良い)・1 人 1 日あたり排出量(少ないほど良い)・リサイクル率(高いほど良い)の 3 つの KPI で順位をつけ、上位 3 県と、順位どうしの順位相関を出す。

📥 入力例 SSDSE-B-2026.csv の 2023 年度・47 行 Prefecture H5609(ごみ総排出量 t) H5610(1人1日排出量 g) H5614(リサイクル率 %) 北海道 1,704,071 912 22.8 東京都 4,046,316 795 24.9 …(全 47 行)
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
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023].set_index('Prefecture')
kpi = pd.DataFrame({
    'ごみ総排出量(t)': d['H5609'],          # 少ないほど良い
    '1人1日排出量(g)': d['H5610'],          # 少ないほど良い
    'リサイクル率(%)': d['H5614'],          # 高いほど良い
})
rank = pd.DataFrame({
    'ごみ総排出量(t)': kpi['ごみ総排出量(t)'].rank(),
    '1人1日排出量(g)': kpi['1人1日排出量(g)'].rank(),
    'リサイクル率(%)': kpi['リサイクル率(%)'].rank(ascending=False),
}).astype(int)
for c in kpi.columns:
    best = rank[c].nsmallest(3).index
    print(f'{c:12s} の上位 3: ' + '、'.join(f'{p}({kpi.loc[p, c]:g})' for p in best))
print('KPI の順位どうしの順位相関:')
print(rank.corr(method='spearman').round(3).to_string())
for p in ['東京都', '長野県', '鳥取県']:
    print(p, '順位:', '  '.join(f'{c} {int(v)} 位' for c, v in rank.loc[p].items()))
📤 実行例(実測) ごみ総排出量(t) の上位 3: 鳥取県(190681)、島根県(214869)、高知県(226813) 1人1日排出量(g) の上位 3: 京都府(749)、滋賀県(761)、神奈川県(769) リサイクル率(%) の上位 3: 岡山県(29)、鳥取県(28.2)、東京都(24.9) KPI の順位どうしの順位相関: ごみ総排出量(t) 1人1日排出量(g) リサイクル率(%) ごみ総排出量(t) 1.000 -0.331 -0.267 1人1日排出量(g) -0.331 1.000 0.164 リサイクル率(%) -0.267 0.164 1.000 東京都 順位: ごみ総排出量(t) 47 位 1人1日排出量(g) 6 位 リサイクル率(%) 3 位 長野県 順位: ごみ総排出量(t) 26 位 1人1日排出量(g) 4 位 リサイクル率(%) 8 位 鳥取県 順位: ごみ総排出量(t) 1 位 1人1日排出量(g) 44 位 リサイクル率(%) 2 位

💬 3 つの KPI の上位 3 県は、総排出量なら鳥取県・島根県・高知県、1 人 1 日あたりなら京都府・滋賀県・神奈川県、リサイクル率なら岡山県・鳥取県・東京都と、ほとんど重なりません。順位相関は −0.331〜+0.164 で、ある KPI で上位の県が別の KPI でも上位とは限りません。東京都は総排出量では 47 位(最下位)ですが、1 人 1 日あたりでは 6 位、リサイクル率では 3 位です。鳥取県は総排出量 1 位、リサイクル率 2 位なのに、1 人 1 日あたりでは 44 位です。総排出量は人口の大きさをそのまま映すだけなので、県どうしの取り組みを比べる KPI には向きません。

ダッシュボードに載せる KPI を決めるときは、(1) 規模の影響を人口などで割って取り除いているか、(2) 「少ないほど良い」「高いほど良い」の向きが明確か、(3) 複数の KPI が矛盾したときにどれを優先するかを先に決めてあるか、の 3 点を確認します。KPI を後から選べば、どの県でも「良い結果」を示せてしまうからです。

🐍 EBPM を実データで練習する — 保育所の定員と待機児童

「保育所の定員を増やせば待機児童は減るか」は、EBPM(証拠に基づく政策立案)の典型的な問いです。SSDSE-B-2026 の保育所等の定員(J2505)と待機児童数(J250502)で、素朴な分析がどう間違えるかを 2 段階で確かめます。まず 1 時点(2022 年度)の県の比較です。

🎯 このコードでやること:2022 年度の 47 県で、保育所等の定員と待機児童数の順位相関を、人数どうしと「15 歳未満人口あたり」の率どうしの 2 通りで計算する。定員の多い県と定員率の高い県を 4 県ずつ並べる。

📥 入力例 SSDSE-B-2026.csv(2022 年度の 47 行だけを使う) SSDSE-B-2026 Prefecture A1301(15歳未満) J2503(保育所等数) J2505(定員) J2506(在所児数) J250502(待機児童) 2022 北海道 530,000 1,099 88,268 79,262 22 2022 東京都 1,535,000 3,615 322,379 275,851 300 2017 東京都 1,542,000 2,414 235,571 226,588 8,586 …(全 564 行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2022].copy()           # 2022 年度の 47 県
d['定員率'] = d['J2505'] / d['A1301'] * 100          # 15 歳未満人口 100 人あたりの保育所等定員
d['待機率'] = d['J250502'] / d['A1301'] * 1e4        # 15 歳未満人口 1 万人あたりの待機児童

rho1, p1 = stats.spearmanr(d['J2505'], d['J250502'])
rho2, p2 = stats.spearmanr(d['定員率'], d['待機率'])
print(f'人数どうし   : 定員 と 待機児童   ρ = {rho1:+.3f} (p = {p1:.1e})')
print(f'人口あたり   : 定員率 と 待機率   ρ = {rho2:+.3f} (p = {p2:.1e})')
cols = ['Prefecture', 'A1301', 'J2505', 'J250502', '定員率', '待機率']
print(d.sort_values('J2505', ascending=False)[cols].head(4).round(1).to_string(index=False))
print(d.sort_values('定員率', ascending=False)[cols].head(4).round(1).to_string(index=False))
📤 実行例(実測) 人数どうし : 定員 と 待機児童 ρ = +0.556 (p = 4.9e-05) 人口あたり : 定員率 と 待機率 ρ = -0.556 (p = 5.0e-05) Prefecture A1301 J2505 J250502 定員率 待機率 東京都 1535000 322379 300 21.0 2.0 愛知県 948000 191331 53 20.2 0.6 大阪府 1002000 181591 134 18.1 1.3 神奈川県 1053000 170144 220 16.2 2.1 Prefecture A1301 J2505 J250502 定員率 待機率 高知県 72000 25867 4 35.9 0.6 福井県 92000 29065 0 31.6 0.0 新潟県 235000 72018 0 30.6 0.0 秋田県 86000 25603 7 29.8 0.8

💬 人数どうしでは ρ = +0.556 で、「定員が多い県ほど待機児童が多い」という、政策の逆効果を思わせる結果が出ます。ところが 15 歳未満人口あたりの率にすると ρ = −0.556 と符号が逆になり、「定員率が高い県ほど待機率が低い」になります。人数どうしの正の相関は、東京都(定員 322,379、待機 300)のように子どもの多い県が両方とも大きいという規模の効果です。定員率の上位は高知県 35.9、福井県 31.6、新潟県 30.6 で、福井県と新潟県は待機児童 0 です。

次に、同じ県の中で時間とともに何が起きたかを見ます。2017 年度から 2022 年度の 5 年間で、定員を大きく増やした県ほど待機児童が減ったかどうかです。

🎯 このコードでやること:47 県について 2017→2022 年度の定員の増加率と待機児童の増減を計算し、その順位相関を出す。さらに、2017 年度の待機児童数が「増減」と「定員の増加率」のそれぞれとどれだけ相関しているかも出す。

📥 入力例 SSDSE-B-2026.csv(564 行 = 47 都道府県 × 2012〜2023 年度) SSDSE-B-2026 Prefecture A1301(15歳未満) J2503(保育所等数) J2505(定員) J2506(在所児数) J250502(待機児童) 2022 北海道 530,000 1,099 88,268 79,262 22 2022 東京都 1,535,000 3,615 322,379 275,851 300 2017 東京都 1,542,000 2,414 235,571 226,588 8,586 …(全 564 行)
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
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
p = lambda c: df.pivot(index='Prefecture', columns='SSDSE-B-2026', values=c)
cap, wait = p('J2505'), p('J250502')

t = pd.DataFrame({
    '定員の増加率(%)': (cap[2022] / cap[2017] - 1) * 100,
    '待機児童 2017': wait[2017],
    '待機児童 2022': wait[2022],
})
t['待機児童の増減'] = t['待機児童 2022'] - t['待機児童 2017']
print(t.sort_values('定員の増加率(%)', ascending=False).head(5).round(1).to_string())
r1 = stats.spearmanr(t['定員の増加率(%)'], t['待機児童の増減'])[0]
r2 = stats.spearmanr(t['待機児童 2017'], t['待機児童の増減'])[0]
r3 = stats.spearmanr(t['待機児童 2017'], t['定員の増加率(%)'])[0]
print(f'定員の増加率 と 待機児童の増減      ρ = {r1:+.3f}')
print(f'2017 年の待機児童 と 待機児童の増減  ρ = {r2:+.3f}')
print(f'2017 年の待機児童 と 定員の増加率    ρ = {r3:+.3f}')
print(f'全国の待機児童 2017 {wait[2017].sum():,} 人 → 2022 {wait[2022].sum():,} 人')
📤 実行例(実測) 定員の増加率(%) 待機児童 2017 待機児童 2022 待機児童の増減 Prefecture 沖縄県 39.3 2247 439 -1808 東京都 36.9 8586 300 -8286 神奈川県 31.3 756 220 -536 千葉県 31.1 1787 250 -1537 埼玉県 26.7 1258 296 -962 定員の増加率 と 待機児童の増減 ρ = -0.761 2017 年の待機児童 と 待機児童の増減 ρ = -0.988 2017 年の待機児童 と 定員の増加率 ρ = +0.765 全国の待機児童 2017 26,081 人 → 2022 2,944 人

💬 定員の増加率と待機児童の増減の順位相関は ρ = −0.761 で、「定員を増やした県ほど待機児童が減った」ように見えます。全国でも待機児童は 26,081 人 → 2,944 人と 9 割近く減りました。しかし、2017 年度の待機児童数と増減の相関は ρ = −0.988 と、ほぼ完全です。待機児童は 0 より下には減らないので、減った人数は「最初に何人いたか」でほぼ決まります。そして 2017 年度の待機児童が多い県ほど定員を増やしていました(ρ = +0.765)。沖縄県(+39.3%、2,247 → 439 人)や東京都(+36.9%、8,586 → 300 人)のように、問題の大きい県に政策が集中したので、「定員の効果」と「もともと待機児童が多かったこと」をこのデータだけでは切り分けられません。

このように政策は、必要性の高いところに優先して実施されるのが普通です(政策の割り当てが結果と無関係ではない)。そのため「実施した所としなかった所を比べる」だけでは効果を測れず、実施のタイミングの違いを使う差の差分析や、実施の基準(例: 待機児童 100 人以上)の前後を比べる回帰不連続デザインのような、割り当ての仕組みを考えた設計が必要になります。上の「潜在結果モデル」の節で見た「比べる相手(反事実)を何にするか」が、実データではこうした形で現れます。

このデータで設計を考えるなら、たとえば 2017 年度に待機児童が 1,000 人以上だった 8 都府県(東京都 8,586、沖縄県 2,247、千葉県 1,787、兵庫県 1,572、福岡県 1,297、埼玉県 1,258、大阪府 1,190、岡山県 1,048 人)を「問題の大きい県」とし、人数ではなく 15 歳未満人口あたりの待機率で、定員を増やした時期が早い県と遅い県の推移を比べる、という形になります。ただし 2023 年度は次の節で見る集計の段差があるので、比較は 2022 年度までに限ります。

🐍 差の差を実データで計算する — 定員を大きく増やした県と、そうでない県

上の保育所の節では、東京都 1 県の前後比較では効果を言えないことを見ました。比べる相手を置く最も素朴な方法が差の差(difference-in-differences)です。「定員を大きく増やした県の変化」から「あまり増やさなかった県の変化」を引けば、両方に共通する全国的な流れ(子どもの減少や制度の変化)は打ち消されます。式で書くと $\text{DiD} = (\bar{y}^{\text{伸}}_{2022} - \bar{y}^{\text{伸}}_{2017}) - (\bar{y}^{\text{小}}_{2022} - \bar{y}^{\text{小}}_{2017})$ です。

🎯 このコードでやること:2017→2022 年度の保育所等定員(J2505)の伸び率の中央値で 47 県を 2 群に分け、15 歳未満 1 万人あたりの待機児童数(J250502 ÷ A1301)の群平均を 2015・2017・2022 年度で出して、差の差と、施策前の期間(2015→2017)の差の差を計算する。

📥 入力例 SSDSE-B-2026.csv(564 行 = 47 都道府県 × 2012〜2023 年度) SSDSE-B-2026 Prefecture A1301(15歳未満) J2505(定員) J250502(待機児童) 2022 東京都 1,535,000 322,379 300 2017 東京都 1,542,000 235,571 8,586 …(全 564 行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={df.columns[0]: 'year'})
cap = df.pivot(index='Prefecture', columns='year', values='J2505')      # 保育所等定員
wait = df.pivot(index='Prefecture', columns='year', values='J250502')   # 待機児童
kids = df.pivot(index='Prefecture', columns='year', values='A1301')     # 15 歳未満人口
rate = wait / kids * 10000          # 15 歳未満 1 万人あたりの待機児童

# 2017→2022 年度の定員の伸びで 47 県を 2 群に分ける(中央値で)
growth = cap[2022] / cap[2017] - 1
hi = growth[growth > growth.median()].index
lo = growth[growth <= growth.median()].index
print(f'定員の伸び  伸びた群 {growth[hi].mean():.3f}({len(hi)} 県)  伸びの小さい群 {growth[lo].mean():.3f}({len(lo)} 県)')

m = pd.DataFrame({'伸びた群': rate.loc[hi].mean(), '伸びの小さい群': rate.loc[lo].mean()})
print(m.loc[[2015, 2017, 2022]].round(2).to_string())
did = (m.loc[2022, '伸びた群'] - m.loc[2017, '伸びた群']) - (m.loc[2022, '伸びの小さい群'] - m.loc[2017, '伸びの小さい群'])
pre = (m.loc[2017, '伸びた群'] - m.loc[2015, '伸びた群']) - (m.loc[2017, '伸びの小さい群'] - m.loc[2015, '伸びの小さい群'])
print(f'差の差 (2017→2022) = {did:+.2f}   事前の差の差 (2015→2017) = {pre:+.2f}')
📤 実行例(実測) 定員の伸び 伸びた群 0.207(23 県) 伸びの小さい群 0.059(24 県) 伸びた群 伸びの小さい群 year 2015 18.84 3.02 2017 20.13 5.61 2022 2.48 1.10 差の差 (2017→2022) = -13.13 事前の差の差 (2015→2017) = -1.30

💬 定員の伸びた 23 県(平均 +20.7%)は 1 万人あたり 20.13 → 2.48 人、伸びの小さい 24 県(+5.9%)は 5.61 → 1.10 人に減り、差の差は −13.13 人です。施策前の 2015→2017 年度の差の差は −1.30 人なので、「もともと減り方が違っていた」わけではなさそうです。ただし、この −13.13 人をそのまま定員拡大の効果とは読めません。伸びの小さい群は 2017 年度に 5.61 人しかおらず、0 人より下には減れないので、そもそも 13 人も減る余地がありませんでした。待機児童の多かった県ほど定員を増やしたので、群の違いは「定員の伸び」と「最初の待機児童の多さ」が重なっています。差の差は「処置が無ければ両群は平行に動いた」という仮定(平行トレンド)に頼る方法で、出発点が大きく違う群ではこの仮定が疑わしいことを、数字とともに報告します。

⚠️ よくある落とし穴(7 件)

データ駆動型社会 に取り組むときに、 学生・実務者・研究者がよく踏むワナをまとめました。 該当しそうな項目があれば、 自分の分析を見直してみてください。

❌ 1. 「データがあれば何でも分かる」ナイーブ信仰
データ駆動型社会のキャッチコピー「勘ではなくデータで」を字面通り受け取り、 ドメイン知識・倫理判断・政治的合意形成を軽視する事例が多い。 EBPM では「データは判断材料」であり「判断そのもの」ではない。
❌ 2. データへの過信と Algorithmic Accountability の欠如
COMPAS (米犯罪予測) や Amazon AI 採用ツールのように、 アルゴリズムが過去の差別を再生産しても「データに基づく判断」として正当化されがち。 第三者監査・苦情処理・説明責任の枠組みがセットで必要。
❌ 3. プライバシー保護とのトレードオフ無視
「全てをデータ化」志向は GDPR や日本の改正個人情報保護法と衝突する。 PPDM (プライバシー保護データマイニング)、 差分プライバシー、 連合学習などの技術を最初から設計に組み込む。
❌ 4. データリテラシー格差 (Data Divide)
データを「読める人」と「読めない人」の格差が、 デジタルデバイドに次ぐ新たな社会格差に。 自治体・学校・市民団体への教育投資なしに「データ駆動社会」を進めると、 一部エリートだけが恩恵を受ける構造になる。
❌ 5. Goodhart's Law: 指標が目標になると指標が壊れる
"When a measure becomes a target, it ceases to be a good measure" (Goodhart, 1975)。 KPI を最適化すると本来の目的が見失われる (英国 NHS の救急 4 時間ルール → 重症者を後回しにする事例)。
❌ 6. データ独占と vendor lock-in
GAFA や国家プラットフォーム (Aadhaar 等) にデータが集中すると、 アクセスできる主体だけが優位に。 オープンデータ (e-Stat、 SSDSE)、 Data Commons、 GAIA-X 等の「主権あるデータ流通」基盤が対抗策。
❌ 7. 説明可能性 (XAI) を後回しに
深層学習で性能を追うほど判断根拠が不透明に。 EU AI Act は High-Risk AI に説明責任を義務化。 「データで決めた」と言うなら、 そのデータと推論プロセスを公開・検証可能にする責任が伴う。

🧭 詳細解説 — データ駆動型社会 を一段深く掘り下げる

歴史的背景

データ駆動型社会(Data-Driven Society)は、 2011 年の World Economic Forum レポート「Personal Data: The Emergence of a New Asset Class」を契機に社会経済学の文脈で使われ始め、 2014 年の Big Data 第二次ブーム、 2016 年の日本「Society 5.0」、 2018 年の EU GDPR 施行、 2020 年の Data Governance Act 提案などを通じて政策用語として定着しました。 日本では第 5 期科学技術基本計画(2016-2020)に「狩猟社会・農耕社会・工業社会・情報社会に続く第 5 の社会」として明記され、 内閣府デジタル田園都市国家構想、 デジタル庁設立 (2021)、 統計改革推進会議 (2017-) など、 公的統計・行政データのオープン化・標準化が制度的に進められています。 SSDSE は独立行政法人統計センターが作成・公開している、 公的統計の教育普及策の象徴的な成果物の 1 つです。

⚠️ よくある落とし穴

❌ データ=真実、 ではない
測り方・集め方にバイアス。 数字だけ信じない。
❌ プライバシー軽視
個人特定可能データの安易な公開は社会的信頼を損なう。
❌ アルゴリズムバイアス
過去データの偏りが将来の判断にも継承。
❌ デジタルデバイド
データを使える人と使えない人で格差拡大。

⚠️ データ駆動社会の落とし穴(深掘り 7 件)

① データ品質の幻想
「集めたデータ = 正しいデータ」と誤認しがち。 行政データは定義変更・取得漏れ・集計ミスが日常茶飯事。 まずメタデータ・更新履歴を疑う癖を。
② プライバシー vs 効用のジレンマ
細かい粒度ほど個人特定リスクが上がる。 k-匿名化、 差分プライバシー、 連合学習などのPETs 知識が必須。 GDPR・改正個人情報保護法も追従。
③ アルゴリズミック・バイアス
過去データの偏りがモデルに転写される。 採用 AI、 信用スコア、 再犯予測などで人種・性別バイアスが報告。 fairness metrics 必須。
④ ガバナンス欠如
「データはあるが誰の責任で意思決定するか」が曖昧だと、 結局過去の慣習が勝つ。 Chief Data Officer の任命・データ責任マトリクスの整備が起点。
⑤ デジタルデバイド
高齢者・障害者・地方在住者がデータ生成・受益から脱落するリスク。 「データ駆動」が逆に格差を拡大しないよう、 包摂的設計が必要。
⑥ 短期 KPI 偏重
数値化しやすい指標だけが評価対象になり、 長期効果・質的価値が無視される(Goodhart の法則)。 複合指標と定性データの併用を。
⑦ 相関と因果の混同
「相関が高い → 効果がある」と早合点して政策投入し、 効果ゼロ・逆効果のケースが頻発。 RCT/DID/IV いずれの識別戦略を取ったか必ず明示。

⚠️ 実データで確かめる — 数字の段差を「政策の効果」と読まない

データ駆動の判断で最も危ないのは、集計の仕方が変わってできた数字の段差を、現実の変化と読んでしまうことです。上の保育所等のデータを全国の合計で並べると、2023 年度に大きな段差があります。

🎯 このコードでやること:保育所等数・定員・在所児数・待機児童・15 歳未満人口の全国合計を 2019〜2023 年度で並べ、前年比を計算する。定員の 2023/2022 年度比を 47 県で比べる。

📥 入力例 SSDSE-B-2026.csv(564 行 = 47 都道府県 × 2012〜2023 年度) SSDSE-B-2026 Prefecture A1301(15歳未満) J2503(保育所等数) J2505(定員) J2506(在所児数) J250502(待機児童) 2022 北海道 530,000 1,099 88,268 79,262 22 2022 東京都 1,535,000 3,615 322,379 275,851 300 2017 東京都 1,542,000 2,414 235,571 226,588 8,586 …(全 564 行)
1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
g = df.groupby('SSDSE-B-2026')[['J2503', 'J2505', 'J2506', 'J250502', 'A1301']].sum()
g.columns = ['保育所等数', '定員', '在所児数', '待機児童', '15歳未満人口']
chg = (g.pct_change() * 100).round(1)
print(g.loc[2019:2023].to_string())
print('前年比(%)'); print(chg.loc[2020:2023].to_string())
p = lambda c: df.pivot(index='Prefecture', columns='SSDSE-B-2026', values=c)
ratio = (p('J2505')[2023] / p('J2505')[2022]).round(3)
print(f'定員の 2023/2022 比: 47 県の最小 {ratio.min()}({ratio.idxmin()})、中央値 {ratio.median()}、最大 {ratio.max()}({ratio.idxmax()})')
print('0.9 未満の県数:', int((ratio < 0.9).sum()))
📤 実行例(実測) 保育所等数 定員 在所児数 待機児童 15歳未満人口 SSDSE-B-2026 2019 28737 2787945 2586393 16772 15213000 2020 29474 2858116 2624336 12439 14955692 2021 29994 2904351 2643195 5634 14787000 2022 30356 2936183 2599188 2944 14504000 2023 23725 2266614 1905478 2680 14171000 前年比(%) 保育所等数 定員 在所児数 待機児童 15歳未満人口 SSDSE-B-2026 2020 2.6 2.5 1.5 -25.8 -1.7 2021 1.8 1.6 0.7 -54.7 -1.1 2022 1.2 1.1 -1.7 -47.7 -1.9 2023 -21.8 -22.8 -26.7 -9.0 -2.3 定員の 2023/2022 比: 47 県の最小 0.445(富山県)、中央値 0.726、最大 0.999(東京都) 0.9 未満の県数: 40

💬 2023 年度だけ、保育所等数 −21.8%、定員 −22.8%、在所児数 −26.7% と、前年まで毎年 1〜3% 増えていた系列が 2 割以上減っています。15 歳未満人口の減少は −2.3% なので、子どもが減ったことでは説明できません。県ごとの定員の 2023/2022 比は、富山県 0.445 から東京都 0.999 まで大きくばらつき、47 県中 40 県で 0.9 未満です。1 年で保育所の 2 割が実際に閉じたとは考えにくく、集計の対象(どの種類の施設を「保育所等」に含めるか)が変わった可能性を疑うべき段差です。SSDSE の数値だけからは理由を確定できないので、元の統計の注記で確かめる必要があります。

もしこの段差に気づかずに「2023 年度に定員を 22.8% 削減したのに待機児童は 9.0% 減った。定員を減らしても待機児童は増えない」と書けば、完全に誤った政策提言になります。時系列のデータを政策の評価に使うときは、(1) 前年比が他の年と桁違いの年がないか、(2) その年に、関連する複数の系列が同時に同じ向きに動いていないか、(3) 元の統計に定義や集計範囲の変更の注記がないか、を必ず確かめます。段差のある年は、分析から外すか、段差の前後を別の系列として扱います。外した場合は「2023 年度の保育所等の値は前年までと集計範囲が異なる可能性があるため、比較から除いた」のように、除いた理由を報告書に書いておきます。

⚠️ 実データで確かめる — 「悪い県を選んで支援したら改善した」は平均への回帰かもしれない

EBPM でよくある流れが「指標の悪い県(自治体)を選んで重点的に支援し、翌年に指標が改善したので効果があった」という評価です。ところが、ある年にたまたま値が悪く出た県は、何もしなくても翌年は平均の側に戻りやすい。これを平均への回帰と呼びます。1 人 1 日当たりのごみ排出量(H5610)で、支援を何もしていないのに「改善」が生じることを確かめます。

🎯 このコードでやること:県 × 年度のごみ排出量(g/人・日)の表を作り、2016 年度に排出量が多かった 10 県・少なかった 10 県・残り 37 県で、翌年の変化の平均を比べる。選ぶ年度を 2012〜2022 年度に変えても同じことが起きるかを確かめる。

📥 入力例 SSDSE-B-2026.csv(564 行 = 47 都道府県 × 2012〜2023 年度) SSDSE-B-2026 Prefecture H5610(1人1日当たりの排出量, g) 2017 鳥取県 … 2016 鳥取県 … …(全 564 行)
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

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={df.columns[0]: 'year'})
# 1人1日当たりのごみ排出量 (g) を 県 × 年度 の表にする
w = df.pivot(index='Prefecture', columns='year', values='H5610')

# 2016 年度に排出量が多かった 10 県を「重点支援県」に選んだと仮定する
top10 = w[2016].nlargest(10).index
bot10 = w[2016].nsmallest(10).index
rest = w.index.difference(top10)

def show(label, idx):
    before = (w.loc[idx, 2016] - w.loc[idx, 2015]).mean()
    after = (w.loc[idx, 2017] - w.loc[idx, 2016]).mean()
    print(f'{label:<10} 2016 平均 {w.loc[idx, 2016].mean():6.1f} g'
          f'  2015→16 {before:+5.1f} g  2016→17 {after:+5.1f} g')

show('多い10県', top10)
show('少ない10県', bot10)
show('残り37県', rest)
print('多い 10 県:', '・'.join(top10))

# 選ぶ年度を変えても同じことが起きるか(どの年も「施策」は無い)
print('選んだ年度  多い10県の翌年変化  残り37県の翌年変化  差')
for y in range(2012, 2023):
    t = w[y].nlargest(10).index
    ch = w[y + 1] - w[y]
    print(f'{y}        {ch[t].mean():+6.1f}            {ch.drop(t).mean():+6.1f}        {ch[t].mean() - ch.drop(t).mean():+6.1f}')
r = w[2016].corr(w[2017] - w[2016])
print(f'2016 年度の水準と翌年の変化の相関 r = {r:.3f}')
📤 実行例(実測) 多い10県 2016 平均 1010.0 g 2015→16 -9.9 g 2016→17 -4.1 g 少ない10県 2016 平均 856.9 g 2015→16 -10.8 g 2016→17 +6.3 g 残り37県 2016 平均 916.0 g 2015→16 -12.0 g 2016→17 +1.0 g 多い 10 県: 鳥取県・富山県・福島県・新潟県・群馬県・青森県・山口県・山梨県・宮城県・石川県 選んだ年度 多い10県の翌年変化 残り37県の翌年変化 差 2012 -3.7 -1.6 -2.1 2013 -14.3 -2.4 -11.9 2014 -8.4 -6.4 -2.0 2015 -12.4 -11.4 -1.0 2016 -4.1 +1.0 -5.1 2017 -4.9 +2.0 -6.9 2018 -2.6 +2.5 -5.1 2019 -17.2 -14.9 -2.3 2020 -6.4 -8.9 +2.5 2021 -5.5 -8.8 +3.3 2022 -33.9 -26.3 -7.6 2016 年度の水準と翌年の変化の相関 r = -0.202

💬 2016 年度に排出量の多かった 10 県は翌年に平均 −4.1 g 減り、少なかった 10 県は +6.3 g、残り 37 県は +1.0 g と、上の県は下がり下の県は上がっています。この 10 県に何か施策をしていたら「重点支援で 4.1 g 減った、他県は増えたのに」と報告できてしまいますが、実際にはどの県も選ばれていません。選ぶ年度を変えると、多い 10 県の翌年変化が残りの県より小さい(差が負)年は 11 回中 9 回あり、2016 年度の水準と翌年の変化の相関も r = −0.202 と負です。ただし差は −11.9 g から +3.3 g まで年によってばらつき、2020・2021 年度は逆向きなので、平均への回帰は「必ず起きる大きな効果」ではなく「施策の効果と見分けがつかない程度には起きる」ものです。

対策は、(1) 選んだ県と、同じ基準で選ばれたが支援を受けなかった県(または選定前の数年の傾向)と比べる、(2) 1 年の値でなく複数年の平均で対象を選ぶ、(3) 支援の前後を比べるときは、同じ期間の全国の変化(上の表の 2022 年度のように、選ばれなかった 37 県の平均でも −26.3 g 動く年がある)を差し引く、の 3 つです。📐 の潜在結果の枠組みで言えば、「支援しなかった場合の翌年の値」を、選ばれた県自身の前年値で代用してはいけない、ということです。

⚠️ 実データで確かめる — 「改善幅ランキング」は毎年入れ替わる

自治体の KPI ダッシュボードでは、指標の水準だけでなく「前年からの改善幅」で県や部署を表彰・順位づけすることがあります。しかし水準の順位は安定していても、改善幅の順位は 1 年ごとにほとんど入れ替わります。上と同じごみ排出量(H5610)で確かめます。

🎯 このコードでやること:ごみ排出量の県別順位が翌年度とどれだけ一致するか(水準の順位相関)と、前の 1 年の改善幅と次の 1 年の改善幅の順位がどれだけ一致するか(改善幅の順位相関)を、2014〜2023 年度で比べる。改善幅の上位 10 県(減少幅の大きい 10 県)が翌年も上位 10 県に残る数を数える。

📥 入力例 SSDSE-B-2026.csv(564 行 = 47 都道府県 × 2012〜2023 年度) SSDSE-B-2026 Prefecture H5610(1人1日当たりの排出量, g) (上の平均への回帰のコードと同じ列)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={df.columns[0]: 'year'})
w = df.pivot(index='Prefecture', columns='year', values='H5610')   # ごみ g/人・日

print('比べる年度   水準の順位相関   改善幅の順位相関')
for y in range(2014, 2023):
    lv = w[y].corr(w[y + 1], method='spearman')                   # 水準: y 年度 vs y+1 年度
    ch_prev = w[y] - w[y - 1]                                     # 改善幅: 前の 1 年
    ch_next = w[y + 1] - w[y]                                     # 改善幅: 次の 1 年
    print(f'{y}→{y + 1}      {lv:+.3f}          {ch_prev.corr(ch_next, method="spearman"):+.3f}')

# 「改善幅ランキング上位 10 県」が翌年も上位 10 に残る数
ch = w.diff(axis=1)
keep = [len(set(ch[y].nsmallest(10).index) & set(ch[y + 1].nsmallest(10).index)) for y in range(2013, 2023)]
print('改善幅の上位10県のうち翌年も上位10に残った県数:', keep)
lv_keep = [len(set(w[y].nsmallest(10).index) & set(w[y + 1].nsmallest(10).index)) for y in range(2013, 2023)]
print('排出量の少ない10県のうち翌年も少ない10県に残った県数:', lv_keep)
📤 実行例(実測) 比べる年度 水準の順位相関 改善幅の順位相関 2014→2015 +0.987 +0.253 2015→2016 +0.988 +0.410 2016→2017 +0.963 +0.310 2017→2018 +0.967 -0.011 2018→2019 +0.975 -0.273 2019→2020 +0.969 +0.235 2020→2021 +0.990 -0.234 2021→2022 +0.988 -0.021 2022→2023 +0.973 -0.209 改善幅の上位10県のうち翌年も上位10に残った県数: [2, 3, 5, 1, 3, 2, 4, 0, 2, 1] 排出量の少ない10県のうち翌年も少ない10県に残った県数: [9, 9, 10, 9, 10, 9, 9, 9, 9, 9]

💬 水準の順位相関は毎年 +0.963〜+0.990 で、ごみの少ない 10 県は翌年も 9〜10 県が入れ替わらずに残ります。一方、ある年の改善幅と翌年の改善幅の順位相関は −0.273〜+0.410 と、正負が年によって入れ替わり、改善幅の上位 10 県で翌年も上位 10 県に残るのは 0〜5 県(10 年の平均 2.3 県)です。改善幅は「その年のたまたまの上下」を多く含むので、1 年の改善幅で表彰すると、翌年の表彰県はほぼ別の県になります。改善幅で評価するなら、3〜5 年の傾き(回帰直線の傾き)を使う、水準と改善幅を併記する、改善幅の不確かさ(過去の年ごとの変動幅)を横に書く、といった工夫が必要です。

🗺 Society 5.0 とデータ駆動社会の位置づけ

日本政府が掲げる Society 5.0 は「サイバー空間とフィジカル空間を高度に融合させた人間中心の社会」と定義され、 データ駆動社会はその技術基盤かつ運営原理です。 段階モデルは以下の通り。

段階特徴主要技術時期
Society 1.0 狩猟自然採集石器~B.C.13000
Society 2.0 農耕定住・分業灌漑・暦~17 世紀
Society 3.0 工業機械化・大量生産蒸気機関・電力~20 世紀
Society 4.0 情報IT・知識社会PC・インターネット1995-2015
Society 5.0 データ駆動サイバー・フィジカル融合IoT/AI/5G/量子2016-

Society 5.0 を実装する OS(オペレーティング・システム)が「データ駆動社会」であり、 SSDSE のようなオープン統計データはそのアプリケーション層の入力データに相当します。

データ駆動型社会 EBPM (政策) Society 5.0 オープンデータ スマートシティ DX (デジタル変革) データリテラシー教育

🔗 隣接手法への橋渡し

データ駆動型社会はオープンデータ・AI 社会論・ガバナンスを束ねる概念。

データ整備 → 公開 → 利活用 → 政策反映 → 効果検証の流れで、 各段でのデータリテラシーと倫理が社会受容性を決める。

🌳 手法選択フロー

データ駆動型社会は公共データ整備、 倫理・プライバシー対応、 意思決定の自動化の三軸で進む。

  1. 公共データの整備は? Yes → オープンデータ、 No → データガバナンス を先に確認
  2. プライバシー・倫理対応は? Yes → プライバシー、 No → AI 倫理 を先に確認
  3. 意思決定の自動化レベルは? Yes → AI、 No → 意思決定支援 を先に確認

行政意思決定なら EBPM、 企業意思決定なら BI、 市民参加なら civic tech、 と「主体と目的」で選ぶ。