You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/th/5-Clustering/1-Visualize/README.md

347 lines
43 KiB

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "730225ea274c9174fe688b21d421539d",
"translation_date": "2025-09-05T21:25:30+00:00",
"source_file": "5-Clustering/1-Visualize/README.md",
"language_code": "th"
}
-->
# บทนำเกี่ยวกับการจัดกลุ่มข้อมูล
การจัดกลุ่มข้อมูล (Clustering) เป็นรูปแบบหนึ่งของ [การเรียนรู้แบบไม่มีผู้สอน](https://wikipedia.org/wiki/Unsupervised_learning) ซึ่งสมมติว่าชุดข้อมูลไม่มีการติดป้ายกำกับ หรือข้อมูลนำเข้าไม่ได้จับคู่กับผลลัพธ์ที่กำหนดไว้ล่วงหน้า โดยใช้หลากหลายอัลกอริทึมเพื่อจัดเรียงข้อมูลที่ไม่มีการติดป้ายกำกับ และสร้างกลุ่มตามรูปแบบที่พบในข้อมูล
[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare")
> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ ขณะคุณกำลังศึกษาเรื่องการเรียนรู้ของเครื่องด้วยการจัดกลุ่มข้อมูล ลองฟังเพลงแนว Dance Hall ของไนจีเรีย - นี่คือเพลงที่ได้รับความนิยมสูงในปี 2014 โดย PSquare
## [แบบทดสอบก่อนการบรรยาย](https://ff-quizzes.netlify.app/en/ml/)
### บทนำ
[การจัดกลุ่มข้อมูล](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) มีประโยชน์มากสำหรับการสำรวจข้อมูล ลองมาดูกันว่ามันสามารถช่วยค้นพบแนวโน้มและรูปแบบในวิธีที่ผู้ชมชาวไนจีเรียบริโภคเพลงได้หรือไม่
✅ ลองใช้เวลาสักครู่คิดถึงการใช้งานของการจัดกลุ่มข้อมูล ในชีวิตจริง การจัดกลุ่มเกิดขึ้นเมื่อคุณมีกองผ้าซักและต้องแยกเสื้อผ้าของสมาชิกในครอบครัว 🧦👕👖🩲 ในวิทยาศาสตร์ข้อมูล การจัดกลุ่มเกิดขึ้นเมื่อพยายามวิเคราะห์ความชอบของผู้ใช้ หรือกำหนดลักษณะของชุดข้อมูลที่ไม่มีการติดป้ายกำกับ การจัดกลุ่มช่วยทำให้ความยุ่งเหยิงมีความหมาย เช่น ลิ้นชักถุงเท้า
[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering")
> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: John Guttag จาก MIT แนะนำเรื่องการจัดกลุ่มข้อมูล
ในสภาพแวดล้อมการทำงาน การจัดกลุ่มสามารถใช้เพื่อกำหนดสิ่งต่าง ๆ เช่น การแบ่งส่วนตลาด หรือการระบุว่ากลุ่มอายุใดซื้อสินค้าอะไร ตัวอย่างอื่น ๆ คือการตรวจจับความผิดปกติ เช่น การตรวจจับการฉ้อโกงจากชุดข้อมูลธุรกรรมบัตรเครดิต หรือการใช้การจัดกลุ่มเพื่อระบุเนื้องอกจากชุดภาพสแกนทางการแพทย์
✅ ลองคิดสักครู่เกี่ยวกับวิธีที่คุณอาจเคยพบการจัดกลุ่มข้อมูลในชีวิตจริง เช่น ในธนาคาร อีคอมเมิร์ซ หรือธุรกิจ
> 🎓 น่าสนใจที่การวิเคราะห์การจัดกลุ่มมีต้นกำเนิดในสาขามานุษยวิทยาและจิตวิทยาในช่วงปี 1930 คุณจินตนาการได้ไหมว่ามันถูกใช้อย่างไรในตอนนั้น?
อีกทางหนึ่ง คุณสามารถใช้มันเพื่อจัดกลุ่มผลการค้นหา - เช่น ลิงก์การช็อปปิ้ง รูปภาพ หรือรีวิว การจัดกลุ่มมีประโยชน์เมื่อคุณมีชุดข้อมูลขนาดใหญ่ที่ต้องการลดขนาดลง และต้องการวิเคราะห์ในเชิงลึกมากขึ้น ดังนั้นเทคนิคนี้สามารถใช้เพื่อเรียนรู้เกี่ยวกับข้อมูลก่อนที่จะสร้างโมเดลอื่น ๆ
✅ เมื่อข้อมูลของคุณถูกจัดกลุ่มแล้ว คุณสามารถกำหนดรหัสกลุ่มให้กับมัน เทคนิคนี้มีประโยชน์เมื่อคุณต้องการรักษาความเป็นส่วนตัวของชุดข้อมูล คุณสามารถอ้างถึงจุดข้อมูลโดยใช้รหัสกลุ่มแทนที่จะใช้ข้อมูลที่สามารถระบุตัวตนได้ คุณคิดเหตุผลอื่น ๆ ได้ไหมว่าทำไมคุณถึงเลือกใช้รหัสกลุ่มแทนที่จะใช้ข้อมูลอื่น ๆ ในกลุ่มเพื่อระบุข้อมูล?
เพิ่มพูนความเข้าใจของคุณเกี่ยวกับเทคนิคการจัดกลุ่มใน [โมดูลการเรียนรู้](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)
## เริ่มต้นกับการจัดกลุ่มข้อมูล
[Scikit-learn มีวิธีการมากมาย](https://scikit-learn.org/stable/modules/clustering.html) สำหรับการจัดกลุ่มข้อมูล ประเภทที่คุณเลือกจะขึ้นอยู่กับกรณีการใช้งานของคุณ ตามเอกสารประกอบ แต่ละวิธีมีประโยชน์ที่แตกต่างกัน นี่คือตารางที่เรียบง่ายของวิธีการที่ Scikit-learn รองรับและกรณีการใช้งานที่เหมาะสม:
| ชื่อวิธีการ | กรณีการใช้งาน |
| :--------------------------- | :--------------------------------------------------------------------- |
| K-Means | ใช้งานทั่วไป, แบบ inductive |
| Affinity propagation | กลุ่มจำนวนมาก, ไม่เท่ากัน, แบบ inductive |
| Mean-shift | กลุ่มจำนวนมาก, ไม่เท่ากัน, แบบ inductive |
| Spectral clustering | กลุ่มจำนวนน้อย, เท่ากัน, แบบ transductive |
| Ward hierarchical clustering | กลุ่มจำนวนมาก, ถูกจำกัด, แบบ transductive |
| Agglomerative clustering | กลุ่มจำนวนมาก, ถูกจำกัด, ระยะทางแบบ non-Euclidean, แบบ transductive |
| DBSCAN | รูปทรงเรขาคณิตแบบ non-flat, กลุ่มไม่เท่ากัน, แบบ transductive |
| OPTICS | รูปทรงเรขาคณิตแบบ non-flat, กลุ่มไม่เท่ากันที่มีความหนาแน่นแปรผัน, แบบ transductive |
| Gaussian mixtures | รูปทรงเรขาคณิตแบบ flat, แบบ inductive |
| BIRCH | ชุดข้อมูลขนาดใหญ่ที่มีค่าผิดปกติ, แบบ inductive |
> 🎓 วิธีที่เราสร้างกลุ่มข้อมูลมีความเกี่ยวข้องกับวิธีที่เรารวบรวมจุดข้อมูลเข้าด้วยกัน ลองมาทำความเข้าใจคำศัพท์บางคำ:
>
> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> การอนุมานแบบ transductive มาจากกรณีการฝึกอบรมที่สังเกตได้ซึ่งจับคู่กับกรณีทดสอบเฉพาะ การอนุมานแบบ inductive มาจากกรณีการฝึกอบรมที่จับคู่กับกฎทั่วไปซึ่งจะถูกนำไปใช้กับกรณีทดสอบในภายหลัง
>
> ตัวอย่าง: สมมติว่าคุณมีชุดข้อมูลที่มีการติดป้ายกำกับบางส่วน บางรายการเป็น 'records', บางรายการเป็น 'cds', และบางรายการไม่มีป้ายกำกับ งานของคุณคือการให้ป้ายกำกับกับข้อมูลที่ไม่มีป้ายกำกับ หากคุณเลือกวิธี inductive คุณจะฝึกโมเดลเพื่อค้นหา 'records' และ 'cds' และนำป้ายกำกับเหล่านั้นไปใช้กับข้อมูลที่ไม่มีป้ายกำกับ วิธีนี้อาจมีปัญหาในการจัดประเภทสิ่งที่เป็น 'cassettes' ในทางกลับกัน วิธี transductive จะจัดการกับข้อมูลที่ไม่รู้จักได้อย่างมีประสิทธิภาพมากกว่า โดยทำงานเพื่อจัดกลุ่มสิ่งที่คล้ายกันเข้าด้วยกันแล้วนำป้ายกำกับไปใช้กับกลุ่ม ในกรณีนี้ กลุ่มอาจสะท้อนถึง 'สิ่งดนตรีทรงกลม' และ 'สิ่งดนตรีทรงสี่เหลี่ยม'
>
> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> มาจากคำศัพท์ทางคณิตศาสตร์ 'non-flat' vs. 'flat' geometry หมายถึงการวัดระยะทางระหว่างจุดโดยใช้วิธีการเรขาคณิตแบบ 'flat' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) หรือ 'non-flat' (non-Euclidean)
>
>'Flat' ในบริบทนี้หมายถึงเรขาคณิตแบบ Euclidean (บางส่วนของมันถูกสอนเป็นเรขาคณิต 'plane') และ non-flat หมายถึงเรขาคณิตแบบ non-Euclidean เรขาคณิตเกี่ยวข้องกับการเรียนรู้ของเครื่องอย่างไร? เนื่องจากทั้งสองสาขามีรากฐานมาจากคณิตศาสตร์ จึงต้องมีวิธีการทั่วไปในการวัดระยะทางระหว่างจุดในกลุ่ม ซึ่งสามารถทำได้ในแบบ 'flat' หรือ 'non-flat' ขึ้นอยู่กับลักษณะของข้อมูล [ระยะทางแบบ Euclidean](https://wikipedia.org/wiki/Euclidean_distance) ถูกวัดเป็นความยาวของเส้นตรงระหว่างสองจุด [ระยะทางแบบ non-Euclidean](https://wikipedia.org/wiki/Non-Euclidean_geometry) ถูกวัดตามเส้นโค้ง หากข้อมูลของคุณเมื่อแสดงภาพดูเหมือนจะไม่อยู่บนระนาบ คุณอาจต้องใช้อัลกอริทึมเฉพาะเพื่อจัดการกับมัน
>
![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png)
> Infographic โดย [Dasani Madipalli](https://twitter.com/dasani_decoded)
>
> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> กลุ่มข้อมูลถูกกำหนดโดยเมทริกซ์ระยะทาง เช่น ระยะทางระหว่างจุดต่าง ๆ ระยะทางนี้สามารถวัดได้หลายวิธี กลุ่มแบบ Euclidean ถูกกำหนดโดยค่าเฉลี่ยของค่าจุด และมี 'centroid' หรือจุดศูนย์กลาง ระยะทางจึงถูกวัดโดยระยะทางไปยังจุดศูนย์กลางนั้น ระยะทางแบบ non-Euclidean หมายถึง 'clustroids' ซึ่งเป็นจุดที่ใกล้ที่สุดกับจุดอื่น ๆ Clustroids สามารถกำหนดได้หลายวิธี
>
> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [การจัดกลุ่มแบบมีข้อจำกัด](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) แนะนำการเรียนรู้แบบ 'semi-supervised' ในวิธีการแบบไม่มีผู้สอน ความสัมพันธ์ระหว่างจุดถูกกำหนดเป็น 'cannot link' หรือ 'must-link' ดังนั้นจึงมีการบังคับใช้กฎบางอย่างในชุดข้อมูล
>
>ตัวอย่าง: หากอัลกอริทึมถูกปล่อยให้ทำงานกับชุดข้อมูลที่ไม่มีการติดป้ายกำกับหรือมีการติดป้ายกำกับบางส่วน กลุ่มที่มันสร้างขึ้นอาจมีคุณภาพต่ำ ในตัวอย่างข้างต้น กลุ่มอาจจัดกลุ่ม 'สิ่งดนตรีทรงกลม' และ 'สิ่งดนตรีทรงสี่เหลี่ยม' และ 'สิ่งทรงสามเหลี่ยม' และ 'คุกกี้' หากมีการให้ข้อจำกัด หรือกฎบางอย่าง ("สิ่งนั้นต้องทำจากพลาสติก", "สิ่งนั้นต้องสามารถผลิตเสียงดนตรีได้") สิ่งนี้สามารถช่วย 'จำกัด' อัลกอริทึมให้เลือกได้ดีขึ้น
>
> 🎓 'Density'
>
> ข้อมูลที่ 'มีเสียงรบกวน' ถือว่าเป็นข้อมูลที่ 'หนาแน่น' ระยะทางระหว่างจุดในแต่ละกลุ่มของมันอาจพิสูจน์ได้ว่ามีความหนาแน่นมากหรือน้อย และข้อมูลนี้จำเป็นต้องได้รับการวิเคราะห์ด้วยวิธีการจัดกลุ่มที่เหมาะสม [บทความนี้](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) แสดงให้เห็นถึงความแตกต่างระหว่างการใช้ K-Means clustering กับ HDBSCAN เพื่อสำรวจชุดข้อมูลที่มีเสียงรบกวนและความหนาแน่นของกลุ่มที่ไม่เท่ากัน
## อัลกอริทึมการจัดกลุ่มข้อมูล
มีอัลกอริทึมการจัดกลุ่มข้อมูลมากกว่า 100 แบบ และการใช้งานขึ้นอยู่กับลักษณะของข้อมูลที่มีอยู่ ลองมาพูดถึงบางอันที่สำคัญ:
- **การจัดกลุ่มแบบลำดับชั้น** หากวัตถุถูกจัดประเภทโดยความใกล้ชิดกับวัตถุใกล้เคียงมากกว่ากับวัตถุที่อยู่ไกลออกไป กลุ่มจะถูกสร้างขึ้นตามระยะทางของสมาชิกไปยังวัตถุอื่น ๆ การจัดกลุ่มแบบ agglomerative ของ Scikit-learn เป็นแบบลำดับชั้น
![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png)
> Infographic โดย [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **การจัดกลุ่มแบบจุดศูนย์กลาง** อัลกอริทึมยอดนิยมนี้ต้องการการเลือก 'k' หรือจำนวนกลุ่มที่จะสร้าง หลังจากนั้นอัลกอริทึมจะกำหนดจุดศูนย์กลางของกลุ่มและรวบรวมข้อมูลรอบจุดนั้น [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) เป็นรูปแบบยอดนิยมของการจัดกลุ่มแบบจุดศูนย์กลาง จุดศูนย์กลางถูกกำหนดโดยค่าเฉลี่ยที่ใกล้ที่สุด จึงเป็นที่มาของชื่อ ระยะทางที่กำลังวัดจากกลุ่มจะถูกลดลง
![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png)
> Infographic โดย [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **การจัดกลุ่มแบบอิงการกระจาย** อิงจากการสร้างแบบจำลองทางสถิติ การจัดกลุ่มแบบอิงการกระจายมุ่งเน้นไปที่การกำหนดความน่าจะเป็นที่จุดข้อมูลจะอยู่ในกลุ่ม และกำหนดให้ตามนั้น วิธี Gaussian mixture เป็นส่วนหนึ่งของประเภทนี้
- **การจัดกลุ่มแบบอิงความหนาแน่น** จุดข้อมูลจะถูกกำหนดให้กับกลุ่มตามความหนาแน่น หรือการรวมตัวกันรอบ ๆ กัน จุดข้อมูลที่อยู่ไกลจากกลุ่มจะถือว่าเป็นค่าผิดปกติหรือเสียงรบกวน DBSCAN, Mean-shift และ OPTICS เป็นส่วนหนึ่งของประเภทนี้
- **การจัดกลุ่มแบบอิงกริด** สำหรับชุดข้อมูลหลายมิติ จะมีการสร้างกริดและข้อมูลจะถูกแบ่งออกเป็นเซลล์ของกริดนั้น ซึ่งจะสร้างกลุ่มขึ้นมา
## แบบฝึกหัด - จัดกลุ่มข้อมูลของคุณ
การจัดกลุ่มข้อมูลเป็นเทคนิคที่ได้รับการสนับสนุนอย่างมากจากการแสดงภาพที่เหมาะสม ดังนั้นเรามาเริ่มต้นด้วยการแสดงภาพข้อมูลเพลงของเรา แบบฝึกหัดนี้จะช่วยให้เราตัดสินใจได้ว่าวิธีการจัดกลุ่มข้อมูลแบบใดที่ควรใช้ให้เหมาะสมที่สุดกับลักษณะของข้อมูลนี้
1. เปิดไฟล์ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) ในโฟลเดอร์นี้
1. นำเข้าแพ็กเกจ `Seaborn` เพื่อการแสดงภาพข้อมูลที่ดี
```python
!pip install seaborn
```
1. เพิ่มข้อมูลเพลงจาก [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv) โหลด dataframe พร้อมข้อมูลเกี่ยวกับเพลง เตรียมพร้อมสำรวจข้อมูลนี้โดยการนำเข้าห้องสมุดและแสดงข้อมูลออกมา:
```python
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("../data/nigerian-songs.csv")
df.head()
```
ตรวจสอบบรรทัดแรกของข้อมูล:
| | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- |
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
1. เรียก `info()` เพื่อดูข้อมูลเกี่ยวกับ dataframe:
```python
df.info()
```
ผลลัพธ์จะมีลักษณะดังนี้:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 530 entries, 0 to 529
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 530 non-null object
1 album 530 non-null object
2 artist 530 non-null object
3 artist_top_genre 530 non-null object
4 release_date 530 non-null int64
5 length 530 non-null int64
6 popularity 530 non-null int64
7 danceability 530 non-null float64
8 acousticness 530 non-null float64
9 energy 530 non-null float64
10 instrumentalness 530 non-null float64
11 liveness 530 non-null float64
12 loudness 530 non-null float64
13 speechiness 530 non-null float64
14 tempo 530 non-null float64
15 time_signature 530 non-null int64
dtypes: float64(8), int64(4), object(4)
memory usage: 66.4+ KB
```
1. ตรวจสอบค่า null โดยเรียก `isnull()` และตรวจสอบผลรวมว่ามีค่าเป็น 0:
```python
df.isnull().sum()
```
ดูดี:
```output
name 0
album 0
artist 0
artist_top_genre 0
release_date 0
length 0
popularity 0
danceability 0
acousticness 0
energy 0
instrumentalness 0
liveness 0
loudness 0
speechiness 0
tempo 0
time_signature 0
dtype: int64
```
1. อธิบายข้อมูล:
```python
df.describe()
```
| | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
| count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
| mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
| std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
| min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
| 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
| 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
| 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
| max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 |
> 🤔 หากเรากำลังทำงานกับการจัดกลุ่ม ซึ่งเป็นวิธีการแบบไม่มีการกำกับดูแลที่ไม่ต้องใช้ข้อมูลที่มีการติดป้ายกำกับ ทำไมเราถึงแสดงข้อมูลนี้พร้อมป้ายกำกับ? ในขั้นตอนการสำรวจข้อมูล ป้ายกำกับมีประโยชน์ แต่ไม่ได้จำเป็นสำหรับการทำงานของอัลกอริทึมการจัดกลุ่ม คุณสามารถลบหัวคอลัมน์ออกและอ้างอิงข้อมูลโดยหมายเลขคอลัมน์แทนได้
ดูค่าทั่วไปของข้อมูล สังเกตว่าความนิยมสามารถมีค่าเป็น '0' ซึ่งแสดงเพลงที่ไม่มีการจัดอันดับ เราจะลบข้อมูลเหล่านั้นในไม่ช้า
1. ใช้ barplot เพื่อค้นหาแนวเพลงที่ได้รับความนิยมมากที่สุด:
```python
import seaborn as sns
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top[:5].index,y=top[:5].values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
![most popular](../../../../5-Clustering/1-Visualize/images/popular.png)
✅ หากคุณต้องการดูค่าที่สูงกว่า ให้เปลี่ยน `[:5]` เป็นค่าที่ใหญ่ขึ้น หรือเอาออกเพื่อดูทั้งหมด
สังเกตว่าเมื่อแนวเพลงที่ได้รับความนิยมสูงสุดถูกอธิบายว่า 'Missing' หมายความว่า Spotify ไม่ได้จัดประเภทแนวเพลงนั้น ดังนั้นเรามาลบข้อมูลเหล่านั้นออก
1. ลบข้อมูลที่หายไปโดยการกรองออก
```python
df = df[df['artist_top_genre'] != 'Missing']
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
ตอนนี้ตรวจสอบแนวเพลงอีกครั้ง:
![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png)
1. แนวเพลงสามอันดับแรกมีอิทธิพลต่อชุดข้อมูลนี้อย่างมาก เรามาเน้นที่ `afro dancehall`, `afropop`, และ `nigerian pop` และกรองชุดข้อมูลเพิ่มเติมเพื่อลบข้อมูลที่มีค่า popularity เป็น 0 (หมายความว่าไม่ได้ถูกจัดประเภทด้วยความนิยมในชุดข้อมูลและสามารถถือว่าเป็นเสียงรบกวนสำหรับวัตถุประสงค์ของเรา):
```python
df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
df = df[(df['popularity'] > 0)]
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
1. ทดสอบอย่างรวดเร็วเพื่อดูว่าข้อมูลมีความสัมพันธ์กันในลักษณะที่แข็งแกร่งหรือไม่:
```python
corrmat = df.corr(numeric_only=True)
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
```
![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png)
ความสัมพันธ์ที่แข็งแกร่งเพียงอย่างเดียวคือระหว่าง `energy` และ `loudness` ซึ่งไม่น่าแปลกใจนัก เนื่องจากเพลงที่ดังมักจะมีพลังงานสูง อย่างไรก็ตาม ความสัมพันธ์อื่นๆ ค่อนข้างอ่อน จะน่าสนใจที่จะดูว่าอัลกอริทึมการจัดกลุ่มสามารถทำอะไรกับข้อมูลนี้ได้บ้าง
> 🎓 โปรดทราบว่าความสัมพันธ์ไม่ได้หมายถึงสาเหตุ! เรามีหลักฐานของความสัมพันธ์ แต่ไม่มีหลักฐานของสาเหตุ เว็บไซต์ [ที่น่าสนใจ](https://tylervigen.com/spurious-correlations) มีภาพที่เน้นประเด็นนี้
มีการรวมตัวกันในชุดข้อมูลนี้เกี่ยวกับความนิยมและความสามารถในการเต้นของเพลงหรือไม่? FacetGrid แสดงให้เห็นว่ามีวงกลมที่รวมตัวกันโดยไม่คำนึงถึงแนวเพลง อาจเป็นไปได้ว่ารสนิยมของชาวไนจีเรียรวมตัวกันในระดับความสามารถในการเต้นที่แนวเพลงนี้หรือไม่?
✅ ลองใช้จุดข้อมูลอื่นๆ (energy, loudness, speechiness) และแนวเพลงที่หลากหลายหรือเพิ่มเติม คุณสามารถค้นพบอะไรได้บ้าง? ดูตาราง `df.describe()` เพื่อดูการกระจายทั่วไปของจุดข้อมูล
### แบบฝึกหัด - การกระจายข้อมูล
แนวเพลงทั้งสามนี้แตกต่างกันอย่างมีนัยสำคัญในเรื่องการรับรู้ความสามารถในการเต้นของเพลงตามความนิยมของพวกเขาหรือไม่?
1. ตรวจสอบการกระจายข้อมูลของแนวเพลงสามอันดับแรกในเรื่องความนิยมและความสามารถในการเต้นตามแกน x และ y ที่กำหนด
```python
sns.set_theme(style="ticks")
g = sns.jointplot(
data=df,
x="popularity", y="danceability", hue="artist_top_genre",
kind="kde",
)
```
คุณสามารถค้นพบวงกลมที่รวมตัวกันรอบจุดรวมทั่วไป ซึ่งแสดงการกระจายของจุดข้อมูล
> 🎓 โปรดทราบว่าตัวอย่างนี้ใช้กราฟ KDE (Kernel Density Estimate) ซึ่งแสดงข้อมูลโดยใช้เส้นโค้งความหนาแน่นความน่าจะเป็นแบบต่อเนื่อง สิ่งนี้ช่วยให้เราตีความข้อมูลเมื่อทำงานกับการกระจายหลายแบบ
โดยทั่วไป แนวเพลงทั้งสามมีการจัดเรียงที่หลวมๆ ในเรื่องความนิยมและความสามารถในการเต้น การกำหนดกลุ่มในข้อมูลที่จัดเรียงหลวมๆ นี้จะเป็นความท้าทาย:
![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png)
1. สร้าง scatter plot:
```python
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
.map(plt.scatter, "popularity", "danceability") \
.add_legend()
```
scatterplot ของแกนเดียวกันแสดงรูปแบบการรวมตัวที่คล้ายกัน
![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png)
โดยทั่วไป สำหรับการจัดกลุ่ม คุณสามารถใช้ scatterplot เพื่อแสดงกลุ่มของข้อมูล ดังนั้นการเชี่ยวชาญการแสดงภาพประเภทนี้จึงมีประโยชน์มาก ในบทเรียนถัดไป เราจะนำข้อมูลที่กรองแล้วนี้ไปใช้กับการจัดกลุ่มแบบ k-means เพื่อค้นหากลุ่มในข้อมูลนี้ที่ดูเหมือนจะทับซ้อนกันในลักษณะที่น่าสนใจ
---
## 🚀ความท้าทาย
เพื่อเตรียมพร้อมสำหรับบทเรียนถัดไป สร้างแผนภูมิเกี่ยวกับอัลกอริทึมการจัดกลุ่มต่างๆ ที่คุณอาจค้นพบและใช้ในสภาพแวดล้อมการผลิต อัลกอริทึมการจัดกลุ่มพยายามแก้ปัญหาแบบใด?
## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/)
## ทบทวนและศึกษาด้วยตนเอง
ก่อนที่คุณจะใช้อัลกอริทึมการจัดกลุ่ม ตามที่เราได้เรียนรู้ เป็นความคิดที่ดีที่จะเข้าใจลักษณะของชุดข้อมูลของคุณ อ่านเพิ่มเติมเกี่ยวกับหัวข้อนี้ [ที่นี่](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
[บทความที่มีประโยชน์นี้](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) จะพาคุณผ่านวิธีการต่างๆ ที่อัลกอริทึมการจัดกลุ่มต่างๆ ทำงาน โดยพิจารณาจากรูปร่างของข้อมูลที่แตกต่างกัน
## งานที่ได้รับมอบหมาย
[ค้นคว้าการแสดงภาพอื่นๆ สำหรับการจัดกลุ่ม](assignment.md)
---
**ข้อจำกัดความรับผิดชอบ**:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้