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

499 lines
38 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": [
"## **Нігерійська музика, зібрана зі Spotify - аналіз**\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",
"> 🎓 Цікаво, що аналіз кластерів виник у галузях антропології та психології у 1930-х роках. Як ви думаєте, як його могли використовувати?\n",
"\n",
"Альтернативно, кластеризацію можна використовувати для групування результатів пошуку — за посиланнями на покупки, зображеннями чи відгуками, наприклад. Кластеризація корисна, коли у вас є великий набір даних, який потрібно зменшити і на якому ви хочете провести більш детальний аналіз, тому цей метод можна використовувати для вивчення даних перед створенням інших моделей.\n",
"\n",
"✅ Коли ваші дані організовані у кластери, ви присвоюєте їм ідентифікатор кластеру, і цей метод може бути корисним для збереження конфіденційності набору даних; замість того, щоб посилатися на точку даних за її більш розкриваючими ідентифікаційними даними, ви можете використовувати ідентифікатор кластеру. Чи можете ви придумати інші причини, чому ви б використовували ідентифікатор кластеру замість інших елементів кластеру для його ідентифікації?\n",
"\n",
"### Початок роботи з кластеризацією\n",
"\n",
"> 🎓 Те, як ми створюємо кластери, багато в чому залежить від того, як ми групуємо точки даних у групи. Давайте розберемо деякі терміни:\n",
">\n",
"> 🎓 ['Трансдуктивний' vs. 'індуктивний'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Трансдуктивний висновок базується на спостережуваних навчальних випадках, які відповідають конкретним тестовим випадкам. Індуктивний висновок базується на навчальних випадках, які формують загальні правила, що потім застосовуються до тестових випадків.\n",
">\n",
"> Приклад: Уявіть, що у вас є набір даних, який частково має мітки. Деякі речі — це 'платівки', деякі — 'CD', а деякі — без міток. Ваше завдання — надати мітки для порожніх даних. Якщо ви обираєте індуктивний підхід, ви тренуєте модель, шукаючи 'платівки' і 'CD', і застосовуєте ці мітки до немаркованих даних. Цей підхід матиме труднощі з класифікацією речей, які насправді є 'касетами'. Трансдуктивний підхід, навпаки, ефективніше працює з невідомими даними, оскільки він групує схожі елементи разом і потім застосовує мітку до групи. У цьому випадку кластери можуть відображати 'круглі музичні речі' і 'квадратні музичні речі'.\n",
">\n",
"> 🎓 ['Неплоска' vs. 'плоска' геометрія](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Взята з математичної термінології, неплоска vs. плоска геометрія стосується вимірювання відстаней між точками за допомогою 'плоских' ([евклідових](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",
"\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",
"Існує понад 100 алгоритмів кластеризації, і їх використання залежить від природи даних. Давайте обговоримо деякі основні:\n",
"\n",
"- **Ієрархічна кластеризація**. Якщо об'єкт класифікується за його близькістю до іншого об'єкта, а не до більш віддаленого, кластери формуються на основі відстані між їх членами. Ієрархічна кластеризація характеризується повторним об'єднанням двох кластерів.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Інфографіка від Дасані Мадіпаллі</figcaption>\n",
"\n",
"\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",
"- **Кластеризація на основі розподілу**. Заснована на статистичному моделюванні, кластеризація на основі розподілу зосереджується на визначенні ймовірності того, що точка даних належить кластеру, і відповідно її призначає. Методи гаусівської суміші належать до цього типу.\n",
"\n",
"- **Кластеризація на основі щільності**. Точки даних призначаються кластерам на основі їх щільності, або їх групування навколо одна одної. Точки даних, які знаходяться далеко від групи, вважаються аномаліями або шумом. DBSCAN, Mean-shift і OPTICS належать до цього типу кластеризації.\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",
"### 1. Дослідження популярних жанрів\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",
"Один із способів візуалізувати категоричні дані (змінні типу character або factor) — це використання стовпчикових діаграм. Давайте створимо стовпчикову діаграму для топ-10 жанрів:\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",
"Зверніть увагу, якщо основний жанр описаний як `Відсутній`, це означає, що Spotify не класифікував його, тож давайте позбудемося цього.\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",
"### 2. Дослідження розподілу даних\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-середніх, щоб виявити групи в цих даних, які цікаво перетинаються.\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",
"[Джен Лупер](https://www.twitter.com/jenlooper) за створення оригінальної версії цього модуля на Python ♥️\n",
"\n",
"[`Дасані Мадіпаллі`](https://twitter.com/dasani_decoded) за створення чудових ілюстрацій, які роблять концепції машинного навчання більш зрозумілими та легкими для сприйняття.\n",
"\n",
"Щасливого навчання,\n",
"\n",
"[Ерік](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-04T07:58:25+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "uk"
}
},
"nbformat": 4,
"nbformat_minor": 1
}