보험 도메인 심화 · 누구인지 모르게 내보내기 · 실습
청구 자료를 내보내되 누구인지 모르게
목표
합성 실손 청구 자료를 분석용으로 내보낸다. 직접 식별자를 걷어 내고 날짜를 일반화하고 작은 지역과 드문 값을 눌러 담아 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 를 남긴다. 해시와 건수는 실제 파일에서 재고, 점검 목록에는 근거와 적용 범위를 함께 적는다.
참고
- claims.csv 머리글: claim_id,member_id,name,birth_date,sex,zip5,city,claim_date,admit_date,dx_code,amount,hospital
- stripped.csv 머리글: rec_id,birth_date,sex,zip5,city,claim_date,admit_date,dx_code,amount
- generalized.csv 머리글: rec_id,birth_year,age_over_89,sex,zip5,city,claim_year,dx_code,amount
- suppressed.csv 와 export.csv 머리글: rec_id,birth_year,age_over_89,sex,zip3,claim_year,dx_code,amount
- 준식별자는 3단계에서는 birth_date·sex·zip5, 6단계부터는 birth_year·age_over_89·sex·zip3·claim_year 입니다.
- 나이는 2026 에서 출생연도를 뺀 값으로 계산합니다(이 실습의 가정). 진단코드는 DX-A10 모양의 합성 코드이고, 사람·지역·병원 이름도 전부 합성입니다.
- 채점기는 단계마다 앞 단계 파일에서 이번 단계의 결과를 다시 계산해 한 줄씩 대조하고, k도 다시 셉니다.
- 흔한 실수: 억제를 먼저 해서 자료를 절반 넘게 버리기, 입원일을 남겨 두기, 점검 목록에 원본 날짜를 그대로 옮겨 적기.
단계 8개
- 합성 청구 스냅샷과 지역 인구표 만들기
- 직접 식별자 걷어 내기
- 조합 하나가 몇 명을 가리키는지 세기
- 날짜를 연도로 줄이고 고령을 묶기
- 작은 지역과 드문 진단코드 눌러 담기
- k를 5로 올리고 잃은 양 재기
- 재식별을 직접 시도해 보기
- 반출 기록과 점검 목록 남기기