TT Lab
はじめる
学ぶ 学習パス コース

保険ドメイン深化

請求データを、誰か分からないまま送り出す

TT Labで続きを見る

目標

合成の実損請求データを分析用に持ち出します。直接識別子を取り除き、日付を一般化し、小さな地域とまれな値をまとめて、kを5以上に引き上げたあと、再識別を自分で試して、持ち出し記録を残します。

なぜ重要なのか

名前と会員番号を消しても、生年月日・性別・郵便番号が残っていると、ほとんどの人は自分の行を見つけ出せます。準識別子の組み合わせが何人を指すか(k)を数える前は、何も証明されていません。 kを上げる方法は、値をぼかすか行を除くかだけで、順序を逆にすると、捨てる行が雪だるま式に増えます。そのため、一般化を先に行い、抑制は最後に行います。 点検リストのお手本には、米国HIPAAの45 CFR 164.514 Safe Harborの18項目を使いますが、この規定は、韓国の保険会社にはそのまま適用されません。国内の基準は個人情報保護法で、健康情報は機微情報として、より厳しく扱われます。

ステップ

  1. /root/deid/gen_claims.pyを作成して実行し、/root/deid/claims.csv(700件以上、会員300人以上)と/root/deid/zip_pop.csvを作ってください。90歳を超えた加入者の請求5件以上、頻度5回未満の診断コード3種以上、人口20000人以下の地域2か所以上を入れてください。
  2. /root/deid/strip.pyで直接識別子を取り除き、/root/deid/stripped.csvを作ってください。rec_idは、元の順序どおりにR-000001から付けてください。
  3. /root/deid/kcount.pyで準識別子の組み合わせのkを数え、/root/deid/k_before.jsonに書いてください(qi・rows・groups・k_min・unique_rows・lt5_rows)。
  4. /root/deid/generalize.pyで日付を一般化し、/root/deid/generalized.csvを作ってください。生年月日は年だけにし、基準年2026で測った年齢が89を超えれば年まで消して、age_over_89をYにします。請求日は年だけを残し、入院日は除きます。
  5. /root/deid/suppress.pyで/root/deid/suppressed.csvを作ってください。郵便番号は上3桁だけを残し、人口20000人以下の地域は000に、頻度5回未満の診断コードはRAREに変え、都市名は除きます。
  6. /root/deid/kanon.pyで、組み合わせが5件未満の行を抑制して、/root/deid/export.csvと/root/deid/k_after.jsonを作ってください。残る行が70%以上である必要があります。
  7. /root/deid/reidentify.pyで再識別を試して、/root/deid/attack.jsonを作ってください。対象は、持ち出し分でrec_idが最も小さい行です。
  8. /root/deid/export_record.jsonと/root/deid/checklist.mdを残してください。ハッシュと件数は実際のファイルから測り、点検リストには、根拠と適用範囲を一緒に書いてください。

参考

合成請求スナップショットと地域人口表を作る

/root/deid/gen_claims.pyを作成して実行し、/root/deid/claims.csvと/root/deid/zip_pop.csvを作ってください。

1人が何度も請求するようにし、生年月日は日付まで散らしてください。そうして、組み合わせが1人だけの行ができます。90歳を超えた加入者と人口の少ない地域、まれにしか出ない診断コードも入れておかなければ、あとのステップで扱う材料がなくなります。

直接識別子を取り除く

/root/deid/strip.pyで/root/deid/stripped.csvを作ってください。名前・会員番号・請求番号・病院名は除き、rec_idを付けます。

読むファイルは、ステップ1で作った/root/deid/claims.csvです。行は1つも捨てません。rec_idは元の順序どおりに付けなければ、あとで同じ行を指し示せません。病院名を除く理由は、小さな病院が居住地を絞り込んでしまうからです。

組み合わせ1つが何人を指すかを数える

/root/deid/kcount.pyでbirth_date・sex・zip5の組み合わせのkを数え、/root/deid/k_before.jsonに書いてください。

読むファイルは/root/deid/stripped.csvです。組み合わせごとの行数を数え、その最小値がkです。1人だけの行(kが1)が何個あるか、5人に満たない行が何個あるかも一緒に数えます。この数字が、次のステップ以降の出発点です。

日付を年に減らし、高齢をまとめる

/root/deid/generalize.pyで/root/deid/generalized.csvを作ってください。90歳を超えれば、出生年まで消します。

読むファイルは/root/deid/stripped.csvです。年を除く日付要素を残さないのが、Safe Harborのルールです。年齢は、2026から出生年を引いた値とみなします。非常に高い年齢は、年1つだけでも人が絞り込まれるので、1つの区分にまとめます。

小さな地域とまれな診断コードをまとめる

/root/deid/suppress.pyで/root/deid/suppressed.csvを作ってください。人口20000人以下の地域は000、頻度5回未満の診断コードはRAREです。

読むファイルは/root/deid/generalized.csvと/root/deid/zip_pop.csvです。郵便番号の上3桁を残すのは、その地域に十分な数の人がいるときだけです。人口表を読んで判断してください。診断コードの頻度は、今回持ち出すデータの中で数えます。

kを5に上げて失った量を測る

/root/deid/kanon.pyで、組み合わせが5件未満の行を抑制して、/root/deid/export.csvと/root/deid/k_after.jsonを作ってください。

読むファイルは/root/deid/suppressed.csvです。抑制は最後の手段です。前のステップの一般化が十分なら、捨てる行は少なくなります。残る割合が70%を下回るなら、抑制を増やすのではなく、前のステップを見直してください。

再識別を自分で試してみる

/root/deid/reidentify.pyで/root/deid/attack.jsonを作ってください。対象は、持ち出し分でrec_idが最も小さい行です。

読むファイルは/root/deid/export.csvと/root/deid/stripped.csvです。攻撃者が知っているのは、一般化された値(出生年・性別・地域・請求年)だけです。同じ人を、直接識別子だけを消したバージョンで探すと何行に絞り込まれるかと比べれば、一般化が実際に何を防いだかが、数字で見えます。

持ち出し記録と点検リストを残す

/root/deid/export_record.jsonと/root/deid/checklist.mdを残してください。ハッシュと件数は、実際のファイルから測ります。

ハッシュと件数は、/root/deid/claims.csvと/root/deid/export.csvから測ります。記録には、原本と持ち出し分のハッシュ、適用したルール、目的と承認者、保管期間が入ります。点検リストには、根拠条文とともに、その基準が自社にそのまま適用されるかどうかも書いてください。原本の日付をリストに書き写すと、リストがもう1つの漏えい物になります。