LabHub
学习 学习路径 课程

保险领域进阶

导出理赔数据,却认不出是谁

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

합성 실손 청구 자료를 분석용으로 내보낸다. 직접 식별자를 걷어 내고 날짜를 일반화하고 작은 지역과 드문 값을 눌러 담아 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 를 만든다. 우편번호는 앞 세 자리만 남기되 인구 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 를 만드세요.

한 사람이 여러 번 청구하게 만들고, 생년월일은 날짜까지 흩어 놓으세요. 그래야 조합이 혼자뿐인 줄이 생깁니다. 90세를 넘긴 가입자와 인구가 적은 지역, 드물게만 나오는 진단코드도 넣어야 뒤 단계에서 다룰 거리가 생깁니다.

직접 식별자 걷어 내기

/root/deid/strip.py/root/deid/stripped.csv 를 만드세요. 이름·회원번호·청구번호·병원명은 빼고 rec_id 를 붙입니다.

읽을 파일은 1단계에서 만든 /root/deid/claims.csv 입니다. 줄은 하나도 버리지 않습니다. rec_id 는 원본 순서 그대로 붙여야 나중에 같은 줄을 가리킬 수 있습니다. 병원 이름을 빼는 이유는 작은 병원이 사는 곳을 좁혀 주기 때문입니다.

조합 하나가 몇 명을 가리키는지 세기

/root/deid/kcount.py 로 birth_date·sex·zip5 조합의 k를 세어 /root/deid/k_before.json 에 적으세요.

읽을 파일은 /root/deid/stripped.csv 입니다. 조합별 줄 수를 세고 그 최솟값이 k 입니다. 혼자뿐인 줄(k가 1)이 몇 개인지, 다섯 명이 안 되는 줄이 몇 개인지도 함께 셉니다. 이 숫자가 다음 단계들의 출발점입니다.

날짜를 연도로 줄이고 고령을 묶기

/root/deid/generalize.py/root/deid/generalized.csv 를 만드세요. 90세를 넘으면 출생연도까지 지웁니다.

읽을 파일은 /root/deid/stripped.csv 입니다. 연도를 뺀 날짜 요소는 남기지 않는 것이 Safe Harbor 의 규칙입니다. 나이는 2026 에서 출생연도를 뺀 값으로 봅니다. 아주 많은 나이는 연도 하나만으로도 사람이 좁혀져서 한 칸으로 묶습니다.

작은 지역과 드문 진단코드 눌러 담기

/root/deid/suppress.py/root/deid/suppressed.csv 를 만드세요. 인구 20000명 이하 지역은 000, 빈도 5회 미만 진단코드는 RARE 입니다.

읽을 파일은 /root/deid/generalized.csv 와 /root/deid/zip_pop.csv 입니다. 우편번호 앞 세 자리를 남기는 것은 그 지역에 사람이 충분히 많을 때만입니다. 인구표를 읽어 판단하세요. 진단코드 빈도는 이번에 내보내는 자료 안에서 셉니다.

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 에서 잽니다. 기록에는 원본과 반출본의 해시, 적용한 규칙, 목적과 승인자, 보관 기간이 들어갑니다. 점검 목록에는 근거 조문과 함께 그 기준이 우리에게 그대로 적용되는지도 적으세요. 원본 날짜를 목록에 옮겨 적으면 목록이 또 하나의 유출본이 됩니다.