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

499 lines
28 KiB

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Nigériai zene Spotify-ról - egy elemzés**\n",
"\n",
"A klaszterezés a [felügyelet nélküli tanulás](https://wikipedia.org/wiki/Unsupervised_learning) egyik típusa, amely feltételezi, hogy az adathalmaz címkézetlen, vagy hogy a bemenetek nincsenek előre meghatározott kimenetekhez társítva. Különböző algoritmusokat használ arra, hogy átvizsgálja a címkézetlen adatokat, és csoportosításokat hozzon létre az adatokban észlelt minták alapján.\n",
"\n",
"[**Előadás előtti kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Bevezetés**\n",
"\n",
"A [klaszterezés](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) nagyon hasznos az adatok feltárásában. Nézzük meg, hogy segíthet-e trendek és minták felfedezésében a nigériai közönség zenehallgatási szokásai kapcsán.\n",
"\n",
"> ✅ Gondolkodj el egy percre a klaszterezés felhasználási lehetőségein. A való életben klaszterezés történik, amikor van egy halom szennyesed, és szét kell válogatnod a családtagjaid ruháit 🧦👕👖🩲. Az adatkutatásban klaszterezés történik, amikor egy felhasználó preferenciáit elemzed, vagy egy címkézetlen adathalmaz jellemzőit próbálod meghatározni. A klaszterezés segít rendet teremteni a káoszban, mint például egy zoknis fiókban.\n",
"\n",
"A szakmai környezetben a klaszterezés felhasználható például piaci szegmentáció meghatározására, például annak megállapítására, hogy mely korcsoportok vásárolnak bizonyos termékeket. Egy másik felhasználási terület lehet az anomália detektálás, például csalás észlelése egy hitelkártya-tranzakciókat tartalmazó adathalmazban. Vagy használhatod a klaszterezést daganatok azonosítására orvosi vizsgálatok során.\n",
"\n",
"✅ Gondolkodj el egy percre, hogy találkoztál-e már klaszterezéssel a való életben, például banki, e-kereskedelmi vagy üzleti környezetben.\n",
"\n",
"> 🎓 Érdekes módon a klaszterelemzés az antropológia és pszichológia területén jelent meg először az 1930-as években. El tudod képzelni, hogyan használták?\n",
"\n",
"Alternatívaként használhatod keresési eredmények csoportosítására - például vásárlási linkek, képek vagy vélemények alapján. A klaszterezés hasznos, ha van egy nagy adathalmazod, amelyet szeretnél csökkenteni, és amelyen részletesebb elemzést szeretnél végezni, így a technika segíthet az adatok megértésében, mielőtt más modelleket építenél.\n",
"\n",
"✅ Miután az adataid klaszterekbe rendeződtek, hozzárendelhetsz egy klaszterazonosítót, és ez a technika hasznos lehet az adathalmaz adatvédelmének megőrzésében; hivatkozhatsz egy adatpontra a klaszterazonosítója alapján, ahelyett, hogy azonosíthatóbb adatokat használnál. Tudsz más okokat is mondani, hogy miért hivatkoznál egy klaszterazonosítóra a klaszter más elemei helyett?\n",
"\n",
"### Klaszterezés alapjai\n",
"\n",
"> 🎓 Az, hogy hogyan hozunk létre klasztereket, nagyban függ attól, hogyan csoportosítjuk az adatpontokat csoportokba. Nézzük meg néhány alapfogalmat:\n",
">\n",
"> 🎓 ['Transzduktív' vs. 'induktív'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> A transzduktív következtetés megfigyelt tanulási esetekből származik, amelyek konkrét tesztesetekhez kapcsolódnak. Az induktív következtetés tanulási esetekből származik, amelyek általános szabályokat határoznak meg, és ezeket csak később alkalmazzák tesztesetekre.\n",
">\n",
"> Példa: Képzeld el, hogy van egy adathalmazod, amely csak részben van címkézve. Néhány elem 'lemezek', néhány 'cd-k', és néhány üres. A feladatod az üres elemek címkézése. Ha induktív megközelítést választasz, egy modellt tanítasz 'lemezek' és 'cd-k' keresésére, és ezeket a címkéket alkalmazod a címkézetlen adatokra. Ez a megközelítés nehézségekbe ütközhet olyan dolgok osztályozásakor, amelyek valójában 'kazetták'. A transzduktív megközelítés viszont hatékonyabban kezeli az ismeretlen adatokat, mivel hasonló elemeket csoportosít, majd címkét rendel a csoporthoz. Ebben az esetben a klaszterek például 'kerek zenei dolgokat' és 'szögletes zenei dolgokat' tükrözhetnek.\n",
">\n",
"> 🎓 ['Nem sík' vs. 'sík' geometria](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Matematikai terminológiából származik, a nem sík vs. sík geometria az adatpontok közötti távolságok mérésére utal, akár 'sík' ([Euklideszi](https://wikipedia.org/wiki/Euclidean_geometry)), akár 'nem sík' (nem Euklideszi) geometriai módszerekkel.\n",
">\n",
"> 'Sík' ebben az összefüggésben az Euklideszi geometriára utal (amelynek részeit 'síkmértan' néven tanítják), míg a nem sík a nem Euklideszi geometriára utal. Mi köze van a geometriának a gépi tanuláshoz? Nos, mivel mindkét terület matematikai alapokon nyugszik, szükség van egy közös módszerre az adatpontok közötti távolságok mérésére a klaszterekben, és ezt 'sík' vagy 'nem sík' módon lehet megtenni, az adatok természetétől függően. Az [Euklideszi távolságokat](https://wikipedia.org/wiki/Euclidean_distance) két pont közötti szakasz hosszával mérik. A [nem Euklideszi távolságokat](https://wikipedia.org/wiki/Non-Euclidean_geometry) görbe mentén mérik. Ha az adataid, vizualizálva, nem síkban léteznek, akkor speciális algoritmusra lehet szükséged a kezelésükhöz.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Távolságok'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> A klasztereket a távolságmátrixuk határozza meg, például az adatpontok közötti távolságok alapján. Ez a távolság többféleképpen mérhető. Az Euklideszi klasztereket az adatpontok értékeinek átlaga határozza meg, és tartalmaznak egy 'centroidot' vagy középpontot. A távolságokat így a centroidtól való távolság alapján mérik. A nem Euklideszi távolságok 'clustroidokra' utalnak, amelyek a legközelebb állnak más pontokhoz. A clustroidokat különböző módokon lehet meghatározni.\n",
">\n",
"> 🎓 ['Korlátozott'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> A [korlátozott klaszterezés](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) 'félig felügyelt' tanulást vezet be ebbe a felügyelet nélküli módszerbe. Az adatpontok közötti kapcsolatokat 'nem kapcsolható' vagy 'kapcsolható' jelzőkkel látják el, így bizonyos szabályokat kényszerítenek az adathalmazra.\n",
">\n",
"> Példa: Ha egy algoritmust szabadon engedünk egy címkézetlen vagy félig címkézett adathalmazon, az általa létrehozott klaszterek gyenge minőségűek lehetnek. A fenti példában a klaszterek csoportosíthatják a 'kerek zenei dolgokat', 'szögletes zenei dolgokat', 'háromszög alakú dolgokat' és 'sütiket'. Ha bizonyos korlátokat vagy szabályokat adunk meg (\"az elemnek műanyagból kell készülnie\", \"az elemnek zenét kell tudnia produkálni\"), ez segíthet az algoritmusnak jobb döntéseket hozni.\n",
">\n",
"> 🎓 'Sűrűség'\n",
">\n",
"> Az 'zajos' adatokat 'sűrűnek' tekintik. Az egyes klaszterekben lévő pontok közötti távolságok vizsgálatakor kiderülhet, hogy ezek a távolságok többé-kevésbé sűrűek, vagy 'zsúfoltak', és így ezeket az adatokat megfelelő klaszterezési módszerrel kell elemezni. [Ez a cikk](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) bemutatja a különbséget a K-Means klaszterezés és a HDBSCAN algoritmusok használata között egy zajos adathalmaz egyenetlen klasztersűrűségének feltárására.\n",
"\n",
"Mélyítsd el a klaszterezési technikák megértését ebben a [Learn modulban](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Klaszterezési algoritmusok**\n",
"\n",
"Több mint 100 klaszterezési algoritmus létezik, és használatuk az adott adatok természetétől függ. Beszéljünk néhány főbb típusról:\n",
"\n",
"- **Hierarchikus klaszterezés**. Ha egy objektumot a közeli objektumhoz való közelsége alapján osztályoznak, nem pedig egy távolabbihoz, a klaszterek az objektumok egymáshoz való távolsága alapján alakulnak ki. A hierarchikus klaszterezés jellemzője, hogy két klasztert ismételten kombinál.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Centroid klaszterezés**. Ez a népszerű algoritmus megköveteli a 'k', vagyis a létrehozandó klaszterek számának kiválasztását, majd az algoritmus meghatározza a klaszter középpontját, és az adatokat e pont köré gyűjti. A [K-means klaszterezés](https://wikipedia.org/wiki/K-means_clustering) a centroid klaszterezés népszerű változata, amely egy adathalmazt előre meghatározott K csoportokra oszt. A középpontot a legközelebbi átlag határozza meg, innen ered a neve. A klasztertől való négyzetes távolság minimalizálva van.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Eloszlás-alapú klaszterezés**. Statisztikai modellezésen alapul, az eloszlás-alapú klaszterezés középpontjában annak meghatározása áll, hogy egy adatpont milyen valószínűséggel tartozik egy klaszterhez, és ennek megfelelően osztja be. A Gauss-keverék módszerek ehhez a típushoz tartoznak.\n",
"\n",
"- **Sűrűség-alapú klaszterezés**. Az adatpontokat klaszterekhez rendelik azok sűrűsége, vagy egymás körüli csoportosulásuk alapján. Az adatpontokat, amelyek távol vannak a csoporttól, kintlévőknek vagy zajnak tekintik. A DBSCAN, Mean-shift és OPTICS ehhez a típushoz tartoznak.\n",
"\n",
"- **Rács-alapú klaszterezés**. Többdimenziós adathalmazok esetén egy rácsot hoznak létre, és az adatokat a rács cellái között osztják el, így klasztereket hozva létre.\n",
"\n",
"A klaszterezés legjobb módja, ha magad próbálod ki, és pontosan ezt fogod tenni ebben a gyakorlatban.\n",
"\n",
"Néhány csomagra lesz szükségünk ennek a modulnak a teljesítéséhez. Telepítheted őket így: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternatívaként az alábbi szkript ellenőrzi, hogy megvannak-e a szükséges csomagok a modul teljesítéséhez, és telepíti őket, ha hiányoznak.\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": [
"## Feladat - klaszterezd az adataidat\n",
"\n",
"A klaszterezés mint technika jelentősen javítható megfelelő vizualizációval, ezért kezdjük azzal, hogy vizualizáljuk a zenei adatainkat. Ez a gyakorlat segít eldönteni, hogy a klaszterezési módszerek közül melyiket használjuk a leghatékonyabban az adatok természetének megfelelően.\n",
"\n",
"Vágjunk bele, és importáljuk az adatokat.\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éha szeretnénk egy kicsit több információt kapni az adatainkról. Az `adatokat` és `struktúrájukat` megvizsgálhatjuk a [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) függvény segítségével:\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": [
"Szép munka!💪\n",
"\n",
"Láthatjuk, hogy a `glimpse()` megmutatja a sorok (megfigyelések) és oszlopok (változók) teljes számát, majd a változó neve után soronként az első néhány bejegyzést minden változóból. Ezenkívül a változó *adattípusa* közvetlenül a változó neve után jelenik meg `< >` jelek között.\n",
"\n",
"A `DataExplorer::introduce()` szépen összefoglalhatja ezeket az információkat:\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": [
"Szuper! Most tudtuk meg, hogy az adatainkban nincsenek hiányzó értékek.\n",
"\n",
"Amíg itt tartunk, felfedezhetjük a központi tendencia statisztikáit (pl. [átlag](https://en.wikipedia.org/wiki/Arithmetic_mean) és [medián](https://en.wikipedia.org/wiki/Median)), valamint a szórás mértékeit (pl. [szórás](https://en.wikipedia.org/wiki/Standard_deviation)) a `summarytools::descr()` segítségével.\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": [
"Nézzük meg az adatok általános értékeit. Ne feledd, hogy a népszerűség lehet `0`, ami olyan dalokat mutat, amelyeknek nincs rangsorolása. Ezeket hamarosan eltávolítjuk.\n",
"\n",
"> 🤔 Ha klaszterezéssel dolgozunk, egy felügyelet nélküli módszerrel, amely nem igényel címkézett adatokat, miért mutatjuk ezt az adatot címkékkel? Az adatfeltárási szakaszban hasznosak lehetnek, de nem szükségesek a klaszterezési algoritmusok működéséhez.\n",
"\n",
"### 1. Népszerű műfajok feltárása\n",
"\n",
"Nézzük meg, melyek a legnépszerűbb műfajok 🎶, az előfordulások számának összesítésével.\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": [
"Ez jól sikerült! Azt mondják, egy kép többet ér ezer sor adatkeretnél (bár igazából senki sem mond ilyet 😅). De érted, mire gondolok, ugye?\n",
"\n",
"Az egyik módja a kategóriális adatok (karakter vagy faktor változók) megjelenítésének a sávdiagramok használata. Készítsünk egy sávdiagramot a 10 legnépszerűbb műfajról:\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": [
"Most már sokkal könnyebb észrevenni, hogy vannak `hiányzó` műfajaink 🧐!\n",
"\n",
"> Egy jó vizualizáció olyan dolgokat mutat meg, amiket nem vártál, vagy új kérdéseket vet fel az adatokkal kapcsolatban - Hadley Wickham és Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Figyelj, ha a legfelső műfaj `Hiányzó`-ként van megjelölve, az azt jelenti, hogy a Spotify nem sorolta be, szóval szabaduljunk meg tőle.\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": [
"A kis adatfeltárásból megtudjuk, hogy a három legnépszerűbb műfaj uralja ezt az adathalmazt. Koncentráljunk az `afro dancehall`, `afropop` és `nigerian pop` műfajokra, továbbá szűrjük az adathalmazt úgy, hogy eltávolítjuk azokat az elemeket, amelyeknél a népszerűségi érték 0 (ami azt jelenti, hogy az adathalmazban nem kaptak népszerűségi besorolást, és céljaink szempontjából zajnak tekinthetők):\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": [
"Nézzük meg, hogy van-e bármilyen nyilvánvaló lineáris kapcsolat az adataink numerikus változói között. Ezt a kapcsolatot matematikailag a [korrelációs statisztika](https://en.wikipedia.org/wiki/Correlation) méri.\n",
"\n",
"A korrelációs statisztika egy -1 és 1 közötti érték, amely a kapcsolat erősségét jelzi. A 0 feletti értékek *pozitív* korrelációt mutatnak (az egyik változó magas értékei általában a másik változó magas értékeivel járnak együtt), míg a 0 alatti értékek *negatív* korrelációt jeleznek (az egyik változó magas értékei általában a másik változó alacsony értékeivel járnak együtt).\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": [
"Az adatok nem mutatnak erős korrelációt, kivéve az `energy` és a `loudness` között, ami érthető, hiszen a hangos zene általában elég energikus. A `Popularity` kapcsolatban áll a `release date`-tel, ami szintén logikus, mivel a frissebb dalok valószínűleg népszerűbbek. Úgy tűnik, hogy a hossz és az energia között is van némi korreláció.\n",
"\n",
"Érdekes lesz látni, hogy egy klaszterező algoritmus mit tud kihozni ezekből az adatokból!\n",
"\n",
"> 🎓 Ne feledd, hogy a korreláció nem jelent ok-okozati összefüggést! Csak a korrelációt tudjuk bizonyítani, az ok-okozati kapcsolatot nem. Egy [szórakoztató weboldal](https://tylervigen.com/spurious-correlations) vizuális példákkal hangsúlyozza ezt a pontot.\n",
"\n",
"### 2. Az adatok eloszlásának vizsgálata\n",
"\n",
"Tegyük fel magunknak néhány finomabb kérdést. Jelentősen eltérnek-e a műfajok a táncolhatóságuk megítélésében a népszerűségük alapján? Vizsgáljuk meg a három legnépszerűbb műfaj adatainak eloszlását a népszerűség és a táncolhatóság szempontjából egy adott x és y tengely mentén, [sűrűséggrafikonok](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) segítségével.\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": [
"Láthatjuk, hogy koncentrikus körök sorakoznak, függetlenül a műfajtól. Lehetséges, hogy a nigériai ízlés egy bizonyos szinten összefut a táncolhatóság tekintetében ennél a műfajnál?\n",
"\n",
"Általánosságban elmondható, hogy a három műfaj népszerűsége és táncolhatósága szempontjából összhangban van. Kihívást jelent majd klasztereket meghatározni ebben a lazán rendezett adathalmazban. Nézzük meg, hogy egy szórt diagram segíthet-e ebben.\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": [
"Egy scatterplot ugyanazon tengelyekkel hasonló konvergencia mintát mutat.\n",
"\n",
"Általánosságban elmondható, hogy a klaszterezéshez scatterplotokat használhatsz az adatok klasztereinek megjelenítésére, így ennek a vizualizációs technikának a elsajátítása nagyon hasznos. A következő leckében ezt a szűrt adatot fogjuk használni, és k-means klaszterezéssel fedezünk fel olyan csoportokat, amelyek érdekes módon átfedésben vannak.\n",
"\n",
"## **🚀 Kihívás**\n",
"\n",
"A következő lecke előkészítéseként készíts egy diagramot a különböző klaszterezési algoritmusokról, amelyeket felfedezhetsz és használhatsz egy éles környezetben. Milyen problémákat próbál megoldani a klaszterezés?\n",
"\n",
"## [**Utólagos kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Áttekintés és önálló tanulás**\n",
"\n",
"Mielőtt klaszterezési algoritmusokat alkalmaznál, ahogy tanultuk, érdemes megérteni az adathalmazod természetét. Olvass többet erről a témáról [itt](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Mélyítsd el a klaszterezési technikák megértését:\n",
"\n",
"- [Klaszterezési modellek tanítása és értékelése Tidymodels és társai segítségével](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",
"## **Feladat**\n",
"\n",
"[Ismerj meg más vizualizációkat a klaszterezéshez](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## KÖSZÖNET ILLETI:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) az eredeti Python verzió elkészítéséért ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) az elképesztő illusztrációkért, amelyek érthetőbbé és könnyebben megérthetővé teszik a gépi tanulás fogalmait.\n",
"\n",
"Boldog tanulást kíván,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Felelősségkizárás**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális, emberi fordítást igénybe venni. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\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:55:54+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "hu"
}
},
"nbformat": 4,
"nbformat_minor": 1
}