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

500 lines
27 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": [
"## **Nigerijská hudba získaná ze Spotify - analýza**\n",
"\n",
"Clustering je typ [neřízeného učení](https://wikipedia.org/wiki/Unsupervised_learning), který předpokládá, že dataset není označený nebo že jeho vstupy nejsou spárovány s předem definovanými výstupy. Používá různé algoritmy k třídění neoznačených dat a poskytuje skupiny podle vzorců, které v datech rozpozná.\n",
"\n",
"[**Kvíz před přednáš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 velmi užitečný pro průzkum dat. Podívejme se, zda nám může pomoci objevit trendy a vzorce ve způsobu, jakým nigerijské publikum konzumuje hudbu.\n",
"\n",
"> ✅ Udělejte si chvíli na zamyšlení nad využitím clusteringu. V reálném životě clustering probíhá například tehdy, když máte hromadu prádla a potřebujete roztřídit oblečení jednotlivých členů rodiny 🧦👕👖🩲. V datové vědě clustering probíhá při analýze preferencí uživatelů nebo při určování charakteristik jakéhokoli neoznačeného datasetu. Clustering tak trochu pomáhá dát chaosu smysl, jako třeba šuplíku na ponožky.\n",
"\n",
"V profesionálním prostředí může být clustering použit například k určení segmentace trhu, k zjištění, jaké věkové skupiny kupují jaké produkty. Dalším využitím může být detekce anomálií, například odhalování podvodů v datasetu transakcí kreditních karet. Nebo můžete clustering použít k určení nádorů v dávce lékařských skenů.\n",
"\n",
"✅ Zamyslete se chvíli nad tím, jak jste se mohli setkat s clusteringem „v divočině“, například v bankovnictví, e-commerce nebo obchodním prostředí.\n",
"\n",
"> 🎓 Zajímavé je, že analýza clusterů vznikla v oborech antropologie a psychologie ve 30. letech 20. století. Dokážete si představit, jak mohla být použita?\n",
"\n",
"Alternativně ji můžete použít ke skupinování výsledků vyhledávání například podle nákupních odkazů, obrázků nebo recenzí. Clustering je užitečný, když máte velký dataset, který chcete zmenšit a na kterém chcete provést podrobnější analýzu, takže tato technika může být použita k poznání dat před vytvořením dalších modelů.\n",
"\n",
"✅ Jakmile jsou vaše data organizována do clusterů, přiřadíte jim ID clusteru, což může být užitečné při zachování soukromí datasetu; místo odkazování na konkrétní data můžete použít ID clusteru. Dokážete si představit další důvody, proč byste odkazovali na ID clusteru místo na jiné prvky clusteru?\n",
"\n",
"### Začínáme s clusteringem\n",
"\n",
"> 🎓 Jak vytváříme clustery, hodně závisí na tom, jak shromažďujeme datové body do skupin. Pojďme si rozebrat některé pojmy:\n",
">\n",
"> 🎓 ['Transduktivní' vs. 'induktivní'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transduktivní inference je odvozena z pozorovaných tréninkových případů, které se mapují na konkrétní testovací případy. Induktivní inference je odvozena z tréninkových případů, které se mapují na obecná pravidla, která jsou teprve poté aplikována na testovací případy.\n",
">\n",
"> Příklad: Představte si, že máte dataset, který je pouze částečně označený. Některé věci jsou „desky“, některé „CD“ a některé jsou prázdné. Vaším úkolem je poskytnout štítky pro prázdné položky. Pokud zvolíte induktivní přístup, vytrénujete model hledající „desky“ a „CD“ a aplikujete tyto štítky na neoznačená data. Tento přístup bude mít problém klasifikovat věci, které jsou ve skutečnosti „kazety“. Transduktivní přístup naopak zvládá tato neznámá data efektivněji, protože pracuje na seskupení podobných položek dohromady a poté aplikuje štítek na skupinu. V tomto případě mohou clustery odrážet „kulaté hudební věci“ a „čtvercové hudební věci“.\n",
">\n",
"> 🎓 ['Neplochá' vs. 'plochá' geometrie](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Odvozeno z matematické terminologie, neplochá vs. plochá geometrie se týká měření vzdáleností mezi body buď „plochými“ ([Euklidovskými](https://wikipedia.org/wiki/Euclidean_geometry)) nebo „neplochými“ (ne-Euklidovskými) geometrickými metodami.\n",
">\n",
"> „Plochá“ v tomto kontextu odkazuje na Euklidovskou geometrii (části z ní se učí jako „rovinná“ geometrie) a neplochá odkazuje na ne-Euklidovskou geometrii. Co má geometrie společného s machine learningem? Jako dvě oblasti, které jsou zakořeněné v matematice, musí existovat společný způsob měření vzdáleností mezi body v clusterech, a to může být provedeno „plochým“ nebo „neplochým“ způsobem, v závislosti na povaze dat. [Euklidovské vzdálenosti](https://wikipedia.org/wiki/Euclidean_distance) se měří jako délka úsečky mezi dvěma body. [Ne-Euklidovské vzdálenosti](https://wikipedia.org/wiki/Non-Euclidean_geometry) se měří podél křivky. Pokud vaše data, vizualizovaná, nevypadají, že existují na rovině, možná budete potřebovat použít specializovaný algoritmus k jejich zpracování.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika od Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Vzdálenosti'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Clustery jsou definovány svou maticí vzdáleností, tj. vzdálenostmi mezi body. Tato vzdálenost může být měřena několika způsoby. Euklidovské clustery jsou definovány průměrem hodnot bodů a obsahují „centroid“ neboli středový bod. Vzdálenosti jsou tedy měřeny podle vzdálenosti k tomuto centroidu. Ne-Euklidovské vzdálenosti odkazují na „clustroidy“, bod nejbližší ostatním bodům. Clustroidy mohou být definovány různými způsoby.\n",
">\n",
"> 🎓 ['Omezený'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Omezený clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) zavádí „polořízené“ učení do této neřízené metody. Vztahy mezi body jsou označeny jako „nelze propojit“ nebo „musí být propojeno“, takže na dataset jsou vynucena určitá pravidla.\n",
">\n",
"> Příklad: Pokud je algoritmus volně spuštěn na dávce neoznačených nebo polo-označených dat, clustery, které vytvoří, mohou být nekvalitní. V příkladu výše mohou clustery seskupovat „kulaté hudební věci“, „čtvercové hudební věci“, „trojúhelníkové věci“ a „sušenky“. Pokud jsou algoritmu dány určité omezení nebo pravidla („položka musí být vyrobena z plastu“, „položka musí být schopna produkovat hudbu“), může to pomoci „omezit“ algoritmus, aby dělal lepší volby.\n",
">\n",
"> 🎓 'Hustota'\n",
">\n",
"> Data, která jsou „šumová“, jsou považována za „hustá“. Vzdálenosti mezi body v každém z jeho clusterů mohou být při zkoumání více či méně husté, nebo „přeplněné“, a proto je třeba tato data analyzovat pomocí vhodné metody clusteringu. [Tento článek](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) ukazuje rozdíl mezi použitím K-Means clusteringu a HDBSCAN algoritmů při zkoumání šumového datasetu s nerovnoměrnou hustotou clusterů.\n",
"\n",
"Prohlubte své znalosti technik clusteringu v tomto [výukovém modulu](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Algoritmy clusteringu**\n",
"\n",
"Existuje více než 100 algoritmů clusteringu a jejich použití závisí na povaze dat. Pojďme si probrat některé hlavní:\n",
"\n",
"- **Hierarchický clustering**. Pokud je objekt klasifikován podle své blízkosti k jinému objektu, spíše než k vzdálenějšímu, clustery se tvoří na základě vzdálenosti jejich členů k ostatním objektům. Hierarchický clustering se vyznačuje opakovaným kombinováním dvou clusterů.\n",
"\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika od Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Centroid clustering**. Tento populární algoritmus vyžaduje volbu „k“, tedy počet clusterů, které se mají vytvořit, po čemž algoritmus určí středový bod clusteru a shromáždí data kolem tohoto bodu. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) je populární verze centroid clusteringu, která rozděluje dataset do předem definovaných K skupin. Střed je určen podle nejbližšího průměru, odtud název. Čtvercová vzdálenost od clusteru je minimalizována.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika od Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Clustering založený na distribuci**. Založený na statistickém modelování, clustering založený na distribuci se zaměřuje na určení pravděpodobnosti, že datový bod patří do clusteru, a jeho následné přiřazení. Metody Gaussovské směsi patří do tohoto typu.\n",
"\n",
"- **Clustering založený na hustotě**. Datové body jsou přiřazeny do clusterů na základě jejich hustoty, tedy jejich seskupení kolem sebe. Datové body vzdálené od skupiny jsou považovány za odlehlé body nebo šum. DBSCAN, Mean-shift a OPTICS patří do tohoto typu clusteringu.\n",
"\n",
"- **Clustering založený na mřížce**. Pro vícerozměrné datasety je vytvořena mřížka a data jsou rozdělena mezi buňky mřížky, čímž se vytvářejí clustery.\n",
"\n",
"Nejlepší způsob, jak se naučit clustering, je vyzkoušet si ho sami, což uděláte v tomto cvičení.\n",
"\n",
"Budeme potřebovat některé balíčky, abychom mohli dokončit tento modul. Můžete je nainstalovat pomocí: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternativně níže uvedený skript zkontroluje, zda máte balíčky potřebné k dokončení tohoto modulu, a nainstaluje je za vás, pokud některé chybí.\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čení - seskupte svá data\n",
"\n",
"Shlukování jako technika je výrazně usnadněno správnou vizualizací, takže začněme vizualizací našich hudebních dat. Toto cvičení nám pomůže rozhodnout, kterou z metod shlukování bychom měli nejefektivněji použít pro povahu těchto dat.\n",
"\n",
"Pojďme rovnou na věc a naimportujme data.\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": [
"Někdy můžeme chtít získat trochu více informací o našich datech. Můžeme se podívat na `data` a `jejich strukturu` pomocí funkce [*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áce!💪\n",
"\n",
"Můžeme si všimnout, že `glimpse()` vám poskytne celkový počet řádků (pozorování) a sloupců (proměnných), poté několik prvních hodnot každé proměnné v řádku za názvem proměnné. Navíc je *datový typ* proměnné uveden ihned za názvem proměnné uvnitř `< >`.\n",
"\n",
"`DataExplorer::introduce()` dokáže tyto informace přehledně shrnout:\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": [
"Skvělé! Právě jsme zjistili, že naše data nemají žádné chybějící hodnoty.\n",
"\n",
"Když už jsme u toho, můžeme prozkoumat běžné statistiky centrální tendence (např. [průměr](https://en.wikipedia.org/wiki/Arithmetic_mean) a [medián](https://en.wikipedia.org/wiki/Median)) a míry rozptylu (např. [směrodatná odchylka](https://en.wikipedia.org/wiki/Standard_deviation)) pomocí `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": [
"Podívejme se na obecné hodnoty dat. Všimněte si, že popularita může být `0`, což ukazuje písně, které nemají žádné hodnocení. Tyto hodnoty brzy odstraníme.\n",
"\n",
"> 🤔 Pokud pracujeme s klastrováním, nesupervizovanou metodou, která nevyžaduje označená data, proč ukazujeme tato data s označeními? Ve fázi průzkumu dat jsou užitečná, ale pro fungování klastrovacích algoritmů nejsou nezbytná.\n",
"\n",
"### 1. Prozkoumejte oblíbené žánry\n",
"\n",
"Pojďme zjistit nejpopulárnější žánry 🎶 tím, že spočítáme, kolikrát se objevují.\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 šlo dobře! Říká se, že obrázek má hodnotu tisíce řádků datového rámce (i když to vlastně nikdo nikdy neříká 😅). Ale chápete, co tím myslím, že?\n",
"\n",
"Jedním ze způsobů, jak vizualizovat kategorická data (znakové nebo faktorové proměnné), je použití sloupcových grafů. Pojďme vytvořit sloupcový graf pro 10 nejlepších žánrů:\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": [
"Teď je mnohem snazší zjistit, že máme `chybějící` žánry 🧐!\n",
"\n",
"> Dobrá vizualizace vám ukáže věci, které jste nečekali, nebo vyvolá nové otázky ohledně dat - Hadley Wickham a Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Poznámka: Když je hlavní žánr označen jako `Chybějící`, znamená to, že ho Spotify nezařadilo, takže se 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 malého průzkumu dat se dozvídáme, že tři nejvýznamnější žánry dominují tomuto datasetu. Zaměřme se na `afro dancehall`, `afropop` a `nigerian pop`, a navíc dataset zfiltrujme tak, aby odstranil vše s hodnotou popularity 0 (což znamená, že nebylo v datasetu klasifikováno s popularitou a pro naše účely to lze považovat za šum):\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": [
"Podívejme se, zda existuje nějaký zjevný lineární vztah mezi číselnými proměnnými v našem datovém souboru. Tento vztah je matematicky kvantifikován pomocí [korelačního koeficientu](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Korelační koeficient je hodnota mezi -1 a 1, která udává sílu vztahu. Hodnoty nad 0 označují *pozitivní* korelaci (vysoké hodnoty jedné proměnné mají tendenci se shodovat s vysokými hodnotami druhé), zatímco hodnoty pod 0 označují *negativní* korelaci (vysoké hodnoty jedné proměnné mají tendenci se shodovat s nízkými hodnotami druhé).\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": [
"Data nejsou silně korelovaná, kromě vztahu mezi `energy` a `loudness`, což dává smysl, protože hlasitá hudba bývá obvykle dost energická. `Popularity` má souvislost s `release date`, což také dává smysl, protože novější skladby jsou pravděpodobně populárnější. Zdá se, že délka a energie mají také určitou korelaci.\n",
"\n",
"Bude zajímavé zjistit, co si s těmito daty poradí algoritmus pro shlukování!\n",
"\n",
"> 🎓 Pamatujte, že korelace neznamená kauzalitu! Máme důkaz o korelaci, ale žádný důkaz o kauzalitě. [Zábavná webová stránka](https://tylervigen.com/spurious-correlations) obsahuje vizualizace, které tento bod zdůrazňují.\n",
"\n",
"### 2. Prozkoumejte rozložení dat\n",
"\n",
"Položme si několik jemnějších otázek. Jsou žánry výrazně odlišné v jejich vnímání tanečnosti na základě jejich popularity? Prozkoumejme rozložení dat našich tří nejlepších žánrů z hlediska popularity a tanečnosti podél dané osy x a y pomocí [hustotních grafů](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í soustředné kruhy, které se shodují, bez ohledu na žánr. Mohlo by to znamenat, že nigerijské preference se sbíhají na určité úrovni tanečnosti pro tento žánr?\n",
"\n",
"Obecně se tyto tři žánry shodují, pokud jde o jejich popularitu a tanečnost. Určení shluků v těchto volně sladěných datech bude výzvou. Podívejme se, zda by to mohl podpořit bodový graf.\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 stejných os ukazuje podobný vzorec konvergence.\n",
"\n",
"Obecně platí, že pro shlukování můžete použít rozptylové grafy k zobrazení shluků dat, takže zvládnutí tohoto typu vizualizace je velmi užitečné. V příští lekci vezmeme tato filtrovaná data a použijeme k-means shlukování k objevení skupin v těchto datech, které se zajímavým způsobem překrývají.\n",
"\n",
"## **🚀 Výzva**\n",
"\n",
"V rámci přípravy na příští lekci vytvořte graf o různých algoritmech pro shlukování, které můžete objevit a použít v produkčním prostředí. Jaké typy problémů se snaží shlukování řešit?\n",
"\n",
"## [**Kvíz po přednášce**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Přehled & Samostudium**\n",
"\n",
"Než začnete aplikovat algoritmy pro shlukování, jak jsme se naučili, je dobré pochopit povahu vašeho datasetu. Přečtěte si více na toto téma [zde](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Prohlubte své znalosti technik shlukování:\n",
"\n",
"- [Trénování a hodnocení modelů shlukování pomocí Tidymodels a dalších nástrojů](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",
"## **Úkol**\n",
"\n",
"[Prozkoumejte další vizualizace pro shlukování](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## DĚKUJEME:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) za vytvoření původní verze tohoto modulu v Pythonu ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) za vytvoření úžasných ilustrací, které usnadňují pochopení konceptů strojového učení.\n",
"\n",
"Šťastné učení,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o co největší přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za závazný zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.\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:48:17+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "cs"
}
},
"nbformat": 4,
"nbformat_minor": 1
}