{ "cells": [ { "cell_type": "markdown", "source": [ "## **Nigerijská hudba zozbieraná zo Spotify - analýza**\n", "\n", "Clustering je typ [neučenej metódy](https://wikipedia.org/wiki/Unsupervised_learning), ktorá predpokladá, že dataset nie je označený alebo že jeho vstupy nie sú spojené s preddefinovanými výstupmi. Používa rôzne algoritmy na triedenie neoznačených dát a poskytuje skupiny podľa vzorov, ktoré rozpozná v dátach.\n", "\n", "[**Kvíz pred prednáškou**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **Úvod**\n", "\n", "[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) je veľmi užitočný na prieskum dát. Pozrime sa, či nám môže pomôcť objaviť trendy a vzory v tom, ako nigérijské publikum konzumuje hudbu.\n", "\n", "> ✅ Zamyslite sa na chvíľu nad využitím clusteringu. V reálnom živote clustering nastáva vždy, keď máte kopu bielizne a potrebujete roztriediť oblečenie členov rodiny 🧦👕👖🩲. V dátovej vede clustering nastáva pri analýze preferencií používateľov alebo pri určovaní charakteristík akéhokoľvek neoznačeného datasetu. Clustering pomáha urobiť poriadok v chaose, ako napríklad v zásuvke na ponožky.\n", "\n", "V profesionálnom prostredí sa clustering môže použiť na určenie vecí, ako je segmentácia trhu, napríklad na zistenie, ktoré vekové skupiny kupujú aké produkty. Ďalším využitím by mohlo byť odhaľovanie anomálií, napríklad na detekciu podvodov v datasete transakcií kreditných kariet. Alebo by ste mohli použiť clustering na identifikáciu nádorov v dávke medicínskych skenov.\n", "\n", "✅ Zamyslite sa na chvíľu nad tým, ako ste sa mohli stretnúť s clusteringom „v divočine“, napríklad v bankovníctve, e-commerce alebo podnikateľskom prostredí.\n", "\n", "> 🎓 Zaujímavé je, že analýza klastrov vznikla v oblasti antropológie a psychológie v 30. rokoch 20. storočia. Dokážete si predstaviť, ako mohla byť použitá?\n", "\n", "Alternatívne by ste ju mohli použiť na zoskupovanie výsledkov vyhľadávania – napríklad podľa nákupných odkazov, obrázkov alebo recenzií. Clustering je užitočný, keď máte veľký dataset, ktorý chcete zmenšiť a na ktorom chcete vykonať podrobnejšiu analýzu, takže táto technika môže byť použitá na získanie informácií o dátach pred vytvorením iných modelov.\n", "\n", "✅ Keď sú vaše dáta organizované v klastroch, priradíte im identifikátor klastru. Táto technika môže byť užitočná pri zachovaní súkromia datasetu; namiesto toho môžete odkazovať na dátový bod podľa jeho identifikátora klastru, namiesto odhaľovania identifikovateľných údajov. Dokážete si predstaviť ďalšie dôvody, prečo by ste odkazovali na identifikátor klastru namiesto iných prvkov klastru na jeho identifikáciu?\n", "\n", "### Začíname s clusteringom\n", "\n", "> 🎓 Spôsob, akým vytvárame klastre, má veľa spoločného s tým, ako zhromažďujeme dátové body do skupín. Poďme si rozobrať niektoré pojmy:\n", ">\n", "> 🎓 ['Transduktívny' vs. 'induktívny'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> Transduktívna inferencia je odvodená z pozorovaných tréningových prípadov, ktoré sa mapujú na konkrétne testovacie prípady. Induktívna inferencia je odvodená z tréningových prípadov, ktoré sa mapujú na všeobecné pravidlá, ktoré sa až potom aplikujú na testovacie prípady.\n", ">\n", "> Príklad: Predstavte si, že máte dataset, ktorý je len čiastočne označený. Niektoré veci sú „platne“, niektoré „CD“ a niektoré sú prázdne. Vašou úlohou je poskytnúť označenia pre prázdne miesta. Ak si zvolíte induktívny prístup, trénovali by ste model hľadajúci „platne“ a „CD“ a aplikovali tieto označenia na neoznačené dáta. Tento prístup bude mať problém klasifikovať veci, ktoré sú vlastne „kazety“. Transduktívny prístup na druhej strane efektívnejšie spracováva tieto neznáme dáta, pretože pracuje na zoskupovaní podobných položiek a potom aplikuje označenie na skupinu. V tomto prípade by klastre mohli odrážať „okrúhle hudobné veci“ a „štvorcové hudobné veci“.\n", ">\n", "> 🎓 ['Nerovinná' vs. 'rovinná' geometria](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> Odvodené z matematickej terminológie, nerovinná vs. rovinná geometria sa týka merania vzdialeností medzi bodmi buď „rovinnými“ ([Euklidovskými](https://wikipedia.org/wiki/Euclidean_geometry)) alebo „nerovinnými“ (ne-Euklidovskými) geometrickými metódami.\n", ">\n", "> „Rovinná“ v tomto kontexte odkazuje na Euklidovskú geometriu (časti ktorej sa učia ako „plánová“ geometria) a nerovinná odkazuje na ne-Euklidovskú geometriu. Čo má geometria spoločné s machine learningom? No, ako dve oblasti zakorenené v matematike, musí existovať spoločný spôsob merania vzdialeností medzi bodmi v klastroch, a to sa dá urobiť „rovinným“ alebo „nerovinným“ spôsobom, v závislosti od povahy dát. [Euklidovské vzdialenosti](https://wikipedia.org/wiki/Euclidean_distance) sa merajú ako dĺžka úsečky medzi dvoma bodmi. [Ne-Euklidovské vzdialenosti](https://wikipedia.org/wiki/Non-Euclidean_geometry) sa merajú pozdĺž krivky. Ak vaše dáta, vizualizované, neexistujú na rovine, možno budete potrebovať špecializovaný algoritmus na ich spracovanie.\n", "\n", "

\n", " \n", "

Infografika od Dasani Madipalli
\n", "\n", "\n", "\n", "> 🎓 ['Vzdialenosti'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> Klastre sú definované ich maticou vzdialeností, napr. vzdialenosťami medzi bodmi. Táto vzdialenosť sa dá merať niekoľkými spôsobmi. Euklidovské klastre sú definované priemerom hodnôt bodov a obsahujú „centroid“ alebo stredový bod. Vzdialenosti sa teda merajú podľa vzdialenosti od tohto centroidu. Ne-Euklidovské vzdialenosti odkazujú na „clustroidy“, bod najbližší k ostatným bodom. Clustroidy môžu byť definované rôznymi spôsobmi.\n", ">\n", "> 🎓 ['Obmedzené'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> [Obmedzený clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) zavádza „semi-supervised“ učenie do tejto neučenej metódy. Vzťahy medzi bodmi sú označené ako „nemôže byť prepojené“ alebo „musí byť prepojené“, takže na dataset sú aplikované určité pravidlá.\n", ">\n", "> Príklad: Ak je algoritmus voľne aplikovaný na dávku neoznačených alebo čiastočne označených dát, klastre, ktoré vytvorí, môžu byť nekvalitné. V príklade vyššie by klastre mohli zoskupovať „okrúhle hudobné veci“, „štvorcové hudobné veci“, „trojuholníkové veci“ a „sušienky“. Ak by boli dané určité obmedzenia alebo pravidlá („položka musí byť vyrobená z plastu“, „položka musí byť schopná produkovať hudbu“), mohlo by to pomôcť „obmedziť“ algoritmus na lepšie rozhodnutia.\n", ">\n", "> 🎓 'Hustota'\n", ">\n", "> Dáta, ktoré sú „šumové“, sa považujú za „husté“. Vzdialenosti medzi bodmi v každom z jeho klastrov môžu byť pri skúmaní viac alebo menej husté, alebo „preplnené“, a preto tieto dáta potrebujú byť analyzované vhodnou metódou clusteringu. [Tento článok](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonštruje rozdiel medzi použitím K-Means clusteringu a HDBSCAN algoritmov na preskúmanie šumového datasetu s nerovnomernou hustotou klastrov.\n", "\n", "Prehĺbte svoje pochopenie techník clusteringu v tomto [učebnom module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n", "\n", "### **Algoritmy clusteringu**\n", "\n", "Existuje viac ako 100 algoritmov clusteringu a ich použitie závisí od povahy dát. Poďme si prejsť niektoré hlavné:\n", "\n", "- **Hierarchický clustering**. Ak je objekt klasifikovaný podľa jeho blízkosti k blízkemu objektu, namiesto vzdialeného, klastre sa tvoria na základe vzdialenosti členov od ostatných objektov. Hierarchický clustering sa vyznačuje opakovaným spájaním dvoch klastrov.\n", "\n", "

\n", " \n", "

Infografika od Dasani Madipalli
\n", "\n", "\n", "\n", "- **Centroid clustering**. Tento populárny algoritmus vyžaduje výber „k“, alebo počet klastrov, ktoré sa majú vytvoriť, po ktorom algoritmus určí stredový bod klastru a zhromaždí dáta okolo tohto bodu. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) je populárna verzia centroid clusteringu, ktorá rozdeľuje dataset na preddefinované K skupiny. Stred je určený najbližším priemerom, odtiaľ názov. Štvorcová vzdialenosť od klastru je minimalizovaná.\n", "\n", "

\n", " \n", "

Infografika od Dasani Madipalli
\n", "\n", "\n", "\n", "- **Clustering založený na distribúcii**. Založený na štatistickom modelovaní, clustering založený na distribúcii sa sústreďuje na určenie pravdepodobnosti, že dátový bod patrí do klastru, a priradenie ho podľa toho. Metódy Gaussovskej zmesi patria do tohto typu.\n", "\n", "- **Clustering založený na hustote**. Dátové body sú priradené do klastrov na základe ich hustoty, alebo ich zoskupenia okolo seba. Dátové body vzdialené od skupiny sú považované za odľahlé alebo šumové. DBSCAN, Mean-shift a OPTICS patria do tohto typu clusteringu.\n", "\n", "- **Clustering založený na mriežke**. Pre multidimenzionálne datasety sa vytvorí mriežka a dáta sa rozdelia medzi bunky mriežky, čím sa vytvoria klastre.\n", "\n", "Najlepší spôsob, ako sa naučiť o clusteringu, je vyskúšať si ho sami, a presne to urobíte v tomto cvičení.\n", "\n", "Budeme potrebovať niektoré balíčky na dokončenie tohto modulu. Môžete ich nainštalovať pomocou: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "Alternatívne, skript nižšie skontroluje, či máte balíčky potrebné na dokončenie tohto modulu, a nainštaluje ich za vás, ak niektoré chýbajú.\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": [ "## Cvičenie - zoskupte svoje údaje\n", "\n", "Zoskupovanie ako technika je výrazne podporené správnou vizualizáciou, takže začnime vizualizáciou našich hudobných údajov. Toto cvičenie nám pomôže rozhodnúť, ktorý z metód zoskupovania by sme mali najefektívnejšie použiť vzhľadom na povahu týchto údajov.\n", "\n", "Začnime hneď tým, že importujeme údaje.\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": [ "Niekedy môžeme chcieť získať trochu viac informácií o našich údajoch. Môžeme sa pozrieť na `údaje` a `ich štruktúru` pomocou funkcie [*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": [ "Dobrá práca!💪\n", "\n", "Môžeme si všimnúť, že `glimpse()` vám poskytne celkový počet riadkov (pozorovaní) a stĺpcov (premenných), potom prvé záznamy každej premennej v riadku za názvom premennej. Okrem toho sa *dátový typ* premennej zobrazí hneď za názvom premennej vo vnútri `< >`.\n", "\n", "`DataExplorer::introduce()` dokáže túto informáciu prehľadne zhrnúť:\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": [ "Skvelé! Práve sme zistili, že naše údaje nemajú žiadne chýbajúce hodnoty.\n", "\n", "Keď už sme pri tom, môžeme preskúmať bežné štatistiky centrálnej tendencie (napr. [priemer](https://en.wikipedia.org/wiki/Arithmetic_mean) a [medián](https://en.wikipedia.org/wiki/Median)) a miery rozptylu (napr. [štandardná odchýlka](https://en.wikipedia.org/wiki/Standard_deviation)) pomocou `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": [ "Pozrime sa na všeobecné hodnoty údajov. Všimnite si, že popularita môže byť `0`, čo znamená piesne, ktoré nemajú žiadne hodnotenie. Tieto údaje čoskoro odstránime.\n", "\n", "> 🤔 Ak pracujeme s klastrovaním, nesupervidovanou metódou, ktorá nevyžaduje označené údaje, prečo zobrazujeme tieto údaje s označeniami? Počas fázy skúmania údajov sú užitočné, ale pre fungovanie algoritmov klastrovania nie sú nevyhnutné.\n", "\n", "### 1. Preskúmajte populárne žánre\n", "\n", "Poďme zistiť najpopulárnejšie žánre 🎶 tým, že spočítame, koľkokrát sa vyskytujú.\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": [ "To dopadlo dobre! Hovorí sa, že obrázok má hodnotu tisíc riadkov dátového rámca (vlastne to nikto nikdy nehovorí 😅). Ale chápete, čo tým myslím, však?\n", "\n", "Jedným zo spôsobov, ako vizualizovať kategóriálne údaje (znakové alebo faktorové premenné), je použitie stĺpcových grafov. Poďme vytvoriť stĺpcový graf pre top 10 žánrov:\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": [ "Teraz je oveľa jednoduchšie identifikovať, že máme `chýbajúce` žánre 🧐!\n", "\n", "> Dobrá vizualizácia vám ukáže veci, ktoré ste neočakávali, alebo vyvolá nové otázky o údajoch - Hadley Wickham a Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "Poznámka: Keď je najvyšší žáner označený ako `Chýbajúci`, znamená to, že ho Spotify neklasifikoval, takže sa ho zbavme.\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": [ "Z krátkeho prieskumu údajov sme zistili, že tri najpopulárnejšie žánre dominujú tomuto datasetu. Zamerajme sa na `afro dancehall`, `afropop` a `nigerian pop`, a navyše filtrujme dataset tak, aby sme odstránili všetko s hodnotou popularity 0 (čo znamená, že nebolo klasifikované s popularitou v datasete a môže byť považované za šum pre naše účely):\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": [ "Pozrime sa, či existuje nejaký zjavný lineárny vzťah medzi číselnými premennými v našej dátovej sade. Tento vzťah je kvantifikovaný matematicky pomocou [korelačnej štatistiky](https://en.wikipedia.org/wiki/Correlation).\n", "\n", "Korelačná štatistika je hodnota medzi -1 a 1, ktorá naznačuje silu vzťahu. Hodnoty nad 0 indikujú *pozitívnu* koreláciu (vysoké hodnoty jednej premennej majú tendenciu zhodovať sa s vysokými hodnotami druhej), zatiaľ čo hodnoty pod 0 indikujú *negatívnu* koreláciu (vysoké hodnoty jednej premennej majú tendenciu zhodovať sa s nízkymi hodnotami druhej).\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": [ "Údaje nie sú silne korelované, okrem `energy` a `loudness`, čo dáva zmysel, keďže hlasná hudba je zvyčajne dosť energická. `Popularity` má súvislosť s `release date`, čo tiež dáva zmysel, pretože novšie skladby sú pravdepodobne populárnejšie. Zdá sa, že dĺžka a energia majú tiež určitú koreláciu.\n", "\n", "Bude zaujímavé zistiť, čo dokáže algoritmus zhlukovania urobiť s týmito údajmi!\n", "\n", "> 🎓 Upozorňujeme, že korelácia neznamená kauzalitu! Máme dôkaz o korelácii, ale žiadny dôkaz o kauzalite. [Zábavná webová stránka](https://tylervigen.com/spurious-correlations) obsahuje niekoľko vizuálov, ktoré tento bod zdôrazňujú.\n", "\n", "### 2. Preskúmajte distribúciu údajov\n", "\n", "Položme si niekoľko jemnejších otázok. Sú žánre výrazne odlišné v ich vnímaní tanečnosti na základe ich popularity? Preskúmajme distribúciu údajov našich troch najpopulárnejších žánrov z hľadiska popularity a tanečnosti pozdĺž danej osi x a y pomocou [hustotných grafov](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": [ "Vidíme, že existujú sústredené kruhy, ktoré sa zhodujú, bez ohľadu na žáner. Môže to byť tak, že nigerijské chute sa zbiehajú na určitej úrovni tanečnosti pre tento žáner?\n", "\n", "Vo všeobecnosti sa tri žánre zhodujú, pokiaľ ide o ich popularitu a tanečnosť. Určenie klastrov v týchto voľne zarovnaných údajoch bude výzvou. Pozrime sa, či nám rozptylový graf môže v tomto pomôcť.\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": [ "Rozptylový graf rovnakých osí ukazuje podobný vzor konvergencie.\n", "\n", "Vo všeobecnosti môžete pri zhlukovaní použiť rozptylové grafy na zobrazenie zhlukov údajov, takže zvládnutie tohto typu vizualizácie je veľmi užitočné. V ďalšej lekcii použijeme tieto filtrované údaje a metódu k-means na objavenie skupín v týchto údajoch, ktoré sa zaujímavo prekrývajú.\n", "\n", "## **🚀 Výzva**\n", "\n", "V rámci prípravy na ďalšiu lekciu vytvorte graf o rôznych algoritmoch zhlukovania, ktoré môžete objaviť a použiť v produkčnom prostredí. Aké typy problémov sa zhlukovanie snaží riešiť?\n", "\n", "## [**Kvíz po prednáške**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **Prehľad a samostatné štúdium**\n", "\n", "Predtým, než použijete algoritmy zhlukovania, ako sme sa naučili, je dobré pochopiť povahu vášho datasetu. Prečítajte si viac na túto tému [tu](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n", "\n", "Prehĺbte si svoje znalosti o technikách zhlukovania:\n", "\n", "- [Trénovanie a hodnotenie modelov zhlukovania pomocou Tidymodels a priateľov](https://rpubs.com/eR_ic/clustering)\n", "\n", "- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n", "\n", "## **Úloha**\n", "\n", "[Preskúmajte ďalšie vizualizácie pre zhlukovanie](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## POĎAKOVANIE:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) za vytvorenie pôvodnej verzie tohto modulu v Pythone ♥️\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) za vytvorenie úžasných ilustrácií, ktoré robia koncepty strojového učenia zrozumiteľnejšími a ľahšie pochopiteľnými.\n", "\n", "Šťastné učenie,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\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:11:16+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "sk" } }, "nbformat": 4, "nbformat_minor": 1 }