BigQuery ve AI Platform Notebooks kullanarak Klinik Verileri Analiz Etme

1. Giriş

139d6fa46b10ab12.png

Son Güncelleme: 22.09.2022

Bu codelab'de, BigQueryUI ve AI Platform Notebooks kullanarak BigQuery'de toplanan sağlık hizmeti verilerine erişme ve bunları analiz etme modeli uygulanmaktadır. HIPAA'ya uygun bir AI Platform Notebooks'ta Pandas, Matplotlib vb. gibi tanıdık araçları kullanarak büyük sağlık hizmeti veri kümelerinde veri keşfinin nasıl yapılacağını gösterir. İşin "sırrı", toplama işleminizin ilk kısmını BigQuery'de gerçekleştirmek, bir Pandas veri kümesine dönmek ve daha sonra küçük Pandas veri kümesiyle yerel olarak çalışmaktır. AI Platform Notebooks, yönetilen bir Jupyter deneyimi sağlar. Bu nedenle, not defteri sunucularını kendiniz çalıştırmanız gerekmez. AI Platform Notebooks, BigQuery ve Cloud Storage gibi diğer GCP hizmetleriyle iyi entegre olduğundan Google Cloud Platform'da veri analizi ve makine öğrenimi yolculuğunuza hızlı ve kolay bir şekilde başlayabilirsiniz.

Bu kod laboratuvarında şunları öğreneceksiniz:

  • BigQuery kullanıcı arayüzünü kullanarak SQL sorguları geliştirme ve test etme
  • GCP'de AI Platform Notebooks örneği oluşturun ve başlatın.
  • Not defterinden SQL sorguları yürütün ve sorgu sonuçlarını Pandas DataFrame'de saklayın.
  • Matplotlib kullanarak grafikler oluşturma
  • Not defterini GCP'deki bir Cloud Source Repository'ye kaydedip aktarın.

Bu codelab'i çalıştırmak için neye ihtiyacınız var?

  • GCP projesine erişiminiz olmalıdır.
  • GCP projesi için Sahip rolü atanmış olmalıdır.
  • BigQuery'de bir sağlık hizmeti veri kümeniz olmalıdır.

GCP projeniz yoksa yeni bir GCP projesi oluşturmak için bu adımları uygulayın.

2. Proje ayarlama

Bu codelab'de BigQuery'deki mevcut bir veri kümesini (hcls-testing-data.fhir_20k_patients_analytics) kullanacağız. Bu veri kümesi, sentetik sağlık verileriyle önceden doldurulmuştur.

Sentezlenmiş veri kümesine erişme

  1. Cloud Console'da oturum açmak için kullandığınız e-posta adresinden hcls-solutions-external+subscribe@google.com adresine katılma isteği içeren bir e-posta gönderin.
  2. İşlemi nasıl onaylayacağınızla ilgili talimatları içeren bir e-posta alırsınız.
  3. Gruba katılmak için e-postayı yanıtlama seçeneğini kullanın. 525a0fa752e0acae.png düğmesini TIKLAMAYIN.
  4. Onay e-postasını aldıktan sonra codelab'deki sonraki adıma geçebilirsiniz.

Projeyi sabitleme

  1. GCP Console'da projenizi seçin ve BigQuery'ye gidin.
  2. +VERİ EKLE açılır listesini tıklayın ve "Proje sabitle" > "Proje adı gir"i seçin.

55257ed5931961c6.png

  1. Proje adını ("hcls-testing-data") girip PIN'i (Sabitle) tıklayın. "fhir_20k_patients_analytics" adlı BigQuery test veri kümesi kullanıma hazırdır.

f9038e2a21e143fd.png

3. BigQuery kullanıcı arayüzünü kullanarak sorgu geliştirme

BigQuery kullanıcı arayüzü ayarı

  1. Sol üst köşedeki ("hamburger") GCP menüsünden BigQuery'yi seçerek BigQuery konsoluna gidin.
  2. BigQuery konsolunda Diğer → Sorgu ayarları'nı tıklayın ve Eski SQL menüsünün İŞARETLENMEDİĞİNDEN emin olun (standart SQL kullanacağız).

455c6c3ed93e9a63.png

Sorgu Oluşturma

Sorgu düzenleyici penceresinde aşağıdaki sorguyu yazın ve çalıştırmak için "Çalıştır"ı tıklayın. Ardından, sonuçları "Sorgu sonuçları" penceresinde görüntüleyin.

HASTALARA SORGU GÖNDERME

#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

"Sorgu düzenleyici"deki sorgu ve sonuçlar:

fb8ef84f0cb583fb.png

QUERY PRACTITIONERS

#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

Sorgu sonuçları:

9515eb63813617e0.png

KURULUŞ SORGULAMA

Kuruluş kimliğini veri kümenizle eşleşecek şekilde değiştirin.

#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"

Sorgu sonuçları:

79a7afe2dd7fca87.png

HASTAYA GÖRE SORGULANAN KARŞILAŞMALAR

#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

Sorgu sonuçları:

18328b6506814084.png

KARŞILAŞMA TÜRÜNE GÖRE ORTALAMA KARŞILAŞMA SÜRESİNİ ALMA

#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

Sorgu sonuçları:

2087792ce2a67e97.png

A1C ORANI >= 6,5 OLAN TÜM HASTALARI GETİR

# 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'

Sorgu sonuçları:

65be2450ecd92485.png

4. AI Platform Notebooks örneği oluşturma

Yeni bir AI Platform Notebooks (JupyterLab) örneği oluşturmak için bu bağlantıdaki talimatları uygulayın.

Lütfen Compute Engine API'yi etkinleştirdiğinizden emin olun.

"Varsayılan seçeneklerle yeni bir not defteri oluştur" veya "Yeni bir not defteri oluştur ve seçeneklerini belirt"i seçebilirsiniz.

5. Veri analizi not defteri oluşturma

AI Platform Notebooks örneğini açın.

Bu bölümde, sıfırdan yeni bir Jupyter not defteri oluşturup kodlayacağız.

  1. Google Cloud Platform Console'da AI Platform Notebooks sayfasına giderek bir not defteri örneği açın. AI PLATFORM NOTEBOOKS SAYFASINA GİDİN
  2. Açmak istediğiniz örnek için Open JupyterLab'i (JupyterLab'i aç) seçin.

82457955b63cbffa.png

  1. AI Platform Notebooks, sizi not defteri örneğinizin URL'sine yönlendirir.

7705bf2f2d9b1b20.png

Not defteri oluşturma

  1. JupyterLab'de File -> New -> Notebook'a (Dosya -> Yeni -> Not Defteri) gidin ve pop-up pencerede "Python 3" çekirdeğini seçin veya başlatıcı penceresindeki Not Defteri bölümünde "Python 3"ü seçerek Untitled.ipynb adlı bir not defteri oluşturun.

d0ae87f0bdac3205.png

  1. Untitled.ipynb dosyasını sağ tıklayın ve not defterini "fhir_data_from_bigquery.ipynb" olarak yeniden adlandırın. Not defterini açmak, sorguları oluşturmak ve not defterini kaydetmek için çift tıklayın.
  2. *.ipynb dosyasını sağ tıklayıp menüden İndir'i seçerek not defterini indirebilirsiniz.

fc16337ffd9b1730.png

  1. "Yukarı ok" düğmesini tıklayarak mevcut bir not defterini de yükleyebilirsiniz.

49373254fbf1ddf9.png

Not defterindeki her kod bloğunu oluşturup yürütün.

Bu bölümde verilen her kod bloğunu tek tek kopyalayıp çalıştırın. Kodu çalıştırmak için "Çalıştır"ı (üçgen) tıklayın.

e6d8b08c124c675e.png

Karşılaşmaların konaklama süresini saat cinsinden alma

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()

Kod ve yürütme çıkışı:

e7d37ff4d0d91518.png

Gözlemleri alma - Kolesterol değerleri

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()

Yürütme çıkışı:

7f43408857c0335.png

Yaklaşık karşılaşma yüzdelik dilimlerini alma

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()

Yürütme çıkışı:

4c2313fae0ebe007.png

Görüşmelerin ortalama uzunluğunu (dakika cinsinden) öğrenme

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()

Yürütme çıkışı:

a0cdbe42751f14f7.png

Hasta başına karşılaşma sayısı

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()

Yürütme çıkışı:

3ed6b4d6a1652de0.png

Kuruluşları alma

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()

Yürütme sonucu:

886b2e99a889422e.png

Hasta Alma

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()

Yürütme sonuçları:

61533f943001c446.png

6. AI Platform Notebooks'ta grafik oluşturma

Çubuk grafik çizmek için "fhir_data_from_bigquery.ipynb" not defterindeki kod hücrelerini çalıştırın.

Örneğin, karşılaşmaların ortalama uzunluğunu dakika cinsinden alın.

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

Kod ve yürütme sonuçları:

e48071e58960f124.png

7. Not defterini Cloud Source Repository'ye gönderme

  1. GCP Console'da Source Repositories'e (Kaynak Kodu Depoları) gidin. İlk kez kullanıyorsanız Başlayın'ı, ardından Depo oluştur'u tıklayın.

475d9a5c1d5dedc5.png

  1. Sonraki seferlerde GCP -> Cloud Source Repositories'e gidin ve yeni bir depo oluşturmak için +Depo ekle'yi tıklayın.

44416312bf155af1.png

  1. "Yeni bir depo oluştur"u seçin ve Devam'ı tıklayın.
  2. Depo adını ve proje adını girin, ardından Oluştur'u tıklayın.

ec2f3eaed74c2e0.png

  1. "Clone your repository to a local Git repository" (Deponuzu yerel bir Git deposuna klonlayın) seçeneğini ve ardından Manually generated credentials (Manuel olarak oluşturulan kimlik bilgileri) seçeneğini belirleyin.
  2. 1. adım olan "Git kimlik bilgileri oluşturma ve depolama" talimatlarını uygulayın (aşağıya bakın). Ekranınızda görünen komut dosyasını kopyalayın.

2089de5541527107.jpeg

  1. Jupyter'da terminal oturumu başlatın.

a2b49535e36a9d5c.png

  1. "Git'i yapılandırın" pencerenizdeki tüm komutları Jupyter terminaline yapıştırın.
  2. GCP Cloud Source Repositories'den depo klonlama yolunu kopyalayın (aşağıdaki ekran görüntüsünde 2. adım).

ba6a61ae8a4d9f9b.png

  1. Bu komutu JupiterLab terminaline yapıştırın. Komut aşağıdaki gibi görünür:
git clone https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks
  1. JupyterLab'de "my-ai-notebooks" klasörü oluşturulur.

19a2b2c910b3df3.png

  1. Not defterinizi (fhir_data_from_bigquery.ipynb) "my-ai-notebooks" klasörüne taşıyın.
  2. Jupyter terminalinde dizini "cd my-ai-notebooks" olarak değiştirin.
  3. Jupyter terminalini kullanarak değişikliklerinizi aşamalandırın. Alternatif olarak Jupyter kullanıcı arayüzünü kullanabilirsiniz (İzlenmeyen alanındaki dosyaları sağ tıklayın, İzle'yi seçin. Dosyalar İzlenen alanına taşınır ve bunun tersi de geçerlidir). Değiştirilen alan, değiştirilmiş dosyaları içerir.)
git remote add my-ai-notebooks https://source.developers.google.com/p/<your -project-name>/r/my-ai-notebooks

5846abefb2451fd1.png

  1. Jupyter terminalini veya Jupyter kullanıcı arayüzünü kullanarak değişikliklerinizi işleyin (mesajı yazın, ardından "İşlendi" düğmesini tıklayın).
git commit -m "message goes here"
  1. Jupyter terminalini veya Jupyter kullanıcı arayüzünü kullanarak değişikliklerinizi uzak depoya gönderin ("Kaydedilen değişiklikleri gönder" simgesini 71c61a74bb205ed1.png tıklayın).
git push --all
  1. GCP Console'da Source Repositories'e gidin. my-ai-notebooks'u tıklayın. "fhir_data_from_bigquery.ipynb" dosyasının artık GCP Kaynak Deposu'na kaydedildiğini unutmayın.

7a6b802d90743182.jpeg

8. Temizleme

Bu codelab'de kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirilmesini önlemek amacıyla, eğitimi tamamladıktan sonra GCP'de oluşturduğunuz kaynakları temizleyebilirsiniz. Böylece bu kaynaklar kotanızı kullanmaz ve gelecekte bu kaynaklar için faturalandırılmazsınız. Aşağıdaki bölümlerde bu kaynakların nasıl silineceği veya devre dışı bırakılacağı açıklanmaktadır.

BigQuery veri kümesini silme

Bu eğitimin bir parçası olarak oluşturduğunuz BigQuery veri kümesini silmek için bu talimatları uygulayın. Alternatif olarak, BigQuery konsoluna gidin ve fhir_20k_patients_analytics test veri kümesini kullandıysanız hcls-testing-data projesinin PIN'ini kaldırın.

AI Platform Notebooks örneğini kapatma

Bir AI Platform Notebooks örneğini kapatmak için bu bağlantıdaki talimatları uygulayın: Not defteri örneğini kapatma | AI Platform Notebooks.

Projeyi silme

Faturalandırılmanın önüne geçmenin en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.

Projeyi silmek için:

  1. GCP Console'da Projeler sayfasına gidin. PROJELER SAYFASINA GİTME
  2. Proje listesinde, silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın, ardından projeyi silmek için Kapat'ı tıklayın.

9. Tebrikler

Tebrikler. BigQuery ve AI Platform Notebooks kullanarak FHIR biçimli sağlık verilerine erişme, bu verileri sorgulama ve analiz etme konulu kod laboratuvarını başarıyla tamamladınız.

GCP'de herkese açık bir BigQuery veri kümesine eriştiyseniz.

BigQuery kullanıcı arayüzünü kullanarak SQL sorguları geliştirip test ettiniz.

AI Platform Notebooks örneği oluşturup başlattınız.

JupyterLab'de SQL sorguları çalıştırdınız ve sorgu sonuçlarını Pandas DataFrame'de sakladınız.

Matplotlib kullanarak çizelgeler ve grafikler oluşturmuş olmanız gerekir.

Not defterinizi GCP'deki bir Cloud Source Repositories'e kaydedip gönderdiniz.

Artık Google Cloud Platform'da BigQuery ve AI Platform Notebooks ile sağlık hizmetleri veri analizi yolculuğunuza başlamak için gereken temel adımları biliyorsunuz.

©Google, Inc. veya bağlı kuruluşları. Tüm hakları saklıdır. Dağıtmayın.