แผนการเรียนรู้
/
AMMS 302 | Week 11

มาตรฐานข้อมูลสุขภาพสากล

Health Care Data Standards

HL7 FHIR R4 · OMOP Common Data Model · ICD-10 · สปสช. Data Dictionary

🎯 เป้าหมาย (CLO1/CLO4)

  • อธิบายบทบาท FHIR (exchange) vs OMOP (research model) vs ICD-10 (terminology)
  • อ่าน FHIR Bundle JSON + flatten เป็นตารางได้
  • Map ICD-10 → chapter และสร้าง mini-OMOP จาก dataset เราได้
Lab: 🧪 week11-data-standards.ipynb · ใช้ patient_fhir_demo.json

สารบัญ

01 · ปัญหา Babel — ทำไมต้องมี standard?

❌ โรงพยาบาลคุยกันไม่รู้เรื่อง

Hosp A: "DM" | Hosp B: "เบาหวาน" | Hosp C: "E11.9"
Field: DOB vs วันเกิด vs birthDate
Lab HbA1c: % vs mmol/mol!

→ ETL ทุกคู่ = O(n²) งานซ้ำซ้อน และแปลผิดได้

✅ Standard = ภาษากลาง

HIS A FHIR / OMOP / ICD-10 HIS B · Research DB
write once → interop everywhere
  • Exchange format: HL7 FHIR (REST/JSON/XML)
  • Research data model: OMOP CDM
  • Terminology: ICD-10, SNOMED CT, LOINC, RxNorm

02 · Standards Landscape Map

LayerStandardหน้าที่ตัวอย่าง
TerminologyICD-10 · SNOMED CT · LOINC · RxNormให้รหัส conceptE11.9 = T2DM
Message/ExchangeHL7 v2 · CDA · FHIRส่งข้อมูลระหว่างระบบFHIR REST + JSON
Research modelOMOP CDM v5.4schema กลางเพื่อ analyticsperson/condition_occurrence
Claims (ไทย)สปสช. 43 แฟ้มเบิกจ่ายสิทธิประโยชน์CHA, DCH, ORFS…
💡 ระดับไหนต่างกัน? FHIR = วิธีส่ง, ICD = ความหมาย, OMOP = รูปทรงตาราง — ใช้ประกอบกันได้ (wk12–13)

03 · ICD-10 — รหัสโรคสากล (WHO)

E11.9
Chapter(Endocrine) · Category(DM) · Subtype(no complication)
  • A–Z chapter letters (22 chapters)
  • Thailand: ICD-10-TM (adapted) ใน claims สปสช.
  • ICD-11 ออกแล้ว — แต่ claims ยังใช้ 10

Chapter ที่ใช้บ่อย

E11Type 2 diabetes mellitus
I10Essential hypertension
I48Atrial fibrillation
J45Asthma
Z00General health exam
💡 lab §3: map first-letter → chapter group ด้วย dict ธรรมดา
📚 Official browse: icd.who.int/browse10 (WHO)

04 · HL7 FHIR — Resources & Bundle

Fast Healthcare Interoperability Resources (R4) — modular resources + REST API

🧱 Resource = LEGO block

Patient Encounter Observation Condition MedicationRequest
GET /Patient?gender=female&birthdate=ge1970
→ JSON Bundle of matching Patients

📦 Bundle structure

Bundle
├─ resourceType: "Bundle"
├─ id, type: "collection"
└─ entry[]
   ├─ fullUrl: urn:uuid:…
   └─ resource: {resourceType:
        "Patient", id, name[],
        gender, birthDate}

PySynthea (wk12) ส่งออกเป็น FHIR R4 bundles — อ่านด้วย skill เดียวกัน

05 · Walkthrough: patient_fhir_demo.json

{ "resourceType": "Bundle",
  "id": "bundle-amms302-demo",
  "entry": [
    { "fullUrl": "urn:uuid:10313763",
      "resource": {
        "resourceType": "Patient",
        "id": "10313763",
        "name": [{"family":"รักดี",
                  "given":["สมชาย"]}],
        "gender": "male",
        "birthDate": "1975-05-12"}}]}
# flatten ทั้ง bundle
pd.json_normalize(bundle,
  record_path=['entry'])
# columns:
# resource.resourceType
# resource.id
# resource.name[].family …
# resource.gender, birthDate

# dot-path ตาม spec
df['resource.birthDate']
🎯 Lab §1–2: นับ resourceType + สกัด age จาก birthDate
📚 json_normalize docs — ทบทวน wk01 สไลด์ 16

06 · OMOP CDM — โมเดลวิจัยของ OHDSI

⭐ Core tables (v5.4)

person (person_id PK)
↑ FK person_id จากทุกตาราง ↓
visit_occurrence condition_occurrence drug_exposure measurement/observation
  • concept_id อ้าง vocabulary tables (SNOMED/RxNorm mapped)
  • เขียน query ครั้งเดียว รันข้าม network ได้ (250+ DBs worldwide)

Tools ecosystem

  • ATLAS: GUI design cohort/characterization — atlas-demo.ohdsi.org
  • ACHILLES: data quality summary
  • HADES/R packages: stats & ML
📖 The Book of OHDSI (free online) — อ่าน ch.4–5 ก่อน wk13

07 · FHIR ↔ OMOP — แนวคิด mapping

FHIR ResourcefieldOMOP table.field
Patient.idperson.person_id
Patient.gendermale/femaleperson.gender_concept_id (8507/8532)
Patient.birthDateYYYY-MM-DDperson.year_of_birth/month/day
Condition.codeICD-10/SNOMED codingcondition_occurrence.condition_concept_id
Encounter.periodstart/endvisit_occurrence.visit_start/end_date
ETL tools สำเร็จรูปมีอยู่แล้ว (e.g., FHIR-to-OMOP pipelines ใน OHDSI community) — เราฝึกหลักการผ่าน mini-OMOP ใน lab §4

08 · สปสช. Data Dictionary — บริบทไทย

43 แฟ้ม claims (UC service)

  • CHA = รับรองสิทธิ (HN, CID hash, สิทธิ)
  • DCH/ODX/ORF = opd dx/drug/referral
  • ICD-10-TM + DRG grouping สำหรับเบิกจ่าย
  • PID field ต้อง de-id ก่อนใช้วิจัย (wk10!)

Project สัปดาห์ 15–16

วาด ER diagram จาก dictionary ของ 2–3 แฟ้มที่เลือก → เสนอ dashboard/insight — ใช้ skill: ERD(wk07) + SQL(wk5–7) + standards(wk11)

📚 dictionary download ผ่าน nhso.go.th (สปสช. — National Health Security Office)

09 · Lab สัปดาห์ที่ 11 🧪

week11-data-standards.ipynb

  1. §1 Load bundle → นับ resourceTypes
  2. §2 json_normalize + dot-path สกัด Patient fields → age
  3. §3 ICD-10 chapter dict + classify hba1c → E11.9/Z00.0
  4. §4 สร้าง omop_mini.db (person + condition_occurrence + FK)

📝 Homework 11

  • เพิ่ม visit_occurrence table ≥5 แถว + JOIN query
  • อ่าน FHIR Patient page → list 5 missing fields ใน dataset เรา
  • ส่ง .ipynb + omop_mini.db
เกณฑ์: normalize ถูก path 40% · mini-OMOP FK ครบ 40% · HW อ้าง spec ถูก 20%

10 · แหล่งอ้างอิงทางการ

🏛️ OHDSI / OMOP

📬 ติดต่อ

ดร.วิชิต สมบัติ — wichit.s@ubu.ac.th

คาบหน้า: BigQuery/DuckDB + PySynthea generation