# 테스트를 위한 합성 환자 데이터

> Synthea, 페르소나 및 모델 생성 데이터 비교, 좋은 테스트 데이터에 포함되는 내용, Synthea 환자를 FHIR 서버에 로드했을 때 발생한 일.

Source: https://developers.anpheros.com/ko/guides/synthetic-patient-data

**합성 환자 데이터는 실제 환자 데이터처럼 보이도록 생성된 가상의 의료 기록(환자, 진단, 처방, 검사 결과, 방문 기록 등)으로, 실제 환자의 건강 정보를 건드리지 않고 의료 소프트웨어를 구축, 테스트 및 시연할 수 있도록 합니다.** 개발 시 기본으로 사용됩니다. 테스트 환경에서 실제 환자 데이터를 사용하는 것은 개인 정보 보호 위험이며 일반적으로 법적 문제입니다. 이 페이지에서는 합성 데이터를 얻는 주요 방법, 각 방법의 장단점, 이를 중심으로 테스트를 설계하는 방법, 그리고 Anpheros에 Synthea 환자를 로드했을 때 발생한 일을 포함하여 FHIR 서버에 로드하는 방법에 대해 다룹니다.

## 합성 환자를 얻는 세 가지 방법

| 접근 방식 | 예시 | 적합한 경우 | 주의 사항 |
|---|---|---|---|
| 규칙 기반 시뮬레이션 | [Synthea](https://github.com/synthetichealth/synthea) (MITRE의 오픈 소스): 질병 모듈을 사용하여 출생부터 삶을 시뮬레이션하고 FHIR R4 번들, C-CDA 및 CSV로 내보냅니다. | 볼륨, 전체 기록, 표준 형식 | 기본적으로 미국 중심(인구 통계, 청구 리소스, 코드); 패턴은 모듈만큼만 현실적입니다. |
| 큐레이션된 페르소나 | 특정 질환을 가진 수작업으로 설계된 환자 | 데모, 엣지 케이스, 반복 가능한 테스트 | 환자 수가 적음; 누군가가 일관성을 유지해야 합니다. |
| 실제 데이터 기반 통계 또는 ML 생성 | 실제 데이터 세트로 학습된 모델 | 연구 현실성 | 잘못 수행될 경우 실제 사람을 유출할 수 있음; "합성"일 뿐만 아니라 개인 정보 보호 평가가 필요합니다. |

언어 모델이 요청에 따라 작성한 텍스트는 네 번째 위험한 소스입니다. 잘 읽히지만 종종 자체적으로 모순됩니다(치료하는 질환이 없는 약물, 불가능한 실험실 값). 테스트의 기반으로 사용해서는 안 됩니다.

## 좋은 테스트 데이터의 구성 요소

현실적인 평균값만으로는 충분하지 않습니다. 코드는 예외적인 상황에서 오류가 발생하므로, 합성 데이터든 아니든 다음을 포함하도록 데이터를 구성해야 합니다.

- **누락 및 부분 데이터:** 참조 범위가 없는 검사 결과, 용량이 없는 약물, 생년월일이 없는 환자.
- **단위 및 형식:** 동일한 검사를 mg/dL 및 mmol/L로, 소수점 구분 기호로 쉼표 사용, 시간대 포함 및 미포함 시간.
- **수정 및 기록:** 수정된 결과, 삭제된 (`entered-in-error`) 항목, 해결된 질병.
- **중복:** 동일한 보고서가 두 번 전송된 경우.
- **길고 짧은 기록:** 신생아, 10년의 데이터가 있는 환자, 한 번의 방문 기록만 있는 환자.
- **여러 언어 및 국가:** 여러 시장을 서비스하는 경우.
- **동의 변경:** 세션 중간에 액세스가 취소된 앱.

## Synthea 환자를 FHIR 서버로 로드하기

Synthea는 환자당 하나의 FHIR R4 `transaction` 번들을 작성합니다. 저희는 두 명의 환자(`java -jar synthea-with-dependencies.jar -p 2 -s 4242 Massachusetts`)를 생성하여 Anpheros의 로컬 인스턴스에 로드했습니다. 첫 번째 환자의 번들에는 221개의 항목이 있었습니다.

| 유지됨 (Anpheros가 저장하는 유형) | 제거됨 (Anpheros가 저장하지 않는 유형) |
|---|---|
| Observation 61, Procedure 48, DiagnosticReport 24, Condition 15, Encounter 12, DocumentReference 12, Immunization 6, Patient, CareTeam, CarePlan, Provenance | Claim 13, ExplanationOfBenefit 13, SupplyDelivery 9, Device 2, ImagingStudy 1, MedicationRequest 1 |

로더는 서버가 지원하는 유형을 묻고, 지원하는 유형만 유지한 후 나머지는 하나의 트랜잭션으로 게시합니다.

```ts
import { readFile } from 'node:fs/promises';
import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });   // sk_test_… key
const SUPPORTED = new Set(((await anpheros.fhir.metadata()) as any).rest[0].resource.map((r: any) => r.type));
const bundle = JSON.parse(await readFile(process.argv[2], 'utf8'));            // one Synthea patient file
const kept = bundle.entry.filter((e: any) => SUPPORTED.has(e.resource.resourceType));
const out: any = await anpheros.fhir.transaction({ ...bundle, entry: kept } as any);
console.log('created', out.entry.length);
```

결과: 182개의 리소스가 하나의 트랜잭션으로 생성되었습니다. 유지된 항목 간의 `urn:uuid` 참조는 서버 ID로 확인되었습니다 (DiagnosticReport의 `result`는 존재하는 Observation을 가리킵니다). 삭제된 39개 항목에 대한 참조는 작성된 대로 유지됩니다. 따라서 로드하기 전에 삭제된 각 항목의 `fullUrl`를 수집하고 해당 항목을 가리키는 유지된 참조를 제거하거나 변환해야 합니다. `Patient/{id}/$summary`는 15개의 문제, 6개의 예방 접종, 15개의 결과 및 28개의 활력 징후를 포함하는 International Patient Summary를 생성했습니다. `$everything`는 플랫폼이 각 쓰기에 추가하는 provenance를 포함하여 363개의 항목을 반환했습니다.

신뢰하기 전에 알아야 할 세 가지 사항이 있습니다.

- **조건부 참조는 작성된 대로 유지됩니다.** Synthea는 `Practitioner?identifier=http://hl7.org/fhir/sid/us-npi|9999967398`와 같은 조건부 참조를 사용하여 의사, 조직 및 위치를 가리킵니다. Anpheros는 트랜잭션에서 조건부 참조를 확인하지 않습니다. 작성된 대로 `display` 텍스트와 함께 저장되며 리소스로 확인되지 않습니다. 코드가 해당 링크를 따르는 경우 의사 및 조직을 별도로 로드하고 참조를 다시 작성해야 합니다.
- **청구 및 공급 데이터는 누락됩니다.** 청구 및 혜택 설명은 Synthea의 미국 비용 모델에 중요하며 Anpheros의 임상 기록의 일부가 아닙니다.
- **처방은 변환되지 않고 누락됩니다.** `MedicationRequest`는 제거됩니다. 기록에 약물이 필요한 경우 로드하기 전에 `MedicationStatement`로 변환해야 합니다.

Synthea의 이름에는 실제 사람으로 오인되지 않도록 의도적으로 숫자가 포함되어 있습니다 (`Marcelo725 Gulgowski816`).

## Anpheros 샌드박스의 합성 환자

모든 Anpheros 샌드박스 프로젝트는 수작업으로 설계된 페르소나에서 생성된 30명의 합성 환자 복사본을 받습니다. 나이는 3세에서 85세까지이며, 여러 EU 국가 및 언어를 포함합니다. 조건은 ICD-10으로 코딩되고, 약물은 ATC로, 검사 및 활력징후는 LOINC와 UCUM 단위 및 참조 범위로, 6개월의 기록 및 문서가 포함됩니다. 새로 시드된 프로젝트는 30명의 환자, 43개의 조건, 51개의 약물 기록, 1,811개의 관찰, 57개의 문서 및 6개의 알레르기를 포함합니다. 데이터는 결정론적이므로 모든 프로젝트는 동일한 사람과 동일한 값을 보지만 ID만 다릅니다. 리셋 시 복원됩니다. 각 페르소나는 안정적인 식별자를 유지하므로 `Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02`는 항상 같은 사람을 찾습니다. [Free FHIR database and sandbox](https://developers.anpheros.com/ko/guides/free-fhir-database)를 참조하십시오.

유럽 언어와 플랫폼 자체 기능을 포괄하는 작고 일관성 있는 기록이 필요할 때 페르소나를 사용하십시오. 볼륨 또는 미국식 기록이 필요할 때는 Synthea를 로드하십시오.

## 자주 묻는 질문

### 합성 환자 데이터란 무엇인가요?
실제 데이터와 유사한 구조 및 패턴을 가지지만 실제 인물을 설명하지 않는 가상의 건강 기록입니다. 이를 통해 개발자는 개인 건강 정보(PHI)를 사용하지 않고도 애플리케이션을 구축하고 테스트할 수 있습니다.

### 합성 데이터는 정의상 익명인가요?
Synthea와 같이 규칙 기반으로 생성된 데이터에는 실제 환자가 포함되어 있지 않습니다. 실제 기록을 기반으로 학습된 모델로 생성된 데이터는 여전히 실제 인물을 드러낼 수 있으므로 공유 전에 개인 정보 보호 평가가 필요합니다.

### Synthea 데이터를 FHIR 서버로 가져올 수 있나요?
예. Synthea는 FHIR R4 트랜잭션 번들을 내보냅니다. 서버에서 지원하지 않는 리소스 유형을 제거하고, 조건부 참조를 처리하는 방식을 확인한 후 각 번들을 트랜잭션으로 게시하세요.

### Anpheros 샌드박스에는 합성 환자가 포함되어 있나요?
예. 프로젝트당 30명의 합성 환자가 포함되며, 6개월 분량의 코딩된 기록이 제공됩니다. 또한 직접 생성할 수 있는 최대 50명의 테스트 환자도 사용할 수 있습니다.

## 관련 자료

- [무료 FHIR 데이터베이스 및 샌드박스](https://developers.anpheros.com/ko/guides/free-fhir-database)
- [FHIR R4 JSON 예제](https://developers.anpheros.com/tools/fhir-examples/)
- [의료 데이터 정규화 방법](https://developers.anpheros.com/ko/guides/normalize-medical-data)
- [FHIR R4를 사용하여 의료 기록 저장 방법](https://developers.anpheros.com/ko/guides/store-medical-records-fhir)
- [FHIR 플랫폼](https://developers.anpheros.com/ko/guides/fhir)
