# บทนำสู่การทำคลัสเตอร์ การทำคลัสเตอร์เป็นประเภทหนึ่งของ [การเรียนรู้แบบไม่ต้องมีผู้สอน](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") > 🎥 คลิกที่รูปภาพด้านบนเพื่อดูวิดีโอ ขณะที่คุณกำลังเรียนรู้แมชชีนเลิร์นนิงด้วยการทำคลัสเตอร์ ขอให้สนุกกับเพลงแนวนิการ์เจียนแดนซ์ฮอลล์ - นี่เป็นเพลงอันดับสูงจากปี 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 | คลัสเตอร์จำนวนมาก, มีข้อจำกัด, ระยะทางไม่เป็นแบบยูคลิด, transductive | | DBSCAN | รูปทรงไม่เรียบ, คลัสเตอร์ไม่เท่ากัน, transductive | | OPTICS | รูปทรงไม่เรียบ, คลัสเตอร์ไม่เท่ากันซึ่งมีความหนาแน่นไม่เท่ากัน, transductive | | Gaussian mixtures | รูปทรงเรียบ, inductive | | BIRCH | ชุดข้อมูลใหญ่ที่มีค่าผิดปกติ, inductive | > 🎓 วิธีที่เราสร้างคลัสเตอร์เกี่ยวข้องกับวิธีการรวบรวมจุดข้อมูลเข้ากลุ่มกัน ลองทำความเข้าใจคำศัพท์ต่าง ๆ: > > 🎓 ['Transductive' กับ 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning)) > > การอนุมานแบบ transductive มาจากกรณีฝึกที่สังเกตเห็นซึ่งจับคู่กับกรณีทดสอบเฉพาะเจาะจง ในขณะที่การอนุมานแบบ inductive มาจากกรณีฝึกที่จับคู่กับกฎทั่วไปซึ่งนำไปใช้กับกรณีทดสอบ > > ตัวอย่าง: สมมติว่าคุณมีชุดข้อมูลที่มีป้ายกำกับบางส่วน บางอย่างเป็น 'แผ่นเสียง' บางอย่างเป็น 'ซีดี' และบางอย่างไม่มีป้าย คุณมีหน้าที่กำหนดป้ายสำหรับข้อมูลที่ไม่มีป้าย หากใช้วิธี inductive คุณจะฝึกโมเดลให้มองหา 'แผ่นเสียง' และ 'ซีดี' แล้วนำป้ายเหล่านั้นไปใช้กับข้อมูลที่ไม่มีป้าย วิธีนี้จะมีปัญหาเมื่อต้องจัดประเภทสิ่งที่เป็น 'เทปคาสเซ็ท' ขณะที่วิธีแบบ transductive จะจัดการข้อมูลที่ไม่รู้จักนี้ได้ดีขึ้นโดยการรวบรวมวัตถุที่คล้ายกันเข้าด้วยกันและระบุป้ายในกลุ่มนั้น เช่น คลัสเตอร์อาจแยกออกเป็น 'สิ่งดนตรีทรงกลม' และ 'สิ่งดนตรีทรงสี่เหลี่ยม' > > 🎓 ['รูปร่างไม่เรียบ' กับ 'รูปร่างเรียบ'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) > > มาจากคำศัพท์ทางคณิตศาสตร์ รูปร่างไม่เรียบกับรูปร่างเรียบหมายถึงการวัดระยะห่างระหว่างจุดโดยวิธีรูปร่าง 'เรียบ' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) หรือ 'ไม่เรียบ' (non-Euclidean) > > 'รูปร่างเรียบ' ในที่นี้หมายถึงเรขาคณิตยูคลิด (ซึ่งส่วนหนึ่งสอนเป็น 'เรขาคณิตระนาบ') และ 'รูปร่างไม่เรียบ' หมายถึงเรขาคณิตแบบไม่ใช่ยูคลิด แล้วเรขาคณิตเกี่ยวข้องกับแมชชีนเลิร์นนิงอย่างไร? เนื่องจากทั้งสองศาสตร์นี้มีรากฐานจากคณิตศาสตร์ จึงต้องมีวิธีวัดระยะห่างระหว่างจุดในคลัสเตอร์ที่เหมาะสม โดยวิธี 'เรียบ' หรือ 'ไม่เรียบ' ขึ้นอยู่กับลักษณะของข้อมูล [ระยะห่างแบบยูคลิด](https://wikipedia.org/wiki/Euclidean_distance) วัดโดยความยาวเส้นตรงระหว่างจุดสองจุด ขณะที่ [ระยะห่างแบบไม่ใช่ยูคลิด](https://wikipedia.org/wiki/Non-Euclidean_geometry) วัดบนเส้นโค้ง หากข้อมูลของคุณเมื่อแสดงภาพแล้วดูเหมือนไม่อยู่บนระนาบ อาจต้องใช้อัลกอริธึมเฉพาะมาแก้ไข > ![Flat vs Nonflat Geometry Infographic](../../../../translated_images/th/flat-nonflat.d1c8c6e2a96110c1.webp) > แผนภูมิภาพโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) > > 🎓 ['ระยะห่าง'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) > > คลัสเตอร์ถูกกำหนดโดยเมทริกซ์ระยะห่าง เช่น ระยะห่างระหว่างจุด ซึ่งสามารถวัดได้หลากหลายวิธี คลัสเตอร์แบบยูคลิดกำหนดโดยค่าเฉลี่ยของค่าจุด และมี 'จุดศูนย์กลาง' หรือเซ็นทรอยด์ ระยะห่างจึงวัดจากจุดศูนย์กลางนี้ ส่วนระยะห่างแบบไม่ใช่ยูคลิดอ้างถึง 'คลัสโตรยด์' ซึ่งเป็นจุดที่ใกล้กับจุดอื่นมากที่สุด คลัสโตรยด์สามารถกำหนดได้หลายวิธี > > 🎓 ['มีข้อจำกัด'](https://wikipedia.org/wiki/Constrained_clustering) > > [การทำคลัสเตอร์ที่มีข้อจำกัด](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) คือการนำการเรียนรู้กึ่งมีผู้สอนมาใช้ในวิธีแบบไม่มีผู้สอน ความสัมพันธ์ระหว่างจุดถูกกำหนดว่า 'ไม่สามารถเชื่อมโยง' หรือ 'ต้องเชื่อมโยง' เพื่อบังคับกฎบางอย่างกับชุดข้อมูล > > ตัวอย่าง: หากปล่อยให้อัลกอริธึมทำงานอย่างอิสระบนชุดข้อมูลที่ไม่มีป้ายหรือกึ่งมีป้าย คุณภาพคลัสเตอร์ที่ได้อาจต่ำ ได้คลัสเตอร์กลุ่ม 'สิ่งดนตรีทรงกลม' 'สิ่งดนตรีทรงสี่เหลี่ยม' 'สิ่งทรงสามเหลี่ยม' และ 'คุกกี้' หากมีข้อจำกัดหรือกฎ ("วัตถุต้องทำจากพลาสติก", "วัตถุต้องสามารถทำดนตรีได้") จะช่วยให้อัลกอริธึมเลือกทำงานได้ดีขึ้น > > 🎓 'ความหนาแน่น' > > ข้อมูลที่ 'มีเสียงรบกวน' ถือว่ามีความหนาแน่น ระยะห่างระหว่างจุดในคลัสเตอร์อาจแตกต่างกันและต้องวิเคราะห์ด้วยวิธีการทำคลัสเตอร์ที่เหมาะสม [บทความนี้](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) ชี้ให้เห็นความแตกต่างระหว่างการใช้ K-Means กับ HDBSCAN ในการสำรวจชุดข้อมูลที่มีเสียงรบกวนและความหนาแน่นในคลัสเตอร์ไม่เท่ากัน ## อัลกอริธึมการทำคลัสเตอร์ มีอัลกอริธึมการทำคลัสเตอร์มากกว่า 100 แบบ และการใช้งานขึ้นอยู่กับลักษณะของข้อมูล ลองพูดถึงอัลกอริธึมหลักๆ บางตัว: - **การทำคลัสเตอร์แบบลำดับชั้น (Hierarchical clustering)** หากวัตถุถูกจัดกลุ่มโดยพิจารณาระยะห่างกับวัตถุใกล้เคียงแทนที่จะกับวัตถุที่อยู่ไกลกว่าสร้างคลัสเตอร์ขึ้นตามระยะห่างระหว่างสมาชิก Scikit-learn ใช้การทำคลัสเตอร์แบบ agglomerative ซึ่งเป็นแบบลำดับชั้น ![Hierarchical clustering Infographic](../../../../translated_images/th/hierarchical.bf59403aa43c8c47.webp) > แผนภูมิภาพโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) - **การทำคลัสเตอร์แบบเซ็นทรอยด์ (Centroid clustering)** อัลกอริธึมยอดนิยมที่ต้องเลือก 'k' หรือจำนวนคลัสเตอร์ที่จะสร้าง หลังจากนั้นอัลกอริธึมจะกำหนดจุดศูนย์กลางของคลัสเตอร์และรวบรวมข้อมูลรอบๆ จุดนั้น [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) เป็นเวอร์ชันยอดนิยมของการทำคลัสเตอร์แบบเซ็นทรอยด์ เซ็นทรอยด์ถูกกำหนดโดยค่าเฉลี่ยที่ใกล้ที่สุด ชื่อก็จึงมาจากตรงนี้ ระยะห่างกำหนดโดยระยะห่างยกกำลังสองจากคลัสเตอร์จะถูกลดให้น้อยที่สุด ![Centroid clustering Infographic](../../../../translated_images/th/centroid.097fde836cf6c918.webp) > แผนภูมิภาพโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) - **การทำคลัสเตอร์แบบฐานะการกระจายตัว (Distribution-based clustering)** โดยอิงจากการจำลองทางสถิติ มุ่งเน้นการกำหนดความน่าจะเป็นที่จุดข้อมูลจะอยู่ในคลัสเตอร์ และกำหนดสมาชิกตามนั้น วิธี Gaussian mixture อยู่ในประเภทนี้ - **การทำคลัสเตอร์แบบฐานะความหนาแน่น (Density-based clustering)** จุดข้อมูลถูกจัดกลุ่มตามความหนาแน่นหรือการรวมตัวกันของพวกมัน จุดที่อยู่ห่างจากกลุ่มถือเป็นค่าผิดปกติหรือเสียงรบกวน DBSCAN, Mean-shift และ OPTICS อยู่ในประเภทนี้ - **การทำคลัสเตอร์แบบตาราง (Grid-based clustering)** สำหรับชุดข้อมูลหลายมิติ จะสร้างตาราง และแบ่งข้อมูลลงในเซลล์ของตารางเพื่อสร้างคลัสเตอร์ ## แบบฝึกหัด - ทำคลัสเตอร์ข้อมูลของคุณ การทำคลัสเตอร์ในฐานะเทคนิคได้รับการช่วยเหลืออย่างมากจากการแสดงผลภาพ ดังนั้นเรามาเริ่มต้นด้วยการแสดงผลข้อมูลเพลงของเรา แบบฝึกหัดนี้จะช่วยเราเลือกวิธีการทำคลัสเตอร์ที่เหมาะสมกับลักษณะข้อมูลนี้มากที่สุด 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. รับข้อมูลบางอย่างเกี่ยวกับ dataframe โดยเรียกใช้ `info()`: ```python df.info() ``` ผลลัพธ์จะดูเหมือนนี้: ```output 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. ตรวจสอบค่าที่หายไปอีกครั้งด้วยการเรียกใช้ `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 | > 🤔 ถ้าเรากำลังทำงานกับการจัดกลุ่ม (clustering) ซึ่งเป็นวิธีการแบบไม่มีผู้สอน (unsupervised) ที่ไม่จำเป็นต้องใช้ข้อมูลที่มีป้ายกำกับ (labeled data) ทำไมเราถึงแสดงข้อมูลนี้พร้อมกับป้ายกำกับ? ในขั้นตอนการสำรวจข้อมูล ป้ายกำกับเหล่านี้มีประโยชน์ แต่ไม่ได้จำเป็นสำหรับอัลกอริทึมการจัดกลุ่มที่จะทำงาน คุณอาจแค่ลบหัวคอลัมน์แล้วอ้างอิงข้อมูลด้วยหมายเลขคอลัมน์แทนก็ได้ ดูค่าทั่วไปของข้อมูล โปรดสังเกตว่า popularity อาจเป็น '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](../../../../translated_images/th/popular.9c48d84b3386705f.webp) ✅ หากคุณต้องการดูค่าท็อปมากกว่านี้ ให้เปลี่ยน `[: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](../../../../translated_images/th/all-genres.1d56ef06cefbfcd6.webp) 1. โดยรวมแล้ว สามแนวเพลงที่ครองชุดข้อมูลนี้ ได้แก่ `afro dancehall`, `afropop`, และ `nigerian pop` ให้โฟกัสที่แนวเพลงเหล่านี้ และกรองชุดข้อมูลเพื่อเอาข้อมูลที่มีค่า popularity เป็น 0 ออก (ซึ่งหมายถึงไม่ได้ถูกจัดประเภทด้วยค่า popularity ในชุดข้อมูลนี้ และสามารถถือเป็นสัญญาณรบกวนสำหรับวัตถุประสงค์ของเรา): ```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](../../../../translated_images/th/correlation.a9356bb798f5eea5.webp) ความสัมพันธ์ที่แข็งแรงเพียงอย่างเดียวคือระหว่าง `energy` และ `loudness` ซึ่งไม่แปลกใจนัก เพราะเพลงที่เสียงดังมักจะมีพลังงานสูง นอกเหนือจากนี้ ความสัมพันธ์ค่อนข้างอ่อน มันจะน่าสนใจที่จะดูว่าสิ่งที่อัลกอริทึมการจัดกลุ่มสามารถทำได้กับข้อมูลนี้ > 🎓 โปรดทราบว่าความสัมพันธ์ไม่ได้บ่งชี้ถึงสาเหตุ! เรามีหลักฐานความสัมพันธ์แต่ไม่มีหลักฐานว่าสาเหตุเป็นไปตามนั้น เว็บไซต์ [ผลงานขำขัน](https://tylervigen.com/spurious-correlations) แสดงภาพที่เน้นจุดนี้ ในชุดข้อมูลนี้ มีการบรรจบกันในเรื่องความนิยมและความสามารถในการเต้นของเพลงหรือไม่? FacetGrid แสดงให้เห็นว่ามีวงกลมรอบศูนย์กลางที่ตรงกันโดยไม่ขึ้นกับแนวเพลง อาจเป็นไปได้ว่าความชอบของชาวไนจีเรียบรรจบกันที่ระดับความสามารถในการเต้นระดับหนึ่งสำหรับแนวเพลงนี้หรือเปล่า? ✅ ทดลองจุดข้อมูลต่าง ๆ (energy, loudness, speechiness) และแนวเพลงที่มากกว่าหรือแตกต่างกัน คุณจะค้นพบอะไร? ดูตาราง `df.describe()` เพื่อดูการกระจายทั่วไปของจุดข้อมูล ### แบบฝึกหัด - การกระจายของข้อมูล แนวเพลงทั้งสามนี้แตกต่างกันอย่างมีนัยสำคัญในความรู้สึกเรื่องความสามารถในการเต้นหรือไม่ ขึ้นอยู่กับความนิยมของพวกเขา? 1. ตรวจสอบการกระจายข้อมูลของสามแนวเพลงท็อปในเรื่องของความนิยมและความสามารถในการเต้นตลอดแกนนอนและแกนตั้งที่กำหนด ```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](../../../../translated_images/th/distribution.9be11df42356ca95.webp) 1. สร้างกราฟกระจาย: ```python sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend() ``` กราฟกระจายของแกนเดียวกันแสดงรูปแบบการบรรจบกันในลักษณะคล้ายกัน ![Facetgrid](../../../../translated_images/th/facetgrid.9b2e65ce707eba1f.webp) โดยทั่วไป สำหรับการจัดกลุ่ม คุณสามารถใช้กราฟกระจายเพื่อแสดงกลุ่มข้อมูลได้ ดังนั้นการควบคุมการสร้างภาพประเภทนี้จึงมีประโยชน์มาก บทเรียนถัดไปเราจะใช้ข้อมูลที่กรองนี้และใช้การจัดกลุ่มแบบ 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) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้