AI

データ匿名化比較:ARX vs Presidio vs Faker でPII/個人情報を保護する

オープンソースラボ編集部2026年6月14日

データ匿名化比較:ARX vs Presidio vs Faker でPII/個人情報を保護する

🔒 GDPRやPIPAに対応するためのデータ匿名化・仮名化ツール。ARX・Microsoft Presidio・Fakerの特徴と使い分けを解説します。

データ匿名化の必要性

個人を特定できる情報(PII: Personally Identifiable Information)を含むデータを開発・テスト・分析に使う場合、プライバシー保護のための匿名化・仮名化が必要です。

匿名化の主要アプローチ

アプローチ内容ツール例
k-匿名性特定可能な組み合わせをぼかすARX
PII検出・マスキング個人情報を検出して置換Presidio
データ合成・偽データ生成テスト用の偽データを生成Faker

主要ツール比較表

項目ARXPresidioFaker
ライセンスApache 2.0MITMIT
用途統計的匿名化PII検出・マスキングテストデータ生成
言語Java(GUI/API)PythonPython/多言語
日本語対応○(カスタマイズ必要)
出力匿名化済みデータマスク/置換済みデータ偽データ
リアルタイム処理×
GDPRレポート××

各ツールの特徴

ARX Data Anonymization Tool

数学的プライバシー保護(k-匿名性・l-多様性・t-近接性等)を実装したJavaツール。リサーチ・コンプライアンス向けの本格的な匿名化が可能です。

主な特徴:

  • k-匿名性・l-多様性・t-近接性・δ-presence等の実装
  • GUI(デスクトップアプリ)とJava APIの両方を提供
  • データユーティリティとプライバシーのトレードオフを可視化
  • GDPRコンプライアンスレポートの出力
// ARX Java API での匿名化例
import org.deidentifier.arx.*;
import org.deidentifier.arx.criteria.*;

// データ読み込み
Data data = Data.create("patients.csv", StandardCharsets.UTF_8, ';');

// 準識別子の設定
data.getDefinition().setAttributeType("age", AttributeType.QUASI_IDENTIFYING_ATTRIBUTE);
data.getDefinition().setAttributeType("zipcode", AttributeType.QUASI_IDENTIFYING_ATTRIBUTE);
data.getDefinition().setAttributeType("disease", AttributeType.SENSITIVE_ATTRIBUTE);

// ヒエラルキーの設定(年齢のグルーピング)
data.getDefinition().setHierarchy("age", Hierarchy.create("age_hierarchy.csv", ...));

// k-匿名性(k=5)の設定
ARXConfiguration config = ARXConfiguration.create();
config.addPrivacyModel(new KAnonymity(5));
config.setSuppressionLimit(0.02d);

// 匿名化実行
ARXAnonymizer anonymizer = new ARXAnonymizer();
ARXResult result = anonymizer.anonymize(data, config);

向いているケース: 医療・統計データの本格的匿名化・コンプライアンス

Microsoft Presidio

PIIの自動検出と匿名化・仮名化を行うPythonフレームワーク。spaCy NLPを使ってテキスト中の個人情報を検出します。

主な特徴:

  • 名前・電話番号・メールアドレス・クレジットカード番号等を自動検出
  • テキストとストラクチャードデータの両方に対応
  • カスタムエンティティの追加が可能
  • 本番APIとして使えるDockerイメージを提供
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
from presidio_anonymizer.entities import RecognizerResult, OperatorConfig

# 初期化
analyzer = AnalyzerEngine()
anonymizer = AnonymizerEngine()

# テキスト中のPIIを検出
text = "私の名前は田中太郎で、メールはtanaka@example.com、電話は090-1234-5678です。"
results = analyzer.analyze(text=text, language='en')

# マスキング
anonymized = anonymizer.anonymize(
    text=text,
    analyzer_results=results,
    operators={
        "PERSON": OperatorConfig("replace", {"new_value": "[氏名]"}),
        "EMAIL_ADDRESS": OperatorConfig("mask", {"masking_char": "*", "chars_to_mask": 10}),
        "PHONE_NUMBER": OperatorConfig("replace", {"new_value": "[電話番号]"}),
    }
)
print(anonymized.text)
# → "私の名前は[氏名]で、メールは**********、電話は[電話番号]です。"

向いているケース: ログ・チャット・ドキュメントのPII自動除去

Faker

テスト用の現実感あるダミーデータを生成するライブラリ。実際の匿名化ではなく、テスト環境の構築に使います。

主な特徴:

  • 名前・住所・会社・Email・電話・クレジットカード等
  • 日本語対応(ja_JPロケール)
  • 20以上の言語ロケール対応
  • シードで再現可能なデータ生成
from faker import Faker

fake = Faker('ja_JP')

# テストデータ生成
for _ in range(5):
    print({
        "name": fake.name(),
        "email": fake.email(),
        "phone": fake.phone_number(),
        "address": fake.address(),
        "company": fake.company(),
        "credit_card": fake.credit_card_number(),
    })

# シードで再現可能
Faker.seed(42)
fake = Faker('ja_JP')
print(fake.name())  # 常に同じ名前
# SQLAlchemyと組み合わせてDBをシード
from faker import Faker
from myapp.models import User, db

fake = Faker('ja_JP')

def seed_database(count=1000):
    users = [
        User(
            name=fake.name(),
            email=fake.unique.email(),
            address=fake.address(),
        )
        for _ in range(count)
    ]
    db.bulk_save_objects(users)
    db.commit()

向いているケース: 開発・テスト環境のデータシード

選択ガイド

状況推奨
医療・統計データの本格匿名化ARX
既存データのPII検出・マスキングPresidio
テスト用偽データ生成Faker

内部リンク

外部リソース

FAQ

Q. 匿名化と仮名化の違いは何ですか?

匿名化は元のデータに戻すことが不可能な状態です。仮名化は元データとの対応表を持っており、必要に応じて復元できます。GDPRでは両者の要件が異なります。

Q. PresidioはデフォルトでNLPに英語しか対応していませんか?

デフォルトは英語ですが、カスタムエンティティとspaCyの日本語モデルを組み合わせることで日本語対応が可能です。

Q. 本番DBのデータをFakerで置き換えてステージングに使えますか?

はい、よくある使い方です。本番DBをダンプ→PIIをFakerデータで置換→ステージングDBにリストア、というパイプラインを構築できます。

Q. ARXはクラウドやAPIとして使えますか?

Java APIとして使えますが、クラウドマネージドサービスはありません。コンテナ化してREST APIを追加するカスタム実装が必要です。

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。