designing-privacy-preserving-analytics について
個人データから統計的な知見を得る組織向けのガイドです。差分プライバシー、k-匿名性、l-多様性、t-近接性のほか、プライバシー予算の管理と実装手順を説明します。
主な機能
- 014つの統計的開示制御手法の解説
- 02差分プライバシー予算の配分方法
- 03予算枯渇時の手順
- 04分析実装ワークフロー
- 05予算追跡と監査記録
活用シーン
- 01プライバシー保護型の統計分析を設計
- 02クエリごとに差分プライバシー予算を配分
- 03複数クエリの累積プライバシー損失を追跡
- 04保護された分析の出力と記録を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ privacy-data-protection-skills --skill designing-privacy-preserving-analyticsインストール後、Claude Code で/designing-privacy-preserving-analyticsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/template.mdreferences/standards.mdworkflows.mdscripts/process.py詳細
プライバシーを保護する分析の設計
概要
プライバシーを保護する分析を利用すると、個人単位の情報を明らかにすることなく、組織が個人データから統計的な知見を得られます。これは、GDPR 第 5 条 1 項(c)(データ最小化)および前文 26(真に匿名化されたデータを規制の適用対象外とする)を直接支えるものです。第 29 条作業部会による「匿名化技術に関する意見書 05/2014」(WP216)では、効果的な匿名化には、個人の特定、データの連結、推論による攻撃への耐性が必要であると定められました。
プライバシーを保護する分析の基盤となる主な統計的開示制御技術は、差分プライバシー、k-匿名性、l-多様性、t-近接性の 4 つです。それぞれ、プライバシー保証とデータの有用性の間で異なるトレードオフを提供します。
統計的開示制御技術
差分プライバシー
差分プライバシー(Dwork ら、2006 年)は、特定の個人のデータを含めるかどうかにかかわらず、分析の出力がほぼ同じになるという数学的な保証を提供します。形式的には、1 件以内のレコードが異なるすべてのデータセット D1 と D2、およびすべての出力集合 S について、ランダム化メカニズム M が (epsilon, delta)-差分プライバシーを満たす場合、次のようになります。
P[M(D1) ∈ S] ≤ e^ε × P[M(D2) ∈ S] + δ
ここで、epsilon(ε)はプライバシー損失パラメーター、delta(δ)はプライバシー侵害の確率の上限です。
プライバシー予算の割り当て:
| イプシロンの範囲 | プライバシーレベル | 一般的なユースケース |
|---|---|---|
| 0.01 — 0.1 | 非常に強い | 医療研究、遺伝子データ、機密性の高い分析 |
| 0.1 — 1.0 | 強い | 汎用分析、人口統計分析 |
| 1.0 — 5.0 | 中程度 | ビジネス指標の集計、傾向分析 |
| 5.0 — 10.0 | 弱い | 機密性の低い件数、すでに公開されている統計 |
主なライブラリ:
| ライブラリ | メンテナー | 言語 | メカニズムの種類 |
|---|---|---|---|
| Google DP Library | C++/Java/Go | ラプラス、ガウス、パーティション選択 | |
| OpenDP | Harvard IQSS & Microsoft | Rust/Python | 合成可能なフレームワーク、ラプラス、ガウス、指数 |
| Apple PPML | Apple | Swift | ローカル差分プライバシー、count-mean-sketch、ハダマール応答 |
| IBM diffprivlib | IBM Research | Python | Scikit-learn 互換、差分プライバシーを用いた機械学習 |
| PyDP | OpenMined | Python(C++ バックエンド) | Google DP Library の Python ラッパー |
k-匿名性
データセット内のすべてのレコードが、準識別子属性に関して少なくとも k-1 件の他のレコードと区別できない場合、そのデータセットは k-匿名性(Sweeney、2002 年)を満たします。準識別子とは、外部データと組み合わせることで個人の再識別につながる可能性のある属性です(例:年齢、郵便番号、性別)。
実装方法:
- データセット内の準識別子を特定します
- 一般化階層を適用します(例:年齢 27 → 年齢範囲 25-30、郵便番号 8001 → 80**)
- 一般化だけでは k-匿名性を達成できないレコードに、抑制を適用します
- すべての同値類で k 値を検証します
制約事項: k-匿名性では、同値類内の機密値が均質な場合、属性の開示を防げません。
l-多様性
l-多様性(Machanavajjhala ら、2007 年)は、各同値類に機密属性の「十分に代表された」値が少なくとも l 個含まれることを求めることで、k-匿名性を拡張します。これにより、属性開示攻撃を防ぎます。
種類:
- Distinct l-diversity: 各同値類に、異なる機密値が少なくとも l 個含まれます
- Entropy l-diversity: 各クラスにおける機密値のエントロピーが ≥ log(l) となります
- Recursive (c,l)-diversity: 最も頻度の高い機密値の出現回数が、最も頻度の低い値の出現回数の c 倍未満となります
t-Closeness
t-Closeness(Li ら、2007 年)では、任意の同値類における機微属性の分布が、データセット全体におけるその属性の分布から距離 t 以内であることを、Earth Mover's Distance(EMD)を用いて測定します。
これにより、l-diversity が満たされている場合でも、攻撃者が同値類内の分布から機微属性を推測できる、偏りを利用した攻撃を防止します。
プライバシーバジェットの管理
プライバシーバジェットは、複数のクエリにわたる累積的なプライバシー損失を追跡します。逐次合成では、プライバシー損失の合計は個々のイプシロンの総和になります。並列合成(互いに素なサブセット)の場合、プライバシー損失の合計は個々のイプシロンの最大値になります。
Prism Data Systems AG の分析機能に対するバジェット割り当てフレームワーク:
| 分析機能 | イプシロンの割り当て | 更新頻度 | 根拠 |
|---|---|---|---|
| 日次アクティブユーザー数 | 1 日あたり 0.1 | 毎日 | 機微性が低く、頻度が高い |
| 地域別売上 | 1 四半期あたり 0.5 | 四半期ごと | 機微性が中程度、集計指標 |
| 機能の使用パターン | 1 か月あたり 0.3 | 毎月 | Art. 6(1)(f) に基づく製品開発に使用 |
| 顧客離脱分析 | 1 四半期あたり 0.2 | 四半期ごと | 行動プロファイリングを伴う |
| A/B テストの結果 | 1 実験あたり 0.1 | 実験ごと | 二値の結果であり、開示リスクが低い |
| 年間バジェットの合計 | ≤ 8.0 | 合成を考慮した全機能の合計 |
バジェット枯渇時のプロトコル:
- 年間バジェットの 80% が消費された時点で、データ保護責任者に通知します
- 95% が消費された時点で、追加のクエリごとに DPO の承認を必須とします
- 100% が消費された時点で、次のバジェット期間まで、以降の差分プライバシークエリをすべてブロックします
- 緊急クエリには、DPO と最高情報セキュリティ責任者の共同承認が必要です
アーキテクチャ設計
┌──────────────────────────────────────────────────────────┐
│ Analyst Interface │
│ (SQL-like query submission) │
└──────────────────────┬───────────────────────────────────┘
│
┌──────────────────────▼───────────────────────────────────┐
│ Privacy Gateway │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────┐ │
│ │ Query Parser │ │ Budget Check │ │ Sensitivity │ │
│ │ & Validator │ │ (ε tracker) │ │ Calibration │ │
│ └──────┬──────┘ └──────┬───────┘ └───────┬────────┘ │
│ └────────────────┼──────────────────┘ │
└──────────────────────────┼───────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────┐
│ Noise Injection Layer │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Laplace │ │ Gaussian │ │ Exponential │ │
│ │ Mechanism │ │ Mechanism │ │ Mechanism │ │
│ └──────────────┘ └──────────────┘ └───────────────┘ │
└──────────────────────────┬───────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────┐
│ Data Processing Layer │
│ ┌─────────────────┐ ┌──────────────────────────────┐ │
│ │ k-Anonymization │ │ Aggregation Engine │ │
│ │ Pre-processing │ │ (min group size: 11) │ │
│ └─────────────────┘ └──────────────────────────────┘ │
└──────────────────────────┬───────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────┐
│ Encrypted Data Store │
│ (Field-level AES-256-GCM encrypted) │
└──────────────────────────────────────────────────────────┘
実装ワークフロー
-
分析クエリを分類する — 各分析ユースケースを機微性(直接識別子へのアクセス、準識別子の組み合わせ、機微属性の有無)に応じて分類し、イプシロンのバジェット割り当てを設定します。
-
メカニズムを選択する — クエリの種類に応じて適切なノイズメカニズムを選びます。カウントクエリにはラプラスメカニズム、(ε,δ)-DP を必要とする平均・分散クエリにはガウスメカニズム、選択クエリには指数メカニズムを使用します。
-
感度を調整する — 各クエリ関数の大域感度(一つのレコードを追加または削除した場合に出力が変化する最大量)を特定します。可能な場合は、入力値をクリッピングして有界感度を使用します。
-
バジェット追跡を実装する — 各クエリのイプシロン消費量を記録し、合成の上限を適用し、バジェットが枯渇した際にクエリをブロックする、プライバシーバジェットの集中管理台帳を導入します。
-
前処理を適用する — 差分プライバシーだけでは有用性が不十分な場合、前処理として k-anonymity を適用し、後続の DP クエリの感度を下げます。
-
出力を検証する — 公開する統計が最小グループサイズ(Prism Data Systems AG の方針では 11 レコード)に違反していないこと、およびノイズを加えた結果とともに信頼区間が報告されていることを確認します。
-
監査証跡 — プライバシー保護クエリごとに、タイムスタンプ、分析担当者の識別情報、クエリのハッシュ、消費したイプシロン、使用したメカニズム、残りの累積バジェットを記録します。
主な規制上の参考資料
- GDPR 第 5 条 1 項 c 号 — データ最小化の原則
- GDPR 第 5 条 1 項 e 号 — 保存期間の制限
- GDPR 第 25 条 — データ保護の設計およびデフォルト設定
- GDPR 第 89 条 — 科学的・歴史的研究または統計目的の処理に対する保護措置
- GDPR 前文第 26 項 — 匿名情報の適用範囲
- GDPR 前文第 162 項 — 統計目的
- 第 29 条作業部会「匿名化技術に関する意見書 05/2014」(WP216)
- ENISA レポート:仮名化の技術とベストプラクティス(2019 年 11 月)