deidentify について
deidentifyは、患者の生データをLLMに渡さず、ローカルスクリプトで匿名化処理を進めるための医療研究者向けスキルです。研究者による確認と監査記録を重視し、処理できる範囲と限界も明示します。
主な機能
- 01ローカルPython匿名化ワークフロー
- 02地域別の識別子パターン
- 03対話式の列レビュー
- 04仮名化と日付シフト
- 05監査ログとマッピングファイルの出力
- 06HIPAA関連の制限に関する説明
活用シーン
- 01分析用の患者データセットの準備
- 02処理前の識別子分類の確認
- 03監査ログを使った変更の検証
- 04論文向け匿名化方法の記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aperivue/ medsci-skills --skill deidentifyインストール後、Claude Code で/deidentifyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
deidentify.pyskill.ymllocales/_template.jsonau.jsonca.jsoncn.jsonde.jsones.jsonfr.jsonin.jsonit.jsonjp.jsonkr.jsonuk.jsonus.jsonreferences/date_shift_guide.mdhipaa_18_identifiers.mdkorean_phi_patterns.mdtests/README.mdtest_clean.csvtest_deidentify_scan.shtest_edge_cases.csvtest_phi_italian.csvtest_phi_korean.csvtest_phi_spanish.csv詳細
匿名化スキル
医療研究者によるデータの匿名化を支援します。実際の匿名化は、LLM を一切使用せずに実行されるスタンドアロンの Python スクリプトが行います。あなたの役割は、説明、案内、確認です。生の PHI データを閲覧したり処理したりしてはいけません。
重要な安全ルール
- PHI を含む生データを貼り付けたり、表示したり、アップロードしたりするよう、ユーザーに絶対に求めないでください。 スクリプトはローカルでデータを処理します。患者単位のデータを見る必要はありません。
- **マッピングファイルの内容を絶対に読み取ったり、表示したりしないでください。**元の PHI 値が含まれています。
- 読み取ってもよいものは、スキャンレポートとレビュー済みレポート(列の分類。セルの値は含まれません)、および監査ログ(キー付きハッシュ。元の値は含まれません)です。匿名化済みの出力を読み取るのは、研究者がレビューを実行して確認した後に限ります。出力からは、研究者が匿名化すると選択した識別子が削除され、それ以外の情報は削除されていません(「このツールが行わないこと」を参照)。
- **プロセスについては、必ずユーザーの希望する言語で伝えてください。**ただし、技術用語(PHI、HIPAA、Safe Harbor など)は英語を使用してください。
- **スクリプトは研究者が自分のターミナルで実行します。**あなたが実行してはいけません(
!接頭辞や Bash ツールの呼び出しは使用しないでください)。レビューでは、すべての列のサンプル値が表示されます。
参考ファイル
${CLAUDE_SKILL_DIR}/references/hipaa_18_identifiers.md— HIPAA Safe Harbor チェックリスト${CLAUDE_SKILL_DIR}/references/korean_phi_patterns.md— 韓国固有の正規表現パターン${CLAUDE_SKILL_DIR}/references/date_shift_guide.md— 日付シフトのベストプラクティス
研究者に助言する前に、関連する参考資料を読んでください。
前提条件
- Python 3.9+
openpyxl(.xlsx ファイル用):pip install openpyxl- 対応形式:CSV、TSV、Excel(.xlsx)
5 段階のワークフロー
フェーズ 1:評価
研究者に次の質問をしてください。
- データのファイル形式は何ですか?(CSV、Excel など)
- データにどのような PHI が含まれていると考えられますか?(氏名、日付、ID など)
- IRB で特定の匿名化に関する文書が求められていますか?
- 後で再識別する必要がありますか?(マッピングファイルの選択に影響します)
回答に基づいて、適切なコマンドを推奨してください。
- パイプライン全体(最も一般的):
python3 deidentify.py full <file> --locale <code> - ステップごとの実行(慎重に進める場合):最初に
python3 deidentify.py scan <file> --locale <code>を実行
使用可能なロケールコード:kr(韓国)、us(米国)、jp(日本)、cn(中国)、de(ドイツ)、
uk(英国)、fr(フランス)、ca(カナダ)、au(オーストラリア)、in(インド)、it(イタリア)、es(スペイン)。
--locale を省略すると、スクリプトに国を選択する対話型メニューが表示されます。
--locale-file custom.json を指定すると、カスタムロケールファイルを使用できます。
フェーズ 2:スクリプトの実行
スクリプトの実行を研究者に案内してください。スクリプトの場所:
${CLAUDE_SKILL_DIR}/deidentify.py
パイプライン全体(ほとんどのユーザーに推奨):
python3 ${CLAUDE_SKILL_DIR}/deidentify.py full data.xlsx \
--locale kr \
--output-dir ./deidentified/
ステップごとの実行(慎重にレビューする場合):
# Step 1: Scan
python3 ${CLAUDE_SKILL_DIR}/deidentify.py scan data.xlsx --locale kr --output-dir ./deidentified/
# Step 2: Review (interactive)
python3 ${CLAUDE_SKILL_DIR}/deidentify.py review ./deidentified/scan_report.json
# Step 3: Apply (refuses a report that was not reviewed, has a column without a decision,
# or was made from data that has changed since: edit the file, then scan and review again)
python3 ${CLAUDE_SKILL_DIR}/deidentify.py apply ./deidentified/reviewed_report.json
オプション:
--locale CODE:PHI パターンに使用する国別ロケール(kr、us、jp、cn、de、uk、fr、ca、au、in、it、es)--locale-file PATH:カスタムロケールの JSON ファイル(locales/_template.jsonをコピーして作成)--auto-accept-safe:SAFE 列を表示せずに保持します。推奨しません。SAFE はパターンに一致しなかったことを意味するだけで、列に識別子が含まれていないことを意味するわけではありません(短いコメントに入力された氏名はどのパターンにも一致しない場合があります)。また、このオプションを使うと、誰もそれらの列を確認しません。--hash-mapping:マッピングファイルに元の氏名や ID ではなく、キーなしの SHA-256 ハッシュを保存します。日付や数値 ID は、あらゆる候補を試すことでこのようなハッシュから復元できるため、いずれの場合も mapping.json のアクセスは制限したままにしてください。--output-dir:匿名化済みファイル、マッピング、監査ログの保存先-v/--verbose:デバッグログを有効にする
フェーズ 3:対話形式のレビューガイダンス
スクリプトのターミナルレビューは、次の 3 回のパスで行います:
- パス 1 — 列の分類:各列を PHI/REVIEW_NEEDED/SAFE としてサンプル値とともに表示します。研究者は各分類を確認するか、上書きします。
- パス 2 — 未決定項目:パス 1 で決定されなかった列を、より多くのサンプル値とともに再確認します。
- パス 3 — 最終サマリー:予定されているすべてのアクションを表形式で表示します。研究者は確定前に個々の判断を編集できます。
- 患者キー(日付をシフトする場合のみ):研究者は患者を識別する列を選択します。各行が異なる患者の場合は
rowを選択します。患者ごとに個別のオフセットが設定されます。キーがない場合、ツールは日付をシフトしません。
研究者を支援します。次のプロンプトを研究者の希望する言語で提示します:
- 「PHI と分類された列は、デフォルトで匿名化されます。元の値を保持するには 'k' を押してください。」
- 「REVIEW_NEEDED は、スクリプトが安全だと判断できなかった列です。自由記述、長い列名に含まれる PHI の語、ID のような数字、まれな住所などが該当します。サンプル値を確認し、'a' または 'k' を入力してください。Enter のみでは受け付けられません。」
- 「SAFE は、パターンに一致しなかったことを意味するだけで、識別子が含まれていないという意味ではありません。サンプル値も確認し、名前などの識別情報を含む列があれば 'r' を押してください。」
- 自由記述の列で 'a' を選択すると、文章全体がそれぞれ
[REDACTED]に置き換えられます。スクリプトは文中の名前を見つけられないため、文章の残りを保持しようとはしません。
フェーズ 4:検証と記録
スクリプトの完了後、研究者による次の検証を支援します:
-
監査ログを読む(元の値は含まれません。
before_hashは、mapping.json のみに保持される実行ごとのキーを使った HMAC-SHA256 です):cat ./deidentified/audit_log.csv | head -20変更数、影響を受けた列、PHI の種類を確認します。
-
まず研究者自身のターミナルで、匿名化されたファイルを抜き取り確認するよう依頼する:予想どおりの仮名(P0001 など)、シフトされた日付、[REDACTED] マーカー、および保持した列に名前が含まれていないことを確認します。研究者が確認してから、あなた自身がファイルを読みます。
-
機微な列が実際に削除されていることを確認する: 元の名前、電話番号、RRN 値が残っていないことを確認します。
-
マッピングファイルのセキュリティ:
- 研究者に次の点を伝えます:「mapping.json には元の患者識別情報が含まれています。制限付きファイルとして扱ってください。」
- 匿名化されたデータとは別に保管することを推奨します
- ファイルのアクセス権は自動的に 0600(所有者のみ)に設定されます
フェーズ 5:文書化
論文または IRB 向けに、匿名化手法についての段落を作成します:
テンプレート:
解析前に、ルールベースの匿名化ツール(deidentify.py、medsci-skills)と [COUNTRY] ロケールパターンパックを使用して、データセットから直接識別子を削除しました。このツールは、 国固有の識別子(例:国民 ID 番号、電話番号)、メールアドレス、日付、住所の正規表現パターンを 使用して、列名とセル値をスキャンしました。各列の分類は、対話形式のターミナルセッションで 研究者が確認しました。名前は仮名(P0001、P0002、...)に置き換え、日付は患者ごとにランダムな オフセット(1~365 日、前後いずれか)でシフトして、相対的な時間間隔を保持しました。また、直接 識別子(電話番号、メールアドレス、国民 ID 番号)は削除しました。[N] 個のセル、[M] 個の列を 匿名化しました。匿名化のマッピングファイルは、制限付きアクセスのもとで別途保管しました (ファイルのアクセス権は 0600)。
実際の監査ログの統計に合わせて調整します。「ツールが行わないこと」に記載された不足点も解消されているか、専門家による判定で対応されていない限り、データセットが「HIPAA Safe Harbor に基づいて匿名化された」(または別の法律に基づいて匿名化された)とは記載しないでください。
スキル間の連携
- deidentify は、研究パイプラインで
clean-dataの前に実行します - 匿名化の後、データ品質のプロファイリングを行うために
/clean-dataに引き継ぎます /analyze-statsでは、匿名化済みの出力を安全に処理できます/write-paperの方法セクションでは、匿名化のプロセスに言及してください/write-protocolでは、プロトコルの文書化に HIPAA/PIPA の参照ファイルを使用できます
出力ファイル
| ファイル | PHI を含むか | Claude で安全に扱えるか | 用途 |
|---|---|---|---|
*_deidentified.xlsx/csv | 研究者が残した情報と、ツールが検出できない情報のみ(下記参照) | 研究者が確認した後 | 分析用データ |
mapping.json | はい | いいえ | 元の値と仮名の対応、患者ごとの日付オフセット、監査ハッシュキー |
audit_log.csv | 元の値なし(キー付きハッシュ) | はい | 変更内容と変更箇所 |
scan_report.json | セルの値なし | はい | 列の分類結果 |
reviewed_report.json | セルの値なし | はい | 研究者がレビューした分類と患者キー列 |
このツールが行わないこと
このツールは、研究者が匿名化対象として指定した識別情報を削除または置換します。データセットを HIPAA Safe Harbor に準拠して匿名化したり、他の法律に基づいて匿名にしたりするものではありません。
- 89 歳を超える年齢はそのまま残ります。 Safe Harbor では、90 歳以上をまとめる必要があります(例:「90+」)。共有前に対応してください。
- シフトした日付には日と月が残ります。 Safe Harbor では年以外のすべての日付要素を削除します。日付のシフトは別の方法です(通常、専門家による判定で正当化される場合や、限定データセット内で使用される場合があります)。スクリプトで解析できない日付は
[DATE_SHIFTED]になります。 - テキスト内の氏名は検出されません。 自由記述の列は REVIEW_NEEDED に分類され、匿名化する場合は列全体が置換されます。短いコメント列内の氏名は SAFE と分類される場合があります。レビュー画面には各列のサンプル値が表示されるため、研究者が確認できます。
- まれな組み合わせは評価されません。 小規模なセル、まれな診断、または準識別子(年齢+性別+ZIP+入院月)から患者が特定される可能性があります。k-匿名性のチェックは行われません。
- 地理情報の粒度は、パターンの細かさに依存します。 住所と郵便番号はロケールごとに検出されます。ZIP コードを 3 桁に短縮する処理(Safe Harbor)は行われません。
- 既知の制限 — 米国の 5 桁のみの ZIP コード: ZIP 列は、列名(
zip、zipcode、zip_code)または ZIP+4 形式(94110-1234)によって検出されます。5 桁のみの値は他の 5 桁コード(例:処置コード)と区別できないため、別の列名を持つ ZIP 列が SAFE に分類される場合があります。レビューでサンプル値を確認してください。 - 既知の制限 — 日付: 次の表記は SAFE に分類されます。月が先でハイフンを使う形式(
Mar-15-2024)、年が先で月を単語で表す形式(2024-Mar-15)、月と年のみの形式(March 2024)、英語以外の月名(15 mars 2024、15. März 2024)、およびusロケール以外での 2 桁年の日付(ukロケールでの15/03/24)。usでは、M/D/YY形式の値(例:1/2/10)はすべて日付として扱われるため、このような 3 要素の数値が並ぶ列は PHI/日付としてフラグ付けされます。 - 検出されないもの: URL、IP アドレス、アカウント番号、ライセンス番号、車両番号、デバイス番号(ファックス番号は、ロケールの電話番号の形式に該当する場合のみ)、および列名やファイル名に記載された識別情報。Excel ファイルでは最初のシートのみが処理されます(その他のシートは出力に書き込まれません)。
対応範囲と制限
対応済み(v1):
- 構造化された表形式データ:CSV、TSV、Excel(.xlsx)
- 国ごとのPHIパターンに対応する12か国のロケール:
- 韓国(kr):RRN(주민번호)、電話番号、メールアドレス、住所、ハングルの氏名、日付
- 米国(us):SSN、米国の電話番号、米国の住所、郵便番号
- 日本(jp):マイナンバー、日本の電話番号、都道府県の住所、漢字の氏名
- 中国(cn):身份证号、中国の電話番号、省市区の住所、中国語の氏名
- ドイツ(de):Steuer-ID、ドイツの電話番号、Straße形式の住所
- 英国(uk):NHS Number、NI Number、英国の電話番号、郵便番号
- フランス(fr):NIR/INSEE、フランスの電話番号、Rue形式の住所
- カナダ(ca):SIN、カナダの電話番号、郵便番号
- オーストラリア(au):TFN、Medicare number、オーストラリアの電話番号
- インド(in):Aadhaar、PAN、インドの電話番号、PINコード
- イタリア(it):Codice Fiscale、イタリアの電話番号、Via形式の住所
- スペイン(es):DNI/NIE、スペインの電話番号、Calle形式の住所
- すべてのロケールで使える汎用パターン:メールアドレス、ISO形式の日付、高カーディナリティの数値ID(MRN)
- すべてのロケールで英語の列名を認識
- テンプレートを使用した
--locale-fileによるカスタムロケールのサポート - 仮名化、日付のシフト、IDの置換、抑制
非対応(v2で対応予定):
- DICOM画像メタデータ(PS3.15 Annex E)— pydicomが必要です
- 臨床自由記述のNER(臨床記録、放射線レポート)
- k-匿名性/l-多様性の自動評価
- SPSS(.sav)、SAS(.sas7bdat)、その他の統計形式
ハルシネーションの防止
- ファイルパス、URL、DOI、パッケージ名を捏造しないでください。 推奨する前に、実在することを確認してください。
- 確認せずに、ジャーナルのメタデータ、インパクトファクター、投稿規定を作り上げないでください。 ジャーナルのウェブサイトで確認してください。
- ツール、パッケージ、リソースが存在しない場合、または確信がない場合は、推測せず、その旨を明確に伝えてください。