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/fa/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb

494 lines
36 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **تحلیل موسیقی نیجریه‌ای استخراج‌شده از اسپاتیفای**\n",
"\n",
"خوشه‌بندی نوعی از [یادگیری بدون نظارت](https://wikipedia.org/wiki/Unsupervised_learning) است که فرض می‌کند یک مجموعه داده برچسب‌گذاری نشده است یا ورودی‌های آن با خروجی‌های از پیش تعریف‌شده مطابقت ندارند. این روش از الگوریتم‌های مختلفی استفاده می‌کند تا داده‌های بدون برچسب را مرتب کرده و بر اساس الگوهایی که در داده‌ها تشخیص می‌دهد، گروه‌بندی‌هایی ارائه دهد.\n",
"\n",
"[**آزمون پیش از درس**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **مقدمه**\n",
"\n",
"[خوشه‌بندی](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) برای کاوش داده‌ها بسیار مفید است. بیایید ببینیم آیا می‌تواند به کشف روندها و الگوها در نحوه مصرف موسیقی توسط مخاطبان نیجریه‌ای کمک کند یا خیر.\n",
"\n",
"> ✅ یک دقیقه وقت بگذارید و به کاربردهای خوشه‌بندی فکر کنید. در زندگی روزمره، خوشه‌بندی زمانی اتفاق می‌افتد که شما یک توده لباس دارید و باید لباس‌های اعضای خانواده‌تان را جدا کنید 🧦👕👖🩲. در علم داده، خوشه‌بندی زمانی اتفاق می‌افتد که بخواهید ترجیحات یک کاربر را تحلیل کنید یا ویژگی‌های یک مجموعه داده بدون برچسب را تعیین کنید. خوشه‌بندی به نوعی به ایجاد نظم در میان آشفتگی کمک می‌کند، مثل مرتب کردن کشوی جوراب‌ها.\n",
"\n",
"در محیط حرفه‌ای، خوشه‌بندی می‌تواند برای تعیین مواردی مانند تقسیم‌بندی بازار، مشخص کردن اینکه چه گروه‌های سنی چه کالاهایی را خریداری می‌کنند، استفاده شود. کاربرد دیگر می‌تواند تشخیص ناهنجاری‌ها باشد، مثلاً برای شناسایی تقلب در یک مجموعه داده از تراکنش‌های کارت اعتباری. یا ممکن است از خوشه‌بندی برای شناسایی تومورها در مجموعه‌ای از اسکن‌های پزشکی استفاده کنید.\n",
"\n",
"✅ یک دقیقه فکر کنید که چگونه ممکن است در دنیای واقعی، در بانکداری، تجارت الکترونیک یا محیط کسب‌وکار با خوشه‌بندی مواجه شده باشید.\n",
"\n",
"> 🎓 جالب است بدانید که تحلیل خوشه‌ای در دهه ۱۹۳۰ در حوزه‌های انسان‌شناسی و روان‌شناسی آغاز شد. آیا می‌توانید تصور کنید که چگونه از آن استفاده می‌شده است؟\n",
"\n",
"همچنین می‌توانید از آن برای گروه‌بندی نتایج جستجو استفاده کنید - مثلاً بر اساس لینک‌های خرید، تصاویر یا نظرات. خوشه‌بندی زمانی مفید است که یک مجموعه داده بزرگ دارید که می‌خواهید آن را کاهش دهید و تحلیل دقیق‌تری روی آن انجام دهید، بنابراین این تکنیک می‌تواند برای یادگیری درباره داده‌ها قبل از ساخت مدل‌های دیگر استفاده شود.\n",
"\n",
"✅ وقتی داده‌های شما در خوشه‌ها سازماندهی شد، به آن‌ها یک شناسه خوشه اختصاص می‌دهید. این تکنیک می‌تواند زمانی مفید باشد که بخواهید حریم خصوصی یک مجموعه داده را حفظ کنید؛ به جای استفاده از داده‌های شناسایی‌کننده، می‌توانید به یک نقطه داده با شناسه خوشه آن اشاره کنید. آیا می‌توانید دلایل دیگری برای استفاده از شناسه خوشه به جای عناصر دیگر خوشه برای شناسایی آن تصور کنید؟\n",
"\n",
"### شروع کار با خوشه‌بندی\n",
"\n",
"> 🎓 نحوه ایجاد خوشه‌ها ارتباط زیادی با چگونگی گروه‌بندی نقاط داده دارد. بیایید برخی از واژگان را بررسی کنیم:\n",
">\n",
"> 🎓 ['انتقالی' در مقابل 'استقرایی'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> استنتاج انتقالی از موارد آموزشی مشاهده‌شده که به موارد آزمایشی خاص نگاشت می‌شوند، استخراج می‌شود. استنتاج استقرایی از موارد آموزشی که به قوانین کلی نگاشت می‌شوند و سپس به موارد آزمایشی اعمال می‌شوند، استخراج می‌شود.\n",
">\n",
"> یک مثال: تصور کنید یک مجموعه داده دارید که فقط بخشی از آن برچسب‌گذاری شده است. برخی موارد 'صفحه گرامافون' هستند، برخی 'سی‌دی' و برخی خالی هستند. وظیفه شما این است که برای موارد خالی برچسب تعیین کنید. اگر رویکرد استقرایی را انتخاب کنید، مدلی برای شناسایی 'صفحه گرامافون' و 'سی‌دی' آموزش می‌دهید و این برچسب‌ها را به داده‌های بدون برچسب اعمال می‌کنید. این رویکرد در طبقه‌بندی مواردی که در واقع 'کاست' هستند، مشکل خواهد داشت. اما یک رویکرد انتقالی این داده‌های ناشناخته را مؤثرتر مدیریت می‌کند، زیرا تلاش می‌کند موارد مشابه را گروه‌بندی کرده و سپس به یک گروه برچسب اختصاص دهد. در این حالت، خوشه‌ها ممکن است 'اشیای موسیقی گرد' و 'اشیای موسیقی مربعی' را منعکس کنند.\n",
">\n",
"> 🎓 ['هندسه تخت' در مقابل 'غیرتخت'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> اصطلاحات هندسی تخت و غیرتخت به اندازه‌گیری فاصله بین نقاط با استفاده از روش‌های هندسی 'تخت' ([اقلیدسی](https://wikipedia.org/wiki/Euclidean_geometry)) یا 'غیرتخت' (غیر اقلیدسی) اشاره دارد.\n",
">\n",
"> 'تخت' در این زمینه به هندسه اقلیدسی (که بخشی از آن به عنوان هندسه 'مسطح' آموزش داده می‌شود) اشاره دارد و غیرتخت به هندسه غیر اقلیدسی اشاره دارد. هندسه چه ارتباطی با یادگیری ماشین دارد؟ خب، به عنوان دو حوزه‌ای که ریشه در ریاضیات دارند، باید یک روش مشترک برای اندازه‌گیری فاصله بین نقاط در خوشه‌ها وجود داشته باشد، و این می‌تواند به صورت 'تخت' یا 'غیرتخت' انجام شود، بسته به ماهیت داده‌ها. [فاصله‌های اقلیدسی](https://wikipedia.org/wiki/Euclidean_distance) به عنوان طول یک خط مستقیم بین دو نقطه اندازه‌گیری می‌شوند. [فاصله‌های غیر اقلیدسی](https://wikipedia.org/wiki/Non-Euclidean_geometry) در طول یک منحنی اندازه‌گیری می‌شوند. اگر داده‌های شما، وقتی تجسم می‌شوند، به نظر می‌رسد که روی یک صفحه قرار ندارند، ممکن است نیاز به استفاده از الگوریتم خاصی برای مدیریت آن داشته باشید.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>اینفوگرافیک از داسانی مادیپالی</figcaption>\n",
"\n",
"> 🎓 ['فاصله‌ها'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> خوشه‌ها با ماتریس فاصله خود تعریف می‌شوند، مثلاً فاصله بین نقاط. این فاصله می‌تواند به چند روش اندازه‌گیری شود. خوشه‌های اقلیدسی با میانگین مقادیر نقاط تعریف می‌شوند و یک 'مرکز' یا نقطه مرکزی دارند. فاصله‌ها بر این اساس با فاصله تا آن مرکز اندازه‌گیری می‌شوند. فاصله‌های غیر اقلیدسی به 'کلسترویدها' اشاره دارند، یعنی نقطه‌ای که به سایر نقاط نزدیک‌تر است. کلسترویدها نیز می‌توانند به روش‌های مختلف تعریف شوند.\n",
">\n",
"> 🎓 ['محدودشده'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [خوشه‌بندی محدودشده](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) یادگیری 'نیمه‌نظارت‌شده' را به این روش بدون نظارت معرفی می‌کند. روابط بین نقاط به عنوان 'نمی‌توانند لینک شوند' یا 'باید لینک شوند' علامت‌گذاری می‌شوند، بنابراین برخی قوانین بر مجموعه داده اعمال می‌شوند.\n",
">\n",
"> یک مثال: اگر یک الگوریتم روی مجموعه‌ای از داده‌های بدون برچسب یا نیمه‌برچسب‌گذاری‌شده آزاد شود، خوشه‌هایی که تولید می‌کند ممکن است کیفیت پایینی داشته باشند. در مثال بالا، خوشه‌ها ممکن است 'اشیای موسیقی گرد'، 'اشیای موسیقی مربعی'، 'اشیای مثلثی' و 'کوکی‌ها' را گروه‌بندی کنند. اگر برخی محدودیت‌ها یا قوانینی به الگوریتم داده شود (\"آیتم باید از پلاستیک ساخته شده باشد\"، \"آیتم باید بتواند موسیقی تولید کند\") این می‌تواند به الگوریتم کمک کند تا انتخاب‌های بهتری انجام دهد.\n",
">\n",
"> 🎓 'چگالی'\n",
">\n",
"> داده‌هایی که 'پر سر و صدا' هستند، به عنوان 'چگال' در نظر گرفته می‌شوند. فاصله بین نقاط در هر یک از خوشه‌های آن ممکن است، پس از بررسی، بیشتر یا کمتر چگال باشد، یا 'شلوغ' باشد و بنابراین این داده‌ها نیاز به تحلیل با روش خوشه‌بندی مناسب دارند. [این مقاله](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) تفاوت بین استفاده از خوشه‌بندی K-Means و الگوریتم‌های HDBSCAN برای کاوش یک مجموعه داده پر سر و صدا با چگالی خوشه‌ای نابرابر را نشان می‌دهد.\n",
"\n",
"درک خود را از تکنیک‌های خوشه‌بندی با این [ماژول آموزشی](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) عمیق‌تر کنید.\n",
"\n",
"### **الگوریتم‌های خوشه‌بندی**\n",
"\n",
"بیش از ۱۰۰ الگوریتم خوشه‌بندی وجود دارد و استفاده از آن‌ها به ماهیت داده‌های موجود بستگی دارد. بیایید برخی از مهم‌ترین آن‌ها را بررسی کنیم:\n",
"\n",
"- **خوشه‌بندی سلسله‌مراتبی**. اگر یک شیء بر اساس نزدیکی به یک شیء نزدیک‌تر طبقه‌بندی شود، نه به یک شیء دورتر، خوشه‌ها بر اساس فاصله اعضای آن‌ها از سایر اشیاء تشکیل می‌شوند. خوشه‌بندی سلسله‌مراتبی با ترکیب مکرر دو خوشه مشخص می‌شود.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>اینفوگرافیک از داسانی مادیپالی</figcaption>\n",
"\n",
"- **خوشه‌بندی مرکزگرا**. این الگوریتم محبوب نیاز به انتخاب 'k' یا تعداد خوشه‌هایی دارد که باید تشکیل شوند، و سپس الگوریتم نقطه مرکزی یک خوشه را تعیین کرده و داده‌ها را در اطراف آن نقطه جمع‌آوری می‌کند. [خوشه‌بندی K-means](https://wikipedia.org/wiki/K-means_clustering) نسخه محبوبی از خوشه‌بندی مرکزگرا است که یک مجموعه داده را به K گروه از پیش تعریف‌شده تقسیم می‌کند. مرکز بر اساس میانگین نزدیک‌ترین نقاط تعیین می‌شود، از این رو نام آن گرفته شده است. فاصله مربعی از خوشه به حداقل می‌رسد.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>اینفوگرافیک از داسانی مادیپالی</figcaption>\n",
"\n",
"- **خوشه‌بندی مبتنی بر توزیع**. بر اساس مدل‌سازی آماری، خوشه‌بندی مبتنی بر توزیع بر تعیین احتمال تعلق یک نقطه داده به یک خوشه تمرکز دارد و بر این اساس آن را اختصاص می‌دهد. روش‌های ترکیب گوسی به این نوع تعلق دارند.\n",
"\n",
"- **خوشه‌بندی مبتنی بر چگالی**. نقاط داده بر اساس چگالی آن‌ها یا گروه‌بندی آن‌ها در اطراف یکدیگر به خوشه‌ها اختصاص داده می‌شوند. نقاط داده دور از گروه به عنوان نویز یا نقاط پرت در نظر گرفته می‌شوند. DBSCAN، Mean-shift و OPTICS به این نوع خوشه‌بندی تعلق دارند.\n",
"\n",
"- **خوشه‌بندی مبتنی بر شبکه**. برای مجموعه داده‌های چندبعدی، یک شبکه ایجاد می‌شود و داده‌ها در میان سلول‌های شبکه تقسیم می‌شوند و بدین ترتیب خوشه‌ها ایجاد می‌شوند.\n",
"\n",
"بهترین راه برای یادگیری خوشه‌بندی این است که خودتان آن را امتحان کنید، بنابراین این همان کاری است که در این تمرین انجام خواهید داد.\n",
"\n",
"برای این ماژول به چند بسته نیاز داریم. می‌توانید آن‌ها را با دستور زیر نصب کنید: \n",
"`install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"یا از اسکریپت زیر استفاده کنید تا بررسی کند آیا بسته‌های مورد نیاز برای تکمیل این ماژول را دارید و در صورت کمبود، آن‌ها را برای شما نصب کند.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## تمرین - خوشه‌بندی داده‌های خود\n",
"\n",
"خوشه‌بندی به عنوان یک تکنیک با تصویربرداری مناسب بسیار بهتر عمل می‌کند، بنابراین بیایید با تصویربرداری داده‌های موسیقی خود شروع کنیم. این تمرین به ما کمک می‌کند تصمیم بگیریم کدام روش خوشه‌بندی برای ماهیت این داده‌ها مؤثرتر است.\n",
"\n",
"بیایید با وارد کردن داده‌ها شروع کنیم.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core tidyverse and make it available in your current R session\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# Import the data into a tibble\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
"\r\n",
"# View the first 5 rows of the data set\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"گاهی اوقات ممکن است بخواهیم اطلاعات بیشتری درباره داده‌های خود داشته باشیم. می‌توانیم با استفاده از تابع [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) نگاهی به `داده‌ها` و `ساختار آن‌ها` بیندازیم:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Glimpse into the data set\r\n",
"df %>% \r\n",
" glimpse()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"کار عالی! 💪\n",
"\n",
"می‌توانیم مشاهده کنیم که `glimpse()` تعداد کل سطرها (مشاهدات) و ستون‌ها (متغیرها) را به شما نشان می‌دهد، سپس چند ورودی اول هر متغیر را در یک سطر بعد از نام متغیر نمایش می‌دهد. علاوه بر این، *نوع داده* متغیر بلافاصله بعد از نام هر متغیر داخل `< >` ارائه می‌شود.\n",
"\n",
"`DataExplorer::introduce()` می‌تواند این اطلاعات را به‌صورت مرتب خلاصه کند:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"عالی! ما تازه متوجه شدیم که داده‌های ما هیچ مقدار گمشده‌ای ندارد.\n",
"\n",
"حالا که در این مرحله هستیم، می‌توانیم آمارهای رایج گرایش مرکزی (مثل [میانگین](https://en.wikipedia.org/wiki/Arithmetic_mean) و [میانه](https://en.wikipedia.org/wiki/Median)) و معیارهای پراکندگی (مثل [انحراف معیار](https://en.wikipedia.org/wiki/Standard_deviation)) را با استفاده از `summarytools::descr()` بررسی کنیم.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe common statistics\r\n",
"df %>% \r\n",
" descr(stats = \"common\")\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"بیایید به مقادیر کلی داده‌ها نگاهی بیندازیم. توجه داشته باشید که محبوبیت می‌تواند `0` باشد، که نشان‌دهنده آهنگ‌هایی است که هیچ رتبه‌بندی ندارند. ما به زودی این موارد را حذف خواهیم کرد.\n",
"\n",
"> 🤔 اگر ما با خوشه‌بندی کار می‌کنیم، روشی بدون نظارت که نیازی به داده‌های برچسب‌دار ندارد، چرا این داده‌ها را با برچسب‌ها نشان می‌دهیم؟ در مرحله کاوش داده‌ها، این برچسب‌ها مفید هستند، اما برای عملکرد الگوریتم‌های خوشه‌بندی ضروری نیستند.\n",
"\n",
"### ۱. بررسی ژانرهای محبوب\n",
"\n",
"بیایید جلو برویم و با شمارش تعداد دفعاتی که هر ژانر ظاهر می‌شود، محبوب‌ترین ژانرها 🎶 را پیدا کنیم.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Popular genres\r\n",
"top_genres <- df %>% \r\n",
" count(artist_top_genre, sort = TRUE) %>% \r\n",
"# Encode to categorical and reorder the according to count\r\n",
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
"\r\n",
"# Print the top genres\r\n",
"top_genres\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"این خوب پیش رفت! می‌گویند یک تصویر به اندازه هزار ردیف از یک دیتافریم ارزش دارد (البته هیچ‌کس واقعاً این را نمی‌گوید 😅). اما منظور را که متوجه شدید، درست است؟\n",
"\n",
"یکی از روش‌های نمایش داده‌های دسته‌بندی‌شده (متغیرهای کاراکتری یا فاکتوری) استفاده از نمودارهای میله‌ای است. بیایید یک نمودار میله‌ای از ۱۰ ژانر برتر بسازیم:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Change the default gray theme\r\n",
"theme_set(theme_light())\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"حالا خیلی راحت‌تر می‌توان تشخیص داد که ژانرهای `ناقص` داریم 🧐!\n",
"\n",
"> یک تجسم خوب چیزهایی را به شما نشان می‌دهد که انتظارش را نداشتید، یا سوالات جدیدی درباره داده‌ها ایجاد می‌کند - هادلی ویکهام و گرت گرولموند، [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"توجه کنید، وقتی ژانر برتر به عنوان `ناقص` توصیف می‌شود، به این معنی است که اسپاتیفای آن را طبقه‌بندی نکرده است، پس بیایید از شر آن خلاص شویم.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" filter(artist_top_genre != \"Missing\") %>% \r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"از بررسی اولیه داده‌ها متوجه می‌شویم که سه ژانر برتر در این مجموعه داده غالب هستند. بیایید بر روی `afro dancehall`، `afropop` و `nigerian pop` تمرکز کنیم و همچنین مجموعه داده را فیلتر کنیم تا هر چیزی که مقدار محبوبیت آن 0 است حذف شود (به این معنا که در مجموعه داده با محبوبیت طبقه‌بندی نشده و می‌تواند برای اهداف ما به‌عنوان نویز در نظر گرفته شود):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"nigerian_songs <- df %>% \r\n",
" # Concentrate on top 3 genres\r\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
" # Remove unclassified observations\r\n",
" filter(popularity != 0)\r\n",
"\r\n",
"\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"nigerian_songs %>%\r\n",
" count(artist_top_genre) %>%\r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"بیایید بررسی کنیم که آیا رابطه خطی آشکاری بین متغیرهای عددی در مجموعه داده ما وجود دارد یا خیر. این رابطه به صورت ریاضی با [آمار همبستگی](https://en.wikipedia.org/wiki/Correlation) اندازه‌گیری می‌شود.\n",
"\n",
"آمار همبستگی مقداری بین -1 و 1 است که قدرت یک رابطه را نشان می‌دهد. مقادیر بالاتر از 0 نشان‌دهنده همبستگی *مثبت* هستند (مقادیر بالای یک متغیر معمولاً با مقادیر بالای متغیر دیگر همراه هستند)، در حالی که مقادیر کمتر از 0 نشان‌دهنده همبستگی *منفی* هستند (مقادیر بالای یک متغیر معمولاً با مقادیر پایین متغیر دیگر همراه هستند).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Narrow down to numeric variables and fid correlation\r\n",
"corr_mat <- nigerian_songs %>% \r\n",
" select(where(is.numeric)) %>% \r\n",
" cor()\r\n",
"\r\n",
"# Visualize correlation matrix\r\n",
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"داده‌ها به‌جز بین `energy` و `loudness` ارتباط قوی‌ای ندارند، که منطقی است، زیرا موسیقی بلند معمولاً پرانرژی است. `Popularity` با `release date` همبستگی دارد، که این هم منطقی است، چون آهنگ‌های جدیدتر احتمالاً محبوب‌تر هستند. به نظر می‌رسد طول و انرژی نیز همبستگی دارند.\n",
"\n",
"جالب خواهد بود که ببینیم یک الگوریتم خوشه‌بندی چه برداشتی از این داده‌ها خواهد داشت!\n",
"\n",
"> 🎓 توجه داشته باشید که همبستگی به معنای علیت نیست! ما شواهدی از همبستگی داریم اما هیچ مدرکی برای علیت نداریم. یک [وب‌سایت جالب](https://tylervigen.com/spurious-correlations) تصاویری دارد که این نکته را برجسته می‌کند.\n",
"\n",
"### ۲. بررسی توزیع داده‌ها\n",
"\n",
"بیایید سؤالات دقیق‌تری بپرسیم. آیا ژانرها از نظر قابلیت رقصیدن، بر اساس محبوبیتشان، تفاوت قابل‌توجهی دارند؟ بیایید توزیع داده‌های سه ژانر برتر خود را برای محبوبیت و قابلیت رقصیدن در امتداد یک محور x و y مشخص با استفاده از [نمودارهای چگالی](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) بررسی کنیم.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Perform 2D kernel density estimation\r\n",
"density_estimate_2d <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
" geom_density_2d(bins = 5, size = 1) +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" xlim(-20, 80) +\r\n",
" ylim(0, 1.2)\r\n",
"\r\n",
"# Density plot based on the popularity\r\n",
"density_estimate_pop <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" theme(legend.position = \"none\")\r\n",
"\r\n",
"# Density plot based on the danceability\r\n",
"density_estimate_dance <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
"\r\n",
"\r\n",
"# Patch everything together\r\n",
"library(patchwork)\r\n",
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ما می‌بینیم که دایره‌های هم‌مرکز بدون توجه به ژانر با هم هماهنگ هستند. آیا ممکن است که سلیقه‌های نیجریه‌ای‌ها در سطح خاصی از قابلیت رقص برای این ژانر به هم نزدیک شوند؟\n",
"\n",
"به طور کلی، این سه ژانر از نظر محبوبیت و قابلیت رقص با هم هماهنگ هستند. تعیین خوشه‌ها در این داده‌های کم‌وبیش هماهنگ چالش‌برانگیز خواهد بود. بیایید ببینیم آیا یک نمودار پراکندگی می‌تواند این موضوع را تأیید کند.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# A scatter plot of popularity and danceability\r\n",
"scatter_plot <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
" geom_point(size = 2, alpha = 0.8) +\r\n",
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
"\r\n",
"# Add a touch of interactivity\r\n",
"ggplotly(scatter_plot)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"یک نمودار پراکندگی از همان محور‌ها الگوی مشابهی از همگرایی را نشان می‌دهد.\n",
"\n",
"به طور کلی، برای خوشه‌بندی، می‌توانید از نمودارهای پراکندگی برای نمایش خوشه‌های داده استفاده کنید، بنابراین تسلط بر این نوع بصری‌سازی بسیار مفید است. در درس بعدی، این داده‌های فیلتر شده را گرفته و از خوشه‌بندی k-means استفاده می‌کنیم تا گروه‌هایی را در این داده‌ها کشف کنیم که به شکل جالبی با هم همپوشانی دارند.\n",
"\n",
"## **🚀 چالش**\n",
"\n",
"برای آماده‌سازی درس بعدی، یک نمودار درباره الگوریتم‌های مختلف خوشه‌بندی که ممکن است در محیط تولید کشف و استفاده کنید، تهیه کنید. خوشه‌بندی چه نوع مشکلاتی را سعی دارد حل کند؟\n",
"\n",
"## [**آزمون پس از درس**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **مرور و مطالعه شخصی**\n",
"\n",
"قبل از اینکه الگوریتم‌های خوشه‌بندی را اعمال کنید، همانطور که یاد گرفتیم، بهتر است ماهیت مجموعه داده خود را درک کنید. درباره این موضوع بیشتر بخوانید [اینجا](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"درک خود را از تکنیک‌های خوشه‌بندی عمیق‌تر کنید:\n",
"\n",
"- [آموزش و ارزیابی مدل‌های خوشه‌بندی با استفاده از Tidymodels و دوستان](https://rpubs.com/eR_ic/clustering)\n",
"\n",
"- بردلی بومک و براندون گرینول، [*یادگیری ماشین عملی با R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
"\n",
"## **تکلیف**\n",
"\n",
"[تحقیق درباره سایر بصری‌سازی‌ها برای خوشه‌بندی](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## سپاس از:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) برای ایجاد نسخه اصلی پایتون این ماژول ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) برای خلق تصاویر فوق‌العاده‌ای که مفاهیم یادگیری ماشین را قابل فهم‌تر و آسان‌تر کرده‌اند.\n",
"\n",
"با آرزوی یادگیری خوشایند،\n",
"\n",
"[Eric](https://twitter.com/ericntay)، سفیر دانش‌آموز طلایی Microsoft Learn.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما برای دقت تلاش می‌کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادقتی‌هایی باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما هیچ مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "99c36449cad3708a435f6798cfa39972",
"translation_date": "2025-09-04T02:07:42+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "fa"
}
},
"nbformat": 4,
"nbformat_minor": 1
}