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

499 lines
27 KiB

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Nigeeria muusika, mis on kogutud Spotifyst - analüüs**\n",
"\n",
"Klasterdamine on [juhendamata õppimise](https://wikipedia.org/wiki/Unsupervised_learning) tüüp, mis eeldab, et andmekogum on märgistamata või et sisendid ei ole seotud eelnevalt määratletud väljunditega. See kasutab erinevaid algoritme, et sorteerida märgistamata andmeid ja luua rühmitusi vastavalt mustritele, mida ta andmetes tuvastab.\n",
"\n",
"[**Eelloengu viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Sissejuhatus**\n",
"\n",
"[Klasterdamine](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) on väga kasulik andmete uurimiseks. Vaatame, kas see aitab avastada trende ja mustreid, kuidas Nigeeria publik muusikat tarbib.\n",
"\n",
"> ✅ Võta hetk, et mõelda klasterdamise kasutusvõimalustele. Igapäevaelus toimub klasterdamine näiteks siis, kui sul on hunnik pesu ja sa pead sorteerima oma pereliikmete riided 🧦👕👖🩲. Andmeteaduses toimub klasterdamine, kui üritatakse analüüsida kasutaja eelistusi või määrata märgistamata andmekogumi omadusi. Klasterdamine aitab teatud mõttes kaosest aru saada, nagu sokisahtli korrastamine.\n",
"\n",
"Professionaalses keskkonnas saab klasterdamist kasutada näiteks turusegmentide määramiseks, et teada saada, millised vanuserühmad ostavad milliseid tooteid. Teine kasutusviis oleks anomaaliate tuvastamine, näiteks pettuste avastamiseks krediitkaarditehingute andmekogumist. Või võib klasterdamist kasutada kasvajate tuvastamiseks meditsiiniliste skaneeringute kogumis.\n",
"\n",
"✅ Mõtle hetkeks, kuidas sa oled klasterdamisega \"päriselus\" kokku puutunud, näiteks panganduses, e-kaubanduses või ärikeskkonnas.\n",
"\n",
"> 🎓 Huvitaval kombel pärineb klasteranalüüs antropoloogia ja psühholoogia valdkondadest 1930ndatel. Kujuta ette, kuidas seda võidi kasutada?\n",
"\n",
"Teise võimalusena võiks seda kasutada otsingutulemuste rühmitamiseks - näiteks ostulinkide, piltide või arvustuste järgi. Klasterdamine on kasulik, kui sul on suur andmekogum, mida soovid vähendada ja millele soovid teha täpsemat analüüsi, nii et seda tehnikat saab kasutada andmete tundmaõppimiseks enne teiste mudelite loomist.\n",
"\n",
"✅ Kui su andmed on klastritesse organiseeritud, määrad neile klaster-ID. See tehnika võib olla kasulik andmekogumi privaatsuse säilitamisel; selle asemel, et viidata andmepunktile paljastavate identifitseerivate andmete kaudu, viitad sellele klaster-ID abil. Kas oskad mõelda teistele põhjustele, miks võiksid klaster-ID-d kasutada klastrite elementide asemel nende tuvastamiseks?\n",
"\n",
"### Klasterdamise alustamine\n",
"\n",
"> 🎓 Kuidas me klastreid loome, sõltub suuresti sellest, kuidas me andmepunkte rühmadesse kogume. Vaatame mõningaid termineid:\n",
">\n",
"> 🎓 ['Transduktsioon' vs. 'induktsioon'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transduktsiooniline järeldamine tuleneb täheldatud treeningjuhtudest, mis kaarduvad konkreetsetele testjuhtudele. Induktsiooniline järeldamine tuleneb treeningjuhtudest, mis kaarduvad üldistele reeglitele, mida seejärel rakendatakse testjuhtudele.\n",
">\n",
"> Näide: Kujuta ette, et sul on andmekogum, mis on ainult osaliselt märgistatud. Mõned asjad on \"plaadid\", mõned \"CD-d\" ja mõned on tühjad. Sinu ülesanne on anda tühjadele märgised. Kui valid induktiivse lähenemise, treenid mudelit otsima \"plaate\" ja \"CD-sid\" ning rakendad need märgised märgistamata andmetele. See lähenemine võib raskustes olla asjade klassifitseerimisega, mis tegelikult on \"kassettid\". Transduktsiooniline lähenemine, teiselt poolt, käsitleb tundmatuid andmeid tõhusamalt, kuna see töötab sarnaste esemete rühmitamisega ja rakendab seejärel rühmale märgise. Sel juhul võivad klastrid kajastada \"ümmargusi muusikaesemeid\" ja \"ruudukujulisi muusikaesemeid\".\n",
">\n",
"> 🎓 ['Mitte-tasapinnaline' vs. 'tasapinnaline' geomeetria](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Matemaatilisest terminoloogiast tuletatud mitte-tasapinnaline vs. tasapinnaline geomeetria viitab punktidevaheliste vahemaade mõõtmisele kas \"tasapinnaliste\" ([Eukleidese](https://wikipedia.org/wiki/Euclidean_geometry)) või \"mitte-tasapinnaliste\" (mitte-Eukleidese) geomeetriliste meetoditega.\n",
">\n",
"> \"Tasapinnaline\" viitab siin Eukleidese geomeetriale (mida osaliselt õpetatakse \"tasapinnageomeetria\" nime all) ja mitte-tasapinnaline viitab mitte-Eukleidese geomeetriale. Mis on geomeetrial pistmist masinõppega? Noh, kuna mõlemad valdkonnad põhinevad matemaatikal, peab olema ühine viis punktidevaheliste vahemaade mõõtmiseks klastrites, ja seda saab teha \"tasapinnaliselt\" või \"mitte-tasapinnaliselt\", sõltuvalt andmete olemusest. [Eukleidese vahemaad](https://wikipedia.org/wiki/Euclidean_distance) mõõdetakse kui sirgjoone pikkust kahe punkti vahel. [Mitte-Eukleidese vahemaad](https://wikipedia.org/wiki/Non-Euclidean_geometry) mõõdetakse mööda kõverat. Kui su andmed, visualiseerituna, ei eksisteeri tasapinnal, võib vaja minna spetsiaalset algoritmi nende käsitlemiseks.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/flat-nonflat.d1c8c6e2a96110c1.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>Infograafik: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Vahemaad'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Klastrid määratletakse nende vahemaade maatriksi järgi, näiteks punktidevaheliste vahemaade järgi. Seda vahemaad saab mõõta mitmel viisil. Eukleidese klastrid määratletakse punktiväärtuste keskmise järgi ja sisaldavad \"tsentroidi\" ehk keskpunkti. Vahemaad mõõdetakse seega tsentroidi kauguse järgi. Mitte-Eukleidese vahemaad viitavad \"klastroididele\", punktile, mis on kõige lähemal teistele punktidele. Klastroidid omakorda saab määratleda mitmel viisil.\n",
">\n",
"> 🎓 ['Piiratud'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Piiratud klasterdamine](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) toob \"pooljuhendatud\" õppimise sellesse juhendamata meetodisse. Punktidevahelised suhted märgitakse kui \"ei saa linkida\" või \"peab linkima\", nii et andmekogumile kehtestatakse mõned reeglid.\n",
">\n",
"> Näide: Kui algoritm lastakse vabaks märgistamata või osaliselt märgistatud andmetel, võivad selle loodud klastrid olla kehva kvaliteediga. Ülaltoodud näites võivad klastrid rühmitada \"ümmargused muusikaesemed\", \"ruudukujulised muusikaesemed\", \"kolmnurksed esemed\" ja \"küpsised\". Kui algoritmile antakse mõned piirangud või reeglid, mida järgida (\"ese peab olema plastikust\", \"ese peab suutma muusikat toota\"), võib see aidata algoritmil teha paremaid valikuid.\n",
">\n",
"> 🎓 'Tihedus'\n",
">\n",
"> Andmeid, mis on \"mürarikkad\", peetakse \"tihedaks\". Punktidevahelised vahemaad igas klastris võivad osutuda, uurimisel, rohkem või vähem tihedaks ehk \"rahvarohkeks\", ja seega tuleb neid andmeid analüüsida sobiva klasterdamismeetodiga. [See artikkel](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) näitab erinevust K-Means klasterdamise ja HDBSCAN algoritmide kasutamise vahel mürarikka andmekogumi uurimiseks, mille klastrite tihedus on ebaühtlane.\n",
"\n",
"Süvene klasterdamistehnikate mõistmisse selles [õppemoodulis](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Klasterdamise algoritmid**\n",
"\n",
"Klasterdamise algoritme on üle 100, ja nende kasutamine sõltub käsitletavate andmete olemusest. Vaatame mõningaid peamisi:\n",
"\n",
"- **Hierarhiline klasterdamine**. Kui objekti klassifitseeritakse selle läheduse järgi lähedalasuvale objektile, mitte kaugemal olevale, moodustatakse klastrid nende liikmete vahemaade põhjal teiste objektidega. Hierarhilist klasterdamist iseloomustab kahe klastri korduv ühendamine.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/hierarchical.bf59403aa43c8c47.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>Infograafik: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Tsentroidi klasterdamine**. See populaarne algoritm nõuab \"k\" ehk moodustatavate klastrite arvu valimist, mille järel algoritm määrab klastri keskpunkti ja kogub andmeid selle punkti ümber. [K-means klasterdamine](https://wikipedia.org/wiki/K-means_clustering) on populaarne tsentroidi klasterdamise versioon, mis jagab andmekogumi eelnevalt määratletud K gruppi. Keskpunkt määratakse lähima keskmise järgi, seega nimi. Klastri ruutkaugus minimeeritakse.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/et/centroid.097fde836cf6c918.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>Infograafik: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Jaotuspõhine klasterdamine**. Statistilisel modelleerimisel põhinev jaotuspõhine klasterdamine keskendub tõenäosuse määramisele, et andmepunkt kuulub klastrisse, ja määrab selle vastavalt. Gaussi segumeetodid kuuluvad sellesse tüüpi.\n",
"\n",
"- **Tiheduspõhine klasterdamine**. Andmepunktid määratakse klastritesse nende tiheduse ehk nende rühmituse järgi üksteise ümber. Andmepunktid, mis on grupist kaugel, loetakse kõrvalekalleteks või müraks. DBSCAN, Mean-shift ja OPTICS kuuluvad sellesse tüüpi klasterdamisse.\n",
"\n",
"- **Võrgupõhine klasterdamine**. Mitmemõõtmeliste andmekogumite jaoks luuakse võrk ja andmed jagatakse võrgu lahtrite vahel, luues seeläbi klastrid.\n",
"\n",
"Parim viis klasterdamise õppimiseks on seda ise proovida, ja just seda sa selles harjutuses teed.\n",
"\n",
"Me vajame mõningaid pakette, et selle mooduli edukalt läbida. Sa saad need installida järgmiselt: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternatiivselt kontrollib allolev skript, kas sul on vajalikud paketid selle mooduli läbimiseks, ja installib need sinu jaoks, kui mõni neist puudub.\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": [
"## Harjutus - rühmitage oma andmed\n",
"\n",
"Rühmitamine kui tehnika saab suuresti kasu korralikust visualiseerimisest, seega alustame oma muusikaandmete visualiseerimisega. See harjutus aitab meil otsustada, millist rühmitamise meetodit oleks kõige tõhusam kasutada selle andmete olemuse jaoks.\n",
"\n",
"Alustame kohe andmete importimisega.\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": [
"Mõnikord võib meil olla soov saada oma andmete kohta veidi rohkem teavet. Saame vaadata `andmeid` ja `nende struktuuri`, kasutades funktsiooni [*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": [
"Hea töö!💪\n",
"\n",
"Võime täheldada, et `glimpse()` näitab sulle ridade (vaatluste) ja veergude (muutujate) koguarvu ning seejärel iga muutuja esimesi kirjeid reas pärast muutuja nime. Lisaks on muutuja *andmetüüp* kohe pärast muutuja nime sees `< >`.\n",
"\n",
"`DataExplorer::introduce()` suudab selle teabe kenasti kokku võtta:\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": [
"Vinge! Me just saime teada, et meie andmetes pole puuduvaid väärtusi.\n",
"\n",
"Kuna oleme juba teemaga seotud, saame uurida levinud keskväärtuse statistikat (nt [keskmine](https://en.wikipedia.org/wiki/Arithmetic_mean) ja [mediaan](https://en.wikipedia.org/wiki/Median)) ning hajuvusmõõdikuid (nt [standardhälve](https://en.wikipedia.org/wiki/Standard_deviation)) kasutades `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": [
"Vaatame andmete üldisi väärtusi. Pange tähele, et populaarsus võib olla `0`, mis näitab laule, millel pole edetabelikohta. Eemaldame need peagi.\n",
"\n",
"> 🤔 Kui me tegeleme klasterdamisega, mis on juhendamata meetod ja ei vaja märgistatud andmeid, siis miks me näitame neid andmeid koos siltidega? Andmete uurimise faasis on need kasulikud, kuid klasterdamise algoritmid ei vaja neid toimimiseks.\n",
"\n",
"### 1. Uurime populaarseid žanreid\n",
"\n",
"Lähme edasi ja uurime, millised on kõige populaarsemad žanrid 🎶, tehes loenduse, kui sageli need esinevad.\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": [
"See läks hästi! Öeldakse, et pilt on väärt tuhat andmeraami rida (tegelikult ei ütle seda keegi kunagi 😅). Aga sa saad aru, eks?\n",
"\n",
"Üks viis kategoriseeritud andmete (tähestringi või faktori muutujate) visualiseerimiseks on kasutada tulpdiagramme. Teeme tulpdiagrammi 10 populaarseima žanri kohta:\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üüd on palju lihtsam tuvastada, et meil on `puuduvad` žanrid 🧐!\n",
"\n",
"> Hea visualiseerimine näitab asju, mida sa ei oodanud, või tekitab uusi küsimusi andmete kohta - Hadley Wickham ja Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Pane tähele, kui peamine žanr on kirjeldatud kui `Puudub`, tähendab see, et Spotify ei klassifitseerinud seda, seega eemaldame selle.\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": [
"Väikesest andmete uurimisest selgub, et kolm populaarseimat žanrit domineerivad seda andmekogumit. Keskendume `afro dancehall`, `afropop` ja `nigerian pop` žanritele ning filtreerime andmekogumi, et eemaldada kõik, mille populaarsuse väärtus on 0 (mis tähendab, et neid ei klassifitseeritud andmekogumis populaarsuse järgi ja neid võib meie eesmärkide jaoks pidada müra):\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": [
"Vaatame, kas meie andmestikus on ilmne lineaarne seos numbriliste muutujate vahel. Seda seost mõõdetakse matemaatiliselt [korrelatsioonistatistikaga](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Korrelatsioonistatistika on väärtus vahemikus -1 kuni 1, mis näitab seose tugevust. Väärtused üle 0 viitavad *positiivsele* korrelatsioonile (kõrged ühe muutuja väärtused kipuvad esinema koos kõrgete teise muutuja väärtustega), samas kui väärtused alla 0 viitavad *negatiivsele* korrelatsioonile (kõrged ühe muutuja väärtused kipuvad esinema koos madalate teise muutuja väärtustega).\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": [
"Andmed ei ole tugevas korrelatsioonis, välja arvatud `energy` ja `loudness` vahel, mis on loogiline, kuna vali muusika on tavaliselt üsna energiline. `Popularity` on seotud `release date`-iga, mis on samuti mõistetav, kuna uuemad laulud on tõenäoliselt populaarsemad. Ka pikkusel ja energial näib olevat korrelatsioon.\n",
"\n",
"Huvitav oleks näha, mida klasterdamise algoritm nende andmetega teha suudab!\n",
"\n",
"> 🎓 Pange tähele, et korrelatsioon ei tähenda põhjuslikkust! Meil on tõendid korrelatsiooni kohta, kuid mitte põhjuslikkuse kohta. Üks [naljakas veebisait](https://tylervigen.com/spurious-correlations) pakub visuaale, mis seda punkti rõhutavad.\n",
"\n",
"### 2. Uurime andmete jaotust\n",
"\n",
"Esitame mõned peenemad küsimused. Kas žanrid erinevad oluliselt oma tantsitavuse tajumise osas, lähtudes nende populaarsusest? Uurime oma kolme populaarseima žanri andmete jaotust populaarsuse ja tantsitavuse osas mööda antud x- ja y-telge, kasutades [tihedusgraafikuid](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": [
"Me näeme, et on kontsentrilised ringid, mis sobivad kokku sõltumata žanrist. Kas võib olla, et nigeerlaste maitse eelistused koonduvad teatud tasemel tantsitavuse juurde selles žanris?\n",
"\n",
"Üldiselt on need kolm žanrit populaarsuse ja tantsitavuse osas sarnased. Klastrite määramine selles lõdvalt joondatud andmestikus saab olema väljakutse. Vaatame, kas hajuvusdiagramm suudab seda toetada.\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": [
"Hajuvälja diagram samadel telgedel näitab sarnast koondumismustrit.\n",
"\n",
"Üldiselt saab klasterdamise jaoks kasutada hajuvälja diagramme, et näidata andmeklastrite jaotust, seega on selle visualiseerimisviisi valdamine väga kasulik. Järgmises õppetunnis võtame selle filtreeritud andmestiku ja kasutame k-means klasterdamist, et avastada selles andmestikus gruppe, mis huvitaval viisil kattuvad.\n",
"\n",
"## **🚀 Väljakutse**\n",
"\n",
"Valmistudes järgmiseks õppetunniks, loo diagramm erinevatest klasterdamise algoritmidest, mida võid avastada ja kasutada tootmiskeskkonnas. Milliseid probleeme püüab klasterdamine lahendada?\n",
"\n",
"## [**Loengu järgne viktoriin**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Ülevaade ja iseseisev õppimine**\n",
"\n",
"Enne klasterdamise algoritmide rakendamist, nagu oleme õppinud, on hea mõte mõista oma andmestiku olemust. Loe selle teema kohta rohkem [siit](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n",
"\n",
"Süvenda oma arusaamist klasterdamise tehnikatest:\n",
"\n",
"- [Treeni ja hinda klasterdamise mudeleid kasutades Tidymodels ja teisi tööriistu](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",
"## **Ülesanne**\n",
"\n",
"[Uuri teisi visualiseerimisviise klasterdamise jaoks](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## TÄNUD:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) originaalse Python-versiooni loomise eest ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) suurepäraste illustratsioonide loomise eest, mis muudavad masinõppe kontseptsioonid arusaadavamaks ja lihtsamini mõistetavaks.\n",
"\n",
"Head õppimist,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Lahtiütlus**: \nSee dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.\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-10-11T12:41:33+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "et"
}
},
"nbformat": 4,
"nbformat_minor": 1
}