Syntheaで開発や実験に使用する架空の患者情報を生成してみよう

# サンプルデータどうしよう？
データ分析やアプリケーション開発、機械学習によるモデル作成など、サンプルデータをどうやってかき集めるか本当に悩みます。たとえば、Watson Studioでは、医療系では昔からおなじみのSPSS Modelarを無料プランから使用することができますし、Auto AIといった機械学習によるモデルを自動作成する機能を使用することができます。
また、機械学習やデータ予測について興味を持った中学生や高校生、大学生から見ても、学習に使えて、リアルなデータというものはなかなかありません。大体がどこかに登録しないとダウンロード出来ないなどですから。
こういった悩みを解決する１つの手段として、[Synthea](https://synthetichealth.github.io/synthea/)があります。Syntheaは、Apache License Version 2.0が適用されているオープンソースソフトウェアであり、Apache License Version 2.0であることから商用利用も可能です。

# Synthea 
**Syntheaは、米国内における架空の患者データを作成**してくれます。Webサービスではなくパソコン上で実行する必要があります。IBM Cloudなどのチュートリアルでは、Syntheaを使用しています。Syntheaを用いて下記手順にて実行し、試しに米国ニューヨーク州在住で故人を除いた1,000名からなる架空の患者データを作成してみます。

Synthea ホームページ https://synthetichealth.github.io/synthea/
Synthea リポジトリ https://github.com/synthetichealth/synthea

## 実行環境の整備
実行環境として、パソコンにVirtual Boxをインストールし、Virtual Box上で、Ubuntu Server 20.0.4 LTSの仮想マシンを作成し使用しています。仮想マシンには、メモリを4GB割り当てています。

作成した仮想マシンで、下記コマンドを実行します。

```
$ sudo apt-get upgrade 
$ sudo apt-get install build-essential git
$ sudo apt-get install openjdk-8-jdk
$ sudo apt-get install libcommons-io-java
```
仮想マシン(Ubuntu Server 20.0.4 LTS)を再起動し、JDKがインストールされているか確認します。

```
$ sudo reboot
$ java -version
```
Javaのバージョン情報が表示されればOKです。

## Syntheaのインストール
インストールしたgitを使い、gitコマンドで、リポジトリからSyntheaを入手します。

```
$ git clone https://github.com/synthetichealth/synthea.git
$ cd synthea
```
患者情報のCSVファイルを作成できるように、Syntheaの設定ファイルを編集します。

```
$ nano src/main/resources/synthea.properties
```

変更箇所

 - 変更前 : exporter.csv.export = false
 - 変更後 : exporter.csv.export = true

Ctrl + xキーを押し、yキーをさらに押して保存します。

## インストール
次のコマンドを実行します。

```
$ ./gradlew build check test
```
BUILD SUCCESSFUL 
と表示されればOK

# ニューヨーク州在住の架空の患者データの生成
いよいよ、架空の患者データを作成します。ニューヨーク州在住で、故人以外の1000名分を生成します。生成時に、架空の故人のデータも一緒に生成されます。

念のため確認ですが、syntheaをリポジトリからgitコマンドで取得した際に、synthaという名称のディレクトリに移動している前提で進めます。ここまでの手順通り進めているのであれば、ディレクトリ移動操作は不要です。

```
$ ./run_synthea -p 1000 "New York"
```

これで、syntheaディレクトリ下のoutputディレクトリに、csvというディレクトリが作成され、次のような患者情報に関するCSVファイルを確認することができます。

```
$ ls output/csv
allergies.csv  conditions.csv  encounters.csv       immunizations.csv  observations.csv   patients.csv  payer_transitions.csv  providers.csv
careplans.csv  devices.csv     imaging_studies.csv  medications.csv    organizations.csv  payers.csv    procedures.csv         supplies.csv
```

架空の患者情報は、「patients.csv」ファイルです。どのような病気が発症したかのデータは、「conditions.csv」ファイルになります。各CSVファイルの内容については、Syntheaのマニュアルから「[CSV-File-Data-Dictionary](https://github.com/synthetichealth/synthea/wiki/CSV-File-Data-Dictionary)」をご確認ください。

ちなみに、患者情報の「patients.csv」ファイルは、下図のような構成になっています。名前もあります。先頭の「Id」がキーとなり、他のCSVファイルの「PATIENT」に該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/23dabc79-afbd-a6eb-36b6-b5a932b8e70c.png)

各患者における病気について記載されている「conditions.csv」ファイルは、下記のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/0b4bb260-999f-c784-536f-2f7dbdefebc8.png)

「patients.csv」ファイルで、「Id」が「a3010f94-ce34-4cf8-a274-efc08a25fe90」の患者が発症している病は、「conditions.csv」ファイルでは下図のようなっています。どうやらウイルス性副鼻腔炎と中耳炎を発症していたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3762fa63-167a-7783-c30e-1a801c9cd604.png)

機械学習によるモデル作成やデータ分析に合わせて各CSVファイルを仮想マシンから取り出して結合するなりしてください。仮想マシンからの取り出しはお好みのツールで良いです。自分は、「Tera Term」を使用して取り出しています。

# 上記以外の架空の患者情報の取り出し方
./run_synthea にオプションを追記することで、米国内の架空の患者情報であることを前提に作成することができます。Syntheaのマニュアルから「[Developer-Setup-and-Running](https://github.com/synthetichealth/synthea/wiki/Developer-Setup-and-Running)」で解説されています。
マニュアルに出てくる、モジュールが病名にあたるので、病名でフィルタをかけたい場合は、Syntheaのマニュアルから「[Module-Gallery](https://github.com/synthetichealth/synthea/wiki/Module-Gallery)」の解説を確認してください。

# 蛇足
Syntheaを触れはじめた経緯としては、健康管理や医療福祉関係のシステムなどを研究する研究団体に協力している関係で、かつ機械学習に関する勉強会を計画するにあたり、教材開発で使うようになった次第です。