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

500 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",
"> 🎓 ['Трансдуктивно' наспрам 'индуктивно'](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",
"\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) демонстрира разлику између коришћења К-Меанс кластеризације и ХДБСЦАН алгоритама за истраживање шумног скупа података са неравномерном густином кластера.\n",
"\n",
"Продубите своје разумевање техника кластеризације у овом [Learn модулу](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",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Инфографик од Дасани Мадипалли</figcaption>\n",
"\n",
"\n",
"\n",
"- **Центроидна кластеризација**. Овај популарни алгоритам захтева избор „к“, или броја кластера који треба формирати, након чега алгоритам одређује централну тачку кластера и окупља податке око те тачке. [К-Меанс кластеризација](https://wikipedia.org/wiki/K-means_clustering) је популарна верзија центроидне кластеризације која раздваја скуп података у унапред дефинисане К групе. Центар се одређује најближим просеком, отуда и назив. Квадратна удаљеност од кластера се минимизира.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Инфографик од Дасани Мадипалли</figcaption>\n",
"\n",
"\n",
"\n",
"- **Кластеризација заснована на дистрибуцији**. Заснована на статистичком моделовању, кластеризација заснована на дистрибуцији се фокусира на одређивање вероватноће да тачка података припада кластеру и њено додељивање у складу с тим. Методи Гауссове мешавине припадају овом типу.\n",
"\n",
"- **Кластеризација заснована на густини**. Тачке података се додељују кластерима на основу њихове густине, или њиховог груписања једна око друге. Тачке података далеко од групе се сматрају изузецима или шумом. ДБСЦАН, 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": [
"Ponekad želimo da saznamo malo više informacija o našim podacima. Možemo pogledati `podatke` i `njihovu strukturu` koristeći funkciju [*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",
"Један од начина да визуализујеш категоријске податке (карактери или факторске променљиве) је коришћењем стубичастих графикона. Хајде да направимо стубичасти графикон за топ 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-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",
"[Џен Лупер](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-06T14:13:36+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "sr"
}
},
"nbformat": 4,
"nbformat_minor": 1
}