가짜 환자, 실제 테스트: 전문가처럼 HIPAA‑준수 데이터 생성

발행: (2025년 12월 31일 오전 01:00 GMT+9)
12 min read
원문: Dev.to

Source: Dev.to

Beck_Moulton

소개

안녕 개발자와 QA 마법사 여러분! 👋

새로운 헬스케어 앱이나 시스템을 테스트해 본 적 있나요? 스테이징이나 개발 환경에서 실제 환자 데이터를 사용하려고 하면 “NOPE!” 라는 큰 거절을 맞이하게 될 겁니다. 그리고 그럴만한 이유가 있죠! HIPAA 준수는 장난이 아니며, 실제 환자 데이터는 그런 환경에서는 거의 방사능 수준이라 위험도 높고, 적절히 익명화하기도 번거롭습니다.

그럼 실시간으로 출시하기 전에 현실감 있는 데이터를 필요로 할 때 팀은 무엇을 해야 할까요? 합성 환자를 만들어야 합니다. 하지만 단순히 무작위 이름과 생년월일을 뽑아내는 것만으로는 충분하지 않습니다. 우리는 통계적으로 유효하면서도 실제 의료 데이터셋에서 발견되는 복잡한 관계를 유지하는 데이터를 필요로 합니다. 이제 이러한 디지털 복제본을 만드는 알고리즘적 과정을 함께 살펴보겠습니다.

문제: 실제 데이터는 사용할 수 없고, 가짜 데이터는 좋아야 합니다

병원 데이터베이스를 상상해 보세요. 환자 이름만 있는 단일 테이블이 아니라 다음과 같은 테이블이 있습니다:

  • Patients – 인구통계, 연락처 정보.
  • Encounters – 방문 상세, 날짜, 이유.
  • Diagnoses – ICD 코드, 중증도.
  • Medications – 처방, 복용량, 날짜.
  • Labs – 검사 결과, 단위, 값.

이 모든 것이 서로 연결되어 있습니다! 특정 진단은 특정 방문과 연관될 수 있고, 그 방문은 특정 환자와 관련되며, 그 환자는 특정 약물을 처방받고 특정 검사 결과를 가졌을 수 있습니다.

만약 합성 데이터 생성이 가짜 환자, 가짜 진단, 가짜 약물 등을 독립적인 집합으로만 만든다면, 이러한 관계와 관련된 중요한 버그를 놓치게 될 가능성이 높습니다. 앱은 고립된 데이터에서는 잘 동작할 수 있지만, 환자를 전체 의료 기록과 연결하려 할 때 무너질 수 있습니다.

Source:

알고리즘 과제: 통계적 타당성 및 관계 무결성

여기서 실제 테스트 데이터 엔지니어링에 **“엔지니어링”**이 진정으로 들어갑니다. 실제(익명화된 혹은 우리 경우처럼 완전히 조작된) 데이터셋에서 발견되는 패턴과 상관관계를 모방하는 데이터를 생성해야 합니다.

분포 모방

목표: 실제로 환자의 30 %가 고혈압을 가지고 있다면, 합성 데이터에서도 대략 30 %가 고혈압을 나타내야 합니다. 이는 연령, 성별, 검사값 등에도 적용됩니다.

방법:

  1. 통계적 샘플링 – 기존(HIPAA‑민감하지 않은) 익명화 데이터셋이나 공공 보건 통계를 분석하여 분포를 파악합니다. 그런 다음 알고리즘을 사용해 해당 통계적 경계 내에 들어가는 새로운 데이터 포인트를 생성합니다.
  2. 생성 모델(GAN, VAE) – 익명화된 의료 데이터(또는 의료 개념을 나타내는 구조화된 데이터)로 생성적 적대 신경망(Generative Adversarial Network)이나 변분 오토인코더(Variational Auto‑Encoder)를 학습시켜 기본 패턴을 학습하고, 원본과 통계적으로 구분할 수 없는 새로운 합성 데이터 포인트를 생성합니다.

상관관계 및 의존성

목표: 당뇨병 환자가 특정 약물을 처방받을 확률이 높다면, 합성 데이터에서도 이를 반영해야 합니다. 특정 검사값이 특정 진단과 일반적으로 상관관계가 있다면, 그 연결 고리가 존재해야 합니다.

방법:

  • 규칙 기반 생성 – 명시적인 규칙을 정의합니다. 예:

    IF diagnosis.code = 'E11' (제2형 당뇨병) THEN probability(medication.name = 'Metformin') increases by X%
  • 베이지안 네트워크 – 변수들 간의 확률적 관계를 모델링합니다. 이를 통해 하나의 속성(예: 진단)의 값이 다른 속성(예: 약물)의 확률에 영향을 미치는 데이터를 생성할 수 있습니다.

  • 그래프 기반 생성 – 데이터 스키마를 그래프로 표현합니다. 그래프를 순회하면서 데이터를 생성하여 노드(테이블) 간의 관계가 유지되도록 합니다.

테이블 간 관계 무결성

목표: Patients 테이블의 환자 ID가 Encounters, Diagnoses, Medications 테이블에서도 동일한 환자를 가리켜야 합니다. 진단 코드는 유효한 코드여야 합니다.

방법:

  • 시드 데이터 및 외래키 생성 – 합성 “환자 시드” 집합을 먼저 만들고, 그 후에 진료, 진단 등을 생성하면서 항상 유효한 기존 합성 환자 ID와 연결합니다. 유효한 진단 코드, 약물 코드 등의 목록을 유지하고 그 중에서 샘플링합니다.
  • 반복적 생성 – 먼저 환자를 생성하고, 그 다음 진료를 생성한 뒤, 진료 데이터를 활용해 진단 및 약물 생성을 진행함으로써 모든 외래키 제약 조건이 충족되도록 합니다.

Source:

파이프라인 설계: 워크플로우 예시

그렇다면 실제로는 어떻게 보일까요?

  1. 스키마 및 제약 조건 정의
    복제해야 할 정확한 데이터베이스 스키마를 이해합니다. 모든 테이블, 컬럼, 데이터 타입, 그리고 핵심 외래키 관계를 식별합니다.

  2. 실제 패턴 분석(또는 정의)

    • 익명화된 집계 통계 데이터에 접근할 수 있다면, 이를 활용해 분포와 상관관계를 파악합니다.
    • 접근할 수 없다면, 도메인 전문가(의사, 간호사)와 협업하여 현실적인 패턴을 정의합니다.
  3. 생성 전략 선택

    • 단순한 경우라면 규칙 기반 생성 및 통계 샘플링으로 충분할 수 있습니다.
    • 복잡한 다중 테이블 관계와 미묘한 통계적 뉘앙스가 필요하다면 생성 모델을 고려합니다.
  4. 생성 모듈 개발

    • Patient Generator – 기본 환자 레코드(인구통계, 고유 ID)를 생성합니다.
    • Encounter Generator – 환자와 연결된 방문을 생성하고, 특정 질환이나 방문 유형에 대한 확률을 적용합니다.
    • Diagnosis / Medication / Lab Generators – Encounter/Patient와 연결된 레코드를 생성하며, 검증된 코드 세트에서 샘플링하고 앞서 정의한 통계적 관계를 준수합니다.

    (각 모듈을 계속 구축하고, 각 단계마다 관계 무결성을 테스트하며, 합성 데이터셋이 원하는 실제 특성을 반영할 때까지 반복합니다.)

파이프라인 오케스트레이션

Airflow, Prefect와 같은 도구 혹은 간단한 스크립트를 사용해 이러한 모듈을 올바른 순서대로 실행하고, 모든 외래키 종속성이 충족되도록 합니다.

검증 및 개선

핵심은 생성된 데이터를 검증하는 것입니다. 데이터가 현실적으로 보이는가? 통계적 분포가 올바른가? 관계가 유지되는가? 검증 결과에 따라 생성 알고리즘을 조정해야 할 수도 있습니다.

결론

견고한 합성 데이터 파이프라인을 구축하는 것은 투자이지만, 그 보상은 매우 큽니다. 얻을 수 있는 이점은 다음과 같습니다:

  • 빠른 피드백 루프 – 데이터 보안 장벽 없이 조기에, 그리고 자주 테스트할 수 있습니다.
  • 포괄적인 테스트 커버리지 – 실제 데이터로는 찾기 어려운 엣지 케이스와 복잡한 시나리오를 시뮬레이션할 수 있습니다.
  • HIPAA 안심 – 테스트 환경에서 민감한 환자 정보가 전혀 노출되지 않습니다.

이는 소프트웨어 엔지니어링, 데이터 사이언스, 도메인 전문 지식이 교차하는 흥미로운 영역입니다. 의료 기술 분야에서 일한다면, 이 역량을 갈고 닦을 가치가 충분합니다!

최근 데이터 생성 및 파이프라인 자동화를 위한 보다 고급 기술들을 탐구하고 있습니다. 이러한 기술적 도전에 대해 더 깊이 파고들고 싶다면, 제가 개인 블로그에 작성한 글들을 참고하세요. 여기서는 확장 가능한 시스템 구축과 최첨단 기술에 대한 인사이트를 공유하고 있습니다. 자세한 가이드와 예시는 my tech blog에서 확인할 수 있습니다.

코딩도 즐겁게, 테스트도 즐겁게!

Back to Blog

관련 글

더 보기 »