Hierarchical Clustering ใช้แบ่งกลุ่มข้อมูล (Clustering) ใน Machine Learning ด้วย Python

Hierarchical Clustering เป็นเทคนิคในการแบ่งกลุ่มข้อมูล (Clustering) ที่ใช้วิธีการสร้างความสัมพันธ์ระหว่างข้อมูลจากการจัดเรียงตามระยะห่างระหว่างข้อมูล ซึ่งการจัดเรียงนี้จะมีการสร้างโครงสร้างเป็นต้นไม้ (Tree-like Structure) ที่เรียกว่า Dendrogram เพื่อแสดงความสัมพันธ์ระหว่างกลุ่มข้อมูล

วิธีการทำงานของ Hierarchical Clustering จะเริ่มต้นด้วยการกำหนดระยะห่างระหว่างข้อมูล ซึ่งจะมีหลายวิธีในการคำนวณ เช่น Euclidean distance, Manhattan distance, หรือ Cosine similarity แล้วจะนำค่าระยะห่างระหว่างข้อมูลมาใช้ในการจัดเรียงตามระดับความสัมพันธ์ระหว่างกลุ่มข้อมูล โดยเริ่มจากการสร้างกลุ่มข้อมูลเป็นกลุ่มเดียวกันแล้ววนลูปเพื่อรวมกลุ่มข้อมูลเข้าด้วยกัน จนกระทั่งมีการจัดเรียงข้อมูลเป็นกลุ่มเดียวกัน

Hierarchical Clustering แบ่งออกเป็น 2 ประเภท คือ

  1. Agglomerative (Bottom-up) Hierarchical Clustering เริ่มจากวิเคราะห์ข้อมูลในแต่ละจุดแยกจากกันเป็น cluster เล็กๆ ก่อน จากนั้นจะรวม cluster เหล่านี้เข้าด้วยกันเป็น cluster ใหญ่ๆ โดยมีวิธีการรวม cluster ที่หลากหลาย เช่น การรวม cluster ที่อยู่ใกล้เคียงกันที่สุด หรือการรวม cluster ที่มีขนาดเล็กๆ ก่อน แล้วจึงรวมเข้าด้วยกันเป็น cluster ใหญ่ๆ ทีละขั้นตอนจนกระทั่งได้ cluster เดียวที่มีข้อมูลทั้งหมด

  2. Divisive (Top-down) Hierarchical Clustering เริ่มจากที่มี cluster ใหญ่ๆ ทั้งหมดอยู่เดียวกัน แล้วแยก cluster ออกเป็น cluster เล็กๆ ตามลำดับ จนกระทั่งแยกเป็น cluster ที่มีข้อมูลแต่ละจุดเพียงคนละตัวเท่านั้น

ขั้นตอนการแบ่งกลุ่มโดยใช้ Hierarchical Clustering มีดังนี้

  1. นำข้อมูลมาตรวจสอบและเตรียมข้อมูล

    • ตรวจสอบความสมบูรณ์และความถูกต้องของข้อมูล
    • ปรับข้อมูลให้เป็นรูปแบบที่เหมาะสมสำหรับการแบ่งกลุ่ม
    • แยกข้อมูลออกเป็นชุด train set และ test set
  2. กำหนดวิธีการคำนวณความคล้ายคลึง (similarity/distance measure) ระหว่างข้อมูล

    • มีหลายวิธีในการคำนวณความคล้ายคลึง เช่น Euclidean distance, Manhattan distance, Cosine similarity เป็นต้น
    • การเลือกวิธีนี้จะขึ้นอยู่กับลักษณะของข้อมูลและวัตถุประสงค์ของการแบ่งกลุ่ม
  3. สร้าง dendrogram

    • ใช้ข้อมูลและความคล้ายคลึงของข้อมูลในการสร้าง dendrogram ซึ่งเป็นตัวแทนของโมเดลการแบ่งกลุ่ม
    • Dendrogram คือแผนภูมิที่แสดงความคล้ายคลึงระหว่างข้อมูลทุกคู่ของข้อมูลทั้งหมด โดยที่แต่ละจุดบนเส้นเเกน Y แทนข้อมูล และเส้นเชื่อมระหว่างจุดบนเส้นเเกน Y แสดงความคล้ายคลึงของข้อมูลระหว่างกัน
  4. กำหนดจำนวนกลุ่ม

    • จาก dendrogram สามารถกำหนดจำนวนกลุ่มที่เหมาะสมได้โดยการตัด dendrogram ด้วยเส้นตัด (cutting line) ให้ได้จำนวนกลุ่มที่เหมาะสม
  5. สร้างโมเดลและแบ่งกลุ่มข้อมูล

    • เลือก algorithm ที่ต้องการใช้ในการ clustering เช่น k-means, hierarchical clustering, DBSCAN เป็นต้น

    • กำหนดค่า hyperparameters ของ algorithm ที่เราเลือก เช่น จำนวน cluster ในกรณีของ k-means, threshold distance ในกรณีของ hierarchical clustering เป็นต้น

    • นำข้อมูลที่เราต้องการแบ่งกลุ่มมาสร้าง model

    • สร้างกลุ่มของข้อมูลด้วย algorithm ที่เราเลือก โดยใช้ hyperparameters ที่กำหนดไว้ และข้อมูลที่ส่งเข้ามาใน model

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

    • ปรับแต่ง model หรือ hyperparameters ตามผลการประเมินและวิเคราะห์ เพื่อให้ model แบ่งกลุ่มข้อมูลได้อย่างเหมาะสม

    • นำ model ที่ปรับแต่งเรียบร้อยแล้วไปใช้งานจริงในการแบ่งกลุ่มข้อมูล

  1. สร้าง dendrogram ขึ้นมา เพื่อใช้ในการหาค่า k (จำนวนกลุ่ม) ที่เหมาะสม โดย dendrogram จะแสดงความสัมพันธ์ระหว่างข้อมูลในรูปแบบของต้นไม้ โดยแกน x จะแสดงจำนวนของข้อมูลแต่ละกลุ่ม และแกน y จะแสดงค่าความคล้ายคลึงระหว่างกลุ่ม โดยค่าความคล้ายคลึงจะมีค่ามากที่สุดที่สามารถเรียกว่าเป็นสายแบ่ง (dendrogram cut) ได้และจะกำหนดจำนวนกลุ่มตามจำนวนสายแบ่งที่เลือกได้

การใช้ Hierarchical Clustering ในการจัดกลุ่มข้อมูลที่เกี่ยวกับการแบ่งกลุ่มคล้ายคลึงกันแล้ว ยังสามารถนำมาประยุกต์ใช้ในงานอื่นๆ ได้ ตัวอย่างเช่น

  1. การจัดกลุ่มลูกค้า (Customer Segmentation) – โดยใช้ข้อมูลเกี่ยวกับลูกค้า เช่น วงเงินที่ใช้ในการซื้อสินค้า การเข้าชมเว็บไซต์ หรือแบบสอบถามเพื่อแบ่งกลุ่มลูกค้าที่มีความสนใจในสินค้าและบริการเดียวกัน เพื่อสามารถสร้างกลยุทธ์การตลาดและการขายได้อย่างมีประสิทธิภาพ

  2. การจัดกลุ่มภาพถ่าย (Image Segmentation) – โดยใช้ข้อมูลภาพถ่าย เช่น การจัดกลุ่มและจำแนกภาพถ่ายของมนุษย์ สัตว์ หรือวัตถุ เพื่อใช้ในการสร้างซอฟต์แวร์ระบบควบคุมหุ่นยนต์ การตรวจสอบความปลอดภัย หรือการตรวจจับวัตถุในอุตสาหกรรม

  3. การจัดกลุ่มเอกสาร (Document Clustering) – โดยใช้ข้อมูลของเอกสาร เช่น บทความ หรือเอกสารต่างๆ เพื่อจัดกลุ่มเอกสารที่มีเนื้อหาที่คล้ายกัน เพื่อใช้ในการวิเคราะห์เนื้อหา หรือสร้างระบบค้นหาข้อมูลที่มีประสิทธิภาพ

  4. การจัดกลุ่มภาษา (Language Clustering) – โดยใช้ข้อมูลของภาษา เช่น คำ ประโยค หรือเอกสารต่างๆ เพื่อจัดกลุ่มภาษาที่มีความสัมพันธ์กัน เพื่อใช้ในการสร้างระบบแปลภาษาหรือระบบจดจำคำพูด

  5. การจัดการทรัพยากรระบบคอมพิวเตอร์ (Computer Resource Clustering) – การจัดกลุ่มคอมพิวเตอร์หรือเครื่องมือที่ใช้งานเพื่อจัดการทรัพยากรเครือข่าย เช่น การจัดกลุ่มเครื่องพิมพ์หรือเครื่องคอมพิวเตอร์ต่างๆ เพื่อสะท้อนถึงพฤติกรรมการใช้งานและตรวจสอบปัญหาที่อาจเกิดขึ้น

  6. การจัดกลุ่มสินค้า (Product Clustering) – การจัดกลุ่มสินค้าต่างๆ โดยพิจารณาคุณสมบัติของสินค้า เช่น ราคา, แบรนด์, สี, ขนาด เป็นต้น ที่สามารถนำมาใช้ในการจัดการสินค้าให้เหมาะสม
  7. การตลาด (Market Clustering) – การจัดกลุ่มลูกค้าที่มีความต้องการหรือความสนใจคล้ายกัน เพื่อนำข้อมูลเหล่านี้ไปใช้ในการวางแผนการตลาด หรือใช้ในการส่งเสริมการขาย การวิเคราะห์การจัดกลุ่มลูกค้ายังช่วยให้สามารถจัดทีมขายและกลยุทธ์การตลาดได้อย่างมีประสิทธิภาพ

  8. การวิเคราะห์ข้อมูลสุขภาพ (Health Analysis Clustering) – การจัดกลุ่มผู้ป่วยที่มีภาวะโรคคล้ายกัน เพื่อนำข้อมูลเหล่านี้ไปใช้ในการวิเคราะห์ข้อมูลสุขภาพและวิจัยทางการแพทย์ อาทิเช่นการวิเคราะห์โรคร้ายแรงหรือการวิเคราะห์ปัจจัยเสี่ยงต่อโรคที่ส่งผลต่อสุขภาพ

อีกหนึ่งตัวอย่างการใช้ Hierarchical Clustering อในการจัดกลุ่มลูกค้า (Customer Segmentation) ของธุรกิจ เช่น สามารถนำข้อมูลการซื้อสินค้าของลูกค้า เช่น ประเภทสินค้า จำนวนการซื้อ ราคาเฉลี่ยต่อการซื้อ และอื่นๆ เพื่อแบ่งกลุ่มลูกค้าที่มีพฤติกรรมการซื้อคล้ายคลึงกัน เพื่อนำไปใช้ในการวางแผนการขาย โปรโมชั่นสินค้า หรือการสร้างสินค้าใหม่ที่เหมาะสมกับลูกค้าในแต่ละกลุ่มให้เหมาะสม และเพิ่มโอกาสในการขายสินค้าให้สูงสุดในแต่ละกลุ่มลูกค้านั้นๆ

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

รายได้ (หน่วย: บาท) จำนวนครั้งที่เข้าร้านค้า
10000 2
20000 4
15000 2
8000 1
30000 6
12000 3
5000 1
25000 5
18000 4
1000 1

สามารถเขียนโค้ด Pythone ได้ดังนี้

import pandas as pd
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt

data = pd.DataFrame({
    'income': [10000, 20000, 15000, 8000, 30000, 12000, 5000, 25000, 18000, 1000],
    'visits': [2, 4, 2, 1, 6, 3, 1, 5, 4, 1]
})

data_standardized = data.apply(lambda x: (x - x.mean()) / x.std(), axis=0)

Z = linkage(data_standardized, method='complete', metric='euclidean')

plt.figure(figsize=(12,6))
dendrogram(Z)
plt.title('Dendrogram')
plt.xlabel('Data Points')
plt.ylabel('Euclidean Distance')
plt.show()

ผลลัพธ์ที่ได้ คือ


ตัวอย่าง
การใช้ Hierarchical Clustering เกี่ยวกับการจัดกลุ่มสินค้า

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

data = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    'price': [25, 30, 35, 20, 40, 50, 10, 5, 15, 45],
    'rating': [4.3, 4.5, 4.1, 4.0, 4.8, 4.7, 3.9, 3.5, 4.0, 4.9],
    'sales': [100, 150, 200, 75, 300, 400, 50, 20, 70, 500]
})

Z = linkage(data[['price', 'rating', 'sales']], method='complete', metric='euclidean')

plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.show()

ผลลัพธ์ที่ได้ คือ

จากตัวอย่าง ได้ใช้ Hierarchical Clustering เพื่อจัดกลุ่มสินค้าโดยใช้ข้อมูลราคา (price), คะแนนโดยเฉลี่ย (rating) และยอดขาย (sales) ของสินค้าทั้ง 10 รายการ (A-J) ซึ่งเก็บอยู่ใน DataFrame ชื่อ data

โดยใช้ฟังก์ชัน linkage() ของ scipy.cluster.hierarchy เพื่อคำนวณระยะห่างระหว่างแต่ละกลุ่มสินค้า โดยกำหนดวิธีการคำนวณความคล้ายคลึงเป็น Complete linkage และคำนวณด้วย Euclidean distance

เมื่อได้ระยะห่างระหว่างกลุ่มสินค้าแล้ว จะนำมาสร้าง dendrogram โดยใช้ฟังก์ชัน dendrogram() ของ matplotlib.pyplot

สีที่ปรากฏใน dendrogram แสดงถึงการจัดกลุ่มที่แตกต่างกันของข้อมูล ซึ่งเส้นสีส้มแสดงถึงการจัดกลุ่มที่สูงสุด (การแบ่งกลุ่มที่เป็นไปได้มากที่สุด) ที่สามารถทำได้โดยไม่เกินจำนวนกลุ่มที่กำหนดไว้ ในขณะที่เส้นสีเขียวแสดงถึงการจัดกลุ่มที่เกิดขึ้นระหว่างการแบ่งกลุ่มในแต่ละระดับของ dendrogram โดยการแบ่งกลุ่มที่เกิดขึ้นในแต่ละระดับจะน้อยลงตามการเลือกตัวแบ่งของ hierarchical clustering ในแต่ละรอบของการจัดกลุ่ม

จัดกลุ่มสินค้าจากข้อมูล 4 คอลัมน์คือ price, rating, sales และ product โดยใช้วิธี complete linkage และ Euclidean distance ในการคำนวณความคล้ายคลึงระหว่างสินค้า จากนั้นใช้ฟังก์ชัน dendrogram เพื่อแสดงผลของการจัดกลุ่มในรูปแบบของ dendrogram โดยแกน x คือ ชื่อสินค้า และแกน y คือค่าความคล้ายคลึงระหว่างสินค้าที่ถูกคำนวณจาก Z โดย Z เป็น output ของฟังก์ชัน linkage ที่รับข้อมูลเป็นตาราง data และระบุวิธีและวิธีคำนวณค่าคล้ายคลึงด้วย method และ metric ตามลำดับ

ผลลัพธ์ที่ได้จากการรันโค้ดนี้คือ การแสดง dendrogram ของกลุ่มสินค้าที่ได้จัดกลุ่มโดยใช้ Hierarchical Clustering โดยแกน x คือสินค้าแต่ละรายการ (A-J) และแกน y คือระยะห่างระหว่างกลุ่มสินค้า โดยสีของเส้นใน dendrogram แสดงถึงระยะห่างระหว่างกลุ่มสินค้า โดยสีเข้มจะแสดงถึงความคล้ายคลึงระหว่างกลุ่มสินค้าที่มีระยะห่างน้อย ส่วนสีอ่อนจะแสดงถึงกลุ่มสินค้าที่มีระยะห่างมากกว่า

ตัวอย่าง การใช้ Hierarchical Clustering เพื่อจัดกลุ่มลูกค้าที่มีความคล้ายคลึงกันเป็นกลุ่มเดียวกัน เพื่อใช้ในการพัฒนากลยุทธ์การตลาดในอนาคต โดยใช้ข้อมูลต่างๆ เช่น ข้อมูลลูกค้า เช่น อายุ รายได้ ประเภทสินค้าที่สนใจ ปริมาณการซื้อสินค้า เป็นต้น

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

data = pd.DataFrame({
    'age': [20, 22, 25, 26, 28, 30, 32, 34, 36, 38, 40, 42, 45, 48, 50],
    'income': [20000, 22000, 24000, 28000, 30000, 32000, 34000, 36000, 38000, 40000, 42000, 44000, 46000, 48000, 50000],
    'product_type': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
    'purchase_amount': [50, 75, 100, 125, 150, 50, 75, 100, 125, 150, 50, 75, 100, 125, 150]
})

Z = linkage(data[['age', 'income', 'purchase_amount']], method='average', metric='euclidean')

plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.show()

ผลลัพธ์ที่ได้ คือ

จากตัวอย่าง เป็นการทำ Hierarchical Clustering ของข้อมูลเกี่ยวกับการตลาด โดยมีตัวแปรใน DataFrame ที่ใช้ในการทำ clustering ประกอบด้วย ‘age’ (อายุ), ‘income’ (รายได้), ‘product_type’ (ประเภทสินค้า), และ ‘purchase_amount’ (จำนวนที่ซื้อสินค้า) โดยใช้ linkage() function ด้วยวิธีการคำนวณความคล้ายคลึงแบบ average linkage และคำนวณความคล้ายคลึงด้วย Euclidean distance จากนั้น plot dendrogram ของการ clustering ด้วย dendrogram() function และ matplotlib.pyplot โดยสีของเส้นบน dendrogram แสดงถึงความคล้ายคลึงระหว่างกลุ่ม โดยสีเขียวแสดงถึงกลุ่มสินค้า A และ B และสีส้มแสดงถึงกลุ่มสินค้า C, D และ E โดยสามารถตัด dendrogram เพื่อเลือกจำนวนกลุ่มที่เหมาะสมได้

จัดกลุ่มลูกค้าในการตลาด จะเห็นได้ว่าเราสามารถแบ่งกลุ่มลูกค้าตามลักษณะการซื้อสินค้าได้ โดยแบ่งเป็น 5 กลุ่มตามเส้นแบ่งและสีใน Dendrogram ซึ่งแต่ละกลุ่มสามารถอธิบายได้ดังนี้

  • กลุ่มที่ 1 คือ ลูกค้าที่มีอายุต่ำกว่า 30 ปี และมียอดรายได้ต่ำกว่า 30,000 บาท และซื้อสินค้าจำนวนน้อยกว่า 100 บาท
  • กลุ่มที่ 2  คือ ลูกค้าที่มีอายุต่ำกว่า 30 ปี แต่มียอดรายได้สูงกว่า 30,000 บาท และซื้อสินค้าจำนวนน้อยกว่า 100 บาท
  • กลุ่มที่ 3 คือ ลูกค้าที่มีอายุระหว่าง 30-40 ปี และมียอดรายได้ระหว่าง 30,000-40,000 บาท และซื้อสินค้าจำนวนน้อยกว่า 100 บาท
  • กลุ่มที่ 4 คือ ลูกค้าที่มีอายุระหว่าง 30-40 ปี และมียอดรายได้สูงกว่า 40,000 บาท และซื้อสินค้าในปริมาณมากกว่ากลุ่มอื่น
  • กลุ่มที่ 5 คือ ลูกค้าที่มีอายุสูงกว่า 40 ปี และมียอดรายได้สูงกว่า 40,000 บาท และซื้อสินค้าในปริมาณมากกว่ากลุ่มอื่น