12  การเรียนรู้แบบไม่มีผู้สอนสำหรับวิทยาการข้อมูล

Modified

18 พฤษภาคม 2569

Noteวัตถุประสงค์การเรียนรู้

เมื่อศึกษาบทนี้แล้ว ผู้เรียนควรสามารถ:

  1. อธิบายแนวคิดของการเรียนรู้แบบไม่มีผู้สอน (Unsupervised Learning) ได้

  2. เข้าใจความแตกต่างกับการเรียนรู้แบบมีผู้สอน (Supervised Learning)

  3. ใช้เทคนิคการแบ่งกลุ่ม (Clustering) ได้

  4. เข้าใจการแบ่งกลุ่มแบบ K-mean การแบ่งกลุ่มตามลำดับชั้น (Hierarchical Clustering) และ กฏความสัมพันธ์ (Association Rules)

  5. วิเคราะห์ผลลัพธ์เพื่อใช้ในธุรกิจได้

Figure 12.1: ปัญหา ‘การจัดกลุ่ม’: ในบรรดารูปทรงที่กระจัดกระจายนี้ หากให้มนุษย์จัดกลุ่มตามพฤติกรรม ‘ความคล้าย’ (Similarity) เราควรใช้ไม้บรรทัดใด (เช่น สี, รูปทรง, หรือขนาด) มาวัดระยะห่างระหว่างจุดพยานหลักฐาน? (ภาพสร้างโดย Google Gemini)

จาก Figure 12.1 นศ. จะแบ่งกลุ่มในภาพอย่างไรดี?

ในบทที่แล้ว นักศึกษาของเราได้สวมบทบาทเป็น “ผู้คุมพยานหลักฐาน” ที่คอยเฉลยคำตอบให้เครื่องจักรเรียนรู้ว่าแบบไหนคือ “ผ่าน” หรือ “ไม่ผ่าน” นั่นคือโลกของการเรียนรู้แบบมีผู้สอนที่เน้นการพยากรณ์อนาคตจากอดีต

แต่ในโลกจริงของวิทยาศาสตร์ข้อมูล ในหลายครั้งที่เราเดินเข้าไปในคลังพยานหลักฐานขนาดมหาศาล… แล้วเรา “ไม่มีคำตอบ”

การเรียนรู้แบบไม่มีผู้สอน (Unsupervised Learning) คือ อัลกอริทึมที่เรียนรู้จากข้อมูลที่ “ไม่มีป้ายกำกับ” (Unlabeled Data) หมายความว่าในชุดข้อมูลจะไม่มีตัวแปรเป้าหมาย (\(Y\)) หรือคำตอบเฉลยมาให้ เครื่องจักรมีหน้าที่เพียงอย่างเดียวคือ “การหาความสัมพันธ์หรือรูปแบบที่ซ่อนอยู่” (Hidden Patterns) ภายในข้อมูลเหล่านั้นเอง

ปรัชญาการทำงาน: “The Self-Organization” หากการเรียนรู้แบบมีผู้สอนคือนักเรียนที่ทำข้อสอบโดยมีคุณครูคอยตรวจคำเฉลยให้การเรียนรู้แบบไม่มีผู้สอนก็เปรียบเสมือน “นักสืบ” ที่ได้รับมอบหมายให้เข้าไปในคลังพยานหลักฐานที่ยุ่งเหยิง แล้วต้องจัดระเบียบข้อมูลเหล่านั้นออกมาเป็นกลุ่มๆ ตามความคล้ายคลึงกัน (Similarity) [1] จาก Table 12.1 แสดงความแตกต่างระหว่าการเรียนรู้แบบมีผู้กับการเรียนรู้แบบไม่มีผู้สอน

Table 12.1: ความแตกต่างระหว่างการเรียนรู้แบบมีผู้สอนและไม่มีผู้สอน
ลักษณะการเปรียบเทียบ การเรียนรู้แบบมีผู้สอน การเรียนรู้แบบไม่มีผู้สอน
ข้อมูลนำเข้า (Data) มีทั้งตัวแปรอิสระ (\(X\)) และคำตอบ (\(Y\)) มีเพียงตัวแปรอิสระ (\(X\)) เท่านั้น
เป้าหมาย (Goal) พยากรณ์ (Predict) ผลลัพธ์ในอนาคต หาโครงสร้างหรือกลุ่ม (Pattern) ของข้อมูล
การประเมินผล วัดจากความแม่นยำ (Accuracy, MSE) วัดจากความหมาย (Interpretability/Metrics)
ตัวอย่างงาน พยากรณ์ราคาบ้าน, แยกอีเมลขยะ แบ่งกลุ่มลูกค้า, แนะนำสินค้าที่ซื้อร่วมกัน

ในบทนี้ เราจะเรียนรู้เทคนิคหลักที่ใช้กันอย่างแพร่หลายในวงการวิทยาการข้อมูล

  1. การแบ่งกลุ่ม(Clustering) คือการจัดกลุ่มข้อมูลที่มีลักษณะ “ใกล้เคียงกัน” ให้อยู่ในกลุ่มเดียวกัน และข้อมูลที่ “ต่างกัน” ให้อยู่คนละกลุ่ม

    • คณิตศาสตร์เบื้องหลัง: ใช้การวัด “ระยะห่าง” (Distance Metrics) เช่น ระยะห่างแบบยุคลิด (Euclidean Distance) เป็นตัวตัดสินความคล้ายคลึง [2]

    • ตัวอย่าง: การแบ่งกลุ่มนักศึกษาตามพฤติกรรมการเข้าห้องสมุดและการใช้จ่าย เพื่อออกแบบกิจกรรมที่เหมาะสม

  2. การหาความสัมพันธ์ (Association Rules) คือการหา “กฎ” ที่บอกว่าถ้าเหตุการณ์ A เกิดขึ้น มีโอกาสเท่าไหร่ที่เหตุการณ์ B จะเกิดขึ้นตามมา

    • แนวคิดหลัก: มักใช้ในงานการวิเคราะห์ตะกร้าตลาด (Market Basket Analysis)

    • ตัวอย่าง: ข้อมูลในห้างสรรพสินค้าพบว่า “คนที่ซื้อผ้าอ้อม มักจะซื้อเบียร์ไปด้วยในเวลาเดียวกัน” (กฎที่ซ่อนอยู่)

12.1 การเรียนรู้ของเครื่องรู้ได้อย่างไรว่าข้อมูลสองชิ้นมีความคล้ายกัน?

ในโลกของข้อมูล ความคล้ายไม่ได้ดูด้วยตาเปล่า แต่ดูด้วย “ระยะห่าง” (Distance) และ “น้ำหนัก” (Weight)

12.1.1 พื้นฐานการวัดความคล้ายคลึง (Similarity and Distance Measures)

ในการเรียนรู้แบบไม่มีผู้สอนคำว่า “ความเหมือน” (Similarity) จะถูกตีความเป็น “ระยะห่าง” (Distance) ยิ่งข้อมูลมีระยะห่างกันน้อย (สั้น) แสดงว่ามีความเหมือนกันมาก และหากระยะห่างกันมาก แสดงว่ามีความต่างกันมาก (Dissimilarity)

  1. การวัดระยะห่างสำหรับข้อมูลตัวเลข (Numerical Distance)

มาตรวัดที่ได้รับความนิยมสูงสุดและนักศึกษาควรคำนวณมือเป็นคือ

Tipระยะห่างยุคลิด (Euclidean Distance) (ระยะห่างทางตรง)

เปรียบเสมือนการลากเส้นไม้บรรทัดวัดระยะระหว่างจุดสองจุดในแนวเฉียง (ตามทฤษฎีพีทาโกรัส)

สูตร: \[d(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}\]

  • การใช้งาน: เหมาะสำหรับข้อมูลที่มีหน่วยวัดเหมือนกันและต้องการวัดระยะห่างที่แท้จริง [3]
Tipระยะห่างแมนฮัตตัน (Manhattan Distance) (ระยะห่างแนวซิตี้บล็อก)

เปรียบเสมือนการเดินรถในเมืองที่ต้องเลี้ยวตามบล็อกตึก ไม่สามารถเดินตัดทะลุตึกได้

สูตร: \[d(x, y) = \sum_{i=1}^{n} |x_i - y_i|\]

  • การใช้งาน: เหมาะสำหรับข้อมูลที่มีความแตกต่างในแต่ละมิติสูง หรือเมื่อเราไม่ต้องการให้ค่าที่ต่างกันมากๆ ในมิติเดียว (Outliers) ส่งผลกระทบต่อระยะห่างรุนแรงเกินไป

12.2 การวัดความคล้ายสำหรับข้อมูลหมวดหมู่ (Categorical Similarity)

ในงานของกฏความสัมพันธ์ หรือข้อมูลที่มีแต่ “ใช่/ไม่ใช่” (Binary) เราจะไม่ได้วัดระยะห่างเป็นเซนติเมตร แต่เราจะวัดจาก “การเกิดขึ้นร่วมกัน” (Overlap)

Tipความคล้ายคลึงแจ็กการ์ด (Jaccard Similarity)

วัดสัดส่วนความเหมือนโดยดูจาก “รายการที่เหมือนกัน” หารด้วย “รายการทั้งหมดที่มีร่วมกัน”

\[J(A, B) = \frac{| A \cap B|}{| A \cup B |}\]

ตัวอย่าง: นักศึกษา A ซื้อ {สมุด, ปากกา} นักศึกษา B ซื้อ {ปากกา, ยางลบ} สิ่งที่เหมือนกันคือ {ปากกา} (1 ชิ้น) จากทั้งหมด {สมุด, ปากกา, ยางลบ} (3 ชิ้น) ค่าความเหมือนคือ \(1/3\)

12.3 การเตรียมข้อมูล: การปรับมาตรฐานข้อมูล (Standardization & Normalization)

อัลกอริทึมการจัดกลุ่มข้อมูลส่วนใหญ่ เช่น K-Means และ Hierarchical Clustering ใช้ “ระยะห่างทางคณิตศาสตร์” (Distance Measures) ในการพิจารณาว่าข้อมูลใดมีความใกล้เคียงกันและควรอยู่ในกลุ่มเดียวกัน

ปัญหา: ตัวแปรแต่ละตัวมักมีหน่วยวัด (Units) และช่วงของค่า (Scales) ที่แตกต่างกันมาก เช่น

  • \(X_1\): Income (รายได้) - มีค่าเป็นหลัก หมื่น/แสน (10,000 - 100,000)

  • \(X_2\): Age (อายุ) - มีค่าเป็นหลัก สิบ (20 - 60)

หากไม่ปรับสเกลข้อมูล: เครื่องจะมองว่าความต่างของรายได้ 1,000 บาท มีความสำคัญมากกว่าความต่างของอายุ 10 ปี เพียงเพราะตัวเลขรายได้มัน “ตัวใหญ่กว่า” มันจะทำให้ “รายได้” กลายเป็นพยานหลักฐานเพียงคนเดียวที่กำหนดผลการจัดกลุ่มทั้งหมด และเพิกเฉยต่อตัวแปรอื่นๆ ไปโดยปริยาย

12.3.1 เทคนิคการปรับสเกลข้อมูล (Scaling Techniques)

เราจะมาเรียนรู้ 2 วิธีมาตรฐานที่ใช้กันบ่อย

Tipการทำให้เป็นมาตรฐาน (Standardization หรือ Z-score Normalization)

คือการปรับข้อมูลให้มีค่าเฉลี่ย (Mean) เป็น 0 และค่าเบี่ยงเบนมาตรฐาน (SD) เป็น 1 \[z = \frac{x - \mu}{\sigma}\]

  • เมื่อไหร่ควรใช้: วิธีนี้เสถียรที่สุด (Robust) เหมาะสำหรับข้อมูลส่วนใหญ่ และ เป็นวิธีมาตรฐานที่แนะนำก่อนทำ Clustering โดยเฉพาะ K-Means เพราะมันจัดการกับค่าผิดปกติ (Outliers) ได้ดีกว่า [4] และทำให้กราฟข้อมูลมีความเป็น “วงกลม/วงรี” มากขึ้น
Tipการทำให้เป็นปรกติ (Normalization หรือ Min-Max Scaling)

คือการปรับข้อมูลทั้งหมดให้อยู่ในกลุ่มระหว่าง 0 ถึง 1 เท่านั้น \[x_{norm} = \frac{x - x_{min}}{x_{max} - x_{min}}\]

  • เมื่อไหร่ควรใช้: เหมาะสำหรับข้อมูลที่รู้ช่วงบนและช่วงล่างชัดเจน เช่น คะแนนสอบ (0-100) หรือเมื่อต้องการให้ความสำคัญกับความต่างขนาดเล็กมากๆ ของค่าที่เข้าใกล้กัน แต่ Sensitive ต่อ Outliers มาก (ถ้ามี Outlier ที่ตัวใหญ่มาก ข้อมูลส่วนใหญ่จะถูกบีบให้อยู่ใกล้ 0 ทั้งหมด)

12.4 K-Means Clustering: การจัดกลุ่มด้วยจุดศูนย์กลาง

K-Means Clustering เป็นหนึ่งในอัลกอริทึมสำหรับการจัดกลุ่มข้อมูล (Clustering) ที่ได้รับความนิยมมากที่สุดในกลุ่มการเรียนรู้แบบไม่มีผู้สอน (Unsupervised Learning) เนื่องจากมีแนวคิดที่เรียบง่าย เข้าใจง่าย และสามารถประยุกต์ใช้กับข้อมูลได้หลากหลายประเภท [5]

TipK-Means คืออะไร?

จัดอยู่ในประเภท Centroid-based Clustering คือ อัลกอริทึมที่ตัดสินความเป็น “พวกเดียวกัน” โดยอิงจาก “ระยะห่าง” (Distance) ระหว่างจุดข้อมูลกับ “จุดศูนย์กลาง” (Centroid) ของกลุ่มนั้นๆ

  • K = จำนวนกลุ่มที่เราต้องการ (ต้องระบุล่วงหน้า)

  • Means = ค่าเฉลี่ย หรือจุดศูนย์กลางคณิตศาสตร์ของกลุ่ม (Centroid)

เป้าหมาย: พยายามแบ่งข้อมูลออกเป็น \(K\) กลุ่ม โดยให้ข้อมูลที่อยู่ภายในกลุ่มเดียวกันมีความ “คล้ายคลึง” กันมากที่สุด (ระยะห่างจากศูนย์กลางน้อยที่สุด) และให้แต่ละกลุ่มมีความ “แตกต่าง” กันมากที่สุด (ระยะห่างระหว่างศูนย์กลางแต่ละกลุ่มมากที่สุด)

12.4.1 ขั้นตอนการทำงานของ K-Means

K-Means เป็นอัลกอริทึมแบบ Iterative (ทำซ้ำ) จนกว่าจะสรุปผลที่ดีที่สุด โดยมีขั้นตอนพื้นฐาน 5 ขั้นตอน ดังนี้ ตาม Figure 12.2

graph TD
    %% Define styles for clarity (Plain text is safer)
    classDef process fill:#d1d8e0,stroke:#2d98da,stroke-width:2px,color:black;
    classDef decision fill:#ffe0b2,stroke:#e67e22,stroke-width:2px,color:black;
    classDef startend fill:#a55eea,stroke:#8854d0,stroke-width:2px,color:white;

    %% Workflow Nodes (Use parenthetical for node shape, but keep text simple)
    Start([START: เตรียมข้อมูล]) --> Prep[1. กำหนดจำนวนกลุ่ม K]
    Prep --> Init[2. สุ่มจุดศูนย์กลางเริ่มต้น]
    
    %% The Core Loop
    Init --> Assign
    subgraph The_KMeans_Loop [กระบวนการทำซ้ำ]
        Assign[3. จัดข้อมูลเข้ากลุ่มที่ใกล้ที่สุด]:::process
        Assign --> Update[4. คำนวณจุดศูนย์กลางใหม่]:::process
    end

    %% Convergence Check
    Update --> Decide{"5. ผลลัพธ์ 'นิ่ง' หรือไม่?"}:::decision
    
    %% Loops back if NO
    Decide -- "ไม่" --> Assign
    
    %% Ends if YES
    Decide -- "ใช่" --> Finish([FINISH: ได้กลุ่มข้อมูลสมบูรณ์])

    %% Assign classes for styling
    class Start,Finish startend;
    class Prep,Init,Assign,Update process;
    class Decide decision;
Figure 12.2: Flowchart แสดงขั้นตอนการทำงานแบบทำซ้ำ (Iterative) ของ K-Means Clustering

ขั้นตอนที่ 1: กำหนดจำนวนกลุ่ม (Choose K) เราต้องตัดสินใจล่วงหน้าว่าต้องการแบ่งข้อมูลทั้งหมดออกเป็นกี่กลุ่ม (กำหนดค่า \(K\))

  • เช่น: ในงาน Workshop นี้ เราอยากแบ่งกลุ่มลูกค้าตามพฤติกรรมการใช้จ่าย เราจึงกำหนด \(K = 3\) (กลุ่มใช้จ่ายต่ำ, กลาง, สูง)

ขั้นตอนที่ 2: สุ่มจุดศูนย์กลางเริ่มต้น (Initialize Centroids) เครื่องจะทำการสุ่มเลือกจุดข้อมูลจำนวน \(K\) จุดขึ้นมาเพื่อทำหน้าที่เป็น “จุดศูนย์กลางชั่วคราว” (Initial Centroids)

  • หมายเหตุ: การสุ่มเริ่มต้นที่แตกต่างกัน อาจทำให้ผลลัพธ์สุดท้ายแตกต่างกันเล็กน้อย

ขั้นตอนที่ 3: จัดข้อมูลเข้ากลุ่มที่ใกล้ที่สุด (Assign Points to Closest Centroid) ข้อมูลทุกๆ จุดในชุดข้อมูลจะถูกนำมาคำนวณ “ระยะห่าง” (มักใช้ Euclidean Distance) เทียบกับจุดศูนย์กลางทั้ง \(K\) จุด และจุดข้อมูลนั้นจะถูก “จัดเข้ากลุ่ม” ของศูนย์กลางที่มันอยู่ใกล้ที่สุด

ขั้นตอนที่ 4: คำนวณจุดศูนย์กลางใหม่ (Update Centroids) เมื่อทุกจุดมีกลุ่มแล้ว เครื่องจะคำนวณหา “ค่าเฉลี่ยทางคณิตศาสตร์” ใหม่ของจุดข้อมูลทั้งหมดที่อยู่ในแต่ละกลุ่ม จุดค่าเฉลี่ยใหม่นี้จะกลายเป็น “จุดศูนย์กลางที่แท้จริง” ของกลุ่มนั้นในการทำซ้ำรอบถัดไป

ขั้นตอนที่ 5: ทำซ้ำจนกว่าจะนิ่ง (Repeat until Convergence) เครื่องจะกลับไปทำ ขั้นตอนที่ 3 และ 4 ซ้ำไปเรื่อยๆ จนกว่าจะเกิดสภาวะใดสภาวะหนึ่ง:

  1. จุดศูนย์กลาง (Centroids) ไม่มีโมเมนตัมในการเคลื่อนที่แล้ว (อยู่ที่เดิม)

  2. ไม่มีจุดข้อมูลจุดใดเปลี่ยนกลุ่มอีกแล้ว

  3. ครบจำนวนรอบ (Iterations) ที่กำหนดไว้ล่วงหน้า

12.5 การหาจำนวนกลุ่ม (K) ที่เหมาะสมที่สุด (Optimal Cluster Number)

ปัญหาโลกแตกของ K-Means: เลือก K เท่าไหร่ดี?

เราไม่สามารถเดาสุ่มค่า \(K\) ได้ เพราะถ้าค่า \(K\) น้อยเกินไป ข้อมูลที่ต่างกันมากอาจจะถูกมัดรวมกัน แต่ถ้าค่า \(K\) มากเกินไป ข้อมูลก็จะถูกแบ่งย่อยจนไม่เห็นภาพรวมธุรกิจ (ในที่สุดข้อมูลทุกจุดจะกลายเป็นจุดศูนย์กลางของตัวเอง)

เราจึงต้องมีไม้บรรทัดทางคณิตศาสตร์ 2 ชิ้นมาช่วยตัดสิน

Tipวิธีที่ 1: Elbow Method (วิธีข้อศอก)
graph TD
    %% Define styles for clarity
    classDef step fill:#d1d8e0,stroke:#2d98da,stroke-width:2px,color:black;
    classDef math fill:#ffe0b2,stroke:#e67e22,stroke-width:2px,color:black;
    classDef startend fill:#a55eea,stroke:#8854d0,stroke-width:2px,color:white;

    %% Nodes
    Start([START: เตรียมข้อมูล Standardized]) --> LoopStart

    subgraph The_Elbow_Process [กระบวนการทำซ้ำหา Inertia]
        LoopStart[1. กำหนดช่วงค่า K: เช่น K=1 ถึง 10]:::step
        LoopStart --> RunKMeans[2. รัน K-Means ทุกค่า K]:::step
        RunKMeans --> CalcInertia[3. คำนวณค่า Inertia WCSS]:::math
    end

    %% Plot and Evaluate
    CalcInertia --> PlotG[4. พล็อตกราฟ: X=K, Y=Inertia]:::process
    PlotG --> Evaluate["5. หาจุดหักศอก The Elbow Point"]:::decision
    
    %% Decision Point
    Evaluate -- "เลือก K ตรงจุดหักศอก" --> Finish([FINISH: ได้ค่า K ที่เหมาะสมที่สุด])

    %% Assign classes
    class Start,Finish startend;
    class LoopStart,RunKMeans,PlotG process;
    class CalcInertia math;
    class Evaluate decision;
Figure 12.3: กระบวนการตัดสินใจเลือกค่า K ด้วย Elbow Method (วิธีข้อศอก)

จากขั้นตอนใน Figure 12.3 เป็นวิธีที่ดู “ความแนบแน่น” ภายในกลุ่ม โดยอิงจากค่า Inertia (หรือ Within-Cluster Sum of Squares - WCSS) คือ ผลรวมของระยะห่างยกกำลังสองระหว่างข้อมูลทุกจุดเทียบกับจุดศูนย์กลางของกลุ่มตัวเอง

หลักการ:

  1. เราจะรัน K-Means หลายๆ รอบ โดยเปลี่ยนค่า \(K\) ไปเรื่อยๆ (เช่น \(K=1, 2, 3, ..., 10\))

  2. เครื่องจะคำนวณค่า Inertia ในแต่ละรอบ (ยิ่ง \(K\) มาก ค่า Inertia จะยิ่งลดลง เพราะจุดศูนย์กลางอยู่ใกล้ข้อมูลมากขึ้น)

  3. เราจะนำค่า \(K\) และ Inertia มาพล็อตกราฟ

วิธีการตัดสิน: เราจะเลือกค่า \(K\) ตรงจุดที่กราฟเกิด “การหักศอก” (The Elbow Point) คือ จุดที่ค่า Inertia ลดลงอย่างรวดเร็วและหลังจากจุดนี้ไป Inertia จะเริ่มลดลงอย่างช้าๆ (Flattening) หมายความว่าการเพิ่มกลุ่มหลังจากจุดนี้ ไม่ได้ทำให้ความแนบแน่นภายในกลุ่มเพิ่มขึ้นอย่างมีนัยสำคัญแล้ว

Tipวิธีที่ 2: Silhouette Score (คะแนนซิลลูเอท)

จากขั้นตอนใน Figure 12.4 เป็นวิธีที่ดูทั้ง “ความแนบแน่นภายในกลุ่ม” (Cohesion) และ “ความแตกต่างระหว่างกลุ่ม” (Separation) ไปพร้อมๆ กัน

หลักการ: เครื่องจะคำนวณคะแนนของข้อมูลแต่ละจุดว่าอยู่ใกล้พวกเดียวกันแค่ไหนเทียบกับกลุ่มข้างเคียง

  • ค่าคะแนน: อยู่ระหว่าง -1 ถึง 1

วิธีการตัดสิน:

  • 1: ข้อมูลอยู่ถูกกลุ่มและแยกออกจากกลุ่มอื่นชัดเจนมาก (ดีเยี่ยม)

  • 0: กลุ่มข้อมูลกำลังทับซ้อนกันอยู่

  • -1: ข้อมูลอยู่ผิดกลุ่ม

เป้าหมาย: เราจะเลือกค่า \(K\) ที่ให้ค่า Average Silhouette Score สูงที่สุด

graph TD
    %% Define styles for clarity
    classDef step fill:#d1d8e0,stroke:#2d98da,stroke-width:2px,color:black;
    classDef math fill:#ffe0b2,stroke:#e67e22,stroke-width:2px,color:black;
    classDef startend fill:#a55eea,stroke:#8854d0,stroke-width:2px,color:white;

    %% Nodes
    Start([START: เตรียมข้อมูล Standardized]) --> LoopStart

    subgraph The_Silhouette_Process [กระบวนการทำซ้ำหาคะแนน]
        LoopStart[1. กำหนดช่วงค่า K<br/>เช่น K=2 ถึง 10]:::step
        LoopStart --> RunKMeans[2. รัน K-Means ทุกค่า K]:::step
        RunKMeans --> CalcScore[<b>3. คำนวณคะแนน Silhouette</b><br/>วัดความแนบแน่นและระยะห่างระหว่างกลุ่ม]:::math
    end

    %% Plot and Evaluate
    CalcScore --> PlotG[4. พล็อตกราฟ<br/>X=ค่า K, Y=Avg. Score]:::process
    PlotG --> Evaluate["<b>5. หาค่า K ที่ให้คะแนนสูงสุด</b><br/>(ค่าเข้าใกล้ 1 มากที่สุด)"]:::decision
    
    %% Decision Point (Internal Logic)
    Evaluate -- "<b>เลือก K ที่คะแนนสูงสุด</b>" --> Finish([FINISH: ได้ค่า K ที่เหมาะสมที่สุด])

    %% Assign classes
    class Start,Finish startend;
    class LoopStart,RunKMeans,PlotG process;
    class CalcScore math;
    class Evaluate decision;
Figure 12.4: กระบวนการตัดสินใจเลือกค่า K ด้วย Silhouette Score (คะแนนซิลลูเอท)

ในทางปฏิบัติ เรามักจะใช้ Elbow Method เพื่อบีบวงของค่า \(K\) ที่น่าจะเป็นไปได้ (เช่น น่าจะอยู่ระหว่าง \(K=2\) ถึง \(K=4\)) จากนั้นเราจะใช้ Silhouette Score มาเป็นตัวตัดสินคนสุดท้ายว่า \(K\) ไหนคือค่าที่สมดุลที่สุด… แต่อย่าลืมนะว่าคณิตศาสตร์บอกได้แค่ ‘จุดที่สวยที่สุด’ หน้าที่ของคุณคือการดูว่ากลุ่มที่ได้มานั้น ‘ตอบโจทย์ธุรกิจ’ (Interpretation) หรือไม่ด้วย [6]

12.6 ปฏิบัติการ: กระบวนการ K-Means ด้วย iris dataset

ในหัวข้อนี้ เราจะสวมบทบาทเป็น “นักชีววิทยา” เดินเข้าไปในสวนดอกไม้ Iris เพื่อจัดกลุ่มดอกไม้ 150 ดอก โดยดูจากขนาดใบเลี้ยง (Sepal) และกลีบดอก (Petal) โดยที่เราไม่รู้มาก่อนว่ามันมีกี่สายพันธุ์

ขั้นตอนที่ 1: เตรียมพยานหลักฐาน (Data Preparation)

ก่อนอื่นเราต้องโหลดข้อมูลและ “ทำความสะอาด” โดยการเอาเฉลย (Species) ออกไปก่อน เพราะในโลกจริงของ Unsupervised เราไม่มีเฉลย

นักศึกษาสามารถ download ได้จาก

GOOGLEDRIVE: ch12/iris_unlabeled.csv

Sepal.Length Sepal.Width Petal.Length Petal.Width
5.1 3.5 1.4 0.2
4.9 3.0 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5.0 3.6 1.4 0.2
5.4 3.9 1.7 0.4

ขั้นตอนที่ 2: ปรับข้อมูลด้วยวิธีการทำให้เป็นมาตรฐาน (Standardization)

เนื่องจากขนาดของ Sepal และ Petal มีช่วงตัวเลขที่แตกต่างกัน เราต้องปรับให้ทุกตัวแปรมี “สิทธิ์มีเสียงเท่ากัน” ด้วย Z-score

ตัวอย่างข้อมูลที่ทำแปลงแล้ว

Sepal.Length Sepal.Width Petal.Length Petal.Width
-0.8976739 1.0156020 -1.335752 -1.311052
-1.1392005 -0.1315388 -1.335752 -1.311052
-1.3807271 0.3273175 -1.392399 -1.311052
-1.5014904 0.0978893 -1.279104 -1.311052
-1.0184372 1.2450302 -1.335752 -1.311052
-0.5353840 1.9333146 -1.165809 -1.048667

ขั้นตอนที่ 3: หาจำนวนกลุ่ม (K) ที่เหมาะสม (Optimal K)

เราจะใช้ Elbow Method ร่วมกับ Silhouette Score เพื่อตัดสินใจเลือกค่า \(K\) ทางวิทยาศาสตร์

การวิเคราะห์ของนักชีววิทยาที่เชี่ยวชาญการวิทยาการข้อมูล

  • Elbow: กราฟหักศอกชัดเจนที่ \(K=2\) และ \(K=3\)

  • Silhouette: คะแนนเฉลี่ยสูงที่สุดอยู่ที่ \(K=2\) แต่ค่า \(K=3\) ก็ยังให้คะแนนที่สูงและเป็นทางเลือกที่น่าสนใจในทางชีววิทยา

ตัดสินใจ: เพื่อให้เห็นการแบ่งกลุ่มที่ชัดเจนและตอบโจทย์ว่าดอกไม้มีหลายสายพันธุ์ เราจะเลือก \(K=3\)

ขั้นตอนที่ 4: รันแบบจำลอง K-Means (Model Training)

เราจะรัน K-Means ด้วยค่า \(K=3\) ที่เราเลือก

K-means clustering with 3 clusters of sizes 50, 53, 47

Cluster means:
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1  -1.01119138  0.85041372   -1.3006301  -1.2507035
2  -0.05005221 -0.88042696    0.3465767   0.2805873
3   1.13217737  0.08812645    0.9928284   1.0141287

Clustering vector:
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 2 2 2 3 2 2 2 2 2 2 2 2 3 2 2 2 2 3 2 2 2
 [75] 2 3 3 3 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3
[112] 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 3 3 3 3 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 2 3
[149] 3 2

Within cluster sum of squares by cluster:
[1] 47.35062 44.08754 47.45019
 (between_SS / total_SS =  76.7 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      

ขั้นตอนที่ 5: วิเคราะห์และตรวจสอบผลลัพธ์ (Visualization & Evaluation)

เราจะวาดกราฟเพื่อดูว่าเครื่องจักรจัดกลุ่มให้เราอย่างไร และท้ายที่สุดเราจะแอบเอาเฉลยจริง (Species) มาเทียบเพื่อดูความแม่นยำ

วาดกราฟ Cluster

ตรวจสอบกับเฉลยจริง (Validation with Ground Truth)

ในเคสนี้เรามีเฉลย เราจึงแอบดูได้ว่าเครื่องจัดกลุ่มดอกไม้ได้ตรงตามสายพันธุ์จริงหรือไม่?

setosa versicolor virginica
50 0 0
0 39 14
0 11 36
Cautionหมายเหตุ

เครื่องแยกสายพันธุ์ Setosa ออกมาได้สมบูรณ์แบบ (อยู่ที่กลุ่ม 2 ทั้งหมด) อย่างไรก็ตาม เครื่องยังสับสนเล็กน้อยระหว่าง Versicolor และ Virginica (มีการปนกันในกลุ่ม 1 และ 3) ซึ่งเป็นเรื่องปกติเพราะดอกไม้สองพันธุ์นี้มีลักษณะใกล้เคียงกันมาก

นี่คือความสวยงามของการเรียนรู้แบบไม่มีผู้สอน เครื่องจักรไม่ได้รู้ชื่อ ‘Setosa’ หรือ ‘Virginica’ มันมองเห็นแค่ ‘ระยะห่างทางคณิตศาสตร์’ แต่คณิตศาสตร์นั้นกลับสามารถจัดกลุ่มพยานหลักฐานได้สอดคล้องกับความเป็นจริงทางชีววิทยาเกือบสมบูรณ์

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

12.7 Hierarchical Clustering: การจัดกลุ่มแบบลำดับชั้น

หาก K-Means คือการ “สุ่มหาหัวหน้าโต๊ะ” Hierarchical Clustering ก็คือการ “จับคู่พยานหลักฐานที่เหมือนกันที่สุด” เข้าด้วยกันไปเรื่อยๆ จนกลายเป็นครอบครัวใหญ่

  1. แนวคิดแบบ Agglomerative (Bottom-Up) วิธีที่นิยมที่สุดคือการมองจาก “ล่างขึ้นบน” โดยมีขั้นตอนดังนี้ ตาม Figure 12.5
graph TD
    %% Style Definitions
    classDef startend fill:#a55eea,stroke:#8854d0,stroke-width:2px,color:white;
    classDef process fill:#d1d8e0,stroke:#2d98da,stroke-width:2px,color:black;
    classDef decision fill:#ffe0b2,stroke:#e67e22,stroke-width:2px,color:black;

    %% Workflow
    Start([START: ข้อมูล N จุด]) --> Init[1. ให้ข้อมูลแต่ละจุดเป็น 1 กลุ่มอิสระ<br/>Cluster = N กลุ่ม]:::process
    Init --> Calc[2. คำนวณระยะห่างระหว่างกลุ่มทั้งหมด<br/>ด้วย Distance Matrix]:::process
    
    %% Loop
    Calc --> Merge[3. รวม 2 กลุ่มที่ใกล้กันที่สุด<br/>เข้าเป็นกลุ่มเดียวกัน]:::process
    Merge --> Check{"4. รวมครบจนเหลือ<br/>กลุ่มเดียวหรือยัง?"}:::decision
    
    %% Loop back
    Check -- "ยัง (N > 1)" --> Calc
    
    %% Finish
    Check -- "ใช่ (N = 1)" --> Finish([FINISH: ได้โครงสร้างต้นไม้ Dendrogram])

    class Start,Finish startend;
Figure 12.5: ขั้นตอนการจัดกลุ่มแบบลำดับชั้น (Agglomerative Hierarchical Clustering)

1.1 เริ่มต้นด้วยการมองว่าข้อมูลทุกจุดคือ 1 กลุ่มอิสระ (ถ้ามีข้อมูล 100 จุด ก็มี 100 กลุ่ม)

1.2 หาข้อมูล 2 จุดที่ “ใกล้กันที่สุด” (มีระยะห่างน้อยที่สุด) แล้วยุบรวมกันเป็นกลุ่มเดียว

1.3 ทำซ้ำขั้นตอนที่ 2 ไปเรื่อยๆ โดยการรวมกลุ่มที่ใกล้กันเข้าด้วยกัน

1.4 หยุดกระบวนการเมื่อข้อมูลทั้งหมดถูกรวมเข้าเป็น กลุ่มใหญ่กลุ่มเดียว

  1. เดนโดรแกรม (Dendrogram): แผนผังต้นไม้บอกสายสัมพันธ์ จุดเด่นที่สุดของ Hierarchical Clustering คือการแสดงผลผ่านเดนโดรแกรม (Dendrogram) ซึ่งเปรียบเสมือนแผนผังตระกูล (Family Tree) ของข้อมูลตาม Figure 12.6
graph BT
    %% Tree Structure (Bottom-Up Logic)
    A[Data A] --- AB(( ))
    B[Data B] --- AB
    C[Data C] --- ABC(( ))
    AB --- ABC
    D[Data D] --- DE(( ))
    E[Data E] --- DE
    ABC --- Root((ALL DATA))
    DE --- Root

    %% Visual Indicators for Cutting
    subgraph Cut_High [ตัดที่ระดับความสูงมาก]
        Root
    end
    
    subgraph Cut_Low [ตัดที่ระดับความสูงน้อย]
        ABC
        DE
    end

    %% Annotations
    note1{{หากตัดระดับนี้: จะได้ 2 กลุ่มใหญ่}} 
    note2{{หากตัดระดับนี้: จะได้ 3 กลุ่มย่อย}}
    
    %% Link notes to subgraphs (conceptual)
    class ABC,DE process;
    class Root decision;
Figure 12.6: แนวคิดการตัดกิ่ง (Cutting the Tree) เพื่อเลือกจำนวนกลุ่ม
  • แกนตั้ง (Height/Distance): บอกว่าข้อมูลกลุ่มนั้นๆ ถูกรวมกันที่ระยะห่างเท่าไหร่ ยิ่งรวมกันที่ระดับสูง แสดงว่าข้อมูลสองกลุ่มนั้นมีความ “ต่าง” กันมาก
  • แกนนอน: แสดงข้อมูลรายจุด

💡 จุดตัดสินใจของนักวิทยาศาสตร์ข้อมูล: ใน K-Means เราต้องกำหนด \(K\) ล่วงหน้า แต่ใน Hierarchical Clustering เราสามารถ “มาเลือกตัดกิ่ง (Cut the Tree)” ในภายหลังได้ ถ้าเราตัดที่ระดับความสูงที่น้อย เราจะได้กลุ่มย่อยจำนวนมาก แต่ถ้าเราตัดที่ระดับความสูงมาก เราจะได้กลุ่มใหญ่จำนวนน้อย

  1. การวัดระยะห่างระหว่างกลุ่ม (Linkage Methods) เมื่อข้อมูลถูกรวมเป็นกลุ่มแล้ว การจะไปรวมกับกลุ่มอื่นต่อ เครื่องต้องตัดสินใจว่าจะใช้ระยะตรงไหนเป็นเกณฑ์? (นี่คือจุดที่นักศึกษาต้องเลือกใน Orange):

    • Single Linkage (A): ใช้ระยะห่างระหว่างจุดที่ “ใกล้ที่สุด” ของสองกลุ่ม (มักได้กลุ่มที่รูปร่างยาวคล้ายโซ่)

    • Complete Linkage (B): ใช้ระยะห่างระหว่างจุดที่ “ไกลที่สุด” ของสองกลุ่ม (มักได้กลุ่มที่แน่นและเป็นวงกลม)

    • Average Linkage (C): ใช้ระยะห่าง “เฉลี่ย” ของทุกจุดระหว่างกลุ่ม (ให้ความสมดุล)

    • Ward’s Method (D): (นิยมที่สุด) มุ่งเน้นการรวมกลุ่มที่ทำให้ ค่าความแปรปรวน (Variance) ภายในกลุ่มเพิ่มขึ้นน้อยที่สุด ผลลัพธ์มักจะได้กลุ่มที่มีขนาดใกล้เคียงกันและแนบแน่น

Figure 12.7: การเปรียบเทียบวิธีการวัดระยะห่างระหว่างกลุ่ม (Linkage Methods)

12.7.1 หลักการตัดสินใจเลือกจำนวนกลุ่ม (Selecting K)

ใน Hierarchical Clustering เราไม่ได้กำหนด \(K\) ตั้งแต่ต้น แต่เราจะใช้ “การตัดกิ่ง” (Cutting the Dendrogram) โดยมีหลักการพิจารณาดังนี้

  1. วิธีพิจารณาจากแนวราบ (The Longest Vertical Distance) เป็นวิธีที่นิยมที่สุดและดูง่ายที่สุดด้วยตาเปล่าบนเดนโดรแกรม

    • หลักการ: ให้มองหาช่วงของ “เส้นเชื่อมแนวตั้ง” ที่มีความยาวมากที่สุดโดยไม่มีเส้นแนวราบมาตัดผ่าน

    • การตัดสินใจ: เราจะลากเส้นตัดแนวราบผ่านช่วงที่ “ว่าง” และ “ยาว” ที่สุดนั้น

    • ความหมาย: ช่วงที่เส้นแนวตั้งยาวๆ หมายความว่าข้อมูลกลุ่มเหล่านั้นมีความแตกต่างของระยะห่างกันมาก การตัดที่จุดนี้จึงทำให้เราได้กลุ่มที่แยกออกจากกันอย่างชัดเจนที่สุด

  2. วิธีทางสถิติ (Statistical Metrics) หากการมองด้วยตาเปล่าทำได้ยาก เราสามารถใช้มาตรวัดเดียวกับ K-Means มาช่วยยืนยันได้

    • Silhouette Score: รันการตัดกิ่งที่ \(K\) ต่างๆ (เช่น \(K=2, 3, 4, ...\)) แล้วเลือก \(K\) ที่ให้คะแนนเฉลี่ยสูงสุด

    • Elbow Method: ใน Hierarchical Clustering เราจะพิจารณาจากค่า Total Within-Cluster Sum of Squares หลังการตัดกิ่งในแต่ละระดับความสูง

  3. วิธีตามบริบทธุรกิจ (Business/Domain Logic) บางครั้งคณิตศาสตร์อาจจะบอกว่า 2 กลุ่มดีที่สุด แต่ในทางปฏิบัติอาจไม่ตอบโจทย์

    • ตัวอย่าง: หากต้องการจัดกลุ่มลูกค้าเพื่อทำโปรโมชั่น ธุรกิจอาจมีงบประมาณรองรับแผนการตลาดได้แค่ 3 รูปแบบ (3 Segments) ดังนั้นการเลือกตัดกิ่งที่ \(K=3\) จึงสมเหตุสมผลกว่าในเชิงการบริหารจัดการ แม้ว่าสถิติจะบอกว่า \(K=2\) สวยกว่าก็ตาม

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

12.8 กรณีศึกษา: การสืบค้นสายพันธุ์นกเพนกวินด้วย Hierarchical Clustering

ในปฏิบัติการนี้ เราจะสวมบทบาทเป็นนักสัตววิทยาที่เดินทางไปสำรวจหมู่เกาะในแอนตาร์กติกา เราพบพยานหลักฐานเป็นนกเพนกวินจำนวนมาก แต่เราแสร้งทำเป็นว่าเราไม่รู้จักสายพันธุ์ของมัน เราจะใช้ความยาวจะงอยปาก (Bill), ความลึกของจะงอยปาก และความยาวปีก (Flipper) มาจัดกลุ่มพวกมัน

ขั้นตอนที่ 1: การเตรียมข้อมูล (Data Cleaning & Preparation) และการปรับมาตรฐานข้อมูล (Standardization)

สามารถดาวน์โหลดชุดข้อมูลได้จากGOOGLEDRIVE: ch12/penguins_clean

ตัวอย่างข้อที่ทำการทำให้เป็นมาตรฐาน (standardization) มาแล้ว

bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
-0.8946955 0.7795590 -1.4246077 -0.5676206
-0.8215515 0.1194043 -1.0678666 -0.5055254
-0.6752636 0.4240910 -0.4257325 -1.1885721
-1.3335592 1.0842457 -0.5684290 -0.9401915
-0.8581235 1.7444004 -0.7824736 -0.6918109
-0.9312674 0.3225288 -1.4246077 -0.7228585

ขั้นตอนที่ 2: การสร้างสายสัมพันธ์ (Hierarchical Clustering)

เราจะใช้ Ward’s Method และระยะห่างยุคลิด (Euclidean distance) เพราะเราต้องการกลุ่มที่แน่นและมีขนาดที่สมเหตุสมผลสำหรับสายพันธุ์สัตว์

เปรียบเทียบการตัด Dendrogram ด้วย ggplot2 (K=2 vs K=3)

เปรียบเทียบการตัด Dendrogram ด้วย ggplot2 (K=2 vs K=3)

ขั้นตอนที่ 4: ตรวจสอบพยานหลักฐานกับความเป็นจริง (Validation)

นักชีววิทยาจะลองเอาเฉลยจริง (Species) มาวางทับผลการจัดกลุ่มที่ \(K=3\) เพื่อดูว่าคณิตศาสตร์แม่นยำแค่ไหน

Adelie Chinstrap Gentoo
146 11 0
0 0 119
0 57 0
Importantชวนคิด
  1. ความแม่นยำสูง: สังเกตว่าเพนกวินสายพันธุ์ Gentoo มักจะถูกแยกออกมาอยู่ในกลุ่มเดียวได้ชัดเจนมาก (เพราะตัวใหญ่และปีกยาวกว่าเพื่อน)

  2. ความท้าทาย: สายพันธุ์ Adelie และ Chinstrap อาจมีการปนกันบ้างในบางกลุ่ม เนื่องจากขนาดตัวที่ใกล้เคียงกัน ซึ่งสะท้อนความจริงที่ว่า “พยานหลักฐานทางกายภาพอย่างเดียวอาจไม่เพียงพอ ต้องใช้ที่อยู่ (Island) มาช่วยด้วย”

  3. Standardization: อาจารย์ลองให้นักศึกษาลองรัน Code นี้โดย ไม่ใช้ scale() ดู พวกเขาจะพบว่าผลการจัดกลุ่มจะเพี้ยนไปเลย เพราะน้ำหนักตัวจะเข้ามายึดอำนาจการตัดสินใจทั้งหมด

เมื่อเราเข้าใจการ “แบ่งกลุ่ม” ข้อมูลด้วย Clustering ไปแล้ว เครื่องมือชิ้นสุดท้ายในชุดการเรียนรู้แบบไม่มีผู้สอนที่จะขาดไม่ได้เลยสำหรับงานด้านวิทยาศาสตร์ข้อมูลธุรกิจ (Business Data Science) คือการหา “กฎแห่งความสัมพันธ์”

หาก Clustering คือการหาว่า “ใครเป็นพวกเดียวกับใคร” ดังนั้น กฏความสัมพันธ์ (Association Rules) ก็คือการหาว่า “พฤติกรรม A มักจะจูงมือพฤติกรรม B มาด้วยเสมอหรือไม่” นั่นเอง

12.9 Association Rules: กฎแห่งความสัมพันธ์

ในโลกของธุรกิจ ข้อมูลพยานหลักฐานที่สำคัญที่สุดอย่างหนึ่งคือ ข้อมูลการซื้อขาย (Transaction Data) การรู้ว่าลูกค้าซื้ออะไรพร้อมกัน ไม่ได้ช่วยแค่การจัดวางชั้นวางสินค้า (Shelf Management) เท่านั้น แต่ยังช่วยในการทำระบบแนะนำสินค้า (Recommendation System) และการจัดโปรโมชันแบบแพ็กคู่ (Bundling) อีกด้วย [1]

12.10 Market Basket Analysis (การวิเคราะห์ตะกร้าสินค้า)

หัวใจของกฏความสัมพันธ์ คือการหาความสัมพันธ์ในรูปแบบ “If-Then” (ถ้า… แล้ว…) \(\{ \text{เหตุ} \} \rightarrow \{ \text{ผล} \}\) > เช่น: \(\{ \text{ขนมปัง, นม} \} \rightarrow \{ \text{เนย} \}\)

หมายความว่า “ถ้าลูกค้าซื้อขนมปังและนม มีแนวโน้มสูงที่เขาจะหยิบเนยลงตะกร้าไปด้วย”

12.11 มาตรวัดความแกร่งของกฎความสัมพันธ์

นักวิทยาศาสตร์ข้อมูลข้อมูลต้องมี “ไม้บรรทัด” 3 ชิ้นเพื่อตัดสินว่ากฎที่ค้นพบนั้นเป็น “ของจริง” หรือ “แค่เรื่องบังเอิญ” ในการพิจารณากฎความสัมพันธ์ \(A \rightarrow B\) (โดยที่ \(A\) คือเหตุ/Antecedent และ \(B\) คือผล/Consequent) เราจะใช้มาตรวัดทางคณิตศาสตร์ 3 ตัวหลักในการตัดสินดังนี้

1. Support (ความบ่อย) คือ สัดส่วนของธุรกรรม (Transactions) ทั้งหมดที่มีทั้งสินค้า \(A\) และ \(B\) เกิดขึ้นร่วมกัน ใช้เพื่อวัดความ “แมส” หรือความนิยมของกฎนี้

สูตร: \[Support(A \rightarrow B) = P(A \cap B) = \frac{\text{จำนวนตะกร้าที่มีทั้ง A และ B}}{\text{จำนวนตะกร้าทั้งหมด}}\]

ความสำคัญ: ช่วยคัดกรองกฎที่เป็น “Niche” เกินไปออกไป หากค่า Support ต่ำเกินไป แม้กฎจะแม่นยำแค่ไหน ก็อาจไม่คุ้มค่าในเชิงเศรษฐศาสตร์ที่จะนำไปทำแคมเปญ

2. Confidence (ความเชื่อมั่น) คือ ความน่าจะเป็นที่ลูกค้าจะซื้อ \(B\) เมื่อทราบว่าเขาได้ซื้อ \(A\) ไปแล้ว (Conditional Probability) ใช้เพื่อวัดความ “แม่นยำ” ของกฎ

สูตร: \[\begin{aligned}Confidence(A \rightarrow B) &= P(B|A) = \frac{Support(A \cap B)}{Support(A)}\nonumber\\ &= \frac{\text{จำนวนตะกร้าที่มีทั้ง A และ B}}{\text{จำนวนตะกร้าที่มี A}}\end{aligned}\]

ความสำคัญ: บ่งบอกความไว้ใจได้ของกฎ เช่น Confidence = 0.8 หมายความว่า “ในบรรดาคนที่ซื้อ A ทั้งหมด มีถึง 80% ที่ซื้อ B ตามไปด้วย”

3. Lift (แรงจูงใจ) คือ มาตรวัดที่บอกว่าการเกิด \(A\) และ \(B\) ร่วมกันนั้น “ดีกว่าการสุ่ม” หรือไม่ โดยเปรียบเทียบความเชื่อมั่นของกฎกับความน่าจะเป็นทั่วไปของสินค้า \(B\)

สูตร: \[\begin{aligned} Lift(A \rightarrow B) &= \frac{Confidence(A \rightarrow B)}{Support(B)} \nonumber\\ &= \frac{P(A \cap B)}{P(A) \cdot P(B)}\end{aligned}\]

การแปลผล:

  • \(Lift > 1\): สินค้า \(A\) และ \(B\) ส่งเสริมกัน (Positive Correlation) การซื้อ \(A\) ช่วย “ดึงดูด” ให้เกิดการซื้อ \(B\) มากกว่าปกติ

  • \(Lift = 1\): สินค้าทั้งสองเป็นอิสระต่อกัน (Independence) การที่เห็นซื้อคู่กันเป็นเพียงเรื่องบังเอิญตามดวง

  • \(Lift < 1\): สินค้าทั้งสองขัดแย้งกัน (Negative Correlation) การซื้อ \(A\) อาจทำให้โอกาสซื้อ \(B\) “ลดลง” (เช่น สินค้าที่ใช้ทดแทนกันได้) [7]

ลองจินตนาการว่า ‘ข้าวเปล่า’ เป็นสินค้าที่ใครๆ ก็ซื้อ (Support สูงมาก) ถ้าเราสร้างกฎ \(\{ \text{ไข่เจียว} \} \rightarrow \{ \text{ข้าวเปล่า} \}\) เราอาจจะได้ค่า Confidence สูงถึง 99% แต่นั่นไม่ได้หมายความว่าไข่เจียวเป็นตัวดึงดูดข้าวเปล่า เพราะไม่ว่าซื้ออะไร คนก็ซื้อข้าวเปล่าอยู่ดี!

แต่ถ้าเราเจอกฎ \(\{ \text{ไวน์ขาว} \} \rightarrow \{ \text{หอยนางรม} \}\) แม้ค่า Confidence จะแค่ 40% แต่ถ้าค่า Lift สูงถึง 5.0 นั่นแสดงว่าคนซื้อไวน์ขาวมีโอกาสซื้อหอยนางรม มากกว่าคนทั่วไปถึง 5 เท่า! นี่แหละคือ ‘กฎทองคำ’ ที่นักการตลาดโหยหา”

12.12 ตัวอย่างคลาสสิก: “เบียร์กับผ้าอ้อม” (Beer and Diapers)

ห้างค้าปลีกแห่งหนึ่งในสหรัฐฯ พบกฎความสัมพันธ์ที่ประหลาดว่า “ในช่วงเย็นวันศุกร์ คุณพ่อบ้านที่มาซื้อผ้าอ้อม มักจะหยิบเบียร์ติดมือไปด้วย”

การนำไปใช้: เมื่อรู้กฎนี้ ห้างจึงลองเอาเบียร์มาวางใกล้ๆ กับโซนผ้าอ้อม หรือจัดโปรโมชันคู่กัน ผลคือยอดขายพุ่งสูงขึ้นอย่างรวดเร็ว นี่คือพลังของการค้นพบ Pattern ที่ซ่อนอยู่ในข้อมูลโดยที่เราไม่ได้ตั้งสมมติฐานไว้ก่อน

สำหรับกฏความสัทพันธ์ อัลกอริทึมที่เป็นมาตรฐานและนักศึกษาควรเข้าใจกลไกการทำงานมากที่สุดคือ Apriori Algorithm เพราะมันแสดงให้เห็นถึงความฉลาดในการ “ตัดกิ่ง” (Pruning) ข้อมูลที่ไม่จำเป็นออกเพื่อประหยัดทรัพยากรเครื่อง

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

หัวใจของ Apriori คือหลักการที่ว่า “ถ้าเซตของสินค้าใดไม่ผ่านเกณฑ์ความถี่ขั้นต่ำ (Minimum Support) เซตสินค้าที่มีสินค้านั้นเป็นส่วนประกอบก็ย่อมไม่ผ่านเกณฑ์เช่นกัน”

graph TD
    %% Style Definitions
    classDef startend fill:#a55eea,stroke:#8854d0,stroke-width:2px,color:white;
    classDef process fill:#d1d8e0,stroke:#2d98da,stroke-width:2px,color:black;
    classDef decision fill:#ffe0b2,stroke:#e67e22,stroke-width:2px,color:black;
    classDef pruning fill:#fc5c65,stroke:#eb3b5a,stroke-width:2px,color:white;

    %% Workflow
    Start([START: ข้อมูล Transaction]) --> SetMin[1. กำหนดค่า Minimum Support<br/>และ Minimum Confidence]:::process
    
    SetMin --> Scan[2. นับความถี่ของสินค้าแต่ละชิ้น<br/>Candidate Itemsets]:::process
    
    Scan --> Prune{3. ความถี่ผ่านเกณฑ์<br/>Min Support หรือไม่?}:::decision
    
    Prune -- "ไม่ผ่าน" --> Cut[ตัดทิ้ง Pruning<br/>ไม่นำไปรวมกลุ่มต่อ]:::pruning
    
    Prune -- "ผ่าน" --> Join[4. จับคู่สินค้าที่ผ่านเกณฑ์<br/>เพื่อสร้างกลุ่มที่ใหญ่ขึ้น]:::process
    
    Join --> Repeat{5. ยังสร้างกลุ่มที่<br/>ใหญ่ขึ้นได้อีกหรือไม่?}:::decision
    
    Repeat -- "ได้" --> Scan
    
    Repeat -- "ไม่ได้" --> GenRules[6. สร้างกฎความสัมพันธ์<br/>Association Rules]:::process
    
    GenRules --> Filter[7. คัดเลือกกฎที่ค่า<br/>Confidence และ Lift ผ่านเกณฑ์]:::process
    
    Filter --> Finish([FINISH: ได้กฎทองคำที่ใช้งานได้])

    class Start,Finish startend;
Figure 12.8: ขั้นตอนการทำงานของ Apriori Algorithm สำหรับการหากฎความสัมพันธ์
Importantคำอธิบายขั้นตอนการทำงาน
  1. การกำหนดเกณฑ์ (Setting Thresholds): นักวิทยาศาสตร์ข้อมูลต้องระบุค่า Minimum Support (ความบ่อยขั้นต่ำที่ยอมรับได้) เช่น ต้องปรากฏอย่างน้อย 5% ของตะกร้าทั้งหมด เพื่อไม่ให้เสียเวลากับพฤติกรรมที่เกิดขึ้นน้อยเกินไป

  2. การหาชุดสินค้าที่พบบ่อย (Frequent Itemsets Generation):

    • เริ่มจากการนับสินค้าทีละชิ้น (1-itemset) ชิ้นไหนไม่ค่อยมีคนซื้อ… “ตัดทิ้งทันที”
    • นำสินค้าที่ผ่านเกณฑ์มาจับคู่เป็นชุดละ 2 ชิ้น (2-itemset) แล้วนับความถี่ใหม่ ชิ้นไหนไม่ผ่าน… “ตัดทิ้ง”
    • ทำซ้ำไปเรื่อยๆ จนกว่าจะไม่สามารถจับคู่สินค้าให้ใหญ่ขึ้นได้
  3. การสร้างกฎ (Rule Generation): นำชุดสินค้าที่สอบผ่านทั้งหมดมาสร้างกฎ “ถ้า…แล้ว…” (If A, then B)

  4. การคัดกรอง (Evaluation): คำนวณค่า Confidence และ Lift เพื่อหาว่ากฎไหนมีความแม่นยำสูงและมีอิทธิพลต่อกันจริงๆ ไม่ใช่แค่เหตุบังเอิญ

ลองจินตนาการว่าถ้าเรามีสินค้า 1,000 ชิ้นในห้าง การจับคู่ทุกรูปแบบที่เป็นไปได้จะใช้พลังประมวลผลมหาศาลมาก อัลกอริทึม Apriori ฉลาดตรงที่มันใช้หลักการ ‘Pruning’ หรือการตัดกิ่งไม้ที่ตายแล้วทิ้งไปตั้งแต่เนิ่นๆ ถ้าสินค้าชิ้นเดียวคนยังไม่ค่อยซื้อ การเอาไปจับคู่กับอะไรมันก็ย่อมไม่ผ่านเกณฑ์อยู่ดี วิธีนี้จึงช่วยให้เราหา ‘กฎทองคำ’ ได้อย่างรวดเร็วท่ามกลางข้อมูลมหาศาล”

12.13 กรณีศึกษา: ค้นหากฎทองคำจากตะกร้าสินค้า (Market Basket Analysis)

ในปฏิบัติการนี้ เราจะสวมบทบาทเป็นผู้จัดการของร้านขายของชำ ที่ต้องการจัดชั้นวางสินค้าใหม่ เราจะใช้ชุดข้อมูล Groceries เพื่อหาว่าสินค้าชนิดใดที่ลูกค้ามักจะหยิบติดมือไปพร้อมกัน [8]

ขั้นตอนที่ 1: เตรียมพยานหลักฐาน (Data Loading)

นักศึกษาสามารถ download ข้อมูลได้จาก GOOGLEDRIVE: ch12/groceries_dataset.csv

frankfurter sausage liver loaf ham meat
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

แสดง 10 อันดับสินค้าขายดี

ขั้นตอนที่ 2: การหากฎความสัมพันธ์ด้วย Apriori

เราจะกำหนดเกณฑ์ขั้นต่ำ (Thresholds) เพื่อกรองเฉพาะกฎที่น่าสนใจออกมา และจัดลำดับกฎที่มีค่า Lift สูงสุดไว้สำหรับวิเคราะห์

Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.5    0.1    1 none FALSE            TRUE       5   0.001      1
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 9 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.00s].
writing ... [5668 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].

ขั้นตอนที่ 3: คัดเลือกและจัดลำดับ “กฎทองคำ”

ในบรรดากฎที่พบ เราจะใช้ฟังก์ชัน inspect เพื่อพิจารณารายละเอียดของกฎที่มีความสัมพันธ์ทรงพลังที่สุด (High Lift) เพื่อนำไปวางแผนกลยุทธ์ต่อไป

วิเคราะห์กฎความสัมพันธ์ที่มีค่า Lift สูงสุด 10 อันดับแรก
LHS (เหตุ) RHS (ผล) Supp. Confi. Cover. Lift Count
{Instant food products,soda} {hamburger meat} 0.001 0.632 0.002 18.996 12
{soda,popcorn} {salty snack} 0.001 0.632 0.002 16.698 12
{flour,baking powder} {sugar} 0.001 0.556 0.002 16.408 10
{ham,processed cheese} {white bread} 0.002 0.633 0.003 15.045 19
{whole milk,Instant food products} {hamburger meat} 0.002 0.500 0.003 15.038 15
{other vegetables,curd,yogurt,whipped/sour cream} {cream cheese } 0.001 0.588 0.002 14.834 10
{processed cheese,domestic eggs} {white bread} 0.001 0.524 0.002 12.444 11
{tropical fruit,other vegetables,yogurt,white bread} {butter} 0.001 0.667 0.002 12.031 10
{hamburger meat,yogurt,whipped/sour cream} {butter} 0.001 0.625 0.002 11.279 10
{tropical fruit,other vegetables,whole milk,yogurt,domestic eggs} {butter} 0.001 0.625 0.002 11.279 10

ขั้นตอนที่ 4: การแสดงผลด้วยภาพ การดูกฎเป็นข้อความอาจจะยากสำหรับผู้บริหาร เราจะวาดกราฟเครือข่าย (Network Graph) เพื่อให้เห็นพฤติกรรมลูกค้า

Figure 12.9: Network Graph แสดงความสัมพันธ์ของสินค้าแต่ละชนิด (Static Visualization)
Importantชวนคิด
  1. พฤติกรรมสุขภาพ: หากเจอกฎ \(\{ \text{Curd, Yogurt} \} \rightarrow \{ \text{Whole Milk} \}\) ที่มี Lift สูง แสดงว่ากลุ่มลูกค้าที่เน้นผลิตภัณฑ์นมมักจะซื้อแบบยกชุด

  2. การจัดร้าน: ถ้าเจอกฎที่สินค้าอยู่คนละแผนกแต่มี Lift สูง (เช่น เนื้อสัตว์ กับ ผักบางชนิด) ร้านควรนำมาจัดโปรโมชัน “เมนูแนะนำ” คู่กันเพื่อเพิ่มยอดขาย

  3. การใช้ Lift: ย้ำให้นักศึกษาสังเกตว่า กฎที่มี Confidence 100% (แม่นยำที่สุด) อาจจะไม่น่าตื่นเต้นเท่ากฎที่มี Lift สูงที่สุด เพราะ Lift คือสิ่งที่บอกว่า “พฤติกรรมนี้ไม่ได้เกิดขึ้นโดยบังเอิญ”

12.14 สรุปปิดท้ายบทเรียน

  1. เราเริ่มจากการจัดกลุ่ม ดอกไม้ Iris ด้วย K-Means เพื่อเรียนรู้การหา ‘จุดศูนย์กลาง’ ของพยานหลักฐาน
  2. เราเดินทางไปแอนตาร์กติกาเพื่อจำแนก นกเพนกวิน ด้วย Hierarchical Clustering ซึ่งทำให้เราเห็น ‘สายสัมพันธ์ลำดับชั้น’ จากแผนภูมิ Dendrogram
  3. และสุดท้าย เราวิเคราะห์ ตะกร้าสินค้า ด้วยกฏความสัมพันธ์ เพื่อค้นหา ‘กฎทองคำ’ ที่ซ่อนอยู่ในพฤติกรรมการซื้อของผู้บริโภค

ทั้งหมดนี้คือเครื่องมือที่ช่วยให้เรา ‘ฟังเสียงที่ซ่อนอยู่’ ของข้อมูลได้โดยไม่ต้องมีใครบอกเฉลยล่วงหน้า หน้าที่ของพวกคุณคือการนำ Pattern เหล่านี้ไปสร้างมูลค่าเพิ่มให้กับธุรกิจ ไม่ว่าจะเป็นการเพิ่มยอดขาย หรือการทำความเข้าใจพฤติกรรมมนุษย์ให้ลึกซึ้งยิ่งขึ้น

12.15 แบบฝึกหัดท้ายบท

ข้อที่ 1: ในการหาจำนวนกลุ่ม (\(K\)) ที่เหมาะสมที่สุดด้วยเทคนิค Elbow Method ในโปรแกรม Orange Data Mining นักศึกษาควรสังเกตการเปลี่ยนแปลงของค่าใดในกราฟ?

\(~~~\)ก. ค่า Silhouette Score ที่สูงที่สุด

\(~~~\)ข. ค่าความแปรปรวนภายในกลุ่ม (Inertia/SSE) ที่เริ่มลดลงในอัตราที่น้อยลงอย่างเห็นได้ชัด

\(~~~\)ค. จำนวนตัวแปร (Features) ที่ลดลง

\(~~~\)ง. ความสูงของเส้นกิ่งก้านใน Dendrogram

ข้อที่ 2: หากนักศึกษาต้องการตรวจสอบว่าจุดข้อมูลใดใน Orange Data Mining ที่อาจถูกจัดกลุ่มผิด (Misclassified) หรืออยู่ “ก้ำกึ่ง” ระหว่างกลุ่ม ควรใช้ Widget ใดในการตรวจสอบ?

\(~~~\)ก. Data Table

\(~~~\)ข. Silhouette Plot

\(~~~\)ค. Distributions

\(~~~\)ง. Correlations

ข้อที่ 3: เพราะเหตุใดการทำข้อมูลให้เป็นมาตราฐาน ด้วย Widget ‘Preprocess’ จึงมีความสำคัญอย่างยิ่งก่อนการทำ K-means?

\(~~~\)ก. เพื่อให้ข้อมูลที่เป็นตัวอักษรกลายเป็นตัวเลข

\(~~~\)ข. เพื่อลดขนาดไฟล์ข้อมูลให้เล็กลง

\(~~~\)ค. เพื่อป้องกันไม่ให้ตัวแปรที่มีหน่วยวัดขนาดใหญ่ (เช่น รายได้หลักหมื่น) มีน้ำหนักเหนือตัวแปรที่มีหน่วยวัดขนาดเล็ก (เช่น อายุ)

\(~~~\)ง. เพื่อให้ข้อมูลมีการกระจายตัวแบบปกติ (Normal Distribution)

ข้อที่ 4: แผนภูมิที่เป็นเอกลักษณ์ของ Hierarchical Clustering ซึ่งแสดงลำดับการรวมตัวของพยานหลักฐานจากจุดเล็กๆ จนกลายเป็นกลุ่มใหญ่เรียกว่าอะไร?

\(~~~\)ก. Scatter Plot

\(~~~\)ข. Box Plot

\(~~~\)ค. Dendrogram

\(~~~\)ง. Heatmap

ข้อที่ 5: ใน Widget ‘Hierarchical Clustering’ หากนักศึกษาเลือกใช้ Ward’s Method ผลลัพธ์ที่ได้มักจะมีลักษณะอย่างไร?

\(~~~\)ก. กลุ่มข้อมูลจะถูกลากต่อกันเป็นเส้นยาวเหมือนโซ่ (Chaining Effect)

\(~~~\)ข. กลุ่มข้อมูลที่ได้มักจะมีขนาด (Member size) ที่ค่อนข้างสมดุลและมีความแน่นแฟ้นสูง

\(~~~\)ค. จะได้จำนวนกลุ่มเท่ากับจำนวนแถวของข้อมูลเสมอ

\(~~~\)ง. ระยะห่างจะถูกคำนวณจากจุดที่ไกลที่สุดของสองกลุ่มเสมอ

ข้อที่ 6: ข้อใดคือความแตกต่างที่ชัดเจนที่สุดระหว่าง K-means และ Hierarchical Clustering?

\(~~~\)ก. K-means ใช้กับข้อมูลตัวเลขเท่านั้น ส่วน Hierarchical ใช้ได้เฉพาะตัวอักษร

\(~~~\)ข. K-means ต้องกำหนดจำนวนกลุ่มล่วงหน้า ส่วน Hierarchical สามารถมาเลือกจุดตัดกลุ่มในภายหลังได้

\(~~~\)ค. Hierarchical Clustering ประมวลผลได้เร็วกว่า K-means เมื่อข้อมูลมีขนาดใหญ่มาก (Big Data)

\(~~~\)ง. K-means ให้ผลลัพธ์เป็นโครงสร้างต้นไม้เสมอ

ข้อที่ 7: ค่า Support ในการวิเคราะห์ตะกร้าสินค้า หมายถึงข้อใด?

\(~~~\)ก. ความเชื่อมั่นว่าถ้าซื้อสินค้า A แล้วจะซื้อ B ตามมา

\(~~~\)ข. ความถี่หรือร้อยละที่ชุดสินค้านั้นๆ ปรากฏขึ้นในรายการธุรกรรมทั้งหมด

\(~~~\)ค. มาตรวัดที่บอกว่ากฎนั้นดีกว่าการเดาสุ่มกี่เท่า

\(~~~\)ง. จำนวนเงินรวมที่ลูกค้าจ่ายในแต่ละครั้ง

ข้อที่ 8: หากกฎความสัมพันธ์ระบุว่า \(\{ \text{ขนมปัง} \} \rightarrow \{ \text{นม} \}\) มีค่า Confidence = 0.8 หมายความว่าอย่างไร?

\(~~~\)ก. ในบรรดาการซื้อทั้งหมด มี 80% ที่ซื้อทั้งขนมปังและนม

\(~~~\)ข. ในบรรดาคนที่ซื้อนม มี 80% ที่ซื้อขนมปังด้วย

\(~~~\)ค. ในบรรดาคนที่ซื้อขนมปัง มี 80% ที่ซื้อนมติดมือไปด้วย

\(~~~\)ง. การซื้อขนมปังช่วยเพิ่มโอกาสการซื้อนมขึ้น 80 เท่า

ข้อที่ 9: มาตรวัดใดที่เป็น “หัวใจสำคัญ” ในการยืนยันว่าสินค้าสองชนิดมีความสัมพันธ์เชิงบวกต่อกันจริงๆ (ไม่ได้เกิดจากความบังเอิญ)?

\(~~~\)ก. ค่า Support ที่สูงที่สุด

\(~~~\)ข. ค่า Lift ที่มีค่ามากกว่า 1

\(~~~\)ค. ค่า Lift ที่มีค่าเท่ากับ 1

\(~~~\)ง. จำนวน Count ที่มากที่สุด

ข้อที่ 10: ในโปรแกรม Orange หากข้อมูลตั้งต้นเป็นตารางรายชื่อลูกค้าและพฤติกรรม (เช่น อายุ, เพศ, อาชีพ) ก่อนจะนำไปเข้า Widget ‘Association Rules’ นักศึกษาควรทำสิ่งใดก่อน?

\(~~~\)ก. ทำการ Discretize เพื่อเปลี่ยนตัวเลขต่อเนื่อง (เช่น อายุ) ให้เป็นช่วงกลุ่ม (Categorical)

\(~~~\)ข. ทำการลบข้อมูลลูกค้าที่ซ้ำกันออกทั้งหมด

\(~~~\)ค. ทำการหาค่าเฉลี่ยของข้อมูลทั้งหมด

\(~~~\)ง. ใช้ Widget ‘PCA’ เพื่อลดมิติข้อมูล

Cautionเฉลย
  1. ข | 2. ข | 3. ค | 4. ค | 5. ข | 6. ข | 7. ข | 8. ค | 9. ข | 10. ก