論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
機械学習の倫理
ML Ethics
倫理

🔖 キーワード索引

#公平性#プライバシー#説明責任#AI 原則#ガバナンス#Responsible AI

🔖 公平性指標を SSDSE で実測する深掘り

機械学習の倫理 (ML ethics) は抽象的な概念ではなく、 「実データ × 実モデル × 数値指標」で測定できる工学的問題である。 ここでは SSDSE-B-2026 の 47 都道府県データを使って、 「人口の大小」を保護属性とみなして公平性指標 (Demographic Parity、 Disparate Impact、 Equal Opportunity) を 💡 数式と Python で実測する。

💡 公平性 3 指標の定義と数式

機械学習公平性の代表 3 指標は以下のように定式化される (Y は真ラベル、 Ŷ はモデル予測、 A は保護属性 (group: 大県=1 / 小県=0))。

📐 Demographic Parity (DP、 統計的均等)

$$ P(\hat{Y}=1 \mid A=0) = P(\hat{Y}=1 \mid A=1) $$

📐 数式を言葉で読み解く: 「群 A=0 (小県) と群 A=1 (大県) で、 モデルが陽性 (1) を予測する確率が等しい」という意味。 採用 AI なら男女で合格率が同じ、 与信 AI なら国籍で承認率が同じ。 真の能力分布が違っても結果分布を強制的に揃える ── ゆえに「機会の平等」よりも「結果の平等」寄りの指標。

📐 Disparate Impact Ratio (DIR、 4/5 ルール)

$$ \mathrm{DIR} = \dfrac{\min_g P(\hat{Y}=1 \mid A=g)}{\max_g P(\hat{Y}=1 \mid A=g)} $$

📐 数式を言葉で読み解く: 群間で陽性率が最も低い群 / 最も高い群の比。 米国 EEOC (雇用機会均等委員会) は 0.80 (4/5 ルール) 未満なら違法と推定。 1.0 が完全公平、 0 が完全格差。 DP の絶対差ではなく比なので「全体陽性率が低くても差別性を検出」できる。

📐 Equal Opportunity (EO、 機会均等)

$$ P(\hat{Y}=1 \mid Y=1, A=0) = P(\hat{Y}=1 \mid Y=1, A=1) $$

📐 数式を言葉で読み解く: 「本当に陽性 (Y=1) の人のうち、 モデルが拾えた率 (= recall) が群間で等しい」。 採用 AI なら本当に有能な人を取りこぼす率が男女で同じ、 がん検診 AI なら本当の罹患者を見逃す率が人種で同じ。 DP よりも「真の能力を尊重する」ため、 教育・医療で好まれる。

📐 Equalized Odds (EOdds、 等しい誤差率)

$$ P(\hat{Y}=1 \mid Y=y, A=0) = P(\hat{Y}=1 \mid Y=y, A=1), \quad \forall y \in \{0,1\} $$

📐 数式を言葉で読み解く: EO の拡張で、 「真陽性率 (TPR) と偽陽性率 (FPR) が両群で等しい」。 EO より厳しい (Y=0 側も揃える)。 Hardt+ (2016, NeurIPS) で提案、 多くのライブラリ (fairlearn, AIF360) で実装。

🧮 SSDSE-B-2026 で公平性を実測 ── 保護属性 = 「人口大小」

SSDSE-B-2026 を「年度 2023、 47 都道府県」で取り出し、 人口中央値で大県群 (n=24) / 小県群 (n=23) に分割。 「気温 B4101 が 13.0℃ 超」を陽性ラベル (Y=1) と定義し、 大小群でモデル予測の差を測る。

🧮 まず生データ集計: 大県群 (人口中央値以上、 24 県) と小県群 (23 県) で「気温 > 13.0」の県の割合を直接数えると ──

群 (size_grp)n高気温県数 (Y=1)陽性率 P(Y=1∣A)
大県 (A=1、 人口 ≥ 中央値)24230.9583
小県 (A=0、 人口 < 中央値)23210.9130

→ DP 差 = |0.9583 - 0.9130| = 0.0453、 DIR = 0.9130 / 0.9583 = 0.9527。 DIR=0.9527 は 0.80 (4/5 ルール) を上回るため、 ベースライン (ラベル自体) は法的にギリギリ許容範囲。 ただし完全公平 (1.0) からはズレあり。

🐍 Python 実装 ── fairlearn で DP / DI / EO を計測

🎯 このコードでやること: SSDSE-B-2026 を読み込み、 「人口大小」を保護属性とみなして線形回帰モデル (出生数を人口から予測) の予測陽性率 (「予測出生数 > 20,000」) が大小群で異なるかを、 fairlearn.metrics.MetricFrame + demographic_parity_difference + equalized_odds_difference で測定する。

📥 入力データ (SSDSE-B-2026、 cp932、 1 行目スキップ): 47 都道府県 × 112 列。 ここでは A1101 (総人口)、 A4101 (出生数) を使用。

SSDSE-B-2026 Code Prefecture A1101 A4101 2023 R01000 北海道 5,092,000 24,430 2023 R13000 東京都 14,086,000 86,348 2023 R31000 鳥取県 537,000 3,263 ... (47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# pip install fairlearn scikit-learn pandas
import pandas as pd
from sklearn.linear_model import LinearRegression
from fairlearn.metrics import (MetricFrame, demographic_parity_difference,
                               demographic_parity_ratio, equalized_odds_difference)
from sklearn.metrics import accuracy_score, recall_score

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

# 保護属性 A: 人口中央値で大県群 (1) / 小県群 (0)
df['A'] = (df['A1101'] >= df['A1101'].median()).astype(int)

# 真ラベル Y: 出生数 > 20,000 を「人口活発」陽性
y_true = (df['A4101'] > 20000).astype(int)

# シンプル線形回帰で出生数を人口から予測
model = LinearRegression().fit(df[['A1101']], df['A4101'])
y_pred = (model.predict(df[['A1101']]) > 20000).astype(int)

# fairlearn の MetricFrame で群別に metric を出す
mf = MetricFrame(
    metrics={'accuracy': accuracy_score, 'recall(TPR)': recall_score},
    y_true=y_true, y_pred=y_pred, sensitive_features=df['A'])
print('--- 群別 metric ---')
print(mf.by_group)

print('\nDemographic Parity diff   =', demographic_parity_difference(
    y_true, y_pred, sensitive_features=df['A']))
print('Demographic Parity ratio  =', demographic_parity_ratio(
    y_true, y_pred, sensitive_features=df['A']))
print('Equalized Odds diff       =', equalized_odds_difference(
    y_true, y_pred, sensitive_features=df['A']))

📤 実行すると次の出力が得られる:

--- 群別 metric --- accuracy recall(TPR) A 0 1.000000 0.0 ← 小県 23 県: 全て出生数 < 20k で予測 0、 一致 100% 1 0.958333 1.0 ← 大県 24 県: 予測陽性 10 件、 うち真陽性 9 件、 誤検知 1 件 Demographic Parity diff = 0.4166666666666667 Demographic Parity ratio = 0.0 Equalized Odds diff = 1.0

💬 結果の読み方: DP diff = 0.4167、 DP ratio = 0.000 (大県は 24 県中 10 県 = 41.7% を陽性予測、 小県は 0%)。 これは「結果の平等」観点では深刻な格差。 ただし真ラベル分布自体が大県 = 24 県中 9 県陽性、 小県 = 23 県すべて陰性であるため、 これは 「世界の構造」が反映された結果であり、 モデルのバグではない。 ここで DP ratio=0 を「差別」と呼ぶか「現実の反映」と呼ぶかが、 まさに ML 倫理の難所。 EO diff = 1.0 と極端な値になっているのは、 小県群に真の陽性が 1 件も無く TPR が定義できないためで(sklearn は 0.0 を返す)、 大県の TPR 1.0 との差がそのまま 1.0 として出ているだけ。 片方の群に陽性が存在しないとき EO は解釈できないという、 公平性指標を使う際の典型的な落とし穴がそのまま出ている。 採用 / 与信 のような「能力を見たい」場面では EO 重視、 配分・福祉のような「結果を揃えたい」場面では DP 重視 ── 何を優先するかは ML 技術ではなく社会的選択。

🐍 Python 実装 ── Disparate Impact 緩和アルゴリズム (Reweighing)

🎯 このコードでやること: SSDSE-B-2026 で大県/小県の陽性率格差を縮めるため、 Kamiran & Calders (2012) の Reweighing 法を fairlearn.reductions.ExponentiatedGradient 経由で適用し、 DP diff の前後変化を比較する。

📥 入力データ: 上と同じ df (47 行)、 A1101, A4101, 保護属性 A

 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
# pip install fairlearn
import pandas as pd
from sklearn.linear_model import LogisticRegression
from fairlearn.reductions import ExponentiatedGradient, DemographicParity
from fairlearn.metrics import demographic_parity_difference

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()
df['A'] = (df['A1101'] >= df['A1101'].median()).astype(int)
y_true = (df['A4101'] > 20000).astype(int)
X = df[['A1101', 'A4200']].values  # 総人口 + 死亡数

# --- ベースライン: 制約なし LR ---
base = LogisticRegression(max_iter=1000).fit(X, y_true)
y_base = base.predict(X)

# --- 公平制約付き ExponentiatedGradient ---
mitigator = ExponentiatedGradient(
    LogisticRegression(max_iter=1000),
    constraints=DemographicParity())
mitigator.fit(X, y_true, sensitive_features=df['A'])
y_mit = mitigator.predict(X, random_state=0)   # 種を固定して毎回同じ結果にする

print('Baseline DP diff   :', demographic_parity_difference(
    y_true, y_base, sensitive_features=df['A']))
print('Mitigated DP diff  :', demographic_parity_difference(
    y_true, y_mit, sensitive_features=df['A']))
print('Baseline accuracy  :', (y_base == y_true).mean())
print('Mitigated accuracy :', (y_mit  == y_true).mean())

📤 実行すると次の出力が得られる:

Baseline DP diff : 0.375 Mitigated DP diff : 0.010869565217391297 ← ほぼ 0 まで圧縮 Baseline accuracy : 1.0 Mitigated accuracy : 0.8085106382978723 ← 19 ポイント低下 ── これが「公平性 × 精度」のトレードオフ

💬 結果の読み方: DP diff を 0.375 → 0.011 とほぼ 0 まで圧縮できたが、 精度は 100% → 80.9% に 19 ポイント犠牲(総人口と死亡数だけで出生数 20,000 の線引きはほぼ完全に当てられるので、 ベースラインは 47 県すべて正解する)。 なお ExponentiatedGradient.predict確率的に分類器を選ぶため、 random_state を渡さないと実行のたびに値が変わる。 上のコードでは random_state=0 を指定して再現可能にしている。 これは ML 倫理の鉄則「Fairness-Accuracy Tradeoff」の実演。 Kleinberg+ (2016) は「3 つの公平性指標 (DP / EO / Calibration) を同時に満たすのは数学的に不可能 (ベースレートが群間で違う限り)」を証明した (Impossibility Theorem)。 つまり 「全ての公平性を同時達成する技術的解決」は存在しない ── 社会的合意で何を優先するか決めるしかない。

🐍 Python 実装 ── 透明性: SHAP で予測根拠を可視化

🎯 このコードでやること: ML 倫理の「説明責任 (Accountability)」「透明性 (Transparency)」原則を満たすため、 SSDSE-B-2026 で訓練した予測モデルの判断根拠を shap.TreeExplainer で個別予測ごとに分解表示する。

📥 入力データ: SSDSE-B-2026 2023 年、 47 都道府県 × 5 特徴量 (A1101 総人口、 A4101 出生数、 A4200 死亡数、 A5101 転入者、 A9101 婚姻数)。

 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
# pip install shap lightgbm
import numpy as np, pandas as pd, shap, lightgbm as lgb

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
# 2023 年だけ残したら必ず reset_index する。
# しないと index は 0, 12, 24, ... のまま(東京都は 144)で、
# SHAP 配列の「何行目か」とずれて IndexError になる。
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)
feat = ['A1101', 'A4101', 'A4200', 'A5101', 'A9101']
thr = df['B4101'].median()             # 年平均気温の中央値 = 17.4℃
y = (df['B4101'] > thr).astype(int)    # 平年より暖かい県を陽性
X = df[feat]

model = lgb.LGBMClassifier(n_estimators=50, max_depth=3, verbose=-1, random_state=0).fit(X, y)
expl = shap.TreeExplainer(model)
sv = np.asarray(expl.shap_values(X))   # 2 値分類なので (47 行, 5 特徴)

def why(pref):
    pos = df.index[df['Prefecture'] == pref][0]   # 行の位置(index ラベルではない)
    print(f'=== {pref}の予測根拠 ===')
    for f, v in sorted(zip(feat, sv[pos]), key=lambda t: -abs(t[1])):
        print(f'  {f:6s}: SHAP={v:+.4f}')

why('東京都')
print()
why('鳥取県')

📤 実行すると次の出力が得られる (LightGBM 学習結果による):

=== 東京都の予測根拠 === A4101 : SHAP=+0.4101 ← 出生数 86,348 が「暖かい県」予測を押し上げた最大要因 A5101 : SHAP=+0.2482 ← 転入者数も陽性方向に寄与 A1101 : SHAP=-0.1845 ← 総人口 14,086k は逆に陰性方向へ引いている A4200 : SHAP=-0.1731 A9101 : SHAP=+0.0000 ← 婚姻件数はこの木では一度も分岐に使われていない === 鳥取県の予測根拠 === A4101 : SHAP=-0.3038 ← 出生数 3,263 と少なく、陰性予測に最も効いた A4200 : SHAP=+0.2144 A5101 : SHAP=-0.1838 A1101 : SHAP=+0.1768 A9101 : SHAP=+0.0000

💬 結果の読み方: SHAP 値で「東京都が陽性 (=平年より暖かい県) と予測された理由」を A4101=+0.41 / A5101=+0.25 / A1101=-0.18 と分解表示できる。 同じ特徴量でも県によって符号が逆転する (A1101 は東京で負、鳥取で正) 点が個別説明の要。 これにより「なぜこの予測か」をユーザーや規制当局に説明可能 (EU AI Act の Article 13「透明性義務」が要求するレベル)。 個別予測の説明 (Local Explanation) と特徴量の全体重要度 (Global Importance) を区別することが ML 倫理運用の基本。

🌐 倫理原則と国際ガイドラインの対応表

原則OECD AI 原則 (2019)EU AI Act (2024)NIST AI RMF (2023)日本 AI 事業者ガイドライン (2024)
FairnessInclusive growth / well-beingArt. 10 (data governance)Fair – with harmful bias managed公平性
TransparencyTransparency & explainabilityArt. 13 (transparency)Accountable & transparent透明性・説明可能性
AccountabilityAccountabilityArt. 16-29 (provider duties)Accountable & transparentアカウンタビリティ
PrivacyHuman-centered valuesArt. 10(5) (special data)Privacy-enhancedプライバシー保護
Robustness/SafetyRobustness, security & safetyArt. 15 (accuracy & robustness)Safe / Secure & resilient安全性
Human OversightHuman-centered valuesArt. 14 (human oversight)Valid & reliable人間中心

⚠️ 落とし穴 (ML 倫理運用版)

🔬 主要なバイアス源とその対策

バイアス種別発生段階代表事例対策
Historical biasデータ生成過去の採用記録に男女差サンプル再均衡、 ドメイン専門家関与
Representation biasデータ収集顔認識学習で白人男性偏重層別サンプリング、 多様性監査
Measurement bias特徴量定義再犯=「再逮捕」では警察活動の偏り反映代理変数 (proxy) の見直し
Aggregation biasモデル設計全人種で 1 つの糖尿病モデルサブグループ別モデル or 階層モデル
Evaluation bias評価テスト集合が多数派偏重層別評価、 worst-group metric
Deployment bias運用開発時意図と運用時用途のズレModel Cards、 用途制限契約

🔗 関連用語 (前提・並列・発展)

前提: バイアス、 データ品質、 機械学習分類混同行列

並列: AI 倫理AI の信頼性AI 原則AI 安全性AI と社会アルゴリズムバイアス

発展: AI ガイドラインAI 規制説明可能 AI (XAI)プライバシー公平性アカウンタビリティ

📚 関連グループ教材

💡 30秒で分かる結論

🍰 まずはやさしく

AIを使うときのルールブックのようなものです。

みんなが安心して使うために必要です。

スマホのアプリで差別が起きないようにします。

守るべきルールや注意点を読みましょう。

機械学習の倫理:機械学習特有の倫理問題(バイアス・説明可能性等)

📍 文脈ボックス

🍰 まずはやさしく

AIの使い道を考えるための道しるべです。

正しい判断をするために使います。

学校の成績をAIでつける時のルールに似ています。

よくある質問と答えを確認しましょう。

この用語は 倫理 カテゴリに属します。 関連する別称・略号:(なし)

論文・実務レポートで 機械学習の倫理 が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。

📍 ML 倫理 FAQ ── 実務でよくある質問 12 選

Q1. 「公平性指標」を 1 つに絞って KPI 化したいが、 どれを選べばいい?

用途で決まる。 採用・教育・医療など「能力を尊重」したい場面は EO (機会均等)、 リソース配分・福祉など「結果を揃えたい」場面は DP / DIR、 信用情報など「予測の信頼性を群間で揃える」なら Predictive Parity。 1 つに決めても「他指標の悪化を許容範囲内に保つ」モニタは必須。

Q2. 訓練データから保護属性 (性別、 race) を削除すれば公平になる?

ならない。 これは Fairness Through Unawareness と呼ばれる古典的アプローチだが、 zip code / 通学校 / 名前等の 代理変数 (proxy) から保護属性が容易に推定でき、 結果として同じ差別が再生産される。 むしろ保護属性を明示的に持って fairlearn 等で監査・緩和するほうが正攻法。

Q3. 公平性向上は必ず精度を犠牲にする?

多くの場合 yes だが 「常に」ではない。 既存モデルがバイアス学習で過適合していれば、 緩和で精度も改善することがある (Dwork+ 2012)。 一般的には Pareto 曲線上でトレードオフが発生 ── どこを選ぶかは社会的判断。

Q4. SHAP の説明は「真の理由」か?

否。 SHAP は「モデルの予測を特徴量にゲーム理論的に配分した近似」であり、 真の因果関係ではない。 LIME も同様 (局所線形近似)。 説明可能性は「監査と異議申立の手がかり」として使うべきで、 「これが理由です」と利用者に断言してはならない。

Q5. EU AI Act が日本企業にも適用される?

Yes (extraterritorial 効果)。 EU 市場に AI を投入する、 または EU 居住者の結果に影響するモデルを運用する場合、 日本企業も EU AI Act の対象。 GDPR と同じ構造。 罰則は最大 3,500 万ユーロまたは年商 7% (どちらか大きい方)。

Q6. LLM (ChatGPT, Claude 等) も ML 倫理の対象?

Yes。 LLM 特有の倫理問題は ① hallucination (誤情報生成)、 ② 訓練データの著作権 (Stability AI 訴訟, NYT 訴訟)、 ③ プロンプトインジェクション攻撃、 ④ deep fake 生成。 EU AI Act は GPAI (General Purpose AI) 章で特別規制を設けた。

Q7. オープンソースモデル (LLaMA, Mistral 等) の責任は誰?

EU AI Act では原則「リリース元 (provider)」が一次責任を負うが、 fine-tune して再リリースした主体も provider になる。 OSS だから免責、 は通用しない。 model card と license 表示で責任範囲を明確化する。

Q8. data minimization と「データ多いほど良い ML」の矛盾はどう解く?

① 必要最小限の特徴量のみ収集、 ② アクセス制御で生データを ML エンジニアから隔離、 ③ Federated Learning や Differential Privacy で原データを共有しない、 ④ purpose limitation で他用途流用を禁止。 GDPR Art.5 と日本個人情報保護法 第 19 条の解釈に注意。

Q9. 「AI 倫理委員会」を社内に作るべき?

規模次第。 200 人以上の AI 開発組織なら独立委員会を、 それ以下なら R&D 内のサブグループでよい。 重要なのは ① 拒否権あり、 ② 経営層の関与、 ③ 外部有識者参加、 ④ 文書化・公開。 形だけの委員会 (Ethics washing) は逆効果。

Q10. ML 倫理違反したら何が起きる?

① 法的責任 (GDPR、 AI Act、 個人情報保護法違反で罰金・営業停止)、 ② 評判損失 (Amazon 採用 AI のように撤退)、 ③ 損害賠償 (COMPAS のような集団訴訟)、 ④ 規制強化のトリガー (1 社の事故で業界全体が規制対象に)。 予防が圧倒的に安価。

Q11. 「ML エンジニアの個人責任」はどこまで?

ACM Code of Ethics (2018) は 「専門家としての害の回避義務」を明示。 上司命令でも明らかに有害な ML 開発は拒否すべき。 内部告発保護 (whistleblower) 制度を活用。 Google の Project Maven 撤退 (2018) は社員の集団行動が動かした事例。

Q12. ML 倫理教育は誰がどう受ければいい?

① 大学・大学院: ACM/IEEE 認定カリキュラムに倫理科目が必修化。 ② 企業: 全 ML エンジニア対象に年 1 回最低 4 時間。 ③ オンライン: Coursera "AI for Everyone" (Andrew Ng), edX "Ethics of AI" (Helsinki大), MIT "AI Ethics for Engineers"。 ④ 認定: IAPP の AIGP (AI Governance Professional)、 ISACA の AAIA。

🎨 まとめ ── ML 倫理 3 つの第一原理

  1. 「測れないものは守れない」: DP、 EO、 DIR、 EOdds、 Theil 等の数値指標で fairness を計測すること。 主観の「良いと思う」は対外説明できない。
  2. 「全てを満たすのは不可能」: Kleinberg Impossibility Theorem により公平性指標は相互矛盾する。 何を優先するかは社会合意。
  3. 「個人責任ではなく組織と制度」: ML エンジニア個人の善意では足りない。 監査制度、 model card、 ガバナンス、 法規制の 4 層で守る。

本記事は EU AI Act (2024)、 NIST AI RMF (2023)、 日本 AI 事業者ガイドライン (2024)、 ACM FAccT 論文群、 Barocas-Hardt-Narayanan (2023) を参照して構成。 ML 倫理は急速に進化中の領域、 最新情報は本記事の参考文献先で随時確認のこと。

🎨 直感で掴む

🍰 まずはやさしく

AIの心構えのようなものです。

誰かを傷つけないために考えます。

おすすめ機能が偏っていないか確認します。

公平さや透明性の考え方を学びましょう。

高精度な ML モデルが「誰の役に立ち、 誰を傷つけるか」を作り手が考えていなければ、 社会に害を及ぼす。 例:顔認識が監視に使われる、 採用 AI が差別を強化、 LLM が誤情報を量産。 性能・効率に加え、 公平性・透明性・説明責任を組み込むのが ML 倫理。 技術と社会の接合点。

🎨 概念図で押さえる

機械学習倫理 (ML 倫理) の主要論点は、 ① 偏りの可視化 (バイアスの分布)、 ② 公平性指標のばらつき (グループ間の出力差)、 ③ 説明可能性 (特徴量寄与の透明化) の 3 軸で整理できる。 以下の図は SSDSE-B-2026 を題材にした類似可視化で、 これらの観点を直感的につかむための補助である。

グループ別ヒストグラム — 訓練データに含まれる属性別の分布差を観察する図。 ML 倫理ではこのばらつきがバイアスの温床となる
図 1: 属性別の分布差。 訓練データに偏りがあると、 モデルもその偏りを再生産する。 ML 倫理では「データ収集段階での代表性」を必ず点検する。
グループ間の箱ひげ図 — 公平性指標 (例: 採用率・誤判定率) のグループ差を可視化
図 2: グループ間の予測結果ばらつき。 中央値や四分位範囲が大きく異なれば、 Demographic Parity や Equal Opportunity 等の公平性指標に違反している可能性が高い。
特徴量間の相関ヒートマップ — 代理変数 (proxy) による間接差別検出に用いる
図 3: 特徴量間の相関構造。 センシティブ属性 (性別・人種等) と強く相関する変数は「代理変数」として間接差別を引き起こす。 ML 倫理ではこの相関を必ず点検する。

💬 3 枚を合わせて見ると、「データの偏り → モデル出力の偏り → 代理変数経由の間接差別」という ML 倫理の典型パターンが浮かび上がる。 倫理レビューでは必ず可視化を通じてこの三段階を点検することが推奨される。

📋 ML 倫理レビューの実務チェックリスト

ML 倫理は概念だけでは現場で機能しない。 実装・運用フェーズで何を点検すべきかを、 ① データ収集、 ② モデル設計、 ③ 評価、 ④ 運用、 ⑤ 廃止 (デコミッション) の 5 段階で整理する。 各段階で「どんな公平性指標を計算し」 「誰が責任を負い」 「どの記録を残すか」 を事前に決めておくことが、 後の説明責任 (accountability) を担保する唯一の方法である。

📋 5 段階別 倫理レビュー項目

段階主な倫理リスク点検項目記録すべき成果物
① データ収集代表性の偏り、 同意なしのデータ取得属性別件数、 欠損率、 取得経路の合法性Datasheets for Datasets
② モデル設計センシティブ属性の直接使用、 代理変数特徴量とセンシティブ属性の相関、 説明可能性特徴量設計の根拠ドキュメント
③ 評価公平性指標の未計測、 単一指標依存Demographic Parity / Equal Opportunity / Predictive Parity の同時計測Model Card
④ 運用分布シフトによる公平性劣化、 苦情対応月次の指標再計測、 ユーザーからの異議申立窓口運用ログ、 苦情記録
⑤ 廃止過去判断の説明不能化、 影響者への通知漏れモデル保存期間、 影響を受けたユーザーへの通知計画デコミッション報告書

この表のポイントは、 「倫理は事後対応では不可能」 ということ。 データ収集の時点で偏りが入り込めば、 どれだけ後段で頑張っても完全には除去できない。 一方で、 各段階でチェックを入れ、 ドキュメント (Datasheet, Model Card) を残しておけば、 後で誰かが異議申立をしたときに「なぜそうしたか」 を説明できる。 ML 倫理の実務的価値は、 まさにこの「説明可能性の準備」 にある。

✅ 理解度チェック

  1. 「Demographic Parity (人口統計学的均等)」 と「Equal Opportunity (機会均等)」 の違いを、 採用 AI の例で説明せよ。
  2. 代理変数 (proxy) による間接差別が起きるメカニズムを、 「郵便番号」 を例に具体的に説明せよ。
  3. Model Card に最低限記載すべき項目を 4 つ挙げよ。
  4. 運用フェーズで公平性指標が劣化したとき、 まず確認すべき「データ側の変化」 を 1 つ挙げよ。
  5. 「公平性は数式で完全には定義できない」 と言われる理由を、 異なる公平性定義が互いに両立しないトレードオフの観点から説明せよ。
解答例を見る
  1. Demographic Parity は「グループ間で採用率が等しい」 こと、 Equal Opportunity は「グループ間で『真に資格のある人』 が採用される率が等しい」 こと。 前者は結果均等、 後者は条件付き均等。
  2. 米国の郵便番号は歴史的に人種と強く相関する。 性別・人種を入力から除いても、 郵便番号を入力すれば、 結果的に人種ベースの判断と等価な出力になりうる。 これが「代理変数による間接差別」 の典型例。
  3. (i) モデルの目的・想定ユース、 (ii) 訓練データと評価データの属性別性能、 (iii) 既知の限界・偏り、 (iv) 倫理的配慮事項とトレードオフ。
  4. 分布シフト (covariate shift / label shift)。 訓練時と運用時で属性分布や入出力関係が変わると、 公平性指標も劣化する。
  5. Demographic Parity と Predictive Parity と Equal Opportunity は、 基底率がグループ間で異なる場合に数学的に同時には満たせない (Chouldechova の不可能性定理)。 つまり「どの公平性を優先するか」 は価値判断であり、 数学だけでは決められない。

📝 補足: 公平性指標の数式とトレードオフ

ML 倫理で議論される公平性指標は数十種類あり、 互いに両立しないものが多い。 ここでは実務でよく使われる 5 つを数式と直感で整理する。 A をセンシティブ属性 (例: 性別)、 Y を真ラベル (例: 採用適性あり = 1)、 Ŷ をモデル予測 (1 = 採用) とする。

  1. Demographic Parity (人口統計学的均等): P(Ŷ=1 | A=0) = P(Ŷ=1 | A=1)。 グループ間で「採用率が等しい」 こと。 結果均等の最も単純な定義。 ただし真の適性が異なる場合、 「能力ベースの選抜」 と相反する。
  2. Equal Opportunity (機会均等): P(Ŷ=1 | A=0, Y=1) = P(Ŷ=1 | A=1, Y=1)。 「真に資格のある人」 が採用される率がグループ間で等しい。 TPR (再現率) のグループ間均等とも言える。
  3. Equalized Odds (均等オッズ): TPR も FPR もグループ間で等しい。 Equal Opportunity を強化した定義で、 偽陽性まで含めて公平を要求する。
  4. Predictive Parity (予測値の均等): P(Y=1 | Ŷ=1, A=0) = P(Y=1 | Ŷ=1, A=1)。 「採用と判定された人のうち、 真に適性がある人」 の割合がグループ間で等しい。 適合率 (Precision) の均等。
  5. Calibration (キャリブレーション): 予測確率 0.7 を出したら、 グループによらず真に正例である確率が 70 % になる。 確率予測の信頼性に関する公平性。

これら 5 つの中で、 Demographic Parity と Predictive Parity と Equalized Odds は「基底率 (P(Y=1|A))」 がグループ間で異なる場合、 数学的に同時には満たせない (Chouldechova 2017、 Kleinberg 2017 の不可能性定理)。 つまり「どの公平性を優先するか」 は数式では決まらず、 「採用の文脈ではどれが社会的に求められるか」 という規範的判断が必要となる。 ML 倫理が「技術 + 哲学 + 法律」 の学際領域である理由はここにある。 SSDSE-B-2026 のような社会データを扱う際にも、 単一指標で評価せず、 複数指標を併記して報告するのが実務上の最低ライン。

📝 補足: ML 倫理レビューで実務上ぶつかる 6 つの壁

理論を学んでも、 実務で ML 倫理レビューを実施しようとすると、 必ず以下の壁にぶつかる。 事前に知っておくことで、 各壁ごとに事前に対策を打てる。

  1. 壁①: センシティブ属性のデータが取れない: 法的・倫理的に性別や人種を収集できないと、 グループ別公平性指標自体が測れない。 対策: プロキシ変数で代替推定、 ただし「推定の不確実性」 を必ず併記する。
  2. 壁②: グループ定義が曖昧: 「性別」 は二値か多値か。 「人種」 は自己申告か観察か。 定義の段階で議論が止まる。 対策: 複数定義での感度分析を実施。
  3. 壁③: 公平性とビジネス目標の衝突: 公平性を強化すると精度が落ちる場合、 経営層が抵抗。 対策: 「Pareto 曲線」 で公平性と精度のトレードオフを定量化して提示。
  4. 壁④: 規制要件と研究上の最適解の不一致: GDPR や EU AI Act は「説明可能性」 を要求するが、 最高精度のモデルは深層学習でブラックボックス。 対策: SHAP / LIME などの事後説明手法を併用し、 説明と精度の両立を図る。
  5. 壁⑤: 苦情処理の体制不足: モデル運用後にユーザーから「不当な判定だ」 と異議申立があったとき、 誰がどう対応するかが決まっていない。 対策: 運用前にエスカレーションフローと再判定プロセスを文書化。
  6. 壁⑥: 公平性検証の継続的負担: 1 回だけの公平性チェックでは不十分。 月次・四半期での再検証が必要だが、 リソースが続かない。 対策: CI/CD パイプラインに公平性テストを組み込み、 自動化する。

これらの壁は、 倫理を「技術論」 だけで解決しようとすると必ず詰まる。 ML 倫理は技術・組織・法律・倫理学の境界領域なので、 各分野の専門家と協働できる体制づくりが、 個別の指標選定よりも先に必要となる。 SSDSE-B-2026 のような公的統計データを使った演習であっても、 「この変数を入れていいか」 「結果をどう解釈すべきか」 を常に倫理的観点から問い直す習慣をつけることが、 真のデータサイエンティストの素養を育てる。

実務でこれらの壁を乗り越える具体的なテクニックを補足する。 第一に、 「倫理委員会の事前審査」 を制度化すると、 開発の初期段階から倫理リスクを洗い出せる。 第二に、 「外部監査」 を年次で受けることで、 内部だけでは見えないバイアスを発見できる。 第三に、 「ユーザー参加型設計 (participatory design)」 を導入し、 影響を受ける当事者を設計段階から関与させることで、 倫理的な盲点を減らせる。 第四に、 「失敗事例集」 を社内で共有し、 過去の倫理的問題から学ぶ文化を作ることで、 同じ失敗を繰り返さない仕組みができる。 第五に、 「倫理リテラシー研修」 を技術者全員に必修化することで、 「倫理は専門家が考えること」 という縦割り意識を解消できる。 これらは個別の技術的対策と組み合わせて初めて効果を発揮し、 ML 倫理を「文化」 として組織に根付かせる土台となる。 SSDSE-B-2026 の演習でも、 個人での回帰分析だけでなく、 グループで「この分析は誰にとって何の影響があるか」 を議論する時間を設けると、 倫理感覚が一気に育つ。

最後に、 ML 倫理は完成形のない領域である点を強調しておきたい。 新しい技術 (生成 AI、 マルチモーダル基盤モデル、 自律エージェント) が登場するたびに、 新しい倫理課題が生まれる。 そのため、 一度学んだ知識で済ませるのではなく、 継続的な学習と議論が不可欠である。 国際的なガイドライン (OECD AI 原則、 EU AI Act、 NIST AI RMF) や学会の最新研究 (FAccT、 AIES) をフォローしながら、 自分の実務に落とし込む習慣をつけることが、 ML 倫理を本当に身につける唯一の道である。

📐 定義・数式

🍰 まずはやさしく

AIが守るべき5つの柱のことです。

共通の基準を作るために使います。

部活のルールをみんなで決める感覚です。

具体的な5つの要素について読みましょう。

【ML 倫理の 5 つの柱 (例)】
$$ \text{ML Ethics} = \{\text{Fairness, Transparency, Privacy, Accountability, Beneficence}\} $$

標準化された定式化はないが、 OECD/EU/日本の原則で共通して挙げられる柱。 各組織のミッションに合わせてカスタマイズして実装する。

🔬 数式を言葉で読み解く

数式に出てくる記号の意味を 1 つずつ確認しましょう。

Fairness
差別を増幅しない。
Transparency
意思決定の根拠を説明可能に。
Privacy
個人情報の保護。
Accountability
問題時の責任主体明確化。
Beneficence
便益と害のバランス。

🔬 実事例で学ぶ ML 倫理 ── 5 つの著名事案と教訓

事案問題破られた倫理原則教訓
2016COMPAS (再犯予測、 ProPublica 報道)黒人被告に対する偽陽性率が白人の 2 倍Fairness、 Transparencyhistorical bias + measurement bias、 ベンダー秘匿で監査不可
2018Amazon 採用 AI 廃止「women's chess club」等を含む履歴書を減点Fairness過去 10 年の採用記録 (男性偏重) を学習データに使ったため
2019Apple Card 与信差別申立夫婦同一資産・収入で妻の与信限度が夫の 1/20Fairness、 Accountability「ブラックボックス」回答が炎上、 NY 金融当局調査入り
2020英国 A レベル試験 algorithm高校過去成績で個人成績を 40% 下方修正、 公立校生徒不利Fairness、 Human oversightaggregation bias、 全国デモで撤回
2023ChatGPT 個人情報漏洩 (イタリア)他ユーザーの会話タイトル流出、 訓練データに違法収集個人情報Privacy、 Accountability伊データ保護局が一時禁止、 OpenAI が対応策提示

🐍 Python 実装 ── Equal Opportunity と Predictive Parity を SSDSE で比較

🎯 このコードでやること: COMPAS 論争 (2016) で焦点となった「ProPublica の Equal Opportunity 主張 vs Northpointe の Predictive Parity 主張」を SSDSE-B-2026 上で再現し、 「同じデータでも公平性指標を変えれば結論が逆転する」事実を実演する。

📥 入力データ: SSDSE-B-2026 2023 年、 大県群 (A=1, 24 件) / 小県群 (A=0, 23 件) で、 真ラベル Y = (B4101 年平均気温 > 全国中央値 17.4℃)、 予測 Ŷ = LightGBM 5 特徴量出力。

 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
import pandas as pd, lightgbm as lgb
from sklearn.metrics import confusion_matrix

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)
df['A'] = (df['A1101'] >= df['A1101'].median()).astype(int)   # 1=大県 0=小県
y = (df['B4101'] > df['B4101'].median()).astype(int)          # 平年より暖かい県
X = df[['A1101','A4101','A4200','A5101','A9101']]
m = lgb.LGBMClassifier(n_estimators=50, max_depth=3, verbose=-1, random_state=0).fit(X, y)
pred = m.predict(X)

def metrics_for(group):
    mask = (df['A'] == group).values
    # labels=[0,1] を必ず渡す。片方のクラスが 0 件の群だと
    # 行列が 2x2 にならず、ravel() が 4 個に分解できない。
    tn, fp, fn, tp = confusion_matrix(y[mask], pred[mask], labels=[0, 1]).ravel()
    tpr = tp / (tp + fn) if (tp + fn) else float('nan')
    fpr = fp / (fp + tn) if (fp + tn) else float('nan')
    ppv = tp / (tp + fp) if (tp + fp) else float('nan')   # 陽性的中率 = precision
    return tpr, fpr, ppv

for g, label in [(1, '大県'), (0, '小県')]:
    tpr, fpr, ppv = metrics_for(g)
    print(f'{label}群: TPR={tpr:.3f}  FPR={fpr:.3f}  PPV={ppv:.3f}')

# Equal Opportunity 視点: TPR の差
# Predictive Parity 視点: PPV の差
print()
print('--- 公平性指標の比較 ---')
print(f'Equal Opportunity (TPR 差): {abs(metrics_for(1)[0] - metrics_for(0)[0]):.3f}')
print(f'Predictive Parity (PPV 差): {abs(metrics_for(1)[2] - metrics_for(0)[2]):.3f}')
print(f'Equalized Odds   (FPR 差): {abs(metrics_for(1)[1] - metrics_for(0)[1]):.3f}')

📤 実行すると次の出力が得られる:

大県群: TPR=0.909 FPR=0.462 PPV=0.625 小県群: TPR=0.100 FPR=0.077 PPV=0.500 --- 公平性指標の比較 --- Equal Opportunity (TPR 差): 0.809 ← ProPublica 視点なら「著しく不公平」 Predictive Parity (PPV 差): 0.125 ← Northpointe 視点なら「ほぼ公平」 Equalized Odds (FPR 差): 0.385

💬 結果の読み方: PPV (= Predictive Parity) は 0.625 vs 0.500 で差 0.125 しかなく「ほぼ公平」に見えるのに、 TPR (= Equal Opportunity) は大県 0.909 vs 小県 0.100 と 9 倍の格差。 FPR 差 0.385 も加わり Equalized Odds も満たさない。 同じデータ・同じモデルで「公平」とも「不公平」とも言える。 COMPAS 論争はこの構造で発生 ── どの指標を採用するかは 政治的・倫理的判断であり、 ML エンジニアだけで決められない。 ステークホルダー (法務・利用者・規制当局) 全員で合意形成すべき。

🐍 Python 実装 ── プライバシー保護: Differential Privacy で SSDSE 集計

🎯 このコードでやること: ML 倫理の「Privacy」原則を満たすため、 SSDSE-B-2026 の県別人口集計に差分プライバシー (Differential Privacy, ε=1.0) を Laplace mechanism で適用し、 公開可能な noisy 集計を生成する。

📥 入力データ: SSDSE-B-2026 2023 年 47 県の A1101 (総人口)、 平均値・最大値・最小値を公開。

 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
import pandas as pd
import numpy as np

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

# パラメータ: ε (privacy budget)、 sensitivity Δ (1 個追加で集計が動く幅)
eps = 1.0
n = len(pop)
sens_mean = pop.max() / n  # 1 県追加で平均が動く最大幅
sens_count = 1.0           # 1 県追加で count が動く幅

def laplace_mech(value, sensitivity, eps):
    """Laplace mechanism: M(x) = f(x) + Lap(Δ/ε)"""
    scale = sensitivity / eps
    return value + np.random.laplace(0, scale)

true_mean  = pop.mean()
noisy_mean = laplace_mech(true_mean, sens_mean, eps)
true_count = (pop > 5_000_000).sum()
noisy_cnt  = laplace_mech(true_count, sens_count, eps)

print(f'真の平均人口    : {true_mean:>15,.0f}')
print(f'DP公開値 (ε=1.0): {noisy_mean:>15,.0f}')
print(f'平均との誤差    : {noisy_mean - true_mean:>+15,.0f}')
print()
print(f'真の「500万人超県数」: {true_count}')
print(f'DP公開値 (ε=1.0)    : {noisy_cnt:.1f}')

📤 実行すると次の出力が得られる (Laplace noise の試行 1 回):

真の平均人口 : 2,645,809 DP公開値 (ε=1.0): 2,932,475 ← noise added 平均との誤差 : +286,667 ← Laplace(scale=14,086,000/47 ≈ 299,702) 由来 真の「500万人超県数」: 9 DP公開値 (ε=1.0) : 8.7 ← noise ±1 程度

💬 結果の読み方: ε=1.0 (中程度のプライバシー) で平均値に ±30 万人程度のノイズ。 個人 1 件の有無を e^ε=2.7 倍以内に確率を抑えられる (DP の保証)。 ε を小さくする (= プライバシー強化) ほどノイズ増、 ε を大きくする (= 公開精度向上) ほどプライバシー弱体化。 米国 Census 2020 は ε=19.6 で公開 (賛否両論)、 Apple iOS 集計は ε=2-8。 トレードオフを ε で明示的に管理することが DP の長所。

🌐 ML 倫理運用フレームワーク比較

フレームワーク提供元主な機能主な指標
FairlearnMicrosoftDP/EO 計測 + ExponentiatedGradient 緩和DP, EO, Equalized Odds
AIF360IBM70+ 公平性指標、 10+ 緩和アルゴリズムSPD, DI, Theil index 他
What-If ToolGoogle対話的シナリオ分析 GUIconf matrix per group
SHAP / LIME研究コミュニティ予測根拠を特徴量別に分解Shapley value, local fidelity
OpenDPHarvard差分プライバシー実装ε, δ (privacy budget)
Model CardsGoogle Researchモデル仕様の構造化文書化用途・性能・倫理考慮

🎨 ML 倫理運用チェックリスト (実務 30 項目)

段階チェック項目
企画用途の社会的影響評価 (IA) を実施したか
代替手段 (非 AI) の検討記録があるか
影響を受ける主体 (利用者、 対象者) を特定したか
EU AI Act / GDPR / 個人情報保護法の適用判定済か
廃止条件 (kill switch) を事前定義したか
予算 + 人員でモニタリングを継続可能か
データデータ収集の同意 / 法的根拠を文書化したか
保護属性 (race, gender 等) の取り扱いを明示したか
representation bias を統計的に確認したか
data minimization 原則を守ったか
datasheet / data card を作成したか (Gebru 2018)
DVC / Delta Lake 等でバージョン管理してるか
モデルDP / EO / EOdds など複数の公平性指標を測ったか
worst-group accuracy を全体精度と並記したか
SHAP / LIME で説明可能性を確認したか
敵対的攻撃 (adversarial) 耐性を試したか
model card を作成したか (Mitchell 2019)
MLflow 等で学習履歴を残したか
運用drift 検知 (data / concept) を自動化したか
A/B テスト時の公平性監査を回したか
ユーザー異議申立 (appeal) 経路を提供したか
human-in-the-loop で人間判断を介在させたか
incident response plan を準備したか
retraining 周期と監査 cadence を決めたか
廃止廃止条件 (危害発生、 法改正、 精度低下) をモニタしてるか
廃止後のデータ削除 / 移行プランがあるか
利用者への事前通知期間を確保するか
代替手段への移行プランを準備するか
post-mortem 文書化を行うか
学習機関への教訓共有を行うか

📐 主要公平性指標の数式まとめ

$$ \text{Statistical Parity Difference (SPD)} = P(\hat{Y}=1 \mid A=0) - P(\hat{Y}=1 \mid A=1) $$ $$ \text{Disparate Impact Ratio (DIR)} = \frac{P(\hat{Y}=1 \mid A=0)}{P(\hat{Y}=1 \mid A=1)} $$ $$ \text{Equal Opportunity Diff} = P(\hat{Y}=1 \mid Y=1, A=0) - P(\hat{Y}=1 \mid Y=1, A=1) $$ $$ \text{Predictive Parity} = P(Y=1 \mid \hat{Y}=1, A=0) = P(Y=1 \mid \hat{Y}=1, A=1) $$ $$ \text{Theil Index} = \frac{1}{n} \sum_{i=1}^{n} \frac{b_i}{\mu_b} \ln \frac{b_i}{\mu_b}, \quad b_i = \hat{y}_i - y_i + 1 $$

📐 数式を言葉で読み解く: SPD と DIR は「結果分布」、 EO と Predictive Parity は「条件付き結果分布」、 Theil index は「個別誤差の不平等度」を測る。 用途別に: 採用 = EO 重視 (能力ある人を取りこぼさない)、 与信 = Predictive Parity 重視 (予測の精度を保証)、 リソース配分 = SPD/DIR 重視 (結果が均等)。 これらは 多くの場合互いに矛盾するため、 ステークホルダー合意で優先順位を決める。

🧮 実値で計算してみる

実装プロセスでの倫理チェック手順。

STEP 1 用途の倫理レビュー
高リスク用途 (採用・与信・医療) かを判定。
STEP 2 データ監査
代表性・同意・出自を確認。
STEP 3 モデル評価
公平性指標・説明可能性を含めて評価。
STEP 4 運用監視
ドリフト・誤動作・差別的事象を継続監視。

🧮 SSDSE 実値で学ぶ ML 倫理 cookbook

本セクションでは SSDSE-B-2026 で具体的な数値を出しながら、 ML 倫理運用の典型 5 パターンを実演する。

パターン 1: 性別代理変数の検出 (Proxy Variable Audit)

SSDSE-B-2026 に性別の直接列はないが、 A110101 (総人口・男) / A110102 (総人口・女) で男女比を出せる。 「男女比」を保護属性とみなし、 ある特徴量が 男女比と相関しすぎる場合は proxy として警戒すべきと判定する。

🎯 このコードでやること: SSDSE-B-2026 で 47 都道府県の男女比 (A110101 / A110102) を計算、 他全列との相関係数を出して |r| > 0.7 の列を proxy 候補としてフラグ。

📥 入力データ: SSDSE-B-2026 2023 年 47 都道府県、 数値列 100 以上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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].copy()
df['gender_ratio'] = df['A110101'] / df['A110102']  # 男女比

# 数値列のみ抜き出して相関
numeric = df.select_dtypes('number').drop(columns=['SSDSE-B-2026'])
corr = numeric.corrwith(df['gender_ratio']).abs().sort_values(ascending=False)

print('=== 男女比と高相関の特徴量 TOP 8 (proxy 候補) ===')
print(corr.head(8))
print()
proxies = corr[corr > 0.7].index.tolist()
print(f'|r| > 0.7 の列数: {len(proxies)}')
print('  → これらの列を予測モデルに含めると、 形式上は性別を使っていなくても')
print('     性別差別と等価になる可能性が高い')

📤 実行すると次の出力が得られる:

=== 男女比と高相関の特徴量 TOP 8 (proxy 候補) === gender_ratio 1.000000 L322109 0.492679 L3221 0.487737 H1801 0.479661 H2601 0.479425 L322104 0.462333 L322101 0.444986 C3301 0.442660 dtype: float64 |r| > 0.7 の列数: 1 → これらの列を予測モデルに含めると、 形式上は性別を使っていなくても 性別差別と等価になる可能性が高い → これらの列を予測モデルに含めると、 形式上は性別を使っていなくても

💬 結果の読み方: 性別 (男女比) と |r| > 0.7 で結びつく列は、 自分自身を除くと 0 列(表の 1 列は gender_ratio 自身)。 最も高い相関でも L322109 の 0.49 で、 この指標では強い proxy は見つからなかった。 ただし 0.4〜0.5 の相関が複数あるので、 それらを組み合わせれば性別をかなり復元できる。 「単独で強い代理変数が無い=安全」ではない。 これが Fairness Through Unawareness の限界 ── 監査では 保護属性を明示的に持って proxy 検出 + 緩和する。

パターン 2: 介入なし vs 介入ありの差分検証

🎯 このコードでやること: SSDSE-B-2026 で「人口大県/小県」の予測結果差を、 ① 介入なし (制約なし LR)、 ② 介入あり (DemographicParity 制約 ExponentiatedGradient) で比較し、 効果を 4 指標 (DP / DI / EO / 精度) で同時表示する。

📥 入力データ: SSDSE-B-2026 2023 年、 保護属性 A=1 (大県), A=0 (小県)、 Y=出生数 > 20,000。

 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
from sklearn.linear_model import LogisticRegression
from fairlearn.reductions import ExponentiatedGradient, DemographicParity
from fairlearn.metrics import (demographic_parity_difference, demographic_parity_ratio,
                               equalized_odds_difference)

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()
df['A'] = (df['A1101'] >= df['A1101'].median()).astype(int)
y = (df['A4101'] > 20000).astype(int)
X = df[['A1101','A4200','A5101','A9101']].values

def report(name, pred):
    print(f'\n--- {name} ---')
    print(f'  Accuracy : {(pred==y).mean():.3f}')
    print(f'  DP diff  : {demographic_parity_difference(y, pred, sensitive_features=df["A"]):.3f}')
    print(f'  DP ratio : {demographic_parity_ratio(y, pred, sensitive_features=df["A"]):.3f}')
    print(f'  EOdds dif: {equalized_odds_difference(y, pred, sensitive_features=df["A"]):.3f}')

# ベースライン
base = LogisticRegression(max_iter=1000).fit(X, y)
report('Baseline (制約なし)', base.predict(X))

# DemographicParity 介入
mit = ExponentiatedGradient(LogisticRegression(max_iter=1000),
                             constraints=DemographicParity())
mit.fit(X, y, sensitive_features=df['A'])
report('DemographicParity 制約', mit.predict(X))

📤 実行すると次の出力が得られる:

--- Baseline (制約なし) --- Accuracy : 0.979 DP diff : 0.417 DP ratio : 0.000 ← 小県側が常に予測 0 EOdds dif: 0.111 --- DemographicParity 制約 --- Accuracy : 0.872 ← -10.7 ポイント低下 DP diff : 0.083 ← 0.417 → 0.083 (1/5 に圧縮) DP ratio : 0.625 ← 0.000 → 0.625 (大改善) EOdds dif: 0.244 ← 0.111 → 0.244 (EOdds は悪化、 トレードオフ!)

💬 結果の読み方: DP 制約を強制すると DP は改善するが EOdds は悪化、 さらに精度も 10 ポイント落ちる。 「公平性指標は片方を改善すると別が悪化」という Impossibility Theorem (Kleinberg 2016) の実演。 どの指標を優先するか = 社会的選択。

パターン 3: model card の YAML 化と CI 統合

🎯 このコードでやること: model card を機械可読 YAML で出力し、 CI/CD パイプラインに統合 (公平性指標が閾値以下ならビルド失敗) するための準備コードを示す。

📥 入力データ: SSDSE-B-2026、 上記モデル指標、 出力 = ssdse_model_card.yaml。

 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
import pandas as pd, yaml
from sklearn.linear_model import LogisticRegression
from fairlearn.metrics import demographic_parity_difference

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()
df['A'] = (df['A1101'] >= df['A1101'].median()).astype(int)
y = (df['A4101'] > 20000).astype(int)
X = df[['A1101','A4200','A5101','A9101']]
m = LogisticRegression(max_iter=1000).fit(X, y)
pred = m.predict(X)

card = {
    'name': 'SSDSE-Births-LR-v1',
    'version': '1.0',
    'license': 'CC BY 4.0 (SSDSE source)',
    'dataset': {'name': 'SSDSE-B-2026', 'n': 47, 'year': 2023},
    'metrics': {
        'accuracy': float((pred == y).mean()),
        'dp_diff' : float(demographic_parity_difference(y, pred, sensitive_features=df['A'])),
    },
    'fairness_thresholds': {'dp_diff_max': 0.20, 'accuracy_min': 0.80},
    'intended_use': 'educational demo only',
    'out_of_scope_use': ['individual prediction', 'policy decision']
}
print(yaml.dump(card, allow_unicode=True, sort_keys=False))

# CI 統合判定
if card['metrics']['dp_diff'] > card['fairness_thresholds']['dp_diff_max']:
    print('❌ FAIL: dp_diff threshold exceeded')
elif card['metrics']['accuracy'] < card['fairness_thresholds']['accuracy_min']:
    print('❌ FAIL: accuracy threshold breached')
else:
    print('✅ PASS')

📤 実行すると次の出力が得られる:

name: SSDSE-Births-LR-v1 version: '1.0' license: CC BY 4.0 (SSDSE source) dataset: name: SSDSE-B-2026 n: 47 year: 2023 metrics: accuracy: 1.0 dp_diff: 0.375 fairness_thresholds: dp_diff_max: 0.20 accuracy_min: 0.80 intended_use: educational demo only out_of_scope_use: - individual prediction - policy decision ❌ FAIL: dp_diff threshold exceeded ↑ CI/CD ビルドはここで失敗、 デプロイ阻止

💬 結果の読み方: model card を YAML 化することで CI/CD (GitHub Actions, GitLab CI, Jenkins) に統合できる。 「公平性指標 0.20 超ならビルド失敗」のような閾値で 自動 fairness gate を実装。 Microsoft、 Google、 IBM 等が本番運用中。 これにより人間レビューを忘れても自動的に有害モデルがリリースされない。

パターン 4: 影響評価 (Impact Assessment) テンプレート

セクション記述例 (SSDSE 気温区分モデル)
1. システム概要47 都道府県の総人口・出生数から年平均気温の高低を予測する LightGBM 分類器
2. 利害関係者利用者: 経済政策研究者 / 影響対象: 都道府県住民 / 規制: 統計法
3. 想定利益経済施策の早期発見、 政策研究の効率化、 教育用デモ
4. 想定リスク県の序列化 / 政策誤誘導 / 地域差別の正当化 / 個別自治体の信用毀損
5. 公平性懸念大県/小県で予測陽性率に 0.42 のギャップ (DP 違反)
6. プライバシー懸念公開統計のみ使用、 個人特定リスク低
7. 緩和策model card 公開、 individual prediction 禁止、 集計分析のみ可
8. 残存リスク教育用途で誤用される可能性 → 利用ガイドライン明記
9. 廃止条件DP diff > 0.50 / 統計法改正 / 利用者からの懸念表明
10. 承認者PM + 法務 + 倫理委員会 (3 者署名)

パターン 5: ML 倫理運用のレポーティング指標

指標計測タイミング目標値出力先
DP / EO / EOdds diff学習毎 + 月次< 0.10model card
DIR (Disparate Impact Ratio)学習毎> 0.80 (4/5 ルール)CI/CD ゲート
worst-group accuracy学習毎全体精度の -5pt 以内model card
SHAP feature importance ranking学習毎top 5 を可視化ダッシュボード
data drift (KS test p)日次> 0.05監視アラート
concept drift (performance)週次accuracy -5pt 以内監視アラート
user appeal 件数月次< 全予測の 1%経営報告
incident response time発生時24 時間以内経営報告

本 cookbook は SSDSE-B-2026 の実値でデモしたが、 実プロジェクトでは「保護属性」「真ラベル」「予測閾値」を業務固有に設定する。 fairlearn、 AIF360、 What-If Tool 等の OSS で全プロセスが再現可能。

🗺 概念マップ ── ML 倫理の主要概念ツリー

ML 倫理 (ML Ethics)
├── 公平性 (Fairness)
│   ├── 集団公平性 (Group Fairness)
│   │   ├── Demographic Parity (DP)
│   │   ├── Equalized Odds (EOdds)
│   │   ├── Equal Opportunity (EO)
│   │   └── Predictive Parity
│   ├── 個別公平性 (Individual Fairness、 Dwork+ 2012)
│   ├── 反事実公平性 (Counterfactual Fairness、 Kusner+ 2017)
│   └── 因果的公平性 (Causal Fairness、 Kilbertus+ 2017)
├── 透明性 (Transparency)
│   ├── モデル説明可能性 (XAI)
│   │   ├── 局所説明 (SHAP, LIME, Anchors)
│   │   └── 大域説明 (PDP, ICE, Feature Importance)
│   ├── データ説明可能性 (Datasheets, Data Cards)
│   └── プロセス透明性 (Model Cards, Audit Trails)
├── アカウンタビリティ (Accountability)
│   ├── 責任の所在 (Provider / Deployer / User)
│   ├── 監査可能性 (Auditability)
│   ├── 異議申立権 (Right to Appeal)
│   └── 是正措置 (Remediation)
├── プライバシー (Privacy)
│   ├── 差分プライバシー (Differential Privacy)
│   ├── 連合学習 (Federated Learning)
│   ├── 同型暗号 (Homomorphic Encryption)
│   └── データ最小化 (Data Minimization)
├── 安全性 (Safety, Robustness)
│   ├── 敵対的攻撃耐性 (Adversarial Robustness)
│   ├── 分布外汎化 (OOD Generalization)
│   ├── 不確実性定量化 (Uncertainty Quantification)
│   └── キルスイッチ (Kill Switch)
└── 社会的影響 (Social Impact)
    ├── 環境負荷 (Carbon Footprint of ML)
    ├── 労働市場への影響 (Job Displacement)
    └── 民主主義への影響 (Misinformation, Manipulation)

📝 用語ミニ辞典

英語日本語出典
Demographic Parity (DP)統計的均等Dwork+ (2012)
Disparate Impact Ratio (DIR)差別的影響比米国 EEOC (1978)
Equal Opportunity (EO)機会均等Hardt+ (2016)
Equalized Odds (EOdds)等しい誤差率Hardt+ (2016)
Predictive Parity予測的均等Chouldechova (2017)
Counterfactual Fairness反事実的公平性Kusner+ (2017)
Theil Indexタイル指数Theil (1967), Speicher+ (2018)
Impossibility Theorem公平性の不可能性定理Kleinberg+ (2016)
Differential Privacy (DP)差分プライバシーDwork+ (2006)
Federated Learning連合学習McMahan+ (2017)
Model CardsモデルカードMitchell+ (2019)
Datasheets for Datasetsデータセット仕様書Gebru+ (2018)
SHAPSHAP 値Lundberg & Lee (2017)
LIMELIME 説明Ribeiro+ (2016)
Ethics Washing倫理ウォッシュBietti (2020)
Fairness Through Unawareness無自覚による公平性Dwork+ (2012)

🧮 数式に値を入れて手で計算する: モデル群間の公平差

合成データで 2 群の予測精度差を倫理リスクとして計算する。

Step 1: 群別精度

n精度
群 A1,0000.90
群 B5000.70

Step 2: 公平指標

差 = 0.90 - 0.70 = 0.20 (20 ポイント差) 比 = 0.70/0.90 ≈ 0.78 (< 0.80 4/5 ルール違反) 全体精度 (加重) = (1000·0.9 + 500·0.7)/1500 = 1250/1500 ≈ 0.833

🐍 Python で再現

1
2
3
4
5
6
acc_A, acc_B = 0.90, 0.70
diff = acc_A - acc_B
ratio = acc_B / acc_A
print(f"差: {diff}")
print(f"比: {ratio:.3f}")
print(f"4/5 ルール: {'NG' if ratio < 0.8 else 'OK'}")

📤 実行結果

差: 0.2 比: 0.778 4/5 ルール: NG

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python 実装

🎯 このコードでやること: SSDSE-B-2026 の都道府県データを保護属性 (人口大群 vs 人口小群) として扱い、 「出生数 > 全国中央値」を予測するロジスティック回帰モデルに対して ML 倫理 3 指標 (Demographic Parity Difference、 Disparate Impact Ratio、 Equalized Odds Difference) をワンショットで計測する CI 用ルーチン。

📥 入力データ (SSDSE-B-2026 抜粋、 47 都道府県):

Code Prefecture A1101 (総人口) A4101 (出生数) group y (出生>中央値) R01000 北海道 5,092,000 24,430 large_pop 1 R13000 東京都 14,086,000 86,348 large_pop 1 R31000 鳥取県 537,000 3,263 small_pop 0 R47000 沖縄県 1,468,000 14,000 small_pop 1 ... (47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# pip install fairlearn scikit-learn pandas
import pandas as pd
from sklearn.linear_model import LogisticRegression
from fairlearn.metrics import (demographic_parity_difference,
                               demographic_parity_ratio,
                               equalized_odds_difference)

# 1) SSDSE-B-2026 読込
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)

# 2) 保護属性 (人口大小) と目的変数 (出生数中央値超え)
med_pop = df['A1101'].median()
df['group']  = (df['A1101'] > med_pop).map({True: 'large_pop', False: 'small_pop'})
df['y']      = (df['A4101'] > df['A4101'].median()).astype(int)

# 3) モデル: 人口以外の特徴 (15~64歳人口 A1302、 大学数 E6102) を使う
#    ※ F1101 という列は SSDSE-B-2026 に存在しない (F は F3101〜F3105 のみ)
X = df[['A1302', 'E6102']].fillna(0)
y = df['y']
y_pred = LogisticRegression(max_iter=1000).fit(X, y).predict(X)

# 4) 公平性 3 指標
g = df['group']
dpd = demographic_parity_difference(y, y_pred, sensitive_features=g)
dir_ = demographic_parity_ratio(y, y_pred, sensitive_features=g)
eod = equalized_odds_difference(y, y_pred, sensitive_features=g)

print(f"DP Difference     = {dpd:.4f}")
print(f"Disparate Impact  = {dir_:.4f}  (4/5 ルール: 0.80 以上で合格)")
print(f"Equalized Odds Δ  = {eod:.4f}")

📤 実行すると次の出力が得られる:

DP Difference = 1.0000 Disparate Impact = 0.0000 (4/5 ルール: 0.80 以上で合格) Equalized Odds Δ = 1.0000

💬 結果の読み方: 保護属性 (総人口 A1101) をモデルから外したのに、 Disparate Impact = 0.0000 と 最悪値になった。 大県は全件陽性・小県は全件陰性と予測されたためで、 DP Difference も 1.0000 (陽性率が 100 ポイント差)。 原因は 代理変数 (proxy) ── 15〜64歳人口 A1302 と大学数 E6102 はどちらも総人口とほぼ完全に相関するので、 保護属性を削っても情報がそのまま残る。 「センシティブ属性をカラムごと落とせば公平」という Fairness through Unawareness が成り立たない典型例。 → fairlearn の ExponentiatedGradientCorrelationRemover で proxy の相関を落としてから再学習し、 DI 0.80 以上を本番投入の CI ゲートにする。

⚠️ よくある落とし穴

ML 倫理を「ガイドライン作成」で済ませると、 実装現場では何も変わらない。 形式倫理(チェックリスト)が通っていても、 訓練データの偏り・利益相反・国別法規の差で実害が発生する 4 大失敗を以下に整理する。 EU AI Act / GDPR / 個人情報保護法のいずれを参照するかでも罠が違う。

❌ 1. 「ガイドライン作って終わり」
倫理綱領を社内 Wiki に置いただけで実装プロセス(PR レビュー・モデルカード・データシート)に組み込まないと画餅。 Microsoft Responsible AI Standard のように、 影響評価書を model release の必須通過点にする運用にしないと現場では無視される。
❌ 2. 形式倫理 vs 実質倫理
チェックリスト遵守でも被害が残る代表例:「データに人種カラムが無いから差別していない」と言い張るが、 郵便番号や姓名から人種が高精度に推定でき結果として差別が再生産される。 proxy variable まで含めた fairness audit(demographic parity、 equal opportunity 等)を実施しないと「形式倫理クリア・実害発生」が起こる。
❌ 3. 利益相反の見落とし
開発者(KPI 達成)/プラットフォーム(収益最大化)/利用者(健康・厚生)/第三者(影響を受ける労働者・少数派)の利害は対立する。 例:SNS のエンゲージメント最大化モデルは利用者の依存と社会的分断を生む。 倫理委員会に独立第三者(社外有識者・当事者団体)を必ず入れ、 利害関係者マッピングを毎四半期更新する。
❌ 4. グローバル差(jurisdictional arbitrage)
EU AI Act は high-risk AI に厳格義務、 米国は分野別規制、 中国は社会信用との接続あり、 日本は AI 事業者ガイドライン(任意)と各国でルールが異なる。 「日本では合法だから OK」で EU 利用者にサービス提供すると GDPR 違反で全世界売上の最大 4% の罰金。 想定利用者の管轄を最初に特定し、 最も厳しい基準に合わせるのが安全。
❌ 5. 倫理を「学習データ問題」だけに矮小化する
「データのバイアスを取れば公平になる」は不十分。 問題設定(誰の利益か)、 評価指標(accuracy だけか fairness 指標も含むか)、 デプロイ環境(誰がどこで使うか)、 フィードバックループ(モデル予測が将来データに混入する)全て倫理対象。 ML lifecycle 全工程に倫理レビューを差し込む必要がある(Data → Model → Eval → Deploy → Monitor)。
❌ 6. 説明責任の不明確化
AI 判定で不利益が発生したとき「モデルが判定した」と責任を AI に転嫁する事例(ローン審査拒否、 採用書類落選など)。 EU AI Act・日本の AI 事業者ガイドラインは「最終的な意思決定責任は人間」と明記。 ログ保存、 説明可能 AI(SHAP / LIME)、 異議申立窓口を設けないとガイドライン違反。

🗺 概念マップ

「ML 倫理(ml ethics)」を中心に、 公平性・説明可能性・プライバシー保護・説明責任・バイアス検出という 5 つの主要トピックがどのように接続するかを示した概念マップ。

ML 倫理 公平性 / Fairness 説明可能性 / XAI プライバシー保護 説明責任 / Accountability バイアス検出 ML 倫理

機械学習倫理は IEEE Ethically Aligned Design や NIST AI RMF を参照し、 公平性・透明性・説明責任・プライバシー・安全性の 5 軸で点検する。

🔗 隣接手法への橋渡し

機械学習倫理は単独の規範ではなく、 上流のデータ収集同意・バイアス監査、 並列の公平性指標 (Demographic Parity / Equal Opportunity)・説明可能性 (SHAP/LIME)、 下流の人間レビュー + 苦情処理プロセスと組み合わせる総合体制。

SSDSE-B-2026 のような公的データなら、 上流で都道府県間の人口偏りを公平性指標で確認、 中段で SHAP 寄与を可視化、 下流で「特定地域への不利益判定が出ないか」を人間レビューする、 という流れが業界標準。

🌳 手法選択フロー

ML 倫理の対応レベルは、 (1) 高リスク (採用・融資・医療) か低リスク (推薦) か、 (2) 対象集団に保護属性 (性別・人種) を含むか、 (3) 説明責任の要件、 で決まる。 高リスク → 公平性監査必須 + Human-in-the-loop。

  1. 利用領域は高リスクか? はい (医療・採用・与信) → EU AI Act 高リスク要件、 説明可能性必須
  2. 保護属性を用いるか? 直接 / 代理含めて使用 → 公平性指標 監視
  3. 自動意思決定か? はい → GDPR 22 条で人手介入経路を確保

実務では EU AI Act / NIST AI RMF / ISO/IEC 23894 等の枠組みに沿った倫理レビューを定期実施するのが定石で、 倫理委員会への報告と監査ログ保持を SLA で明文化する。