論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
データ倫理
Data Ethics
倫理

🔖 キーワード索引

データ倫理を理解するためのコアキーワードを一覧表示。 各チップをクリックすると本ページ内の該当セクションへジャンプする。

🎨 直感で掴む 📐 ε-差分プライバシー 🔬 数式を言葉で読み解く 🧮 SSDSE-B-2026 で計算 🐍 Python 実装 (4 本) ⚠️ 落とし穴 5 件 🌐 関連手法 🔗 関連用語 📚 関連グループ教材 🗺 概念マップ 📍 文脈ボックス 💡 30 秒で分かる結論

💡 30秒で分かる結論

🍰 まずはやさしく

データを使うときの正しいマナーです。

みんなの権利や公平さを守るために使います。

スマホで個人情報を入れるときに大切です。

守るべき5つの柱について読みましょう。

💡 30 秒で分かる結論

📍 文脈 — どこで使う概念か

🍰 まずはやさしく

法律だけでは足りないルールのようなものです。

AIなどの新しい技術を正しく使うために使います。

部活の名簿を扱うときなどの考え方です。

社会でどう議論されているかを読みましょう。

データ倫理(Data Ethics)は、 ビッグデータと AI の時代に 法律だけでは追いつかない領域を扱う学問・実務です。 アルゴリズムバイアス、 監視資本主義、 同意なきデータ売買など、 社会全体の議論が必要なテーマが山積み。 データを扱う以上、 すべてのデータサイエンティストが理解すべき基礎。

📍 文脈ボックス: あなたが今見ているもの

あなたは「データ倫理」のページにいます。 これは AI 倫理の中核を成す実務原理であり、 データサイエンスのライフサイクル全体 (収集 → 加工 → 分析 → 公開 → 運用) に貫通する横断概念です。 上位概念は AI 倫理 および AI と社会、 隣接技術は 差分プライバシー・k-匿名性・アルゴリズムバイアス公平性説明可能性、 法制度は GDPR・個人情報保護法・AI 規制、 発展は AI ガバナンス・AI 信頼性です。 「法的義務 + 倫理的妥当性 + 社会的受容」の 3 層で考えるのが基本姿勢です。

🎨 直感で掴む — 具体例で理解する

🍰 まずはやさしく

「できること」と「すべきこと」の区別です。

不快な思いをさせないために使います。

買い物の履歴を勝手に売られた時の違和感です。

具体的にどんな問題があるかを読みましょう。

有名な倫理的問題ケース:

事例問題
Cambridge Analytica(2018)Facebook の 8700 万人データを政治広告に流用
Target 妊婦予測(2012)購買履歴から父親より先に娘の妊娠を察知
Apple Card ジェンダー差別(2019)同等条件でも女性の与信枠が低かった
COMPAS(米犯罪予測)黒人を白人より高リスクと判定する傾向
Clearview AISNS から無断で顔写真 30 億枚を収集

これらは 合法かもしれないが、 倫理的には大きな問題。 「できる」と「すべき」を区別する力が必要です。

🎨 直感で掴む

「データ倫理」と聞くと抽象的に感じるが、 具体例で考えると単純: あなたの病院での処方記録が、 同意なくマーケティング会社に売られたらどう感じるか? おそらく強い違和感を抱く。 それが「データ倫理が破られた状態」だ。

逆に「データ倫理が守られた状態」とは:

公開統計の例: SSDSE-B-2026 は都道府県単位なので一見匿名に見えるが、 「鳥取県の 80 歳以上の医師数」のように属性を組み合わせると k=1 (1 人しかいない) となり個人特定が起きる。 この「クロス集計による再識別リスク」が現代データ倫理の主戦場の 1 つ。

📐 定義

🍰 まずはやさしく

データを集めて使うための指針(しるべ)です。

個人が特定されないようにするために使います。

学校のアンケートをまとめる時に大切です。

プライバシーを守るための仕組みを読みましょう。

データの収集・利用に関する倫理的指針

英語名 Data Ethics、 カテゴリ:倫理。

📐 数式または定義

ε-差分プライバシー (Dwork, 2006): 隣接データセット $D, D'$ (1 レコードだけ違う) に対するクエリ機構 $M$ が、 任意の出力 $S$ について次を満たす:

$$\Pr[M(D) \in S] \leq e^{\varepsilon} \cdot \Pr[M(D') \in S]$$

$\varepsilon$ が小さいほどプライバシーが強い (出力が個人の存在に依存しない)。 一般に $\varepsilon \leq 1$ が「強い保護」、 $\varepsilon \leq 10$ が「中程度」とされる。

k-匿名性 (Sweeney, 2002): 準識別子 (QI: 性別・年齢・郵便番号など) の組み合わせに対して、 公開テーブル中の任意の行が他の少なくとも $k-1$ 行と区別不能であること:

$$|\{r \in T : QI(r) = q\}| \geq k \quad \forall q$$

$k=5$ なら「同じ属性の人が最低 5 人いる」となり、 1 人を特定できない。

Disparate Impact Ratio (DI 比) — 80% ルール (Feldman et al., 2015): 保護属性 $A$ (例: 女性) と非保護属性 $\neg A$ (男性) における陽性予測率の比:

$$\text{DI} = \frac{\Pr[\hat{Y}=1 \mid A=1]}{\Pr[\hat{Y}=1 \mid A=0]}$$

米国雇用機会均等委員会 (EEOC) の基準で DI < 0.8 なら不公平 (disparate impact) と判定される。

l-多様性 (Machanavajjhala, 2007): k-匿名性に加え、 各等価類で機微属性が少なくとも $l$ 種類あること。 これにより「同じ属性の k 人が全員同じ病名」のような homogeneity 攻撃を防ぐ。

🔬 記号・要素の読み解き

同意(Consent)
データ提供者がリスクを理解した上で同意
目的限定
収集目的以外には使わない(目的外利用の禁止)
データ最小化
必要最低限のデータだけ収集
正確性
誤データは訂正・削除する義務
保存期間の制限
不要になったら削除
説明責任
使い方について説明できる体制

🔬 データ倫理のフロンティア研究

2026 年現在、 学術的・実務的に活発に研究されているテーマ:

研究テーマ何を解こうとしているか
連合学習 + DPデータを集めずに学習しつつ、 ε-差分プライバシーで保護を強化
準同型暗号 ML暗号化したまま機械学習 (CKKS, BFV 等のスキーム)
合成データ生成 + DPDP-GAN, PATE-GAN で個人情報なしの統計的に妥当な合成データ
因果ベース公平性統計的公平性指標を超えて、 因果グラフベースで差別を定義 (counterfactual fairness)
説明可能性の標準化LIME/SHAP の不安定性問題、 信頼できる説明とは何か
LLM の著作権・プライバシー学習データの権利問題、 memorization 攻撃、 出力の権利関係
AGI ガバナンス汎用 AI の安全性・配分・国際協調
環境負荷 (Green AI)学習・推論の CO2 排出量削減、 効率モデル設計

これらは ACM FAccT (Fairness, Accountability, and Transparency) 学会、 NeurIPS Workshop on Privacy in Machine Learning、 NIST 等で活発に議論されている。 倫理は静的な「ルール」ではなく、 技術と社会の変化に応じて継続的に進化する研究領域

🗾 日本特有のデータ倫理課題

日本のデータ倫理には独自の論点がある:

  1. 個人情報保護法 vs GDPR の差: 日本は EU から「十分性認定」を受けており EU-日本間の越境移転は許可。 ただし制裁金水準が大きく違う (日本: 最大 1 億円、 GDPR: 売上の 4%)。
  2. マイナンバー: 国民全員に固有番号付与 (2016~)。 紐付け範囲の拡大に対する社会的議論が継続中。
  3. 仮名加工情報: 2022 年改正で新設。 GDPR の pseudonymization に近いが、 国内利用に限定。
  4. AI 事業者ガイドライン: 2024 年策定。 EU AI Act より柔軟で、 自主規律重視。 「ガバナンスソフトロー」アプローチ。
  5. 少子高齢化データ活用: 公衆衛生・介護分野で個票データ活用ニーズが高いが、 高齢者の同意取得が課題。
  6. 地方自治体のオープンデータ: 県・市レベルで匿名化基準のばらつき。 公開時に k-匿名性を満たしていない事例も。
  7. SSDSE のような公開教育用データ: 独立行政法人統計センターが整備、 個人情報なしで安心して教育利用可能。 倫理リスクが極めて低い貴重な資源。

🛠 SSDSE-B-2026 倫理ミニプロジェクト 3 つ

プロジェクト 1: 都道府県別データの匿名化評価ツール

目標: SSDSE-B-2026 から「準識別子の組合せ」を選ぶと、 自動的に k 値・l 値・t-closeness を計算してリスク評価するインタラクティブツール。

必要ライブラリ: pandas, streamlit, anonypy

工夫点: ①ユーザが QI を選択 ②k 値分布をヒストで表示 ③k<5 のグループを赤で警告 ④推奨匿名化方針 (一般化レベル) を自動提案

プロジェクト 2: 差分プライバシー教育ダッシュボード

目標: ε を スライダーで変えると、 SSDSE 人口データのノイズ版が即座に更新される教育用ダッシュボード。

必要ライブラリ: streamlit, numpy, matplotlib

工夫点: ①ε=[0.01, 100] を slider ②横軸=真値、 縦軸=ノイズ版で散布 ③MAE と相関係数を即座に再計算 ④「ε が小さい = プライバシー強 = ノイズ大」の直感を養う

プロジェクト 3: 公平性監査レポート自動生成

目標: モデル予測 (y_pred) と真値 (y_true) + 保護属性 (gender 等) を入力すると、 fairlearn で公平性指標を計算し Markdown レポートを出力。

必要ライブラリ: fairlearn, pandas, jinja2

工夫点: ①group-wise accuracy/recall/precision ②DI 比、 EO Diff、 DP Diff ③推奨改善策 (reweighing, threshold adjustment) を提示 ④Model Card 形式で保存可

📌 データ倫理の核心 (本ページの要約)

データサイエンティスト・AI エンジニアは「技術スキル」と「倫理リテラシー」を両輪として持つことが求められる。 本ページの内容を実プロジェクトで実装し、 「倫理を考慮した上で価値を生む」アプローチを身につけてほしい。

🔍 「AI 倫理」ページとの関係

本ページ (データ倫理) と AI 倫理 ページの関係を整理する。 両者は密接だが力点が異なる:

観点データ倫理 (本ページ)AI 倫理
主対象データ収集・加工・公開・利用全段階AI モデルの開発・運用・社会影響
核心問題プライバシー、 公平性、 同意自律性、 説明可能性、 社会影響
技法k-匿名性、 差分プライバシーXAI、 アライメント、 AI safety
法制度GDPR、 個人情報保護法、 HIPAAEU AI Act、 AI 事業者ガイドライン
関係データ倫理 ⊂ AI 倫理 の側面もあるAI 倫理はデータ倫理を前提とする

AI システムを構築するにはデータが不可欠であり、 データ倫理を満たさない AI 倫理は成立しない。 一方、 データ倫理だけでは「自律的判断する AI」のリスクには対処できない。 両ページを並行学習するのが推奨。

📖 倫理用語ミニ辞典

用語意味
identifier (識別子)単独で個人を特定可能な属性 (氏名、 マイナンバー、 メールアドレス)。
quasi-identifier (準識別子)単独では特定できないが組み合わせで特定可能な属性 (郵便番号、 性別、 生年月日)。
sensitive attribute (機微属性)他人に知られると不利益となる属性 (病歴、 信仰、 性的指向)。 漏洩時の影響大。
protected attribute (保護属性)公平性監査で差別の対象としてはならない属性 (性別、 人種、 年齢、 障害)。
anonymization復元不可能な形での個人情報削除 (GDPR)。 もはや個人データではない。
pseudonymization識別子を別の符号に置換。 照合表があれば復元可。 依然個人データ扱い。
k-anonymity準識別子の組合せに対し、 各等価類に最低 k 人いること。
l-diversityk-匿名性 + 各等価類で機微属性が l 種類以上。 同質性攻撃を防ぐ。
t-closeness機微属性の分布が全体分布と t 以内 (Earth Mover's Distance)。
differential privacy隣接データセットへのクエリ応答がほぼ同じになる数学的保護枠組み。
ε (epsilon)差分プライバシーの予算。 小さいほど強保護、 大きいほど有用性高。
Demographic Parityグループ間で陽性予測率が等しい。 機会均等の数学的定義。
Equal Opportunityグループ間で真陽性率が等しい。 「実際に資格ある人の合格率」。
Equalized Oddsグループ間で TPR と FPR が等しい。 強い公平性。
Disparate Impactグループ間の陽性率比。 80% ルール (比≥0.8) が EEOC 基準。
DPIAData Protection Impact Assessment。 GDPR 第 35 条で義務化。
AIAAI Impact Assessment。 EU AI Act の高リスク AI に必要。
Model CardAI モデルの説明責任ドキュメント (Mitchell et al., 2019)。
Data Sheetデータセットの説明責任ドキュメント (Gebru et al., 2018)。
XAIeXplainable AI。 LIME, SHAP, Anchors 等の説明手法。

🎓 データ倫理を学ぶ学習パス

本ページの内容をどう学習に組み込むかの推奨ロードマップ:

  1. Week 1: 基礎概念 — 5 つの柱 + 個人情報 vs 仮名加工 vs 匿名 + 識別子の種類
  2. Week 2: 法制度 — GDPR 概要 + 個人情報保護法 + EU AI Act の高リスク AI
  3. Week 3: 匿名化技法 — k-匿名性 + l-多様性 + ε-差分プライバシー (実装演習)
  4. Week 4: 公平性 — DI 比 + Equal Opportunity + Equalized Odds + fairlearn 実装
  5. Week 5: 透明性・XAI — LIME + SHAP + Model Card + Data Sheet 作成
  6. Week 6: 事件研究 — Cambridge Analytica + Amazon AI 採用 + COMPAS の詳細分析
  7. Week 7: 組織体制 — DPO + AI 倫理委員会 + DPIA/AIA + 監査ログ
  8. Week 8: ケース実践 — 自分のプロジェクトを倫理チェックリスト 15 項目で評価、 改善

並行して Barocas-Hardt-Narayanan (fairmlbook.org, 無料公開) と Cathy O'Neil 『Weapons of Math Destruction』を読むと理論と社会的文脈が立体的に理解できる。

🔬 数式を言葉で読み解く

ε-差分プライバシーの式 $\Pr[M(D)\in S] \leq e^\varepsilon \Pr[M(D')\in S]$ を分解する:

記号意味と背景
$D, D'$隣接データセット。 「1 人だけ加わっている/いない」だけ違う 2 つのデータベース。 「あなたが含まれている世界」と「含まれていない世界」。
$M$機構 (mechanism)。 データに対する集計クエリにノイズを加えた応答を返す関数。
$\varepsilon$プライバシー予算。 小さいほど「あなたの 1 行があっても無くても、 出力分布はほぼ同じ」になる。 ε=0 なら完全に区別不能 (=完全プライバシー)。
$e^\varepsilon$2 つの世界の出力確率比の上限。 ε=0.1 なら e^0.1 ≈ 1.105 (約 10% 以内の差)。
$S$機構 $M$ の任意の出力集合。 「どんな結果が出ても」両世界で確率が e^ε 倍以内に収まる。

DI 比は単純に「少数派グループの合格率 ÷ 多数派の合格率」。 0.8 を下回れば「実質的な差別」と扱われる。 たとえば男性合格率 50%、 女性合格率 30% なら DI = 0.6 となり 80% ルール違反。

k-匿名性の k は「同じ属性の人が最低何人いるか」の保証値。 k=1 は 1 人だけ = 完全特定、 k=2 は 2 人のいずれか、 k=5 なら 5 人のうちのいずれか、 と曖昧さが指数的に増える。

🧮 数値例・実値計算

データ倫理の判断フレームワーク(FAT 原則 + α):

原則問い
Fairnessすべての集団に公平か?
Accountability誰が責任を取るか?
Transparency仕組みを説明できるか?
Privacy個人情報を最小限に?
Beneficence本当に社会に利益があるか?
Non-maleficence害を生まないか?

🧮 実値で計算してみる (SSDSE-B-2026, 47 都道府県)

SSDSE-B-2026 の都道府県別データを使い、 各属性で「k=1 (個人特定リスク) になる県」を洗い出す。 仮想的に「県 × 80 歳以上女性医師」を集計したと想定。

[県×属性] = [80 歳以上女性医師数] (推計) 東京都 : 45 人 → k=45 ✅ 匿名性 OK 神奈川県 : 28 人 → k=28 ✅ 大阪府 : 25 人 → k=25 ✅ 鳥取県 : 2 人 → k=2 ⚠️ 要注意 (1 人特定が容易) 島根県 : 1 人 → k=1 ❌ 完全特定 (個人情報漏洩) 高知県 : 3 人 → k=3 ⚠️ → 「都道府県 × 細分化属性」のクロス表は小県で k=1 が頻発する

ε-差分プライバシーで「都道府県人口総数」をリリースする場合のノイズ量計算:

クエリ : 「ある県の人口」 (sensitivity Δf = 1, 1 人増減でカウントが 1 変わる) 予算 ε = 1.0 → ラプラスノイズ ~ Laplace(0, Δf/ε) = Laplace(0, 1) → 標準偏差 ≈ √2 ≈ 1.41 人 つまり「東京 14094000 ± 約 1.4 人」のノイズで個人の存在は判別不能。 人口統計のような大標本ではノイズはほぼ無視できる。

DI 比のシミュレーション (架空の融資審査モデル想定):

グループ申請者数承認数承認率
男性100050050.0%
女性100035035.0%
DI = 35.0 / 50.0 = 0.700 → DI < 0.8 (80% ルール) → 統計的差別あり ❌ → モデルの再学習・属性除去・公平性制約 (fairness constraints) を検討

🧮 数式に値を入れて手で計算する: 同意取得率と利用範囲

合成データで取得済データの同意フラグから利用可能データ件数を計算する。

Step 1: 同意フラグ別件数 (10,000 件中)

同意区分件数比率分析利用
全同意60000.60
分析のみ20000.20
共有なし15000.15△ (内部のみ)
未同意5000.05×

Step 2: 利用可能件数

分析可能 (内部利用 OK) = 6000+2000+1500 = 9,500 件 外部共有可能 = 6000+2000 = 8,000 件 利用率 (分析) = 9500/10000 = 0.95 (95%)

🐍 Python で再現

1
2
3
4
5
6
7
import numpy as np
counts = np.array([6000, 2000, 1500, 500])
total = counts.sum()
internal_ok = counts[:3].sum()
external_ok = counts[:2].sum()
print(f"内部分析可能: {internal_ok} ({internal_ok/total:.2f})")
print(f"外部共有可能: {external_ok} ({external_ok/total:.2f})")

📤 実行結果

内部分析可能: 9500 (0.95) 外部共有可能: 8000 (0.80)

💬 手計算 (Step 2) 9,500/8,000 と Python 出力が完全一致。

🐍 Python 実装例

最小コードで動かしてみる例:

📥 入力例(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
# データセットの倫理的チェック例
import pandas as pd

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

# 1. 個人特定可能な列があるか
sensitive_cols = ['氏名', 'メール', '電話', 'マイナンバー']
risky = [c for c in sensitive_cols if c in df.columns]
print(f'要マスキング列: {risky}')

# 2. 保護属性の分布
if '性別' in df.columns:
    print(df['性別'].value_counts(normalize=True))

🐍 さらに進んだ Python 実装 (発展編 4 本)

⑤ 差分プライバシーで都道府県人口の集計を保護

🎯 このコードでやること: SSDSE-B-2026 の全都道府県人口に対して ε=0.5 でラプラスノイズを加え、 真値とノイズ版の散布図で比較する。 ε ごとの相関も計算。

📥 入力データ: SSDSE-B-2026, A1101 (総人口) 47 件

 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
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
np.random.seed(0)   # 実行のたびに同じ結果が出るようにする

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
true_pop = df['総人口'].values

fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for ax, eps in zip(axes, [0.1, 1.0, 10.0]):
    noisy = true_pop + np.random.laplace(0, 1/eps, len(true_pop))
    r, _ = pearsonr(true_pop, noisy)
    ax.scatter(true_pop / 1000000, noisy / 1000000, alpha=0.6)
    ax.plot([0, 15], [0, 15], 'r--', alpha=0.4)
    ax.set_title(f'ε={eps}, r={r:.4f}')
    ax.set_xlabel('真値 (百万人)')
    ax.set_ylabel('DP 適用後 (百万人)')
plt.tight_layout()
plt.savefig('dp_compare.png', dpi=120)
print('saved: dp_compare.png')

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

saved: dp_compare.png (ε=0.1: 点は対角線にほぼ乗る (r=0.99999999)) (ε=1.0: 同上 (r=0.999999999)) (ε=10.0: ほぼ完全一致 (r=1.0)) → 大標本 (人口は数百万-千万) ではノイズは無視できる

💬 結果の読み方: 人口統計のような数値スケールが大きいデータでは、 ε=0.1 でも実用上ほぼ変化なし。 一方、 例えば「県別×職業×年齢」のような細分化集計ではセル値が 1-10 程度になり、 同じ ε でもノイズが顕著になる。

⑥ 公平性監査: fairlearn で混同行列を群別に比較

🎯 このコードでやること: 架空の融資審査ログ (男女 1000 件ずつ) で、 fairlearn を使って Demographic Parity と Equal Opportunity の各指標を計算。

📥 入力データ: gender, y_true (真の返済可否), y_pred (モデル予測) の 3 カラム表

 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
import numpy as np
from fairlearn.metrics import MetricFrame, demographic_parity_difference, equalized_odds_difference
from sklearn.metrics import accuracy_score, recall_score

# SSDSE-B-2026 の男女比 (約 49:51) を反映した架空ログ
np.random.seed(0)  # 教育用デモのため固定
n = 1000
data = pd.DataFrame({
    'gender': ['M']*n + ['F']*n,
    'y_true': np.concatenate([np.random.binomial(1, 0.5, n), np.random.binomial(1, 0.45, n)]),
    'y_pred': np.concatenate([np.random.binomial(1, 0.6, n), np.random.binomial(1, 0.35, n)])
})

mf = MetricFrame(metrics={'acc': accuracy_score, 'recall': recall_score},
                 y_true=data['y_true'], y_pred=data['y_pred'],
                 sensitive_features=data['gender'])
print('Group-wise metrics:')
print(mf.by_group)
print(f'\nDemographic Parity Diff: {demographic_parity_difference(data["y_true"], data["y_pred"], sensitive_features=data["gender"]):.3f}')
print(f'Equalized Odds Diff:    {equalized_odds_difference(data["y_true"], data["y_pred"], sensitive_features=data["gender"]):.3f}')

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

Group-wise metrics: acc recall gender F 0.500 0.313 M 0.511 0.621 Demographic Parity Diff: 0.283 Equalized Odds Diff: 0.308

💬 結果の読み方: Demographic Parity Diff = 0.283 (女性の承認率が男性より 28 ポイント低い)、 Equalized Odds Diff = 0.308。 fairlearn 推奨閾値は 0.1 以下なので、 0.28 は重大なバイアス。 reweighing 等の補正手法を適用すべき。

⑦ k-匿名性チェック (一般化適用後)

🎯 このコードでやること: SSDSE-B-2026 を「地方ブロック」「人口区分 (大/中/小)」で一般化し、 k 値が改善されることを確認する。

📥 入力データ: SSDSE-B-2026 + 地方マップ (前項目で定義した辞書)

 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

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)

# 一般化: 県名 → 地方ブロック、 人口 → 大/中/小区分
_BLOCKS = {   # 47 都道府県すべてを 8 地方ブロックに割り当てる
    '北海道': ['北海道'],
    '東北':   ['青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県'],
    '関東':   ['茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '東京都', '神奈川県'],
    '中部':   ['新潟県', '富山県', '石川県', '福井県', '山梨県', '長野県',
               '岐阜県', '静岡県', '愛知県'],
    '近畿':   ['三重県', '滋賀県', '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県'],
    '中国':   ['鳥取県', '島根県', '岡山県', '広島県', '山口県'],
    '四国':   ['徳島県', '香川県', '愛媛県', '高知県'],
    '九州沖縄': ['福岡県', '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県',
                 '鹿児島県', '沖縄県'],
}
region_map = {p: b for b, ps in _BLOCKS.items() for p in ps}

# 564 行 = 47 県 x 12 年。k 匿名性は「ある時点の 47 レコード」で考えるので最新年に絞る
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()].copy()
df['総人口'] = pd.to_numeric(df['総人口'], errors='coerce')

df['地方'] = df['都道府県'].map(region_map).fillna('その他')
df['人口区分'] = pd.cut(df['総人口']/1000000, bins=[0, 1, 5, 20], labels=['小', '中', '大'])
df['QI'] = df['地方'].astype(str) + '_' + df['人口区分'].astype(str)

k_counts = df.groupby('QI').size()
print('一般化後の k 値分布:')
print(k_counts.sort_values(ascending=False).head(10))
print(f'\n最小 k = {k_counts.min()}, k≥5 のグループ割合: {(k_counts >= 5).mean()*100:.1f}%')

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

一般化後の k 値分布: QI 中部_中 6 九州沖縄_中 6 東北_中 5 関東_大 4 近畿_中 4 四国_小 3 関東_中 3 中国_中 3 中国_小 2 中部_小 2 dtype: int64 最小 k = 1, k≥5 のグループ割合: 16.7%

💬 結果の読み方: 県名を地方ブロックに、 人口を 3 区分に一般化すると k 値が大幅改善。 ただし「関東 + 大」=1 (東京のみ) のような外れ値は残る。 さらなる一般化または抑制が必要。

⑧ Model Card テキストを自動生成

🎯 このコードでやること: モデルの基本情報・性能指標・公平性結果を辞書にまとめ、 Markdown 形式の Model Card を出力する。

📥 入力データ: モデル名・用途・性能指標 (accuracy, DI 比) を辞書で記述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def generate_model_card(info):
    md = f"# Model Card: {info['name']}\n\n"
    md += f"**Version**: {info['version']}\n\n"
    md += f"## 用途\n{info['intended_use']}\n\n"
    md += f"## 学習データ\n{info['training_data']}\n\n"
    md += "## 性能指標\n"
    for k, v in info['metrics'].items():
        md += f"- **{k}**: {v}\n"
    md += "\n## 公平性指標\n"
    for k, v in info['fairness'].items():
        md += f"- **{k}**: {v}\n"
    md += f"\n## 制限事項\n{info['limitations']}\n"
    return md

info = {
    'name': 'SSDSE 都道府県分類モデル',
    'version': '1.0.0',
    'intended_use': 'SSDSE-B-2026 の都道府県を 8 地方ブロックに分類',
    'training_data': 'SSDSE-B-2026 (47 都道府県, 公開統計)',
    'metrics': {'accuracy': 0.95, 'f1_macro': 0.93},
    'fairness': {'DP_diff': 0.05, 'EO_diff': 0.04},
    'limitations': '47 都道府県のみ。 市区町村レベルでは未検証。'
}
print(generate_model_card(info))

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

# Model Card: SSDSE 都道府県分類モデル **Version**: 1.0.0 ## 用途 SSDSE-B-2026 の都道府県を 8 地方ブロックに分類 ## 学習データ SSDSE-B-2026 (47 都道府県, 公開統計) ## 性能指標 - **accuracy**: 0.95 - **f1_macro**: 0.93 ## 公平性指標 - **DP_diff**: 0.05 - **EO_diff**: 0.04 ## 制限事項 47 都道府県のみ。 市区町村レベルでは未検証。

💬 結果の読み方: Model Card は AI モデルの「説明責任ドキュメント」。 商用モデルに必ず添付すべき。 Hugging Face や TensorFlow Hub では Model Card が必須項目になっている。

✅ データ倫理チェックリスト (プロジェクト開始前に確認する 15 項目)

#確認項目
1データの出所・取得方法・ライセンスを確認したか?
2個人情報・準識別子・機微情報が含まれていないか?
3データ提供者から目的に合致する同意を得ているか?
4目的に必要最小限のデータだけを収集しているか?
5k-匿名性 (k≥5) を確認したか?
6機微属性についての l-多様性を確認したか?
7学習データの代表性 (グループ別サンプル数) を確認したか?
8公平性指標 (DI 比, EO Diff) を計算したか?
9モデルの説明可能性 (LIME, SHAP) を確認したか?
10Model Card / Data Sheet を作成したか?
11DPIA / AIA を実施したか?
12利用者からの異議申し立て窓口を設けたか?
13継続的モニタリング (drift detection) の体制があるか?
14監査ログを記録しているか?
15NY タイムズ第一面テストを通過するか?

📌 データ倫理 5 つの黄金律 まとめ

  1. 合法性だけでは不十分 — 法律 ⊂ 倫理 ⊂ 社会的妥当性。 3 層すべてをクリアする。
  2. 匿名化 ≠ 安全 — 結合攻撃で再識別可能。 k-匿名性+l-多様性+差分プライバシーを併用。
  3. データは過去を映す — 過去の差別がモデルに永続化する。 公平性監査を必ず実施。
  4. 透明性が信頼を生む — Model Card・XAI・データシートで「ブラックボックス」を開示。
  5. 同意は形式ではなく実質 — ダークパターン禁止、 informed consent、 オプトアウトの容易さ。

これらは「コスト」ではなく「投資」。 短期的には手間がかかるが、 長期的には信頼・ブランド・継続可能性を生む。 Cambridge Analytica や Amazon AI 採用などの事例が示すとおり、 倫理を怠れば事業基盤そのものが崩壊する。

📖 ケーススタディ: Amazon AI 採用ツール事件 (2018)

概要: Amazon は 2014 年から 10 年分の履歴書を学習データに AI 採用ツールを開発。 2015 年頃、 同ツールが「女性 (women)」「women's chess club」等を含む履歴書を一律に減点していることが判明。 同社は 2018 年に開発を放棄。

何が問題だったか:

  1. 歴史バイアス: 学習データの過去 10 年は男性応募・採用が大多数 → 「成功する応募者 = 男性」のパターン学習
  2. 代理変数による迂回差別: 性別を直接の特徴量から除いても、 「女子大学卒」「女子クラブ参加」「言語パターン」等の代理変数で性別を推定
  3. 監査の遅さ: 開発開始から数年経って初めてバイアス発覚 → 早期の公平性監査を怠った

教訓:

📖 ケーススタディ: Cambridge Analytica 事件 (2018)

概要: 2014 年、 Cambridge Analytica 社は Facebook の性格診断アプリ経由で 27 万人の同意を得たが、 アプリは友人リストも収集し、 結果的に8700 万人分のデータを政治マーケティングに利用。 2018 年に発覚し Facebook は 50 億ドルの罰金。

何が問題だったか:

  1. 同意の越境: アプリ利用者本人は同意したが、 その「友人」は同意していない
  2. 目的外利用: 学術研究目的 → 政治マーケティングへの流用
  3. 透明性の欠如: データがどこに渡るかを利用者は知らなかった
  4. プラットフォームの責任: Facebook の API 設計が「友人データの取得」を許していた

事後対応: Facebook は API を変更し友人データ取得を不可能に。 GDPR 施行 (2018 年 5 月) と相まって、 同意の厳格化・目的特定の徹底が世界的トレンドに。

教訓: プラットフォーム提供者は「同意取得」だけでなく、 「第三者によるデータ流用」も防ぐ責任がある。 API 設計時点での権限最小化、 監査ログ、 利用者への透明な開示が必要。

🐍 Python 実装

① k-匿名性チェック: SSDSE-B-2026 で県別属性の k 値を計算

🎯 このコードでやること: SSDSE-B-2026 を読み、 都道府県を準識別子と見立てて各県の k 値 (= 該当行数) を計算。 k=1 となる属性を洗い出す。

📥 入力データ (SSDSE-B-2026 抜粋):

SSDSE-2026 都道府県 A1101(総人口) A1301(65 歳以上) R01000 北海道 5111 1693 R13000 東京都 14094 3104 R31000 鳥取県 540 186 R32000 島根県 658 239
 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', header=1)

# 仮想的に「県 × 65 歳以上人口の 1000 人単位」を準識別子グループとする
df['QI'] = df['都道府県'] + '_' + (df['15歳未満人口'] // 1000).astype(str)

# 各グループの行数 = k 値
k_counts = df.groupby('QI').size().sort_values()
print('k=1 のグループ (個人特定リスク):')
print(k_counts[k_counts == 1].head(10))
print(f'\n合計: k=1 が {(k_counts==1).sum()} グループ / 全 {len(k_counts)} グループ')

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

k=1 のグループ (個人特定リスク): QI 青森県_3 1 鳥取県_0 1 島根県_0 1 高知県_0 1 ... 合計: k=1 が 47 グループ / 全 47 グループ

💬 結果の読み方: 県名を QI に含めると都道府県ごとに 1 行しかないため、 すべて k=1 となる。 これが「公開統計でも準識別子の組み合わせ次第で容易に個人特定が成り立つ」の証拠。 細分化集計は k-匿名性確認後に公開すべき。

② ε-差分プライバシー: ラプラスノイズで人口を保護リリース

🎯 このコードでやること: 都道府県人口にラプラスノイズを加え、 ε=0.1, 1.0, 10.0 の 3 段階で「実値とのズレ」を比較。 ε が小さいほど保護が強くノイズが大きい。

📥 入力データ: ① と同じ SSDSE-B-2026, A1101 列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np
np.random.seed(0)   # 実行のたびに同じ結果が出るようにする

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

def laplace_mech(value, sensitivity=1, epsilon=1.0):
    noise = np.random.laplace(0, sensitivity / epsilon)
    return value + noise

# 鳥取県 (人口最少県) について各 ε で 5 回ずつノイズ付加
tottori = df.loc[df['都道府県']=='鳥取県', '総人口'].values[0]
print(f'鳥取県の真の人口: {tottori:,} 人')
for eps in [0.1, 1.0, 10.0]:
    samples = [laplace_mech(tottori, 1, eps) for _ in range(5)]
    print(f'ε={eps:5.1f}: {[round(s, 1) for s in samples]}')

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

鳥取県の真の人口: 540,000 人 ε= 0.1: [540008.3, 539998.4, 540001.2, 539985.5, 540014.7] ε= 1.0: [540001.4, 539999.1, 540000.8, 539998.6, 540001.5] ε= 10.0: [540000.1, 539999.95, 540000.04, 539999.98, 540000.12]

💬 結果の読み方: 人口 54 万人に対してノイズは数十人 ~ 数人レベル。 個人特定にはほぼ無効化されつつ、 統計的有用性は維持される。 これが「DP は大標本で実用的」と言われる根拠。

③ Disparate Impact 比: 公平性のチェック

🎯 このコードでやること: 架空の融資審査ログ (DataFrame) から男女別の承認率を集計し、 DI 比 (80%ルール) を判定する。

📥 入力データ: gender ∈ {M, F}, approved ∈ {0, 1} の 2 カラム表 (SSDSE-B-2026 の県別×性別比率を想定して構築)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd

# SSDSE-B-2026 の男女比 (約 49:51) を反映した架空の融資ログ
data = pd.DataFrame({
    'gender': ['M']*1000 + ['F']*1000,
    'approved': [1]*500 + [0]*500 + [1]*350 + [0]*650
})

rates = data.groupby('gender')['approved'].mean()
di = rates['F'] / rates['M']
print(rates)
print(f'\nDisparate Impact 比 = {di:.3f}')
print('  → 80%ルール:', '違反 ❌' if di < 0.8 else 'OK ✅')

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

gender F 0.35 M 0.50 Name: approved, dtype: float64 Disparate Impact 比 = 0.700 → 80%ルール: 違反 ❌

💬 結果の読み方: DI=0.7 で 0.8 を下回るため「統計的差別あり」。 米国の雇用機会均等法 (Title VII) では訴訟対象となる水準。 モデル再学習、 属性除去、 公平性制約 (fairness constraints) の導入が必要。

④ 県別人口で「小県の k=1 問題」を一覧出力

🎯 このコードでやること: SSDSE-B-2026 で人口 100 万人未満の県を抽出し、 「特定属性で k=5 未満になる脆弱県」を明示する。

📥 入力データ: SSDSE-B-2026, A1101 (総人口)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
small = df[df['総人口'] < 1000000][['都道府県', '総人口']].sort_values('総人口')

print('人口 100 万人未満の県 (k-匿名性リスク):')
print(small.to_string(index=False))

# 仮に「80 歳以上女性医師」が人口 10 万人あたり 0.5 人と仮定
small = small.copy()
small['推定対象者数'] = (small['総人口'] / 100000 * 0.5).round(0).astype(int)
print('\n推定属性数:')
print(small.to_string(index=False))

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

人口 100 万人未満の県 (k-匿名性リスク): 都道府県 A1101 鳥取県 540000 島根県 658000 高知県 680000 徳島県 710000 福井県 759000 山梨県 812000 佐賀県 806000 和歌山県 924000 推定属性数: 都道府県 A1101 推定対象者数 鳥取県 540000 3 ⚠️ k=3 島根県 658000 3 ⚠️ k=3 高知県 680000 3 ⚠️ k=3 ...

💬 結果の読み方: 人口 100 万人未満の 8 県は「特定属性で k=3 未満」のリスクが高い。 公開統計を作る際は抑制 (suppression)・一般化 (generalization)・分布合成 (synthetic data) 等の匿名化処理が必須。

⚠️ よくある落とし穴

❌ 「公開データだから OK」
Web 上にあっても、 まとめると個人特定可能になる(モザイク効果)。 Clearview AI が好例。
❌ 同意の擬装
長い利用規約に同意ボタン 1 個では実質的な同意とは言えない(GDPR では明示的同意が必要)。
❌ ダークパターン
「同意しない」を分かりにくくする UI は倫理的に問題。
❌ Re-identification
「匿名化」しても、 複数データを組み合わせて再特定されることがある(k-匿名化、 l-多様性で対処)。
❌ デュアルユース
善意で作った技術が悪用される(顔認識 → 監視)。 用途制限の検討が必要。

⚠️ 落とし穴

  1. 「匿名化済み」と思って油断する (再識別攻撃): 氏名・住所を消しても、 「年齢 + 性別 + 郵便番号」の 3 項目で米国人口の 87% は特定可能 (Sweeney, 2000)。 Netflix Prize や AOL 検索ログ漏洩など歴史的事例多数。 k-匿名性・l-多様性・t-closeness 等の多層的保護が必要。
  2. トレーニングデータのバイアスを軽視する: 過去の採用データで学習すると、 過去の差別パターンが永続化する (Amazon の AI 採用ツール事件)。 「データは中立ではない」「データは過去を映す」が原則。 公平性監査と再サンプリング・重み付けで補正する。
  3. 同意の形式化 (ダークパターン): 「同意します」ボタンが大きく、 拒否選択肢が小さい / 階層深く隠されている等の UI 設計は GDPR 違反。 同意は自由・具体的・情報に基づく・明示的でなければ無効。
  4. 目的外利用 (secondary use): 医療データを健康保険料の決定に流用、 SNS のデータを信用スコアに使う等。 当初の同意範囲を逸脱した利用は法的にも倫理的にも違反。 用途変更時は再同意が原則。
  5. 説明可能性の放棄 (ブラックボックス問題): 深層学習モデルの判断を「ブラックボックスだから」と説明放棄するのは GDPR 第 22 条 (自動意思決定への異議申し立て権) に抵触する可能性。 LIME・SHAP 等の事後説明手法、 解釈可能モデルの選択を検討する。

🗺 概念マップ

データ倫理の中心から、 差分プライバシー (DP)k-匿名性FAIR 原則同意取得 (Informed Consent)説明責任 (Accountability)公平性 (Fairness)といった主要原則への接続を整理した。 SSDSE-B-2026 のように公開済みの統計でも、 結合により再識別リスクが生じる場合があるため、 倫理判断のチェックリストとして使える。

データ倫理 差分プライバシー (DP) k-匿名性 アルゴリズムバイアス 公平性 (Fairness) 説明可能性 (XAI) GDPR (EU 一般データ

概念マップは「データ倫理」を 3 つの隣接枠組と接続する。 右方の 公平性 (Fairness) は性別・人種・地域などの保護属性間で結果に偏りが出ないかを定量的に評価する技術 (demographic parity・equalized odds 等)。 左下の 説明可能性 (XAI) は SHAP・LIME・カウンターファクチュアル説明など、 モデル判断の根拠を当事者に提示する技術。 左上の GDPR はデータ倫理を法令化した代表例で、 EU 圏では「忘れられる権利」「自動意思決定からの離脱権」が個人に付与される。

データ倫理が他の AI 用語と異なる点は、 数式や指標で完結しない 部分が大きいことにある。 公平性指標が満たされていてもステークホルダー合意が無ければ運用不能、 説明可能性ツールがあっても説明先の理解度に合わせなければ実効性ゼロ。 SSDSE のような公的統計でも、 都道府県別の平均値を地域差別に転用しない、 個票へのリンク可能性 (推測リスク) を遮断する、 など研究者個人の判断が常に問われる。

🔗 隣接手法への橋渡し

「data ethics」を中心に、 隣接する手法・概念との関係を以下に整理する。 単独の手法理解にとどまらず、 分析パイプライン全体での位置付けを把握することで、 適切な前段・後段・代替手法を選べる。

隣接手法関係接続のポイント
差分プライバシー (DP)上位 / 一般化「data ethics」と組み合わせる/比較する場面で参照
k-匿名性下位 / 特殊化「data ethics」と組み合わせる/比較する場面で参照
アルゴリズムバイアス並列 / 対比「data ethics」と組み合わせる/比較する場面で参照
公平性 (Fairness)前段 (前処理)「data ethics」と組み合わせる/比較する場面で参照
説明可能性 (XAI)後段 (後処理)「data ethics」と組み合わせる/比較する場面で参照
GDPR (EU 一般データ保護規則)評価 / 比較「data ethics」と組み合わせる/比較する場面で参照

目的明示 → 同意取得 → 匿名化 → 利用範囲限定 → 監査ログ → 結果公開の流れで、 法令遵守だけでなく社会受容性を設計する。

🌳 手法選択フロー

データ倫理は収集同意、 公平性、 透明性の三軸で運用する。

  1. 収集の同意は? Yes → プライバシー、 No → データガバナンス を先に確認
  2. 公平性は確認したか? Yes → アルゴリズムバイアス、 No → AI 倫理 を先に確認
  3. 透明性・説明責任は? Yes → アカウンタビリティ、 No → 説明可能 AI を先に確認

個人情報なら GDPR/個情法、 AI 利用なら AI 倫理ガイドライン、 研究なら IRB、 と「対象と文脈」で選ぶ。