# テスト用の合成患者データ

> Synthea、ペルソナ、モデル生成データの比較、良質なテストデータに含まれるもの、Synthea患者をFHIRサーバーにロードした際に何が起こったか。

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

**合成患者データとは、架空の医療記録（患者、診断、投薬、検査結果、受診記録など）であり、実際のデータのように見え、振る舞うように生成されたものです。これにより、個人の健康情報に触れることなく、ヘルスケアソフトウェアの構築、テスト、デモを行うことができます。** これは開発におけるデフォルトです。テスト環境で実際の患者データを使用することは、プライバシーのリスクであり、通常は法的な問題となります。このページでは、合成データを取得する主な方法、それぞれの長所と短所、合成データを使ったテストの設計方法、そしてFHIRサーバーへのロード方法について説明します。これには、Synthea患者をAnpherosにロードした際に何が起こったかについても含まれます。

## 合成患者を取得する3つの方法

| アプローチ | 例 | 適している用途 | 注意点 |
|---|---|---|---|
| ルールベースシミュレーション | [Synthea](https://github.com/synthetichealth/synthea) (MITRE提供のオープンソース): 病気モジュールから出生時の生活をシミュレートし、FHIR R4バンドル、C-CDA、CSVをエクスポート | ボリューム、完全な履歴、標準フォーマット | デフォルトでは米国中心 (人口統計、請求リソース、コード); パターンはモジュールと同程度にしか現実的ではない |
| キュレーションされたペルソナ | 特定の条件を持つ手作業で設計された患者 | デモ、エッジケース、再現可能なテスト | 患者数が少ない; 一貫性を保つ必要がある |
| 実データからの統計的またはML生成 | 実データセットでトレーニングされたモデル | 研究の現実性 | 不適切に行われた場合、実在の人物を漏洩させる可能性がある; 「合成である」というだけでなくプライバシー評価が必要 |

言語モデルによって作成されたテキストは4番目のリスクの高いソースです。読みやすいですが、しばしば矛盾します (治療薬のない病気、不可能な検査値など)。テストの基盤として使用すべきではありません。

## 良好なテストデータに含まれるべきもの

現実的な平均値だけでは不十分です。コードはエッジケースで破損するため、合成データであっても、以下の要素を含めるようにしてください。

- **欠損および不完全なデータ:** 参照範囲のない検査結果、用量のない薬剤、生年月日がない患者。
- **単位とフォーマット:** 同じ検査が mg/dL と mmol/L で存在する、小数点コンマ、タイムゾーンの有無による時刻表記。
- **修正と履歴:** 修正された結果、削除された (`entered-in-error`) エントリ、解消された病状。
- **重複:** 同じレポートが複数回送信されたもの。
- **長い履歴と短い履歴:** 新生児、10年分のデータを持つ人物、1回の受診歴しかない人物。
- **複数の言語と国:** 複数の市場に対応している場合。
- **同意の変更:** セッションの途中でアクセスが取り消されたアプリケーション。

## Synthea 患者を FHIR サーバーにロードする

Synthea は、患者ごとに 1 つの FHIR R4 `transaction` バンドルを作成します。私たちは 2 人の患者 (`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 |

ローダーは、サーバーがどのタイプをサポートしているかを問い合わせ、サポートされているもののみを保持し、残りを 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 リソースが 1 つのトランザクションで作成されました。保持されたエントリ間の `urn:uuid` 参照は、サーバー ID に解決されました (DiagnosticReport の `result` は存在する Observation を指しています)。ドロップされた 39 個のエントリへの参照は、記述されたまま保持されるため、ロードする前に、ドロップされた各エントリの `fullUrl` を収集し、それらを指す保持された参照を削除または変換する必要があります。`Patient/{id}/$summary` は 15 件の問題、6 件の予防接種、15 件の結果、28 件のバイタルサインを含む International Patient Summary を生成しました。`$everything` は、プラットフォームが各書き込みに追加するプロビナンスを含む 363 件のエントリを返しました。

それに依存する前に知っておくべき 3 つのこと:

- **条件付き参照は記述されたままです。** 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/ja/guides/free-fhir-database) を参照してください。

ヨーロッパの言語とプラットフォーム固有の機能を網羅した、小さく一貫性のあるレコードが必要な場合はペルソナを使用してください。ボリュームまたは米国スタイルの履歴が必要な場合はSyntheaをロードしてください。

## よくある質問

### 合成患者データとは何ですか？
実際の患者データと構造やパターンは似ていますが、実在の人物を表さない架空の医療記録です。これにより、開発者は個人情報保護の対象となる情報を使用せずに、アプリケーションを構築およびテストできます。

### 合成データは定義上匿名ですか？
Synthea のようなルールから生成されたデータには、実際の患者は含まれていません。実際の記録に基づいてトレーニングされたモデルから生成されたデータは、実在の人物を明らかにする可能性があるため、共有する前にプライバシー評価が必要です。

### Synthea データを FHIR サーバーにインポートできますか？
はい。Synthea は FHIR R4 トランザクションバンドルをエクスポートします。サーバーがサポートしていないリソースタイプを削除し、条件付き参照の処理方法を確認してから、各バンドルをトランザクションとして投稿してください。

### Anpheros サンドボックスには合成患者が含まれていますか？
はい。プロジェクトごとに 30 人の患者が含まれ、6 か月分のコーディングされた履歴があります。さらに、自分で作成できる最大 50 人のテスト患者も利用できます。

## 関連情報

- [無料のFHIRデータベースとサンドボックス](https://developers.anpheros.com/ja/guides/free-fhir-database)
- [FHIR R4 JSONの例](https://developers.anpheros.com/tools/fhir-examples/)
- [医療データを正規化する方法](https://developers.anpheros.com/ja/guides/normalize-medical-data)
- [FHIR R4を使用して医療記録を保存する方法](https://developers.anpheros.com/ja/guides/store-medical-records-fhir)
- [FHIRプラットフォーム](https://developers.anpheros.com/ja/guides/fhir)
