Back

พื้นฐาน Data Mining: Regression, Classification, ClusteringBlur image

บทความนี้แนะนำ Data Mining (การทำเหมืองข้อมูล) ตั้งแต่แนวคิดพื้นฐาน โดยเริ่มจากความแตกต่างระหว่าง Supervised Learning และ Unsupervised Learning ก่อนเจาะลึก 4 เทคนิค ที่ใช้บ่อย ได้แก่ Linear Regression และ Classification ในกลุ่ม Supervised Learning รวมถึง Association และ Clustering ในกลุ่ม Unsupervised Learning

ทุกตัวอย่างใช้ ข้อมูลโรงพยาบาล พร้อมทั้ง ทฤษฎี + สูตร, ไฟล์ CSV แยก และ โค้ด Python ที่สามารถคัดลอกไปรันบน Google Colab ได้ทันที โดยไม่ต้องติดตั้งโปรแกรมเพิ่มเติม


1. Data Mining คืออะไร#

ทฤษฎี#

Data Mining คือกระบวนการค้นหา รูปแบบ (patterns) ความสัมพันธ์ หรือ ความรู้ที่ซ่อนอยู่ จากข้อมูลจำนวนมาก โดยประยุกต์ใช้เทคนิคจากหลายสาขา เช่น สถิติ, แมชชีนเลิร์นนิง (machine learning) และ ฐานข้อมูล (database)

เปรียบเทียบง่าย ๆ: ข้อมูล (data) เปรียบเสมือน “แร่ดิบ” ส่วน Data Mining คือกระบวนการ “ทำเหมือง” เพื่อสกัดเอา “ทองคำ” ซึ่งก็คือความรู้หรือรูปแบบที่มีคุณค่าออกมา

กระบวนการ KDD#

Data Mining มักเป็นส่วนหนึ่งของกระบวนการที่เรียกว่า KDD (Knowledge Discovery in Databases) ซึ่งเป็นกระบวนการเปลี่ยนข้อมูลดิบให้กลายเป็นความรู้ที่สามารถนำไปใช้งานได้ โดยมีขั้นตอนหลัก 4 ขั้น ดังภาพด้านล่าง

กระบวนการ Data Mining: ข้อมูลดิบ → เตรียมข้อมูล → ทำเหมืองข้อมูล → รูปแบบ/ความรู้

  1. ข้อมูลดิบ (Raw Data) — ข้อมูลที่เก็บรวบรวมมาจากแหล่งต่าง ๆ ซึ่งอาจมีข้อมูลผิดพลาด ค่าที่หายไป ข้อมูลซ้ำ หรือรูปแบบที่ไม่สอดคล้องกัน
  2. เตรียมข้อมูล (Preprocessing) — ทำความสะอาด จัดรูปแบบ และแปลงข้อมูลให้อยู่ในรูปแบบที่เหมาะสม เช่น แปลงค่าหมวดหมู่ "yes/no" ให้เป็นตัวเลข ซึ่งเรียกว่า encoding
  3. ทำเหมืองข้อมูล (Mining) — เลือกเทคนิคที่เหมาะสม เช่น Classification, Association หรือ Clustering เพื่อค้นหารูปแบบจากข้อมูลที่เตรียมไว้
  4. รูปแบบ/ความรู้ (Patterns) — ผลลัพธ์ที่สามารถนำไปใช้สนับสนุนการตัดสินใจ เช่น โมเดลทำนาย กฎความสัมพันธ์ หรือกลุ่มผู้ป่วยที่มีลักษณะคล้ายกัน

Supervised Learning vs Unsupervised Learning#

Machine Learning สามารถแบ่งออกเป็น 2 แนวทางหลัก โดยพิจารณาว่าข้อมูลที่ใช้ฝึกโมเดล มี label (คำตอบ) กำกับไว้หรือไม่

Supervised Learning (การเรียนรู้แบบมีผู้สอน) — ข้อมูลฝึก มี label กล่าวคือ แต่ละตัวอย่างมี “คำตอบที่ถูกต้อง” กำกับไว้ เปรียบเสมือนนักเรียนที่มี ครูคอยบอกว่าคำตอบใดถูกหรือผิด

โมเดลจะเรียนรู้ความสัมพันธ์ f:Xyf: X \to y ระหว่าง features XX ซึ่งเป็นข้อมูลนำเข้า กับ label yy ซึ่งเป็นคำตอบ จากนั้นจึงนำฟังก์ชัน ff ที่เรียนรู้ได้ไปใช้ทำนายคำตอบของข้อมูล ใหม่ ที่โมเดลไม่เคยเห็นมาก่อน

Supervised Learning แบ่งออกเป็น 2 ประเภทตามชนิดของ label

  • Regression (การถดถอย) — label เป็น ตัวเลข เช่น น้ำหนัก ราคา หรืออุณหภูมิ → ดูตัวอย่างหัวข้อ 3 (Linear Regression: น้ำหนักทารก vs ความดันมารดา)
  • Classification (การจำแนกประเภท) — label เป็น หมวดหมู่ เช่น ใช่/ไม่ใช่ หรือโรค A/B/C → ดูตัวอย่างหัวข้อ 4 (Decision Tree: ทำนายผู้ป่วยกลับมารักษาซ้ำ)

ขั้นตอน Supervised Learning: ข้อมูลมี label → ฝึกโมเดล → ทำนายข้อมูลใหม่

Unsupervised Learning (การเรียนรู้แบบไม่มีผู้สอน) — ข้อมูลฝึก ไม่มี label หรือไม่มี “คำตอบ” กำกับไว้ โมเดลจึงต้อง ค้นหาโครงสร้างหรือรูปแบบจากข้อมูลด้วยตนเอง

เปรียบเสมือนการให้นักเรียนจัดกลุ่มสิ่งของหรือค้นหาความเกี่ยวข้องระหว่างข้อมูล โดยไม่มีครูบอกคำตอบที่ถูกต้อง เช่น การรวมข้อมูลที่มีลักษณะ คล้ายกัน ให้อยู่ในกลุ่มเดียวกัน (Clustering) หรือการค้นหาว่าสิ่งใด มักเกิดร่วมกัน (Association)

ขั้นตอน Unsupervised Learning: ข้อมูลไร้ label → ค้นหากลุ่ม/ความสัมพันธ์เอง

เทคนิคแนวทางมี label?ตัวอย่างคำถาม
Linear RegressionSupervised — Regression✅ มี (ตัวเลข)ทารกจะหนักกี่กรัม?
ClassificationSupervised — Classification✅ มี (หมวดหมู่)ผู้ป่วยจะ “กลับมารักษาซ้ำ” หรือไม่?
AssociationUnsupervised❌ ไม่ใช้”ผู้ที่มีความดันสูง มักเป็นเบาหวานร่วมด้วย” จริงหรือไม่?
ClusteringUnsupervised❌ ไม่มีผู้ป่วยสามารถแบ่งเป็นกี่กลุ่มตามระดับความเสี่ยง?

จำง่าย ๆ: หากข้อมูลมี “คำตอบ” ที่ต้องการให้โมเดลทำนาย → ใช้ Supervised Learning (คำตอบเป็นตัวเลข = Regression, คำตอบเป็นหมวดหมู่ = Classification) หากไม่มีคำตอบและต้องการค้นหารูปแบบจากข้อมูล → ใช้ Unsupervised Learning (Association หรือ Clustering)


2. เตรียมสภาพแวดล้อม: Google Colab#

Google Colab คือสภาพแวดล้อมแบบจูปเตอร์โน้ตบุ๊ก (Jupyter Notebook) ที่ช่วยให้สามารถเขียนและรัน Python ผ่านเว็บเบราว์เซอร์ได้ฟรี โดยไม่ต้องติดตั้ง Python ลงในเครื่อง

Google Colab มีไลบรารียอดนิยม เช่น pandas, scikit-learn และ matplotlib ติดตั้งไว้ให้แล้ว จึงเหมาะสำหรับการทดลอง Data Mining และ Machine Learning เบื้องต้น

  1. เปิด https://colab.research.google.com แล้วเลือก New notebook
  2. รันเซลล์ (cell) แรกด้านล่าง เพื่อติดตั้งไลบรารี mlxtend ซึ่งจะใช้ในหัวข้อ Association จากนั้น import ไลบรารีทั้งหมดที่จำเป็นสำหรับบทความนี้
# เซลล์ที่ 1: ติดตั้ง + import (รันครั้งเดียว)
!pip install mlxtend -q

import pandas as pd
import matplotlib.pyplot as plt
from google.colab import files
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)  # ปิดการแจ้งเตือน DeprecationWarning

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.cluster import KMeans
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
python

สามารถรันแต่ละเซลล์ได้โดยกดปุ่ม Play ทางด้านซ้ายของเซลล์ หรือกด Shift + Enter


3. Linear Regression (การถดถอยเชิงเส้น)#

โจทย์ของข้อมูล Linear Regression: จากความดันโลหิตมารดา ทำนายน้ำหนักแรกเกิดของทารก

ทฤษฎี#

Regression เป็น Supervised Learning ประเภทหนึ่งที่ใช้สำหรับทำนาย ค่าตัวเลขต่อเนื่อง (continuous value) แตกต่างจาก Classification ซึ่งใช้ทำนายข้อมูลที่เป็นหมวดหมู่

ในตัวอย่างนี้ เราจะสร้างโมเดลเพื่อทำนาย น้ำหนักแรกเกิดของทารก (กรัม) จาก ความดันโลหิตของมารดา (mmHg)

Linear Regression ตั้งสมมติฐานว่าความสัมพันธ์ระหว่างตัวแปรต้น xx (ความดันโลหิตของมารดา) และตัวแปรตาม yy (น้ำหนักทารกแรกเกิด) สามารถอธิบายได้ด้วย สมการเส้นตรง

y^=wx+b\hat{y} = w x + b

โดยที่

  • ww = Slope (ความชันของเส้นตรง) แสดงว่าเมื่อ xx เพิ่มขึ้น 1 หน่วย ค่า yy จะเปลี่ยนแปลงไป ww หน่วย
  • bb = Intercept (จุดตัดแกน y) คือค่าของ yy เมื่อ x=0x = 0
  • y^\hat{y} = ค่าที่โมเดลทำนาย

เป้าหมายของโมเดลคือการหาค่า ww และ bb ที่ทำให้ผลรวมกำลังสองของ ค่าคลาดเคลื่อน (Residual) ระหว่างค่าจริง yiy_i และค่าที่โมเดลทำนาย y^i\hat{y}_i มีค่าน้อยที่สุด วิธีนี้เรียกว่า Ordinary Least Squares (OLS)

Loss=1ni=1n(yiy^i)2\text{Loss} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2

เมื่อฝึกโมเดลแล้ว เราสามารถประเมินคุณภาพของเส้นตรงได้ด้วยค่า R2R^2 (Coefficient of Determination) ซึ่งมีค่าระหว่าง 0 ถึง 1

  • R2=1R^2 = 1 → โมเดลอธิบายข้อมูลได้สมบูรณ์ ทุกจุดอยู่บนเส้นตรง
  • R2=0R^2 = 0 → โมเดลไม่สามารถอธิบายข้อมูลได้ดีกว่าการใช้ค่าเฉลี่ยของ yy

ข้อควรระวัง: ความสัมพันธ์ (Correlation) ไม่ได้หมายความว่าเป็น เหตุและผล (Causation) เสมอไป โมเดลนี้เพียงแสดงให้เห็นว่า ความดันโลหิตของมารดาที่สูงขึ้น “มีความสัมพันธ์” กับน้ำหนักทารกที่ลดลง (เช่น อาจเกิดจากภาวะครรภ์เป็นพิษ) แต่ไม่ได้พิสูจน์ว่าความดันโลหิตเป็นสาเหตุโดยตรงของน้ำหนักทารกที่ลดลง

ข้อมูล: pregnancy_bp.csv#

ชุดข้อมูลตัวอย่างประกอบด้วยข้อมูลของมารดา 16 ราย โดยมี 2 คอลัมน์ ได้แก่

  • maternal_bp — ความดันโลหิตของมารดา (mmHg)
  • birth_weight — น้ำหนักแรกเกิดของทารก (กรัม)
maternal_bp,birth_weight
110,3550
113,3480
116,3520
119,3390
122,3340
125,3300
128,3210
131,3150
134,3080
137,3000
140,2940
143,2850
146,2780
149,2680
152,2620
155,2500
csv

โค้ด#

# เซลล์ที่ 2: Linear Regression — อัปโหลด/โหลด pregnancy_bp.csv แล้ววิเคราะห์
files.upload()  # เลือก pregnancy_bp.csv
from sklearn.linear_model import LinearRegression

df_pregnancy = pd.read_csv("pregnancy_bp.csv")
X = df_pregnancy[["maternal_bp"]]
y = df_pregnancy["birth_weight"]

model = LinearRegression()
model.fit(X, y)

print(f"Slope (w)     = {model.coef_[0]:.2f}  g/mmHg")
print(f"Intercept (b) = {model.intercept_:.2f}  g")
print(f"R^2           = {model.score(X, y):.3f}")

# ทำนายน้ำหนักทารก สำหรับมารดาความดัน 140 mmHg
pred = model.predict(
    pd.DataFrame({"maternal_bp": [140]})
)[0]
print(f"ทำนายน้ำหนักทารก @ BP=140 mmHg = {pred:.0f} g")

# กราฟ: จุดข้อมูลจริง + เส้นทำนาย
plt.scatter(X, y)
plt.plot(X, model.predict(X), color="red", label="Regression line")
plt.xlabel("Maternal systolic BP (mmHg)")
plt.ylabel("Birth weight (g)")
plt.legend()
plt.show()
python

ผลลัพธ์ Linear Regression: จุดข้อมูลความดันโลหิตมารดา vs น้ำหนักทารก พร้อมเส้นทำนายสีแดง

เมื่อรันโปรแกรม จะพบว่า Slope มีค่าติดลบ (ประมาณ −20 ถึง −25 g/mmHg) ซึ่งหมายความว่า

เมื่อความดันโลหิตของมารดาเพิ่มขึ้น 1 mmHg น้ำหนักแรกเกิดของทารกมีแนวโน้มลดลงประมาณ 20 กรัม

นอกจากนี้ ค่า R2R^2 จะมีค่าใกล้ 1 แสดงว่าเส้นตรงสามารถอธิบายความสัมพันธ์ของข้อมูลชุดนี้ได้เป็นอย่างดี

กราฟจะแสดงจุดข้อมูลจริง (Scatter Plot) พร้อมเส้นแนวโน้มสีแดงที่ได้จากโมเดล Linear Regression ซึ่งช่วยให้เห็นความสัมพันธ์เชิงเส้นระหว่างตัวแปรทั้งสองได้อย่างชัดเจน

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

กิจกรรม#

ทดลองเปลี่ยนค่าที่ใช้ทำนายในคำสั่ง

model.predict([[140]])
python

เป็น

model.predict([[120]])
python

และ

model.predict([[150]])
python

จากนั้นเปรียบเทียบผลลัพธ์ที่ได้ แล้วสังเกตว่าน้ำหนักทารกที่โมเดลทำนายเปลี่ยนแปลงไปอย่างไร

ผลลัพธ์ควรสอดคล้องกับ Slope ที่มีค่าติดลบ กล่าวคือ เมื่อความดันโลหิตของมารดาสูงขึ้น น้ำหนักแรกเกิดของทารกที่โมเดลทำนายจะมีแนวโน้มลดลง


4. Classification (การจำแนกประเภท)#

โจทย์ของข้อมูล Classification: จากคุณลักษณะผู้ป่วย ทำนายว่าจะกลับมารักษาซ้ำหรือไม่

ทฤษฎี#

Classification ใช้ตอบคำถามว่า “จากคุณลักษณะที่มี ข้อมูลนี้ควรอยู่ในหมวดหมู่ใด?”

Classification เป็นงานประเภท Supervised Learning (การเรียนรู้แบบมีผู้สอน) เพราะข้อมูลที่ใช้ฝึกโมเดลมี คำตอบหรือ Label กำกับไว้แล้ว โมเดลจะเรียนรู้ฟังก์ชัน ff ที่เชื่อมโยง Features XX ไปยัง Label yy

y=f(X)y = f(X)

จากนั้นจึงนำฟังก์ชัน ff ที่เรียนรู้ได้ไปใช้ทำนาย Label ของข้อมูล ใหม่ ที่โมเดลไม่เคยเห็นมาก่อน

ในตัวอย่างนี้ Label คือ readmitted ซึ่งระบุว่าผู้ป่วยจะกลับมารักษาซ้ำหรือไม่

ส่วนประกอบสำคัญของ Classification ได้แก่

  • Training Set — ชุดข้อมูลที่ใช้ฝึกโมเดล
  • Test Set — ชุดข้อมูลที่แยกเก็บไว้สำหรับประเมินผล โดยไม่ใช้ในการฝึก เพื่อดูว่าโมเดลสามารถทำนายข้อมูลใหม่ได้ดีเพียงใด
  • Model — ผลลัพธ์จากกระบวนการฝึก ซึ่งก็คือฟังก์ชัน ff ที่เรียนรู้ความสัมพันธ์ระหว่าง Features และ Label

อัลกอริทึม: Decision Tree กับ Entropy#

Decision Tree (ต้นไม้ตัดสินใจ) เป็นอัลกอริทึมที่สร้างกฎในลักษณะ “ถ้า…แล้ว…” และจัดเรียงกฎเหล่านั้นเป็นโครงสร้างต้นไม้ จึงสามารถอ่านและอธิบายผลลัพธ์ได้ง่าย

หัวใจสำคัญของ Decision Tree คือการเลือกแอตทริบิวต์ที่สามารถแบ่งข้อมูลออกเป็นกลุ่มที่บริสุทธิ์มากที่สุด หรือช่วยลด ความไม่บริสุทธิ์ (Impurity) ของข้อมูลได้มากที่สุด

ค่าความไม่บริสุทธิ์สามารถวัดได้ด้วย Entropy

Info(D)=i=1cpilog2(pi)\text{Info}(D) = -\sum_{i=1}^{c} p_i \log_2(p_i)

โดยที่ pip_i คือสัดส่วนของตัวอย่างที่อยู่ในคลาสที่ ii ภายในชุดข้อมูล DD

  • Info(D)=0\text{Info}(D) = 0 → ข้อมูลบริสุทธิ์ทั้งหมด กล่าวคือทุกตัวอย่างอยู่ในคลาสเดียวกัน
  • Info(D)\text{Info}(D) สูง → ข้อมูลมีหลายคลาสปะปนกัน และมีความไม่แน่นอนสูง

เมื่อแบ่งชุดข้อมูล DD ด้วยแอตทริบิวต์ AA ซึ่งมีค่าย่อยทั้งหมด vv ค่า จะได้ชุดข้อมูลย่อย D1,,DvD_1, \ldots, D_v

ค่าความคาดหวังของ Entropy หลังการแบ่งข้อมูลคำนวณได้จาก

InfoA(D)=j=1vDjDInfo(Dj)\text{Info}*A(D) = \sum*{j=1}^{v} \frac{|D_j|}{|D|} \text{Info}(D_j)

จากนั้นคำนวณ Information Gain ได้ดังนี้

Gain(A)=Info(D)InfoA(D)\text{Gain}(A) = \text{Info}(D) - \text{Info}_A(D)

Decision Tree จะเลือกแอตทริบิวต์ที่ให้ค่า Information Gain สูงที่สุด มาใช้แบ่งข้อมูลที่ Node นั้น แล้วทำกระบวนการเดิมซ้ำในแต่ละกิ่งจนกระทั่งถึง Leaf

ใน scikit-learn การกำหนดพารามิเตอร์ criterion="entropy" หมายถึงให้โมเดลใช้ Entropy และ Information Gain ในการเลือกจุดแบ่งข้อมูล

ข้อควรระวังเรื่อง Overfitting: หากต้นไม้มีความลึกมากเกินไป โมเดลอาจ “จดจำ” รายละเอียดและสัญญาณรบกวน (Noise) ของ Training Set มากเกินไป ทำให้ทำนายข้อมูลใหม่ได้ไม่ดี แนวทางแก้ไข ได้แก่ การจำกัดความลึกด้วย max_depth, การแบ่งข้อมูลเป็น Training Set และ Test Set หรือการตัดแต่งต้นไม้ (Pruning)

ต้นไม้ตัดสินใจแบ่งข้อมูลออกเป็นหมวด Yes/No

ข้อมูล: readmission.csv#

ชุดข้อมูลตัวอย่างประกอบด้วยผู้ป่วย 14 ราย โดยมี Features ได้แก่ age_group, blood_pressure, glucose และ length_of_stay ส่วน Label คือ readmitted ซึ่งมีค่าเป็น yes หรือ no

age_group,blood_pressure,glucose,length_of_stay,readmitted
young,normal,normal,short,no
young,normal,high,short,no
middle,high,normal,long,yes
senior,high,normal,long,yes
senior,normal,high,short,no
senior,high,high,long,yes
middle,normal,high,long,yes
young,high,normal,short,no
young,normal,normal,short,no
senior,high,high,short,yes
young,high,high,short,yes
middle,normal,normal,long,no
middle,high,normal,long,yes
senior,normal,normal,short,no
csv

โค้ด#

# เซลล์ที่ 3: Classification — อัปโหลด/โหลด readmission.csv แล้ววิเคราะห์
files.upload()  # เลือก readmission.csv
df_readmission = pd.read_csv("readmission.csv")

# 1) แยก features ออกจาก label
X = df_readmission.drop(columns=["readmitted"])
y = df_readmission["readmitted"]

# 2) Preprocessing: one-hot encoding แปลงหมวดหมู่ (ข้อความ) เป็น 0/1
#    เช่น blood_pressure=high/normal กลายเป็นคอลัมน์ blood_pressure_high, blood_pressure_normal
X_encoded = pd.get_dummies(X)

# 3) ฝึก Decision Tree (criterion="entropy" = ใช้ information gain)
clf = DecisionTreeClassifier(criterion="entropy", max_depth=4, random_state=0)
clf.fit(X_encoded, y)

# 4) ทำนายผู้ป่วยใหม่: senior, ความดันสูง, น้ำตาลสูง, รักษานาน
new_patient = pd.DataFrame(
    [["senior", "high", "high", "long"]],
    columns=["age_group", "blood_pressure", "glucose", "length_of_stay"],
)
new_encoded = pd.get_dummies(new_patient).reindex(
    columns=X_encoded.columns, fill_value=0
)
print("ทำนาย readmitted สำหรับผู้ป่วยใหม่:", clf.predict(new_encoded)[0])

# 5) แสดงต้นไม้ตัดสินใจที่โมเดลสร้างขึ้น
plt.figure(figsize=(14, 6))
plot_tree(
    clf,
    feature_names=X_encoded.columns,
    class_names=clf.classes_,
    filled=True,
    rounded=True,
    fontsize=9,
)
plt.show()
python

ผลลัพธ์ Decision Tree: ต้นไม้ตัดสินใจที่สร้างจากข้อมูล readmission

เมื่อรันโปรแกรม โมเดลจะทำนายผู้ป่วยใหม่ว่า yes ซึ่งหมายถึงมีแนวโน้มกลับมารักษาซ้ำ และ Google Colab จะแสดงภาพต้นไม้ตัดสินใจที่โมเดลสร้างขึ้น

ลองอ่านเส้นทางจาก Root Node ด้านบนลงไปยัง Leaf Node ด้านล่าง จะเห็นกฎที่โมเดลเรียนรู้จากข้อมูล เช่น การตรวจสอบระดับความดันโลหิต ระดับน้ำตาล หรือระยะเวลาที่พักรักษาในโรงพยาบาล

ในชุดข้อมูลตัวอย่างนี้ ตัวแปร blood_pressure มักมีบทบาทสำคัญในการแบ่งข้อมูล เนื่องจากผู้ป่วยที่มีความดันโลหิตสูงปรากฏร่วมกับการกลับมารักษาซ้ำหลายกรณี

อย่างไรก็ตาม ผลลัพธ์นี้เกิดจากข้อมูลตัวอย่างขนาดเล็ก จึงใช้เพื่อสาธิตหลักการทำงานของ Decision Tree เท่านั้น ไม่ควรนำไปใช้ตัดสินใจทางการแพทย์จริงโดยตรง

กิจกรรม#

ลองเพิ่มข้อมูลผู้ป่วยตัวอย่างอีก 2–3 รายลงในไฟล์ readmission.csv จากนั้นอัปโหลดไฟล์ใหม่และรันโค้ดอีกครั้ง

สังเกตว่าต้นไม้ตัดสินใจที่ได้เปลี่ยนแปลงไปอย่างไร เช่น

  • ตัวแปรที่ใช้แบ่งข้อมูลใน Root Node เปลี่ยนไปหรือไม่
  • จำนวนกิ่งและความลึกของต้นไม้เปลี่ยนแปลงหรือไม่
  • คำทำนายของผู้ป่วยใหม่ยังคงเป็น yes หรือไม่

กิจกรรมนี้ช่วยให้เห็นว่า Decision Tree เรียนรู้กฎจากรูปแบบของข้อมูลโดยตรง ดังนั้นเมื่อข้อมูลฝึกเปลี่ยน โครงสร้างของต้นไม้และผลการทำนายก็อาจเปลี่ยนตามไปด้วย


5. Association Analysis (การวิเคราะห์ความสัมพันธ์)#

โจทย์ของข้อมูล Association: ค้นหาโรคที่มักพบร่วมกันในผู้ป่วยคนเดียวกัน

ทฤษฎี#

Association Analysis เป็นเทคนิคสำหรับค้นหา สิ่งที่มักปรากฏร่วมกัน ภายในธุรกรรมหรือเหตุการณ์ต่าง ๆ

ในบริบททางการแพทย์ เทคนิคนี้สามารถใช้ค้นหา โรคร่วม (comorbidities) ที่มักพบในผู้ป่วยคนเดียวกัน เช่น “ผู้ป่วยที่มีคอเลสเตอรอลสูง มักมีโรคอ้วนร่วมด้วย”

งานประเภทนี้ ไม่มี label และไม่ได้มุ่งทำนายผลลัพธ์ แต่เน้นค้นหา ความสัมพันธ์ ระหว่างการวินิจฉัยหรือเหตุการณ์ที่มักเกิดร่วมกัน

กำหนดให้

  • I=i1,i2,I = {i_1, i_2, \ldots} คือเซตของไอเทมทั้งหมด ในตัวอย่างนี้คือการวินิจฉัยโรคทั้งหมด
  • แต่ละธุรกรรม TT เป็นเซตย่อยของ II ซึ่งแทนการวินิจฉัยทั้งหมดของผู้ป่วยหนึ่งราย
  • Itemset คือเซตย่อยของ II
  • k-itemset คือ Itemset ที่ประกอบด้วยไอเทมจำนวน kk รายการ
  • σ(X)\sigma(X) คือ Support Count หรือจำนวนธุรกรรมที่มี Itemset XX
  • NN คือจำนวนธุรกรรมทั้งหมด

ตัวชี้วัดสำคัญของกฎความสัมพันธ์ XYX \to Y มี 3 ค่า ได้แก่ Support, Confidence และ Lift

Support(XY)=σ(XY)N\text{Support}(X \to Y) = \frac{\sigma(X \cup Y)}{N}

Confidence(XY)=σ(XY)σ(X)=P(YX)\text{Confidence}(X \to Y) = \frac{\sigma(X \cup Y)}{\sigma(X)} = P(Y \mid X)

Lift(XY)=Support(XY)Support(X),Support(Y)\text{Lift}(X \to Y) = \frac{\text{Support}(X \cup Y)}{\text{Support}(X),\text{Support}(Y)}

  • Support — แสดงความถี่โดยรวมของกฎ หรือสัดส่วนของธุรกรรมทั้งหมดที่มีทั้ง XX และ YY

  • Confidence — แสดงว่าในบรรดาธุรกรรมที่มี XX มีสัดส่วนเท่าใดที่พบ YY ร่วมด้วย

  • Lift — ใช้เปรียบเทียบการเกิดร่วมกันของ XX และ YY กับกรณีที่ทั้งสองเกิดขึ้นอย่างอิสระต่อกัน

    • Lift=1\text{Lift} = 1XX และ YY เป็นอิสระต่อกัน หรือไม่มีความสัมพันธ์กันอย่างชัดเจน
    • Lift>1\text{Lift} > 1XX และ YY เกิดร่วมกันมากกว่าที่คาดจากความบังเอิญ แสดงถึงความสัมพันธ์เชิงบวก
    • Lift<1\text{Lift} < 1XX และ YY เกิดร่วมกันน้อยกว่าที่คาด

การวินิจฉัยที่พบร่วมกันเชื่อมด้วยลูกศร "ถ้ามี X มักมี Y"

อัลกอริทึม: Apriori กับหลักการ Anti-monotonicity#

หากมีจำนวนไอเทมมาก การค้นหา Itemset ที่เป็นไปได้ทั้งหมดจะใช้เวลาและทรัพยากรสูงมาก อัลกอริทึม Apriori จึงช่วยลดพื้นที่การค้นหาด้วยหลักการสำคัญที่เรียกว่า Anti-monotonicity

Apriori Principle (Anti-monotonicity): หาก Itemset ใด ไม่เป็น Frequent Itemset หรือมี Support ต่ำกว่าค่าที่กำหนด Superset ทุกชุดของ Itemset นั้นก็จะไม่เป็น Frequent Itemset เช่นกัน

หลักการนี้ทำให้ไม่จำเป็นต้องสร้างและนับ Itemset ขนาดใหญ่ที่มีส่วนย่อยไม่ผ่านเกณฑ์ Support จึงช่วยลดจำนวน Candidate และทำให้การค้นหามีประสิทธิภาพมากขึ้น

แลตทิซของ itemset แสดงการตัดทอนของ Apriori

ขั้นตอนการทำงานของ Apriori

  1. สแกนข้อมูลเพื่อค้นหา 1-itemsets ที่เป็น Frequent Itemset โดยมี Support มากกว่าหรือเท่ากับ min_support
  2. นำ Frequent Itemset มาต่อกัน (Join) เพื่อสร้าง Candidate k-itemsets จากนั้นนับ Support และกรองด้วยค่า min_support ในขั้นตอนนี้จะใช้หลัก Apriori เพื่อตัด Candidate ที่มีส่วนย่อยไม่เป็น Frequent Itemset ออกก่อน
  3. ทำซ้ำจนไม่พบ Frequent Itemset ใหม่
  4. สร้างกฎ XYX \to Y จาก Frequent Itemset ที่มีค่า Confidence มากกว่าหรือเท่ากับเกณฑ์ที่กำหนด

ข้อมูล: diagnoses.csv#

ชุดข้อมูลตัวอย่างประกอบด้วยการวินิจฉัยของผู้ป่วย 5 ราย โดยจัดเก็บในรูปแบบยาว patient_id,diagnosis ผู้ป่วยหนึ่งรายจึงสามารถมีข้อมูลได้หลายแถวตามจำนวนโรคที่ได้รับการวินิจฉัย

patient_id,diagnosis
1,hypertension
1,diabetes
2,hypertension
2,obesity
2,cholesterol
2,heart_disease
3,diabetes
3,obesity
3,cholesterol
3,asthma
4,hypertension
4,diabetes
4,obesity
4,cholesterol
5,hypertension
5,diabetes
5,obesity
5,asthma
csv

โค้ด#

# เซลล์ที่ 4: Association — อัปโหลด/โหลด diagnoses.csv แล้ววิเคราะห์
files.upload()  # เลือก diagnoses.csv
diag = pd.read_csv("diagnoses.csv")
diagnosis_sets = diag.groupby("patient_id")["diagnosis"].apply(list).tolist()

# 1) แปลงชุดการวินิจฉัยเป็นตาราง one-hot: แถว = ผู้ป่วย, คอลัมน์ = โรค (True/False)
te = TransactionEncoder()
basket = pd.DataFrame(
    te.fit(diagnosis_sets).transform(diagnosis_sets),
    columns=te.columns_,
)

# 2) หา frequent itemsets (support >= 0.6 = อย่างน้อย 3 จาก 5 ผู้ป่วย)
frequent = apriori(basket, min_support=0.6, use_colnames=True)
print("Frequent itemsets:")
print(frequent)

# 3) สร้างกฎความสัมพันธ์ ที่ confidence >= 0.6
rules = association_rules(
    frequent, metric="confidence", min_threshold=0.6, num_itemsets=len(frequent)
)
print("\nAssociation rules:")
print(rules[["antecedents", "consequents", "support", "confidence", "lift"]])
python

ผลลัพธ์จะแสดง Frequent Itemsets และกฎความสัมพันธ์หลายรายการ ดังนี้

Frequent itemsets:
   support                  itemsets
0      0.6             (cholesterol)
1      0.8                (diabetes)
2      0.8            (hypertension)
3      0.8                 (obesity)
4      0.6    (cholesterol, obesity)
5      0.6  (diabetes, hypertension)
6      0.6       (diabetes, obesity)
7      0.6   (obesity, hypertension)

Association rules:
      antecedents     consequents  support  confidence    lift
0   (cholesterol)       (obesity)      0.6        1.00  1.2500
1       (obesity)   (cholesterol)      0.6        0.75  1.2500
2      (diabetes)  (hypertension)      0.6        0.75  0.9375
3  (hypertension)      (diabetes)      0.6        0.75  0.9375
4      (diabetes)       (obesity)      0.6        0.75  0.9375
5       (obesity)      (diabetes)      0.6        0.75  0.9375
6       (obesity)  (hypertension)      0.6        0.75  0.9375
7  (hypertension)       (obesity)      0.6        0.75  0.9375

ตัวอย่างการอ่านกฎ (cholesterol) → (obesity)

  • support = 0.6 หมายความว่า ผู้ป่วยร้อยละ 60 ของข้อมูลทั้งหมดมีทั้งคอเลสเตอรอลสูงและโรคอ้วน
  • confidence = 1.0 หมายความว่า ผู้ป่วยทุกคนที่มีคอเลสเตอรอลสูงในชุดข้อมูลนี้มีโรคอ้วนร่วมด้วย
  • lift = 1.25 ซึ่งมากกว่า 1 แสดงว่าโรคทั้งสองพบร่วมกันมากกว่าที่คาดจากการเกิดแบบอิสระ จึงถือเป็นความสัมพันธ์เชิงบวก

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

การประยุกต์ใช้งาน: โรงพยาบาลสามารถใช้กฎความสัมพันธ์เพื่อค้นหาโรคร่วม วางแผนการคัดกรอง หรือสร้างระบบแจ้งเตือนให้แพทย์พิจารณาตรวจหาโรคอื่นที่มักพบร่วมกับโรคที่ผู้ป่วยได้รับการวินิจฉัยแล้ว

กิจกรรม#

ทดลองเปลี่ยนค่า min_support=0.6 เป็น 0.4 และ 0.8 จากนั้นเปรียบเทียบจำนวน Frequent Itemsets และกฎความสัมพันธ์ที่ได้

  • เมื่อกำหนด min_support ต่ำลง จะพบ Frequent Itemsets และกฎมากขึ้น แต่บางกฎอาจเกิดจากข้อมูลเพียงไม่กี่รายการและไม่น่าเชื่อถือ
  • เมื่อกำหนด min_support สูงขึ้น จะได้กฎน้อยลง แต่เป็นกฎที่พบซ้ำในข้อมูลบ่อยกว่า

สังเกตว่าการเลือกค่า min_support เป็นการสร้างสมดุลระหว่างจำนวนกฎที่ค้นพบกับความน่าเชื่อถือของกฎเหล่านั้น


6. Clustering (การจัดกลุ่ม)#

โจทย์ของข้อมูล Clustering: จัดผู้ป่วยที่มีค่า Lab คล้ายกันเป็นกลุ่มความเสี่ยง

ทฤษฎี#

Clustering เป็นเทคนิคที่ใช้รวมข้อมูลที่มีลักษณะ “คล้ายกัน” ให้อยู่ในกลุ่มเดียวกัน โดยไม่มี Label กำกับไว้ล่วงหน้าว่าข้อมูลแต่ละจุดควรอยู่ในกลุ่มใด จึงจัดเป็นงานประเภท Unsupervised Learning

ความแตกต่างจาก Classification คือ Classification เรียนรู้จากข้อมูลที่มีคำตอบอยู่แล้ว แล้วนำโมเดลไปใช้ทำนายข้อมูลใหม่ ส่วน Clustering ไม่มีคำตอบให้เรียนรู้ อัลกอริทึมจึงต้อง ค้นพบโครงสร้างของกลุ่มจากข้อมูลด้วยตนเอง

ในทางการแพทย์ Clustering สามารถใช้แบ่งผู้ป่วยออกเป็นกลุ่มตามลักษณะที่คล้ายกัน เช่น แบ่งกลุ่มตามระดับความเสี่ยงจากผลตรวจทางห้องปฏิบัติการ

ความคล้ายกันของข้อมูลมักวัดด้วย ระยะทาง โดยข้อมูลที่อยู่ใกล้กันจะถือว่ามีลักษณะคล้ายกันมากกว่า วิธีที่ใช้บ่อยคือ ระยะทาง Euclidean ระหว่างจุด xx และ yy ในปริภูมิ nn มิติ

d(x,y)=i=1n(xiyi)2d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}

ค่าระยะทางที่น้อยหมายถึงข้อมูลสองจุดมีลักษณะใกล้เคียงกัน ส่วนค่าระยะทางที่มากแสดงว่าข้อมูลแตกต่างกันมากขึ้น

อัลกอริทึม: K-Means#

K-Means เป็นอัลกอริทึมที่แบ่งข้อมูลออกเป็น KK กลุ่ม โดยค้นหา จุดศูนย์กลางของกลุ่ม (Centroid) จำนวน KK จุด ได้แก่ μ1,,μK\mu_1, \ldots, \mu_K

เป้าหมายคือทำให้ผลรวมของระยะทางยกกำลังสองระหว่างข้อมูลแต่ละจุดกับ Centroid ของกลุ่มที่ข้อมูลนั้นสังกัดมีค่าน้อยที่สุด ค่านี้เรียกว่า WCSS (Within-Cluster Sum of Squares) หรือ inertia

WCSS=k=1KxCkxμk2\text{WCSS} = \sum_{k=1}^{K}\sum_{x \in C_k} |x - \mu_k|^2

โดยที่ CkC_k คือกลุ่มที่ kk และ μk\mu_k คือ Centroid ของกลุ่มนั้น

ขั้นตอนการทำงานของ K-Means จะทำซ้ำจนกว่าการจัดกลุ่มจะคงที่

  1. กำหนดจำนวนกลุ่ม KK แล้วเลือก Centroid เริ่มต้น μ1,,μK\mu_1, \ldots, \mu_K จำนวน KK จุด
  2. Assignment — จัดข้อมูลแต่ละจุดให้อยู่ในกลุ่มของ Centroid ที่อยู่ใกล้ที่สุด
  3. Update — คำนวณตำแหน่ง Centroid ใหม่จากค่าเฉลี่ยของข้อมูลทุกจุดในแต่ละกลุ่ม
  4. ทำขั้นตอนที่ 2–3 ซ้ำจนกว่าการจัดกลุ่มหรือตำแหน่ง Centroid จะไม่เปลี่ยนแปลงอย่างมีนัยสำคัญ ซึ่งเรียกว่า Convergence

ขั้นตอน K-Means: สุ่มจุดศูนย์กลาง → จัดกลุ่ม → ย้ายจุดศูนย์กลาง

ข้อจำกัด: K-Means อาจหยุดที่ค่า Local Minimum ของ WCSS จึงไม่รับประกันว่าจะได้คำตอบที่ดีที่สุดในระดับ Global Minimum เสมอไป นอกจากนี้ K-Means เหมาะกับกลุ่มที่มีลักษณะค่อนข้างกลม (Spherical) และมีขนาดใกล้เคียงกัน หากข้อมูลมีรูปทรงซับซ้อนหรือมี Noise มาก อาจพิจารณาใช้ DBSCAN หรือ Hierarchical Clustering แทน หากตัวแปรมีช่วงค่าหรือหน่วยแตกต่างกันมาก เช่น อายุเทียบกับค่าตรวจทางห้องปฏิบัติการ ควรทำ Standardization ก่อนนำข้อมูลไปจัดกลุ่ม

เลือก KK อย่างไร: Elbow Method#

ในตัวอย่างนี้เรากำหนด K=3K = 3 เพราะข้อมูลถูกออกแบบให้เห็นกลุ่มอย่างชัดเจน แต่ในข้อมูลจริง เรามักไม่ทราบล่วงหน้าว่าควรแบ่งข้อมูลออกเป็นกี่กลุ่ม

วิธีหนึ่งที่นิยมใช้คือ Elbow Method โดยทดลองกำหนดค่า KK หลายค่า แล้วเปรียบเทียบค่า WCSS ของแต่ละค่า

เมื่อ KK เพิ่มขึ้น ค่า WCSS จะลดลงเสมอ เพราะข้อมูลถูกแบ่งออกเป็นกลุ่มย่อยมากขึ้น อย่างไรก็ตาม เราจะเลือกค่า KK บริเวณที่กราฟเริ่มเปลี่ยนจากการลดลงอย่างรวดเร็วเป็นลดลงช้าลง จุดดังกล่าวมีลักษณะคล้าย “ข้อศอก” จึงเรียกว่า Elbow Point

กราฟกระจายจุด 3 สี = 3 กลุ่ม และเครื่องหมาย X คือจุดศูนย์กลาง

ข้อมูล: patients.csv#

ชุดข้อมูลตัวอย่างประกอบด้วยผู้ป่วย 15 ราย โดยใช้ตัวแปร 2 ค่าในการจัดกลุ่ม ได้แก่

  • blood_glucose — ระดับน้ำตาลในเลือด
  • cholesterol — ระดับคอเลสเตอรอล
blood_glucose,cholesterol
95,160
92,158
98,165
94,162
97,155
140,210
138,205
142,215
136,208
144,212
200,258
205,262
198,255
202,260
196,265
csv

โค้ด#

# เซลล์ที่ 5: Clustering — อัปโหลด/โหลด patients.csv แล้ววิเคราะห์
files.upload()  # เลือก patients.csv
df_patients = pd.read_csv("patients.csv")

# 1) ทำ K-Means โดยกำหนด K = 3 กลุ่ม
km = KMeans(n_clusters=3, n_init=10, random_state=0)
df_patients["cluster"] = km.fit_predict(df_patients[["blood_glucose", "cholesterol"]])

print("จำนวนสมาชิกแต่ละกลุ่ม:")
print(df_patients["cluster"].value_counts().sort_index())

# 2) แสดงผลแบบกราฟกระจายจุด
for c in sorted(df_patients["cluster"].unique()):
    sub = df_patients[df_patients["cluster"] == c]
    plt.scatter(sub["blood_glucose"], sub["cholesterol"], label=f"Cluster {c}", s=70)

plt.scatter(
    km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],
    marker="X", c="black", s=150, label="Centroids",
)
plt.xlabel("Blood glucose (mg/dL)")
plt.ylabel("Cholesterol (mg/dL)")
plt.legend()
plt.show()
python

ผลลัพธ์ K-Means Clustering: จุดผู้ป่วยแบ่งเป็น 3 กลุ่ม พร้อมเครื่องหมาย X แสดงตำแหน่ง Centroid ของแต่ละกลุ่ม

กราฟจะแสดงข้อมูลผู้ป่วยเป็นจุดกระจายที่แบ่งออกเป็น 3 สีตาม Cluster ที่โมเดลกำหนด ส่วนเครื่องหมาย X สีดำแสดงตำแหน่ง Centroid ของแต่ละกลุ่ม

จากข้อมูลตัวอย่าง จะเห็นกลุ่มที่แยกออกจากกันอย่างชัดเจน 3 กลุ่ม ได้แก่

  • ค่า Lab ต่ำ — อาจตีความเป็นกลุ่มที่มีความเสี่ยงต่ำ
  • ค่า Lab ปานกลาง — อาจตีความเป็นกลุ่มที่มีความเสี่ยงปานกลาง
  • ค่า Lab สูง — อาจตีความเป็นกลุ่มที่มีความเสี่ยงสูง

อย่างไรก็ตาม หมายเลข Cluster ที่ได้จาก K-Means เช่น 0, 1 และ 2 ไม่มีความหมายด้านลำดับโดยตรง Cluster 0 ไม่ได้หมายความว่ามีความเสี่ยงต่ำกว่า Cluster 1 เสมอไป ผู้วิเคราะห์ต้องพิจารณาค่า Centroid และลักษณะของสมาชิกในแต่ละกลุ่มก่อนตั้งชื่อหรือแปลความหมายให้กับกลุ่ม

การประยุกต์ใช้งาน: ผลลัพธ์ของ Clustering สามารถใช้ทำ การแบ่งกลุ่มผู้ป่วย (Patient Segmentation) เพื่อช่วยออกแบบแนวทางการดูแลที่แตกต่างกัน เช่น ผู้ป่วยกลุ่มเสี่ยงสูงอาจต้องได้รับการติดตามบ่อยขึ้นหรือได้รับการตรวจเพิ่มเติม

โบนัส — หา KK ที่เหมาะสมด้วย Elbow Method:

# เซลล์ที่ 6: Elbow Method
inertias = []
k_values = range(1, 8)
for k in k_values:
    km_k = KMeans(n_clusters=k, n_init=10, random_state=0).fit(
        df_patients[["blood_glucose", "cholesterol"]]
    )
    inertias.append(km_k.inertia_)

plt.plot(k_values, inertias, marker="o")
plt.xlabel("K (number of clusters)")
plt.ylabel("Inertia (WCSS)")
plt.title("Elbow Method")
plt.show()
python

ผลลัพธ์ Elbow Method: กราฟ Inertia ลดลงตามค่า K โดยจุดศอกอยู่ที่ K = 3

กราฟจะแสดงความสัมพันธ์ระหว่างค่า KK กับค่า Inertia โดยจุด “ศอก” ซึ่งเป็นตำแหน่งที่ค่า Inertia เริ่มลดลงช้าลง มักใช้เป็นแนวทางในการเลือกจำนวนกลุ่มที่เหมาะสม

สำหรับข้อมูลตัวอย่างนี้ จุดศอกจะอยู่บริเวณ K=3K = 3 ซึ่งสอดคล้องกับโครงสร้างของข้อมูลที่มี 3 กลุ่มอย่างชัดเจน

กิจกรรม#

  • เปลี่ยนจำนวนกลุ่ม — ทดลองกำหนด n_clusters=2 และ n_clusters=4 แล้วสังเกตว่าการแบ่งกลุ่มเปลี่ยนแปลงไปอย่างไร จากนั้นเปรียบเทียบกับกราฟ Elbow Method ว่าค่า KK ใดเหมาะสมที่สุด
  • จัดกลุ่มด้วยมือเทียบกับ K-Means — ลองพิจารณาข้อมูลในไฟล์ patients.csv และแบ่งกลุ่มผู้ป่วยด้วยสายตาก่อน จากนั้นเปรียบเทียบกับผลลัพธ์ของ K-Means หากผลลัพธ์ใกล้เคียงกัน แสดงว่ากลุ่มในข้อมูลชุดนี้มีโครงสร้างที่ชัดเจน

7. เปรียบเทียบเทคนิค#

ด้านLinear RegressionClassificationAssociationClustering
มี label?✅ มี — ตัวเลข (supervised)✅ มี — หมวดหมู่ (supervised)❌ ไม่ใช้❌ ไม่มี (unsupervised)
เป้าหมายทำนายค่าตัวเลขของข้อมูลใหม่ทำนายหมวดหมู่ของข้อมูลใหม่ค้นหาสิ่งที่มักเกิดร่วมกันจัดกลุ่มข้อมูลที่มีลักษณะคล้ายกัน
หลักการลดค่าคลาดเคลื่อน (residual) ด้วย OLSเรียนรู้ความสัมพันธ์ f:Xyf: X \to yใช้ support / confidence / liftลดค่า WCSS ภายในกลุ่ม
โมเดล/อัลกอริทึมLinear Regression, Polynomial RegressionDecision Tree, k-NN, Naive BayesApriori, FP-GrowthK-Means, DBSCAN, Hierarchical Clustering
ตัวอย่างทางการแพทย์ทำนายน้ำหนักทารกจากความดันโลหิตของมารดาทำนายการกลับมารักษาซ้ำหรือตรวจจับโรคค้นหาโรคร่วม (comorbidity)แบ่งกลุ่มผู้ป่วยตามระดับความเสี่ยง

กฎง่าย ๆ ในการเลือกเทคนิค

  • ต้องการทำนาย “ตัวเลข” เช่น น้ำหนัก ราคา หรือระยะเวลา → ใช้ Linear Regression
  • ต้องการทำนาย “หมวดหมู่” หรือคำตอบแบบใช่–ไม่ใช่ → ใช้ Classification
  • ต้องการค้นหาว่าสิ่งของหรือเหตุการณ์ใดมักเกิดร่วมกัน → ใช้ Association
  • ต้องการแบ่งข้อมูลออกเป็นกลุ่มตามความคล้ายคลึง โดยไม่มี label กำกับไว้ล่วงหน้า → ใช้ Clustering

8. สรุป#

บทความนี้แนะนำแนวคิดพื้นฐานของ Data Mining โดยเริ่มจากความแตกต่างระหว่าง Supervised Learning และ Unsupervised Learning ก่อนอธิบายเทคนิคหลัก 4 เทคนิค พร้อมทั้งทฤษฎี สูตรคำนวณ ข้อมูลตัวอย่างจากโรงพยาบาล และโค้ด Python

  • Linear Regression เป็นเทคนิคในกลุ่ม Supervised Learning ประเภท Regression ใช้ทำนายค่าตัวเลขด้วยสมการเส้นตรง y^=wx+b\hat{y}=wx+b โดยหาค่า ww และ bb ที่ทำให้ค่าคลาดเคลื่อนตามหลัก Ordinary Least Squares (OLS) ต่ำที่สุด และประเมินความเหมาะสมของโมเดลด้วยค่า R2R^2 ตัวอย่างในบทความคือการทำนายน้ำหนักแรกเกิดของทารกจากความดันโลหิตของมารดา โดยค่า Slope ที่ติดลบแสดงว่า เมื่อความดันโลหิตของมารดาสูงขึ้น น้ำหนักทารกมีแนวโน้มลดลง

  • Classification เป็นเทคนิคในกลุ่ม Supervised Learning ที่ใช้ทำนายข้อมูลซึ่งเป็นหมวดหมู่ โดยเรียนรู้ความสัมพันธ์ f:Xyf: X \to y จากข้อมูลตัวอย่างที่มี Label กำกับไว้ ตัวอย่างในบทความคือการทำนายว่าผู้ป่วยจะกลับมารักษาซ้ำหรือไม่ด้วย Decision Tree ซึ่งเลือกแอตทริบิวต์ที่ให้ค่า Information Gain สูงที่สุด หรือช่วยลดค่า Entropy ได้มากที่สุด

  • Association Analysis เป็นเทคนิคในกลุ่ม Unsupervised Learning ที่ใช้ค้นหาสิ่งที่มักปรากฏร่วมกัน โดยพิจารณาจากตัวชี้วัด Support, Confidence และ Lift อัลกอริทึม Apriori ใช้หลัก Anti-monotonicity เพื่อตัด Itemset ที่ไม่มีโอกาสเป็น Frequent Itemset ออกจากการค้นหา ตัวอย่างในบทความคือการค้นหาโรคร่วม (Comorbidity) ที่มักพบพร้อมกันในผู้ป่วยคนเดียวกัน

  • Clustering เป็นเทคนิคในกลุ่ม Unsupervised Learning ที่ใช้จัดข้อมูลที่มีลักษณะคล้ายกันให้อยู่ในกลุ่มเดียวกัน K-Means จะค้นหา Centroid ที่ทำให้ค่า WCSS ภายในกลุ่มต่ำที่สุด และสามารถใช้ Elbow Method เป็นแนวทางในการเลือกจำนวนกลุ่มที่เหมาะสม ตัวอย่างในบทความคือการแบ่งผู้ป่วยออกเป็นกลุ่มความเสี่ยงตามระดับน้ำตาลในเลือดและคอเลสเตอรอล

ข้อมูลตัวอย่างทั้งหมดถูก แยกเป็นไฟล์ CSV ออกจากโค้ดวิเคราะห์ ผู้เรียนสามารถคัดลอกข้อมูลแต่ละชุดเป็นไฟล์ อัปโหลดเข้าสู่ Google Colab และอ่านข้อมูลด้วย pd.read_csv

เมื่อแก้ไขข้อมูลในไฟล์ CSV แล้วรันโค้ดใหม่ ผลลัพธ์ของโมเดลและการวิเคราะห์จะเปลี่ยนแปลงตามข้อมูลโดยอัตโนมัติ ทำให้สามารถทดลองและสังเกตผลของข้อมูลที่แตกต่างกันได้อย่างสะดวก

ทุกตัวอย่างสามารถรันบน Google Colab ได้โดยไม่ต้องติดตั้ง Python หรือไลบรารีเพิ่มเติมในเครื่อง เพียงคัดลอกโค้ดลงในแต่ละเซลล์ อัปโหลดไฟล์ CSV แล้วกดรัน

หัวใจสำคัญของ Data Mining คือการเลือกเทคนิคให้สอดคล้องกับคำถามที่ต้องการตอบ

  • หากมี Label เป็นตัวเลข → ใช้ Linear Regression
  • หากมี Label เป็นหมวดหมู่ → ใช้ Classification
  • หากต้องการค้นหาความสัมพันธ์ระหว่างเหตุการณ์ → ใช้ Association
  • หากต้องการค้นหาและแบ่งกลุ่มข้อมูลตามความคล้ายคลึง → ใช้ Clustering
พื้นฐาน Data Mining: Regression, Classification, Clustering
Author กานต์ ยงศิริวิทย์ / Karn Yongsiriwit
Published at July 18, 2026

Loading comments...

Comments 0