BigQuery と AI Platform Notebooks を使用して臨床データを分析する

1. はじめに

139d6fa46b10ab12.png

最終更新日: 2022 年 9 月 22 日

この Codelab では、BigQueryUI と AI Platform Notebooks を使用して、BigQuery に集約された医療データにアクセスして分析するパターンを実装します。HIPPA 準拠の AI Platform Notebooks で、Pandas、Matplotlib などの使い慣れたツールを使用して、大規模な医療データセットのデータ探索について説明します。ポイントは、集計処理の最初の部分を BigQuery で実行して Pandas データセットを取得し、より小規模の Pandas データセットをローカルで処理する点です。AI Platform Notebooks にはマネージド Jupyter 環境が用意されているため、ノートブック サーバーをご自分で実行する必要はありません。AI Platform Notebooks は、Big Query や Cloud Storage などの他の GCP サービスと緊密に統合されているため、Google Cloud Platform でデータ分析や ML の利用を迅速かつ簡単に開始できます。

この Codelab では、以下について学びます。

  • BigQuery UI を使用して SQL クエリを開発およびテストする。
  • GCP で AI Platform Notebooks インスタンスを作成して起動します。
  • ノートブックから SQL クエリを実行し、クエリ結果を Pandas DataFrame に保存します。
  • Matplotlib を使用してチャートやグラフを作成します。
  • ノートブックを commit して GCP の Cloud Source Repositories に push します。

この Codelab を実行するには何が必要ですか?

  • GCP プロジェクトへのアクセス権が必要です。
  • GCP プロジェクトのオーナーのロールが割り当てられている必要があります。
  • BigQuery の医療データセットが必要です。

GCP プロジェクトが存在しない場合は、こちらの手順に沿って新しい GCP プロジェクトを作成します。

2. プロジェクトのセットアップ

この Codelab では、BigQuery の既存のデータセット(hcls-testing-data.fhir_20k_patients_analytics)を使用します。このデータセットには、合成医療データが事前入力されます。

合成データセットへのアクセス権を取得する

  1. Cloud コンソールへのログインに使用しているメールアドレスから、hcls-solutions-external+subscribe@google.com 宛てにメールを送信し、参加をリクエストします。
  2. 操作の確認方法が記載されたメールが届きます。
  3. メールに返信するオプションを使用してグループに参加します。525a0fa752e0acae.png ボタンはクリックしないでください。
  4. 確認メールが届いたら、Codelab の次のステップに進むことができます。

プロジェクトを固定する

  1. Google Cloud コンソールでプロジェクトを選択し、BigQuery に移動します。
  2. [+ データを追加] プルダウンをクリックし、[プロジェクトを固定] を選択します。>「プロジェクト名を入力してください」をタップします。

55257ed5931961c6.png

  1. プロジェクト名「hcls-testing-data」を入力し、[固定] をクリックします。BigQuery テスト データセット「fhir_20k_patients_analytics」使用できます。

f9038e2a21e143fd.png

3. BigQuery UI を使用してクエリを開発する

BigQuery UI の設定

  1. GCP の左上隅(「ハンバーガー」)メニューから [BigQuery] を選択して、BigQuery コンソールに移動します。
  2. BigQuery コンソールで [展開] → [クエリの設定] をクリックし、[レガシー SQL] メニューがオフになっていることを確認します(ここでは標準 SQL を使用します)。

455c6c3ed93e9a63.png

クエリの作成

クエリエディタ ウィンドウで次のクエリを入力し、[実行] をクリックして実行します。その結果を [クエリ結果] ウィンドウで確認できます。

患者をクエリ

#standardSQL - Query Patients
SELECT
  id AS patient_id,
  name[safe_offset(0)].given AS given_name,
  name[safe_offset(0)].family AS family,
  telecom[safe_offset(0)].value AS phone,
  birthDate AS birth_date,
  deceased.dateTime AS deceased_datetime,
  Gender AS fhir_gender_code,
  Address[safe_offset(0)].line AS address1_line_1,
  Address[safe_offset(0)].city AS address1_city,
  Address[safe_offset(0)].state AS address1_state,
  Address[safe_offset(0)].postalCode AS address1_postalCode,
  Address[safe_offset(0)].country AS address1_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Patient` AS Patient 
LIMIT 10

[クエリエディタ] でのクエリ結果:

fb8ef84f0cb583fb.png

クエリ 実践者

#standardSQL - Query Practitioners
SELECT 
  id AS practitioner_id, 
  name[safe_offset(0)].given AS given_name,
  name[safe_offset(0)].family AS family_name, 
  gender 
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Practitioner` 
LIMIT 10

クエリ結果:

9515eb63813617e0.png

クエリの構成

データセットと一致するように組織 ID を変更します。

#standardSQL - Query Organization
SELECT
  id AS org_id,
  type[safe_offset(0)].text AS org_type,
  name AS org_name,
  address[safe_offset(0)].line AS org_addr,
  address[safe_offset(0)].city AS org_addr_city,
  address[safe_offset(0)].state AS org_addr_state,
  address[safe_offset(0)].postalCode AS org_addr_postalCode,
  address[safe_offset(0)].country AS org_addr_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Organization` AS Organization
WHERE 
  id = "b81688f5-bd0e-3c99-963f-860d3e90ab5d"

クエリ結果:

79a7afe2dd7fca87.png

患者別のクエリ件数

#standardSQL - Query Encounters by Patient
SELECT
  id AS encounter_id,
  period.start AS encounter_start,
  period.end AS encounter_end,
  status AS encounter_status,
  class.code AS encounter_type,
  subject.patientId as patient_id,
  participant[safe_OFFSET(0)].individual.practitionerId as parctitioner_id,
  serviceProvider.organizationId as encounter_location_id,
  type[safe_OFFSET(0)].text AS encounter_reason
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter` AS Encounter
WHERE
  subject.patientId = "900820eb-4166-4981-ae2d-b183a064ac18"
ORDER BY
  encounter_end

クエリ結果:

18328b6506814084.png

検出数のタイプ別の平均検出数を取得

#standardSQL - Get Average length of Encounters by Encounter type 
SELECT
  class.code encounter_class,
  ROUND(AVG(TIMESTAMP_DIFF(TIMESTAMP(period.end),    TIMESTAMP(period.start), HOUR)),1) as avg_minutes
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter` AS Encounter
WHERE
  period.end >= period.start
GROUP BY
  1
ORDER BY
  2 DESC

クエリ結果:

2087792ce2a67e97.png

A1C 率が 6.5 以上の患者をすべて対象

# Query Patients who have A1C rate >= 6.5
SELECT 
  id AS observation_id,
  subject.patientId AS patient_id,
  context.encounterId AS encounter_id,
  value.quantity.value,
  value.quantity.unit,
  code.coding[safe_offset(0)].code,
  code.coding[safe_offset(0)].display AS description
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Observation` 
WHERE 
  code.text like '%A1c/Hemoglobin%' AND 
  value.quantity.value >= 6.5 AND 
  status = 'final'

クエリ結果:

65be2450ecd92485.png

4. AI Platform Notebooks インスタンスを作成する

こちらのリンクの手順に沿って、新しい AI Platform Notebooks(JupyterLab)インスタンスを作成します。

必ず Compute Engine API を有効にしてください。

「デフォルトのオプションで新しいノートブックを作成する」または新しいノートブックを作成し、オプションを指定する」というメッセージが表示されます。

5. データ分析ノートブックを作成する

AI Platform Notebooks インスタンスを開く

このセクションでは、新しい Jupyter ノートブックをゼロから作成してコーディングします。

  1. Google Cloud Platform コンソールの [AI Platform Notebooks] ページに移動して、ノートブック インスタンスを開きます。AI Platform の [ノートブック] ページに移動
  2. 開きたいインスタンスの [JupyterLab を開く] を選択します。

82457955b63cbffa.png

  1. AI Platform Notebooks により、ノートブック インスタンスの URL に自動的に移動します

7705bf2f2d9b1b20.png

ノートブックを作成する

  1. JupyterLab で、[File] ->新規 ->Notebook」に移動し、カーネルとして [Python 3] を選択します。[Python 3]をクリックして、Untitled.ipynbnotebook を作成します。

d0ae87f0bdac3205.png

  1. [Untitled.ipynb] を右クリックし、ノートブックの名前を「fhir_data_from_bigquery.ipynb」に変更します。ダブルクリックして開き、クエリを作成してノートブックを保存します。
  2. ノートブックをダウンロードするには、*.ipynb ファイルを右クリックし、メニューから [ダウンロード] を選択します。

fc16337ffd9b1730.png

  1. [上矢印] をクリックして、既存のノートブックをアップロードすることもできます。] ボタンを離します。

49373254fbf1ddf9.png

ノートブックで各コードブロックをビルドして実行する

このセクションに記載されている各コードブロックを 1 つずつコピーして実行します。コードを実行するには、[Run] をクリックします。(三角形)。

e6d8b08c124c675e.png

面会の滞在日数を時間単位で取得できます

from google.cloud import bigquery

client = bigquery.Client()

lengthofstay="""
SELECT
    class.code as encounter_class,
    period.start as start_timestamp,
    period.end as end_timestamp, 
    TIMESTAMP_DIFF(TIMESTAMP(period.end), TIMESTAMP(period.start), HOUR) 
        as length_of_stay_in_hours
FROM 
    `hcls-testing-data.fhir_20k_patients_analytics.Encounter`
WHERE
    period.end >= period.start
ORDER BY
    4 DESC
LIMIT 10
"""
df = client.query(lengthofstay).to_dataframe()
df.head()

コードと実行の出力:

e7d37ff4d0d91518.png

観察結果の取得 - コレステロール値

observation="""
SELECT
  cc.code loinc_code,
  cc.display loinc_name,
  approx_quantiles(round(o.value.quantity.value,1),4) as quantiles,
  count(*) as num_obs
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Observation` o, o.code.coding cc
WHERE
  cc.system like '%loinc%' and lower(cc.display) like '%cholesterol%'
GROUP BY 1,2
ORDER BY 4 desc
"""
df2 = client.query(observation).to_dataframe()
df2.head()

実行出力:

7f43408857c0335.png

近似エンカウンタ分位数を取得する

encounters="""
SELECT
  encounter_class,
  APPROX_QUANTILES(num_encounters, 4) num_encounters_quantiles
FROM (
  SELECT
    class.code encounter_class,
    subject.reference patient_id,
    COUNT(DISTINCT id) AS num_encounters
  FROM
    `hcls-testing-data.fhir_20k_patients_analytics.Encounter`
  GROUP BY
    1,2
  )
GROUP BY 1
ORDER BY 1
"""
df3 = client.query(encounters).to_dataframe()
df3.head()

実行出力:

4c2313fae0ebe007.png

面談の平均時間を分単位で取得

avgstay="""
SELECT
  class.code encounter_class,
  ROUND(AVG(TIMESTAMP_DIFF(TIMESTAMP(period.end), TIMESTAMP(period.start), MINUTE)),1) as avg_minutes
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter`
WHERE
  period.end >= period.start
GROUP BY
  1
ORDER BY
  2 DESC
  """
df4 = client.query(avgstay).to_dataframe()
df4.head()

実行出力:

a0cdbe42751f14f7.png

患者あたりの診察数を取得

patientencounters="""
SELECT
  id AS encounter_id,
  period.start AS encounter_start,
  period.end AS encounter_end,
  status AS encounter_status,
  class.code AS encounter_type,
  subject.patientId as patient_id,
  participant[safe_OFFSET(0)].individual.practitionerId as parctitioner_id,
  serviceProvider.organizationId as encounter_location_id,
  type[safe_OFFSET(0)].text AS encounter_reason
FROM
  `hcls-testing-data.fhir_20k_patients_analytics.Encounter` AS Encounter
WHERE
  subject.patientId = "900820eb-4166-4981-ae2d-b183a064ac18"
ORDER BY
  encounter_end
"""

df5 = client.query(patientencounters).to_dataframe()
df5.head()

実行出力:

3ed6b4d6a1652de0.png

組織を取得する

orgs="""
SELECT
  id AS org_id,
  type[safe_offset(0)].text AS org_type,
  name AS org_name,
  address[safe_offset(0)].line AS org_addr,
  address[safe_offset(0)].city AS org_addr_city,
  address[safe_offset(0)].state AS org_addr_state,
  address[safe_offset(0)].postalCode AS org_addr_postalCode,
  address[safe_offset(0)].country AS org_addr_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Organization` AS Organization
WHERE 
  id = "b81688f5-bd0e-3c99-963f-860d3e90ab5d"
"""

df6 = client.query(orgs).to_dataframe()
df6.head()

実行結果:

886b2e99a889422e.png

患者の取得

patients="""
SELECT
  id AS patient_id,
  name[safe_offset(0)].given AS given_name,
  name[safe_offset(0)].family AS family,
  telecom[safe_offset(0)].value AS phone,
  birthDate AS birth_date,
  deceased.dateTime AS deceased_datetime,
  Gender AS fhir_gender_code,
  Address[safe_offset(0)].line AS address1_line_1,
  Address[safe_offset(0)].city AS address1_city,
  Address[safe_offset(0)].state AS address1_state,
  Address[safe_offset(0)].postalCode AS address1_postalCode,
  Address[safe_offset(0)].country AS address1_country
FROM 
  `hcls-testing-data.fhir_20k_patients_analytics.Patient` AS Patient 
LIMIT 10
"""

df7 = client.query(patients).to_dataframe()
df7.head()

実行結果:

61533f943001c446.png

6. AI Platform Notebooks でチャートやグラフを作成する

ノートブック「fhir_data_from_bigquery.ipynb」のコードセルを実行する棒グラフを描画します

たとえば、Encounters の平均時間を分単位で取得できます。

df4.plot(kind='bar', x='encounter_class', y='avg_minutes');

コードと実行の結果:

e48071e58960f124.png

7. ノートブックを Cloud Source Repositories のリポジトリに commit

  1. GCP コンソールで、Source Repositories に移動します。初めて使用する場合は、[使ってみる] をクリックし、[リポジトリを作成] をクリックします。

475d9a5c1d5dedc5.png

  1. 後日 GCP ->Cloud Source Repositories に移動し、[+ リポジトリを追加] をクリックして新しいリポジトリを作成します。

44416312bf155af1.png

  1. [新しいリポジトリを作成] を選択し、[続行] をクリックします。
  2. リポジトリ名とプロジェクト名を指定して、[作成] をクリックします。

ec2f3eaed74c2e0.png

  1. [ローカル Git リポジトリにリポジトリのクローンを作成する] を選択し、[手動で生成した認証情報] を選択します。
  2. ステップ 1「Git 認証情報を生成して保存する」の手順を行います。(下記をご覧ください)。画面に表示されるスクリプトをコピーします。

2089de5541527107.jpeg

  1. Jupyter でターミナル セッションを開始します。

a2b49535e36a9d5c.png

  1. 「Configure Git」からすべてのコマンドを貼り付けます。Jupyter ターミナルに移動します。
  2. GCP Cloud ソース リポジトリからリポジトリのクローンパスをコピーします(以下のスクリーンショットの手順 2)。

ba6a61ae8a4d9f9b.png

  1. このコマンドを JupiterLab ターミナルに貼り付けます。コマンドは次のようになります。
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. 「my-ai-notebooks」は、フォルダが作成されます。

19a2b2c910b3df3.png

  1. ノートブック(fhir_data_from_bigquery.ipynb)をフォルダ「my-ai-notebooks」に移動します。
  2. Jupyter ターミナルでディレクトリを「cd my-ai-notebooks」に変更します。
  3. Jupyter ターミナルを使用して変更をステージングします。Jupyter UI を使用することもできます。[Untracked] 領域でファイルを右クリックし、[Track] を選択してからファイルが追跡領域に移動されます。逆も同様です。変更された領域に変更されたファイルを含む)。
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Jupyter ターミナルまたは Jupyter UI を使用して変更を commit します(メッセージを入力し、[オン] ボタンをクリックします)。
git commit -m "message goes here"
  1. Jupyter ターミナルまたは Jupyter UI を使用して(「commit された変更を push」アイコン 71c61a74bb205ed1.png をクリック)して、リモート リポジトリに変更を push します。
git push --all
  1. GCP コンソールで、Source Repositories に移動します。[my-ai-notebooks] をクリックします。「fhir_data_from_bigquery.ipynb」GCP Source Repository に保存されます

7a6b802d90743182.jpeg

8. クリーンアップ

この Codelab で使用したリソースについて、Google Cloud Platform アカウントに課金されないようにするには、チュートリアルの完了後に GCP で作成したリソースをクリーンアップして、今後料金が発生しないようにします。次のセクションで、このようなリソースを削除または無効にする方法を説明します。

BigQuery データセットの削除

手順に沿って、このチュートリアルで作成した BigQuery データセットを削除します。テスト データセット fhir_20k_patients_analytics を使用した場合は、BigQuery コンソールに移動してプロジェクト hcls-testing-data の固定を解除します。

AI Platform Notebooks インスタンスをシャットダウンする

ノートブック インスタンスをシャットダウンする |AI Platform Notebooks を使用して、AI Platform Notebooks インスタンスをシャットダウンします。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには、次の操作を行います。

  1. GCP Console でプロジェクト ページに移動します。プロジェクト ページに移動
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

9. 完了

これで、BigQuery と AI Platform Notebooks を使用して FHIR 形式の医療データにアクセスする、クエリ、分析するための Codelab は終了です。

ここでは、GCP で BigQuery の一般公開データセットにアクセスしました。

ここでは、BigQuery UI を使用して SQL クエリを開発し、テストしました。

AI Platform Notebooks インスタンスを作成して起動しました。

JupyterLab で SQL クエリを実行し、クエリ結果を Pandas DataFrame に保存しました。

Matplotlib を使用してチャートやグラフを作成しました。

ノートブックを GCP の Cloud Source Repositories に commit して push しました。

ここでは、Google Cloud Platform で BigQuery と AI Platform Notebooks を使用して医療データ分析を開始するために必要な主な手順を学習しました。

©Google, Inc. or its affiliates. All rights reserved. Do not distribute.