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

การเชื่อมโยงข้อมูลและการรวมกลุ่มข้อมูลสุขภาพ

รายวิชา ปฏิบัติการสารสนเทศด้านสุขภาพ (อจวพ ๓๐๒)
หลักสูตรวิทยาศาสตรบัณฑิต สาขาวิชาวิทยาศาสตร์การแพทย์

🎯 สารบัญ

AMMS 302 | สัปดาห์ที่ ๒ (ส่วนที่ ๑)

บทบาทเชิงกลยุทธ์ของ Data Linking ทางสาธารณสุข

ในระบบบริการสุขภาพดิจิทัล ข้อมูลประวัติคนไข้และสถิติการสั่งใช้ยามักจะถูกจัดเก็บแยกส่วน (Siloed Data) กันในระบบต่างๆ การจับคู่หรือบูรณาการระเบียนข้อมูลจึงเป็นหัวใจสำคัญอย่างยิ่ง

🔗 1. การบูรณาการข้อมูลคนไข้ (Patient Integration)

เชื่อมข้อมูลประวัติส่วนบุคคลผู้ป่วย (Demographics) ร่วมกับข้อมูลประวัติการสั่งใช้ยาสะสม เพื่อสนับสนุนให้เกิดความปลอดภัย ลดความเสี่ยงในการสั่งใช้ยาซ้ำซ้อน และเพิ่มคุณภาพในการดูแลรักษาที่ต่อเนื่อง

📊 2. การสร้างตัวชี้วัดและจัดกลุ่ม (Cohort Analysis)

ช่วยให้นักศึกษาและแพทย์สามารถคัดกรอง วิจัย จัดลำดับความสำคัญผู้ป่วย (Clinical Prioritization) เพื่อแก้ไขปัญหาสาธารณสุขระดับประเทศได้อย่างเป็นระบบ [9]

📖 อ้างอิงทางวิชาการร่วม: คาบเรียนนี้ดึงแนวคิดกระบวนการจัดลำดับและประเมินผลกลุ่มผู้ป่วยเบาหวาน (Diabetic Patient Prioritization) และปรับปรุงข้อมูลการวิเคราะห์เชิงระบบอิงตามมาตรฐาน [9].
👉 คลิกอ่านรายงานวิจัยสถิติผู้ป่วยเบาหวานในคลังข้อมูล Springer / Wolters Kluwer Medknow (DOI: 10.4103/sjmms.sjmms_394_22) [9]

ตรรกะการเชื่อมตาราง: Inner Join vs. Left Join

ในการเขียนโค้ดวิเคราะห์ข้อมูลสุขภาพ การเลือกประเภทการ Join จะส่งผลโดยตรงต่อความครบถ้วนของประวัติคนไข้

🤝 INNER JOIN (เลือกเฉพาะที่จับคู่ได้)

ข้อมูลจากตารางฝั่งซ้ายและขวาต้องมีคีย์ร่วม (practice_code) ตรงกันเท่านั้น หากสถานพยาบาลใดไม่มีข้อมูลในทะเบียนจะถูกตัดทิ้งทันที

# โค้ดเชื่อมตารางแบบคัดเฉพาะที่มีคู่ตรงกัน
pd.merge(df_prescriptions, df_practices, 
on='practice_code', how='inner')

👈 LEFT JOIN (เน้นรักษาฐานระเบียนหลัก)

เก็บประวัติการจ่ายยาสะสมทั้งหมดในฝั่งซ้ายไว้เป็นหลัก แม้รหัสคลินิกนั้นจะไม่มีข้อมูลลงทะเบียนในฝั่งขวาก็ตาม (โดยระบบจะแทนที่ค่าที่หายไปด้วย NaN)

# โค้ดเชื่อมตารางแบบเก็บระเบียนหลักไว้ครบถ้วน
pd.merge(df_prescriptions, df_practices, 
on='practice_code', how='left')
💡 หลักจริยธรรมและการทวนสอบ (Validity Check): การเลือกเชื่อมข้อมูลแบบอ้อมอาจก่อให้เกิดระเบียนที่ว่างเปล่า ซึ่งนักศึกษาต้องเรียนรู้วิธีการทำความสะอาดและตรวจสอบคุณภาพข้อมูลตามระเบียบสถิติสากล .
👉 สืบค้นดัชนีคุณภาพความปลอดภัยและการทบทวนการวิเคราะห์ระบบข้อมูล ICU ในวารสาร Monash University (DOI: 10.1186/s12912-025-03195-6) [15]

แหล่งคลังข้อมูลสุขภาพเปิดระดับโลก (Open Datasets)

ในการเรียนการสอนวิชา อจวพ ๓๐๒ และวิจัยวิทยาศาสตร์การแพทย์ เราจะเลือกใช้ชุดข้อมูลที่ลบระบุตัวตน (De-identified) ที่ได้รับมาตรฐานความปลอดภัยทางการแพทย์ระดับสากล

🏥 PhysioNet

คลังทรัพยากรกลางระดับสากล สนับสนุนโดยสถาบันเทคโนโลยี MIT เป็นฐานข้อมูลที่ได้รับความไว้วางใจสูงสุดในการวิจัยและการพัฒนาแบบจำลอง AI ทางการแพทย์

เปิดระบบหลัก PhysioNet →

🗄️ MIMIC Database

เวชระเบียนสุขภาพผู้ป่วยวิกฤต (ICU) จริงนับหมื่นราย ทั้งสัญญาณชีพ การตรวจวัด ยา และวันเวลาเข้ารักษา เพื่อวิเคราะห์ผลลัพธ์และความโปร่งใสเชิงข้อมูล

⌚ Zenodo Sensors

คลังเก็บข้อมูลสัญญาณชีพดิบแบบอนุกรมเวลา (Timeseries) และข้อมูลเซ็นเซอร์สวมใส่ของผู้ใช้งาน เช่น ออกซิเจนในเลือด (SpO2) และระดับความเครียด

ดาวน์โหลดชุดข้อมูล Zenodo →
ℹ️ ข้อพึงทราบก่อนใช้งาน: การสืบค้นระเบียนข้อมูลของ PhysioNet/MIMIC นักศึกษาจำเป็นต้องลงทะเบียนและผ่านการฝึกอบรมจริยธรรมคุ้มครองผู้ป่วย (เช่น CITI Program) ตลอดจนตกลงในใบสัญญารักษาความลับของข้อมูลก่อนดาวน์โหลดเสมอ .

ข้อมูลผู้ป่วยจำลอง: PySynthea & มาตรฐาน FHIR JSON

ภายใต้ข้อจำกัดทางกฎหมายด้านการคุ้มครองข้อมูลส่วนบุคคล (PDPA และ HIPAA) การเรียนรู้ผ่าน ข้อมูลผู้ป่วยสังเคราะห์ (Synthetic Patient Data) จึงเป็นมาตรฐานอุตสาหกรรมยุคใหม่ — รายวิชานี้ใช้ PySynthea (tietai-synthea) ซึ่งเป็น Python-native reimplementation ของ Synthea โดย TIET-AI (ไม่ต้องติดตั้ง Java/JVM)

⚙️ 1. PySynthea — Python-native Generator

สังเคราะห์เวชระเบียนคนไข้จำลองตั้งแต่แรกเกิดจนถึงสภาวะโรคต่างๆ อย่างสมจริงแต่ไม่ผูกกับข้อมูลผู้ป่วยจริง — ติดตั้งด้วย uv add tietai-synthea (รันออฟไลน์บน Windows) แล้วเรียก uv run synthea -p 10 หรือ Python API from synthea import Generator

Windows + scoop/uv (แนะนำสำหรับ Self-study)
scoop install git uv
uv init
uv add tietai-synthea
uv run synthea -p 10 --state "California"
# หรือใน notebook:
# from synthea import Generator, GeneratorOptions

ต้นฉบับ Synthea (Java, MITRE) ที่ PySynthea reimplement: synthetichealth/synthea — นักศึกษาที่อยากเทียบเคอร์เนล Java ดูได้ แต่แล็บในรายวิชาใช้ PySynthea ทั้งหมด

🔥 2. HL7 FHIR (Interoperability Standard)

ข้อมูลที่ PySynthea สังเคราะห์จะส่งออกเป็น FHIR R4 JSON Bundle (Patient, Encounter, Condition, Observation, MedicationRequest ฯลฯ) ตามมาตรฐานสากล เพื่อให้ระบบสุขภาพทั่วโลกแลกเปลี่ยนข้อมูลได้ — สเปกทางการ: hl7.org/fhir

💡 Self-study บน Windows: หลัง uv add tietai-synthea ให้ทดสอบ uv run python -c "import synthea; print(synthea.__version__)" — จากนั้นดูไฟล์ FHIR JSON ที่ PySynthea สร้างใน ./output/fhir/ แล้วฝึก pd.json_normalize ในโน้ตบุ๊ก (คาบ 11–13 จะคลี่ Bundle เป็นตาราง DataFrame)

แหล่งข้อมูลเรียนรู้ด้วยตนเองและการอ้างอิงของวิชา

รายวิชา อจวพ ๓๐๒ ส่งเสริมและสนับสนุนกลยุทธ์การศึกษาแบบเชิงรุก (Active & Self-paced Learning) เพื่อให้นักศึกษาสามารถทบทวนความรู้ล่วงหน้าได้ตลอดเวลา

🎓 MUx MOOC

วิชา "เทคโนโลยีดิจิทัลและสารสนเทศทางสุขภาพ" ของมหาวิทยาลัยมหิดล ครอบคลุมหลักการจัดการฐานข้อมูล กฎหมายข้อมูลและจริยธรรมสุขภาพยุคดิจิทัล .

สมัครเรียนบนระบบ MUx →

📘 หนังสืออ้างอิงหลัก

"ความรอบรู้ด้านสุขภาพ: ขั้นพื้นฐาน ปฏิสัมพันธ์ วิจารณญาณ" โดย ผศ.ดร.ขวัญเมือง แก้วดำเกิง สมาคมวิชาชีพสุขศึกษา เพื่อพฤติกรรมและการตัดสินใจในระบบสุขภาพ .

ดูรายละเอียดที่ศูนย์หนังสือจุฬาฯ →

🎥 สไลด์และวิดีโอ

รวบรวมชุดการบรรยายวิชาการเรื่อง "Health Informatics for Health Service Systems" โดย ดร.นพ.นวนรรน ธีระอัมพรพันธุ์ ผู้แทนจากสมาคมเวชสารสนเทศไทย (TMI) .

ดาวน์โหลดสไลด์ ดร.นวนรรน →
AMMS 302 | สัปดาห์ที่ ๒ (ส่วนที่ ๒)

ปฏิบัติการเชื่อมโยงและจัดกลุ่มสถิติสารสนเทศสุขภาพ

การประยุกต์ใช้ไลบรารี Pandas ในการคำนวณและวิเคราะห์ดัชนีชี้วัดเพื่อตอบสนองวัตถุประสงค์ระดับรายวิชา CLO2

🎯 ปฏิบัติการสัปดาห์ที่ ๒ (ส่วนย่อย - คลิกเพื่อข้ามไปเรียนรู้)

การเขียนชุดคำสั่งเชื่อมโยงข้อมูลสุขภาพด้วย Python

ในฐานข้อมูลระบบเวชระเบียนอิเล็กทรอนิกส์ (EHRs) เรามักใช้รหัสอ้างอิงร่วม (เช่น รหัสยา หรือ รหัสคลินิก) เพื่อนำตารางข้อมูลมารวมกันผ่านฟังก์ชัน pd.merge()

💻 ชุดคำสั่งภาษา Python ในการทำ Left Join (รักษาประวัติจ่ายยาหลัก):

# 1. อ่านข้อมูลระเบียนสั่งยา และ ทะเบียนที่ตั้งคลินิก
df_prescriptions = pd.read_csv('prescriptions.csv')
df_practices = pd.read_csv('practices_registry.csv')

# 2. เชื่อมข้อมูลผ่านรหัสสถานพยาบาล (practice_code)
df_linked = pd.merge(
    df_prescriptions,
    df_practices,
    on='practice_code',
    how='left',
    suffixes=('_rx', '_reg')
)

💡 คำอธิบายพารามิเตอร์สำคัญ: อาร์กิวเมนต์ suffixes มีความจำเป็นอย่างยิ่งในระบบสารสนเทศสุขภาพ เพื่อช่วยแยกคอลัมน์ชื่อซ้ำกัน เช่น วันที่บันทึกของใบสั่งยา (date_rx) และวันที่ขึ้นทะเบียนของคลินิก (date_reg) ป้องกันการสับสนเชิงโครงสร้างข้อมูล

📚 อ้างอิงสากล: ศึกษาและทบทวนตรรกะความสัมพันธ์และการประมวลผลข้อมูล EHR ความปลอดภัยสูง เพิ่มเติมได้จากคู่มือเชิงปฏิบัติการของสถาบัน MIT.
👉 ลิงก์คู่มือสอนใช้ฐานข้อมูลเวชระเบียนร่วมกับ BigQuery บน MIT MIMIC-III Portal
สัปดาห์ที่ 2: การทำ Data Merging

การวิเคราะห์กลุ่มผู้ป่วยและตัวชี้วัดด้วย Group By

การวิเคราะห์สถิติด้านระบาดวิทยาคลินิกและการบริหารจัดการ (KPIs) จะมุ่งใช้คำสั่ง .groupby() เพื่อสรุปภาพรวมรายกลุ่มประชากร

💻 โค้ดคำนวณยอดเงินและรายการรวมสะสมรายสถานพยาบาล (Data Aggregation):

# รวมกลุ่มข้อมูลด้วยรายชื่อสถานพยาบาล และประมวลผลสถิติสะสมหลายมิติ
practice_stats = df_linked.groupby('practice_name').agg(
    total_spend=('actual_cost', 'sum'),        # ยอดใช้จ่ายยาในระบบรวม 
    average_price=('actual_cost', 'mean'),      # ราคายาเฉลี่ยต่อระเบียนสั่งใช้ยา 
    total_prescriptions=('items', 'count')      # ผลรวมจำนวนรายการใบสั่งยา 
).reset_index()

practice_stats.head()

🔍 กระบวนการ Split-Apply-Combine: โค้ดด้านบนจะทำการแยกกลุ่มตามรายชื่อคลินิก (Split) สั่งให้ประมวลผลตามฟังก์ชันที่กำหนดในแต่ละคอลัมน์ (Apply) และยุบตารางกลับมาแสดงผลเป็นค่าสถิติวินิจฉัยเปรียบเทียบในรูปตารางสรุปที่มีขนาดกระชับ (Combine)

📚 อ้างอิงทฤษฎีการจัดการทรัพยากร: สามารถสืบค้นตัวอย่างงานวิจัยและดัชนีชี้วัดความปลอดภัยจากการสั่งจ่ายยาเวชปฏิบัติทั่วไปเพิ่มเติมได้จากฐานข้อมูลเปิด.
👉 เข้าสู่รายงานสถิติและความปลอดภัยในระบบจัดการข้อมูลเวชระเบียนสากล (Monash University / DOI: 10.1186/s12912-025-03195-6)

ตรรกะการกรองระดับกลุ่ม (HAVING Concept in Pandas)

ในการกรองข้อมูลระดับแถวทั่วไปเราจะใช้เงื่อนไข WHERE แต่ในระบบฐานข้อมูลขนาดใหญ่ เมื่อทำการจัดกลุ่มแล้วเราต้องใช้เงื่อนไข **HAVING** เพื่อคัดเลือกกลุ่มข้อมูลเป้าหมาย

💻 โค้ดกรองหาเฉพาะสถานพยาบาลที่มียอดสั่งจ่ายยาหนาแน่นสะสมสูงกว่าเกณฑ์:

# กรองตารางสรุปโดยเลือกเฉพาะสถานพยาบาลที่มีใบสั่งยาสะสม > 1,000 ใบ (HAVING)
high_volume_practices = practice_stats[
    practice_stats['total_prescriptions'] > 1000
]

# เรียงลำดับจากสถานพยาบาลที่มียอดมูลค่ารายจ่ายสะสมสูงสุดลงมาตรวจเช็ค
high_volume_practices = high_volume_practices.sort_values(
    by='total_spend',
    ascending=False
)
  

🚨 ข้อห้ามเชิงระบบ: ห้ามกรองเงื่อนไขผลรวมสะสม (เช่น cost.sum() > 1000) ในขั้นตอน WHERE ตั้งแต่แรก เพราะ ณ จุดนั้นคอมพิวเตอร์ยังไม่ได้ประมวลผลจัดกลุ่ม จะทำให้เกิดความบกพร่องทางตรรกะการคำนวณทันที

📚 อ้างอิงการจัดลำดับลำดับสิทธิ์ผู้ป่วย: ศึกษาทฤษฎีการประยุกต์ใช้แบบจำลองวิเคราะห์ข้อมูลเพื่อลดการติดขัด (backlog) และจัดสรรทรัพยากรสุขภาพได้ตามคู่มือ.
👉 เข้าสู่งานวิจัยการประเมินสิทธิ์และการจัดลำดับการดูแลคลินิกเบาหวาน (DOI: 10.4103/sjmms.sjmms_394_22)

แนะนำแหล่งคลังข้อมูลเวชระเบียนระดับสากล

ในการทำโครงงานกลุ่มวิชานี้ (สัดส่วนคะแนนสะสมร้อยละ ๓๐) และการทำงานวิจัยวิทยาศาสตร์การแพทย์ นักศึกษาควรทำความรู้จักและสืบค้นฐานข้อมูลทางการแพทย์ที่เป็นระบบเปิดในระดับสากลดังนี้ครับ:

🏥 PhysioNet คลังวิจัย

แพลตฟอร์มหลักระดับโลก สนับสนุนโดย MIT รวบรวมข้อมูลสัญญาณชีพและเวชระเบียนดิจิทัลสำหรับงานวิจัย AI .

ไปที่เว็บไซต์หลัก PhysioNet → [20]

🗄️ ฐานข้อมูลสากล MIMIC

ฐานข้อมูลผู้ป่วยภาวะวิกฤต (ICU) แบบลบตัวตน เพื่อศึกษาอัตราการรอดชีวิตและการวิเคราะห์ประวัติทางคลินิก .

📊 UCI Machine Learning

แหล่งรวบรวมชุดข้อมูลมาตรฐานสำหรับการทดสอบแบบจำลองทางสถิติและ Machine Learning ทั่วไป ครอบคลุมโรคเบาหวานและโรคเรื้อรัง .

ไปที่ระบบฐานข้อมูล UCI → [25]
💡 ข้อตระหนักเชิงระบบ: แหล่งข้อมูลเวชระเบียนจริงของคนไข้ (เช่น MIMIC-III และ MIMIC-IV) มีนโยบายจำกัดการเข้าถึง โดยกำหนดให้เฉพาะนักวิจัยที่ผ่านการฝึกอบรมและผ่านการทดสอบมาตรฐานจริยธรรมข้อมูล เช่น การรับรองหลักสูตร **CITI Program** จึงจะได้รับสิทธิ์ในการดาวน์โหลดและนำข้อมูลไปประมวลผลวิจัยต่อได้ .

โจทย์ปฏิบัติการและการบ้าน ๒ (Homework 2)

การประเมินเพื่อตัดสินผลการเรียนรู้ของรายวิชา (Summative Assessment) ตามกรอบแผนการสอน มม.๓

📋 โจทย์สำหรับฝึกทักษะ (รายบุคคล):

  • ดาวน์โหลดตารางข้อมูลสั่งจ่ายยา prescriptions.csv และแฟ้มทะเบียน practices_registry.csv
  • ใช้ Jupyter Notebook ทำการเชื่อมตารางแบบ **Left Join** ตามรหัส practice_code
  • ใช้ฟังก์ชัน **Group By** เพื่อคำนวณหาค่าเฉลี่ยสถิติราคายา และจำนวนรายการใบสั่งรวมแยกเป็นรายคลินิก
  • ทำตัวกรองแบบ **Having** เลือกดึงเฉพาะคลินิกในเขตชนบท (Rural) ที่มียอดรวมการจ่ายยามากกว่า 500 ใบสั่งยา
  • บันทึกไฟล์ส่งออกเป็น CSV ในรูปแบบ student_id_homework2.csv และส่งตัวโค้ด .ipynb
AMMS 302 | สัปดาห์ที่ ๒ (ส่วนที่ ๓)

การประยุกต์ใช้การผูกข้อมูลและการสร้างตัวชี้วัดระบบสุขภาพ

เจาะลึกกระบวนการตรวจสอบคุณภาพข้อมูล (Post-Merge Audit), การหาอัตราครองเตียงเฉลี่ย (ICU LOS), และการวิเคราะห์ความเหลื่อมล้ำภูมิศาสตร์สาธารณสุข [2, 3]

🎯 หัวข้อเรียนรู้ด้วยตนเองในส่วนที่ ๓ (คลิกเพื่อข้ามไปยังสไลด์)

กระบวนการตรวจสอบคุณภาพระเบียนหลังการเชื่อมตาราง

ในวิทยาการข้อมูลสุขภาพ ขั้นตอนที่สำคัญที่สุดหลังจากทำการเชื่อมตาราง (Data Merging) คือ การทวนสอบ (Post-Merge Quality Audit) [4] เพื่อตรวจสอบว่ามีระเบียนคนไข้ตกหล่น หรือคีย์หลุดเกิดเป็นค่าสูญหายอันตรายขึ้นหรือไม่

💻 ชุดคำสั่งตรวจสอบความครบถ้วนของมิติข้อมูลใน Jupyter Notebook:

# 1. ตรวจสอบมิติ (Shape) ว่าระเบียนหลักของใบสั่งยาฝั่งซ้ายไม่ลดลงอย่างผิดปกติ
print(f"ขนาดตารางก่อนเชื่อม: {df_prescriptions.shape} แถว")
print(f"ขนาดตารางหลังเชื่อม: {df_linked.shape} แถว")

# 2. ค้นหารายชื่อสถานพยาบาลที่ไม่ตรงกับระบบทะเบียน (Orphan Keys)
unmatched_practices = df_linked[df_linked['practice_name'].isnull()]['practice_code'].unique()
print(f"รหัสคลินิกที่ไม่มีชื่อขึ้นทะเบียน: {unmatched_practices}")

# 3. สรุปภาพรวมโครงสร้างคอลัมน์และประเภทตัวแปรใหม่ทั้งหมด
df_linked.info()

🔒 ความสำคัญของการตรวจสอบ: หากนักศึกษาเลือกเชื่อมตารางด้วย Inner Join แล้วไม่ตรวจสอบให้ดี ข้อมูลผู้ป่วยที่ไม่มีคีย์จับคู่ฝั่งขวาจะถูกลบทิ้งไปอย่างเงียบๆ ส่งผลให้อัตราความชุกของโรคหรือรายงานทางการคลังมีความบกพร่องทันที

📚 อ้างอิงเชิงระบบ: เทคนิคการลดความเสี่ยงและความผิดพลาดจากการดึงระเบียนเวชระเบียนอิงตามมาตรฐานความโปร่งใสของสถาบันเวชสารสนเทศสากล [4].
👉 อ่านรายละเอียดโครงงานวิจัยการลดความผิดพลาดข้อมูล EHR ของ National Center for Biotechnology Information (NCBI)
สัปดาห์ที่ 2: Post-Merge Validation Methods

การสกัดตัวชี้วัดความปลอดภัยและการครองเตียง (KPIs)

เรานำทักษะการ Group By มารวมกับการวิเคราะห์มิติเชิงเวลาเพื่อคำนวณ ระยะเวลาครองเตียงรักษาเฉลี่ย (Length of Stay: LOS) และอัตราความรุนแรงของคนไข้ระดับโรงพยาบาล [5, 6]

💻 โค้ดสรุปค่าวันนอนเฉลี่ย และสัญญาณชีพวิกฤตเฉลี่ยรายโรงพยาบาล:

# 1. คำนวณระยะวันนอนรักษา (Length of Stay) จากวันที่เข้าและจำหน่ายผู้ป่วย
df_linked['LOS'] = (pd.to_datetime(df_linked['discharge_date']) - pd.to_datetime(df_linked['admission_date'])).dt.days

# 2. ยุบตารางหาค่าเฉลี่ยวันครองเตียง (LOS) และความดันวิกฤตต่ำสุดรายห้อง ICU
hospital_kpis = df_linked.groupby('hospital_name').agg(
    average_stay=('LOS', 'mean'),
    min_systolic_bp=('systolic_bp', 'min'),
    total_patients=('patient_id', 'count')
).reset_index()

hospital_kpis.head()

🔬 การแปรผลลัพธ์เชิงสารสนเทศ: ตารางสรุปนี้จะช่วยให้ผู้บริหารระบบสุขภาพสามารถวินิจฉัยเพื่อจัดสรรกำลังบุคลากรพยาบาล และระบุพิกัดหอผู้ป่วยวิกฤตที่มีแนวโน้มรับภาระงานคนไข้หนาแน่นเกินความจุ (ICU Congestion) ได้อย่างมีประสิทธิภาพ [5, 6]

📚 แหล่งสถิติความปลอดภัย ICU สากล: ดัชนีวันนอนเฉลี่ย (Hospital LOS) และอัตราครองเตียงเป็นตัวชี้วัดความโปร่งใสในระบบสาธารณสุขยุคดิจิทัล [5-7].
👉 สืบค้นรายงานวิเคราะห์ข้อมูลและตัวชี้วัดความปลอดภัยในแผนกผู้ป่วยวิกฤตสากล (Monash University Review / DOI: 10.1186/s12912-025-03195-6)

ข้อมูลเชิงภูมิศาสตร์สุขภาพ และการลดความเหลื่อมล้ำ

การยกระดับคุณภาพบริการสาธารณสุขชุมชน ต้องพิจารณาความเท่าเทียมในการเข้าถึงยาและนวัตกรรม [3, 8] เราจึงนำระเบียนการรักษามาผูกเชื่อมต่อกับ ข้อมูลที่ตั้งทางภูมิศาสตร์ (Geographic Metadata)

🗺️ เชื่อมโยงข้อมูลเพื่อหาพฤติกรรม Rural vs Urban:

การเชื่อมข้อมูลด้วยรหัสพื้นที่ช่วยจำแนกพฤติกรรมการจ่ายยาสมุนไพรและยาแผนปัจจุบันของคลินิกในเขตเมืองและเขตห่างไกลชนบท เพื่อจัดลำดับสิทธิ์การดูแลและงบประมาณสำรองฉุกเฉิน [3, 8]

# วิเคราะห์เปรียบเทียบมูลค่ารวมค่ายาระหว่างสองเขตพิกัด
equity_analysis = df_linked.groupby('area_type').agg(
    total_drug_cost=('actual_cost', 'sum'),
    prescribing_clinics=('practice_code', 'nunique')
).reset_index()

🏥 แนวคิดและบทสรุปจากตำราเรียนวิชาสารสนเทศ:

ตามที่ระบุในหนังสืออ้างอิง ความรอบรู้ด้านสุขภาพ (Health Literacy) ความสามารถของประชาชนในการเข้าถึงระบบส่งเสริมสุขภาพจำเป็นต้องพึ่งระบบข้อมูลที่โปร่งใส การประสานชุดข้อมูลที่มีภูมิศาสตร์ร่วมจะช่วยขจัดความเหลื่อมล้ำทางสุขภาพได้อย่างแท้จริง [3, 9]


ทรัพยากรอ้างอิงหลักสูตร: ใช้หลักการจัดการระเบียนเพื่อศึกษาการจัดกลุ่มโรคเชิงกายภาพและการประเมินนโยบายสุขภาพ [10]

📚 ทรัพยากรเรียนรู้ด้วยตนเอง: นักศึกษาสามารถทบทวนความรู้กฎหมายและจรรยาบรรณวิเคราะห์พื้นที่ข้อมูลสุขภาพระดับเมือง-ชนบทได้ผ่านตำราสุขศึกษาและการประเมินสิทธิ์ระดับองค์กร [9-11].
👉 ลงทะเบียนเรียนทบทวนบทเรียนล่วงหน้าได้ที่รายวิชาออนไลน์ "เทคโนโลยีดิจิทัลและสารสนเทศทางสุขภาพ" บนระบบ MUx MOOC มหาวิทยาลัยมหิดล

การบริหารหน่วยความจำ (RAM) เมื่อผูกข้อมูลขนาดใหญ่

เนื่องจากฐานข้อมูลเวชระเบียนจริง เช่น MIMIC-IV บรรจุข้อมูลสัญญาณชีพคนไข้นับล้านแถว [12, 13] การดึงไฟล์ดิบทั้งหมดเข้ามาผูกร่วมกันจะส่งผลให้ระบบประมวลผลหยุดทำงาน (Out of Memory Error)

🚫 ปัญหาการโหลดข้อมูลล้น RAM และทางเลือกในการเขียนโค้ดที่ถูกต้อง:

✅ 1. เลือกโหลดเฉพาะคอลัมน์ที่จำเป็น (Usecols):

ลดการจองพื้นที่ RAM โดยคัดกรองเฉพาะคอลัมน์คีย์หลักร่วมและตัวชี้วัดที่เราจะวิเคราะห์สรุปผลสถิติตั้งแต่ตอนดึงเข้าสู่ Pandas

# โหลดเฉพาะคอลัมน์รหัสคลินิกและค่ายาเท่านั้น
cols = ['practice_code', 'actual_cost']
df_rx_thin = pd.read_csv('prescriptions.csv', usecols=cols)
✅ 2. การกำหนดประเภทข้อมูลประหยัดสเปค (Downcasting):

ตามสเปคท่อส่งข้อมูลการแพทย์สมัยใหม่ [14] การแปลงชนิดข้อมูลจำนวนเต็มหรือชนิดเลขทศนิยมให้มีขนาดเล็กลงช่วยประหยัดหน่วยความจำได้เกินร้อยละ ๕๐

# แปลงค่าน้ำหนักเพื่อความเบาของหน่วยประมวลผล
df_linked['Age'] = pd.to_numeric(df_linked['Age'], downcast='integer')
💡 แนวปฏิบัติระดับสากล: การจัดการข้อมูลเวชระเบียนขนาดใหญ่ในสภาวะที่มีทรัพยากรจำกัด สามารถศึกษาเทคนิคและแนวทางการแบ่งกลุ่ม (Chunking) เพิ่มเติมได้จากเอกสารของ MIT [13-15].
👉 เปิดประตูสู่การใช้งาน BigQuery และท่อส่งข้อมูลประมวลผลประสิทธิภาพสูงของฐานข้อมูล MIMIC ทางคลินิก (MIT MIMIC Portal)

คู่มือและแนวทางปฏิบัติสู่ความสำเร็จสัปดาห์ที่ ๒

นักศึกษาสามารถนำความรู้และทักษะทั้ง ๓ ส่วนย่อยในสัปดาห์นี้ ไปประยุกต์เขียนรหัสคอมพิวเตอร์เพื่อทำใบงานสะสมคะแนน Homework 2 (ร้อยละ ๒๐) [16] ให้ถูกต้องสมบูรณ์แบบ

📋 แผนงานตรวจสอบคุณภาพสำหรับส่ง Homework 2 (CLO2 Evaluation) [17]

🏁 1. ขั้นตอนเชื่อมตาราง (Data Linkage)

  • ใช้คำสั่ง pd.merge() แบบ Left Join เท่านั้น
  • ตรวจสอบจำนวนแถวหลังเชื่อมโยงระเบียน

📊 2. ขั้นสรุปกลุ่มสถิติ (Group By)

  • ยุบกลุ่มตารางรายชื่อคลินิก ค้นหารายจ่ายค่ายาสะสมรวม และอัตราเฉลี่ย
  • รันคำสั่งรีเซ็ตดัชนีคอลัมน์ให้แบนราบ

🧹 3. ขั้นกรองผลลัพธ์ (Having)

  • คัดกรองเฉพาะกลุ่ม Rural ที่จ่ายยามากกว่า 500 ใบสั่งยาขึ้นไป
  • ส่งออกเป็นไฟล์ CSV ปลอดภัยโดยไม่ฝังดัชนีคีย์หลัก
💡 ทรัพยากรจัดเตรียมข้อมูลการเรียนรู้เพิ่มเติม: สำหรับนักศึกษาที่ต้องการศึกษาและดาวน์โหลดชุดข้อมูลเวชระเบียนคนไข้และตารางอัตราการรักษาโรคเรื้อรังระดับเปิดสากลเพื่อการทวนสอบ (Self-practice) [18, 19].
👉 สืบค้นคลังดาวน์โหลดชุดข้อมูลและแบบจำลองการทำนายเวชระเบียนทางการแพทย์ทั้งหมดใน UCI Machine Learning Repository
AMMS 302 | สัปดาห์ที่ ๒ (ส่วนที่ ๔)

การแปลงและเชื่อมโยงระเบียนข้อมูลเวชระเบียนสากล (HL7 FHIR JSON)

ปฏิบัติการเรียนรู้เชิงลึกด้านการคลี่โครงสร้างซับซ้อน (Nested JSON Data normalization), การสกัดคุณลักษณะ (Feature Extraction) และมาตรฐานการคุ้มครองข้อมูลอ่อนไหวทางการแพทย์

🎯 สารบัญบทเรียนย่อยส่วนที่ ๔ (คลิกเพื่อข้ามไปยังสไลด์)

มาตรฐาน HL7 FHIR และการแลกเปลี่ยนข้อมูลสุขภาพ

ข้อมูลสารสนเทศสุขภาพในอดีตมักจัดเก็บในรูปแบบกระจัดกระจายและไร้ทิศทาง ทำให้เกิดปัญหาการเชื่อมต่อข้ามโรงพยาบาล มาตรฐาน HL7 FHIR (Fast Healthcare Interoperability Resources) [3] จึงถูกพัฒนาขึ้นเพื่อกำหนดรูปแบบการสื่อสารเวชระเบียนสากลในลักษณะของโครงสร้างข้อมูลกึ่งมีโครงสร้าง (Semi-structured XML/JSON) [3-5]

🔥 โครงสร้างหลักภายในระบบระเบียบ FHIR:

  • Resources: หน่วยข้อมูลขั้นพื้นฐานที่จับต้องได้ทางการแพทย์ เช่น ทะเบียนประวัติ (Patient) [4], บันทึกอาการโรค (Condition) [5], และข้อมูลสัญญาณชีพ/ผลการตรวจแล็บ (Observation) [5]
  • Bundle Structure: โครงสร้างรวบรวมระเบียนข้อมูล (Transaction Container) ที่ใช้บรรจุเวชระเบียนผู้ป่วยจำลองเพื่อส่งออกและประมวลผลพร้อมกันในคราวเดียว [5, 6]

🏥 คุณลักษณะแบบจำลองจำลองเพื่อความปลอดภัย:

เนื่องจากมาตรฐาน FHIR ในระบบข้อมูลสุขภาพขนาดใหญ่มักเป็นโครงสร้างเชิงสัมพันธ์ (Relational) การใช้ระบบสังเคราะห์ประวัติผู้ป่วยเสมือนจริง เช่น PySynthea [3] (Python-native, แทน Synthea Java เดิม) ร่วมกับมาตรฐาน FHIR ทำให้นักศึกษาสามารถจำลองกรณีศึกษาการรักษาโรคเบาหวานหรือโรคเรื้อรังได้โดยไม่ล่วงละเมิดสิทธิผู้ป่วยจริง [3, 7]


ทิศทางสำคัญ: อิงตามเอกสารแนะนำ "Health Informatics for Health Service Systems" ในแผนหลักสูตรรายวิชา [8]

📚 เรียนรู้ข้ามระบบด้วยตนเอง: ศึกษารายละเอียดภาพรวมข้อมูลสังเคราะห์และมาตรฐาน FHIR สำหรับทำงานวิจัยสากลได้จาก MITRE/NIH Portal [3].
👉 ลิงก์เข้าสู่หน้าเว็บคู่มือมาตรฐานสากล Synthea Synthetic Data Overview - FHIR® for Research
สัปดาห์ที่ 2: HL7 FHIR Interoperability Foundations [1, 3]

การเขียนสคริปต์คลี่ตารางข้อมูลซ้อน (Nested JSON Normalization)

เนื่องจากเวชระเบียนสากลแบบ FHIR บันทึกในฟอร์แมต JSON ที่ซับซ้อนและมีการซ้อนทับกันหลายกิ่งก้าน (Nested Properties) [4, 5] เราจำเป็นต้องใช้ฟังก์ชัน pd.json_normalize() ของ Pandas เพื่อจัดรูปแบบให้อยู่ในตารางแบนราบ (Flat Table)

💻 ชุดคำสั่งคลี่ตารางข้อมูลผู้ป่วยจากโครงสร้าง FHIR Bundle JSON:

import json
import pandas as pd

# 1. โหลดระเบียนผู้ป่วยและแปลงข้อความดิบเป็นอ็อบเจกต์ Python
with open('patient_fhir_demo.json') as f:
    fhir_data = json.load(f)

# 2. คลี่โครงสร้างซับซ้อน (Nested path) ภายใต้คีย์ 'entry' ให้ออกมาเป็นระนาบตารางแบนราบ
df_flat = pd.json_normalize(
    fhir_data, 
    record_path=['entry'], 
    meta=['id', 'resourceType']
)
df_flat.head(5)

💡 เทคนิคที่ต้องเข้าใจ: พารามิเตอร์ record_path บังคับระบุพิกัดกิ่งก้านเป้าหมายที่เราต้องการสกัดแตกออกเป็นแถว ส่วนตัวแปร meta ช่วยดึงคุณลักษณะคีย์หลักด้านบน (Root Keys) ติดลงมาในตารางสรุปใหม่ เพื่อใช้ในการเชื่อมโยงตารางข้อมูลต่อยอดได้สะดวก

📚 ฝึกทดลองเขียนโค้ดและส่งผลงานร่วมพัฒนา: ค้นหาและเรียนรู้แนวคิดสถาปัตยกรรมแบบจำลองสถานะจำกัดสำหรับการจำลองข้อมูลเพิ่มเติมได้จากกลุ่มผู้พัฒนา [9].
👉 ลิงก์เข้าสู่PySynthea (Python-native) — TIET-AI/tietai-synthea on GitHub (แทน Synthea Java เดิม)

การสร้างท่อส่งข้อมูลสกัดลักษณะคุณลักษณะทางคลินิก

ในการพัฒนาโมเดลปัญญาประดิษฐ์ทางการแพทย์ขั้นสูง (เช่น การทำนายการกลับเข้ารักษาซ้ำภายใน 30 วัน หรือ 30-day Readmission Prediction) เราต้องเขียนโค้ดเพื่อสกัดคุณลักษณะเด่น (Feature Extraction) จากแฟ้ม FHIR JSON Bundle [6]

💻 สถาปัตยกรรมการดึงค่าประวัติ วันครองเตียง และสัญญาณชีพ (Feature Extractor Pipeline):

# คำนวณหาอายุจริงและระยะเวลานอนรักษาในโรงพยาบาล (Length of Stay: LOS)
start_date = pd.to_datetime(df_flat['resource.period.start'])
end_date = pd.to_datetime(df_flat['resource.period.end'])
df_flat['los_days'] = (end_date - start_date).dt.days

# ดึงค่าผลตรวจห้องปฏิบัติการ เช่น ระดับน้ำตาลสะสม (LOINC code: 4548-4 เป็น HbA1c) [5, 6]
df_flat['hba1c_level'] = df_flat.apply(
    lambda r: r['resource.valueQuantity.value'] 
    if r['resource.code.coding']['code'] == '4548-4' else None, 
    axis=1
)

🔬 การเชื่อมโยงระบบ: วิธีนี้ช่วยดึงข้อมูลสัญญาณชีพในระบบบันทึกเวลาจริง (Timeseries) และข้อมูลจากอุปกรณ์สวมใส่ [10] มาร้อยเรียงสรุปผลสถิติในระดับผู้ป่วยรายบุคคลเพื่อการดูแลรักษาแบบแม่นยำ (Precision Medicine) [11]

📚 เครื่องมือสร้างจำลองพยาธิวิทยา: สามารถใช้โปรแกรมจำลองภายนอกในการแก้ไขและควบคุมการสร้างพฤติกรรมและการกระจายตัวของผู้ป่วยเบาหวานและโรคเรื้อรังได้เพิ่มเติม [12].
👉 ลิงก์เข้าสู่ระบบออกแบบโมเดลโรคผู้ป่วยจำลองสากล (Synthea Generic Module Builder Portal)

กฎหมายคุ้มครองสิทธิ์และความปลอดภัยข้อมูลสุขภาพ

เนื่องจากข้อมูลระเบียนผู้ป่วย (EHR) ถือเป็นข้อมูลส่วนบุคคลที่มีความอ่อนไหวสูงมาก (Sensitive Personal Identifiable Information: PII) [1] การจัดสรรและเชื่อมโยงตารางข้อมูลจึงต้องอยู่ภายใต้เกณฑ์จริยธรรมข้อมูลสารสนเทศสุขภาพอย่างเคร่งครัด [8, 13]

⚖️ กฎหมายควบคุมระดับสากลและในประเทศไทย:

  • PDPA พ.ศ. 2562 (ประเทศไทย): พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล กำหนดสิทธิและการขอความยินยอมในการดึงระเบียนคนไข้ไปศึกษาต่อยอด [8, 14]
  • HIPAA Act (ระดับสากล): มาตรฐานสากลว่าด้วยการรักษาสิทธิ์ความปลอดภัยและความลับของเวชระเบียนทางการแพทย์ [15]
  • จรรยาบรรณวิชาชีพ: นักวิจัยและแพทย์ต้องลงนาม Data Use Agreement และผ่าน CITI Program ก่อนเข้าใช้ฐานข้อมูลเปิด [16, 17]

🛡️ ยุทธศาสตร์เทคโนโลยีรักษาความลับเชิงนโยบาย:

สมาคมเวชสารสนเทศไทย (TMI) และนโยบายคลาวด์กลางภาครัฐ [1] แนะนำให้ใช้กระบวนการเข้ารหัส (Encryption) [18] และการปิดบังตัวตนผู้ป่วยระดับลึก (Anonymization) เช่น การคัดทิ้งและจำกัดข้อมูลอายุผู้ป่วยเพื่อป้องกันภัยการสืบหาตัวตนย้อนกลับ (Re-identification)


เป้าหมาย CLO3: ตระหนักและสามารถอธิบายเกณฑ์กฎหมายและจริยธรรมข้อมูลได้ [19]

📚 กฎบัตรและการคุ้มครองสิทธิ์สากล: ศึกษารายละเอียดแนวปฏิบัติการเข้าสืบค้นและนโยบายความคุ้มครองข้อมูลสุขภาพระดับประเทศที่เข้มงวดเพิ่มเติมได้จากคลังสนับสนุนการวิจัย.
👉 ลิงก์อ้างอิงเอกสารข้อบังคับสัญญารักษาความลับและสิทธิ์ข้อมูลสากล (All of Us Data Protection Policy Hub)

สรุปปฏิบัติการและการบ้านสัปดาห์ที่ ๒ (Homework 2)

เกณฑ์ตัดสินและผลลัพธ์เพื่อประเมินความสามารถการเขียนโปรแกรมและการรวมกลุ่มข้อมูลขนาดใหญ่สะสมร้อยละ ๒๐ [19]

🏁 รายการสรุปขั้นตอนปฏิบัติสู่ความสำเร็จ:

  1. ดาวน์โหลดข้อมูลจำลองและเชื่อมโยงตารางผ่านรหัส practice_code ด้วย Left Join [1]
  2. ใช้คำสั่งสรุปกลุ่มสถิติรวมยอดรายจ่ายและอัตราค่ารักษาเฉลี่ยรายประเภท
  3. กรองข้อมูลหลังประมวลผลกลุ่ม (Having) เลือกเฉพาะพิกัดเขตภูมิศาสตร์ชนบทและคลินิกยอดสะสมการรักษาหนาแน่น [1]
  4. ส่งออกไฟล์ผลงานผ่านเครื่องคอมพิวเตอร์ออฟไลน์ และส่งก่อนเข้าเรียนปฏิบัติการสัปดาห์ถัดไป
💡 ขยายมิติข้อมูลวิจัยด้วยตนเอง: นักศึกษาสามารถเข้าไปสืบค้นและดาวน์โหลดสัญญาณชีพจากอุปกรณ์สวมใส่เชิงอนุกรมเวลาเพื่อทดสอบการจัดกลุ่มได้เพิ่มเติม [20].
👉 ลิงก์สืบค้นและเข้าดาวน์โหลดชุดข้อมูลสัญญาณชีพสากล (Zenodo Open Access: Wearable Sensor Health and Activity Dataset)
🔧 Self-study บน Windows (scoop/uv): ติดตั้งตาม scoop.shscoop install git uvuv add tietai-synthea pandas jupyterlab — เอกสารทางการ: uv installation | uv projects | PySynthea Quick Start