{ "cells": [ { "cell_type": "markdown", "source": [ "## **Nigerijos muzika iš Spotify - analizė**\n", "\n", "Klasterizavimas yra [nesupervizuoto mokymosi](https://wikipedia.org/wiki/Unsupervised_learning) tipas, kuris daro prielaidą, kad duomenų rinkinys yra nepažymėtas arba kad jo įvestys nėra susietos su iš anksto apibrėžtais rezultatais. Jis naudoja įvairius algoritmus, kad išanalizuotų nepažymėtus duomenis ir sudarytų grupes pagal duomenyse pastebėtus modelius.\n", "\n", "[**Prieš paskaitos testas**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **Įvadas**\n", "\n", "[Klasterizavimas](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) yra labai naudingas duomenų tyrinėjimui. Pažiūrėkime, ar jis gali padėti atrasti tendencijas ir modelius, kaip Nigerijos auditorija vartoja muziką.\n", "\n", "> ✅ Skirkite minutę pagalvoti apie klasterizavimo panaudojimą. Kasdieniame gyvenime klasterizavimas vyksta, kai turite skalbinių krūvą ir reikia išrūšiuoti šeimos narių drabužius 🧦👕👖🩲. Duomenų moksle klasterizavimas vyksta analizuojant vartotojo pageidavimus arba nustatant bet kokio nepažymėto duomenų rinkinio charakteristikas. Klasterizavimas tam tikra prasme padeda suprasti chaosą, kaip tvarkant kojinių stalčių.\n", "\n", "Profesinėje aplinkoje klasterizavimas gali būti naudojamas rinkos segmentavimui, pavyzdžiui, nustatant, kokios amžiaus grupės perka tam tikrus daiktus. Kitas panaudojimas galėtų būti anomalijų aptikimas, galbūt siekiant nustatyti sukčiavimą iš kredito kortelių operacijų duomenų rinkinio. Taip pat galite naudoti klasterizavimą, kad nustatytumėte auglius medicininių skenavimų rinkinyje.\n", "\n", "✅ Pagalvokite minutę, kaip galėjote susidurti su klasterizavimu „laukinėje gamtoje“, bankininkystės, e. prekybos ar verslo aplinkoje.\n", "\n", "> 🎓 Įdomu tai, kad klasterių analizė atsirado antropologijos ir psichologijos srityse 1930-aisiais. Ar galite įsivaizduoti, kaip ji galėjo būti naudojama?\n", "\n", "Be to, klasterizavimą galima naudoti grupuojant paieškos rezultatus – pavyzdžiui, pagal apsipirkimo nuorodas, vaizdus ar apžvalgas. Klasterizavimas yra naudingas, kai turite didelį duomenų rinkinį, kurį norite sumažinti ir atlikti detalesnę analizę, todėl ši technika gali būti naudojama norint sužinoti apie duomenis prieš kuriant kitus modelius.\n", "\n", "✅ Kai jūsų duomenys yra suskirstyti į klasterius, galite priskirti jiems klasterio ID, ir ši technika gali būti naudinga išsaugant duomenų rinkinio privatumą; vietoj to galite nurodyti duomenų tašką pagal jo klasterio ID, o ne pagal labiau atskleidžiančius identifikuojamus duomenis. Ar galite sugalvoti kitų priežasčių, kodėl norėtumėte nurodyti klasterio ID, o ne kitus klasterio elementus, kad jį identifikuotumėte?\n", "\n", "### Pradžia su klasterizavimu\n", "\n", "> 🎓 Kaip mes kuriame klasterius, labai priklauso nuo to, kaip surenkame duomenų taškus į grupes. Išsiaiškinkime kai kuriuos terminus:\n", ">\n", "> 🎓 ['Transduktyvus' vs. 'induktyvus'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> Transduktyvi išvada yra gaunama iš stebėtų mokymo atvejų, kurie susiejami su konkrečiais testavimo atvejais. Induktyvi išvada yra gaunama iš mokymo atvejų, kurie susiejami su bendromis taisyklėmis, kurios tik tada taikomos testavimo atvejams.\n", ">\n", "> Pavyzdys: Įsivaizduokite, kad turite duomenų rinkinį, kuris yra tik iš dalies pažymėtas. Kai kurie dalykai yra „įrašai“, kai kurie „CD“, o kai kurie yra tušti. Jūsų užduotis yra suteikti etiketes tuštiems duomenims. Jei pasirinksite induktyvų požiūrį, treniruosite modelį ieškodami „įrašų“ ir „CD“ ir taikysite tas etiketes nepažymėtiems duomenims. Šis požiūris turės sunkumų klasifikuojant dalykus, kurie iš tikrųjų yra „kasetės“. Transduktyvus požiūris, kita vertus, efektyviau tvarko šiuos nežinomus duomenis, nes jis dirba grupuodamas panašius elementus ir tada priskiria etiketę grupei. Šiuo atveju klasteriai gali atspindėti „apvalius muzikinius dalykus“ ir „kvadratinius muzikinius dalykus“.\n", ">\n", "> 🎓 ['Neplokščia' vs. 'plokščia' geometrija](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> Kilusi iš matematinės terminologijos, neplokščia vs. plokščia geometrija reiškia atstumų tarp taškų matavimą naudojant arba „plokščius“ ([Euklidinius](https://wikipedia.org/wiki/Euclidean_geometry)) arba „neplokščius“ (ne-Euklidinius) geometrinius metodus.\n", ">\n", "> „Plokščia“ šiame kontekste reiškia Euklidinę geometriją (dalis kurios mokoma kaip „plokštuminė“ geometrija), o neplokščia reiškia ne-Euklidinę geometriją. Ką geometrija turi bendro su mašininiu mokymusi? Na, kaip dvi matematikos šakos, turi būti bendras būdas matuoti atstumus tarp taškų klasteriuose, ir tai galima padaryti „plokščiu“ arba „neplokščiu“ būdu, priklausomai nuo duomenų pobūdžio. [Euklidiniai atstumai](https://wikipedia.org/wiki/Euclidean_distance) matuojami kaip linijos segmento ilgis tarp dviejų taškų. [Ne-Euklidiniai atstumai](https://wikipedia.org/wiki/Non-Euclidean_geometry) matuojami palei kreivę. Jei jūsų duomenys, vizualizuoti, atrodo, kad neegzistuoja plokštumoje, jums gali prireikti specializuoto algoritmo, kad juos apdorotumėte.\n", "\n", "

\n", " \n", "

Infografikas: Dasani Madipalli
\n", "\n", "\n", "\n", "> 🎓 ['Atstumai'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> Klasteriai apibrėžiami pagal jų atstumų matricą, pvz., atstumus tarp taškų. Šis atstumas gali būti matuojamas keliais būdais. Euklidiniai klasteriai apibrėžiami pagal taškų reikšmių vidurkį ir turi „centroidą“ arba centrinį tašką. Atstumai matuojami pagal atstumą iki to centro. Ne-Euklidiniai atstumai reiškia „klastroidus“, tašką, kuris yra arčiausiai kitų taškų. Klastroidai savo ruožtu gali būti apibrėžiami įvairiais būdais.\n", ">\n", "> 🎓 ['Apribotas'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> [Apribotas klasterizavimas](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) įveda „pusiau prižiūrimą“ mokymąsi į šį nesupervizuotą metodą. Taškų tarpusavio ryšiai pažymimi kaip „negali būti susieti“ arba „turi būti susieti“, todėl duomenų rinkiniui taikomos tam tikros taisyklės.\n", ">\n", "> Pavyzdys: Jei algoritmas paleidžiamas ant nepažymėtų arba pusiau pažymėtų duomenų, klasteriai, kuriuos jis sukuria, gali būti prastos kokybės. Aukščiau pateiktame pavyzdyje klasteriai gali grupuoti „apvalius muzikinius dalykus“, „kvadratinius muzikinius dalykus“, „trikampius dalykus“ ir „sausainius“. Jei pateikiami tam tikri apribojimai arba taisyklės („daiktas turi būti pagamintas iš plastiko“, „daiktas turi galėti groti muziką“), tai gali padėti „apriboti“ algoritmą, kad jis priimtų geresnius sprendimus.\n", ">\n", "> 🎓 'Tankis'\n", ">\n", "> Duomenys, kurie yra „triukšmingi“, laikomi „tankiais“. Atstumai tarp taškų kiekviename klasteryje gali būti, išnagrinėjus, daugiau ar mažiau tankūs, arba „susigrūdę“, todėl šiuos duomenis reikia analizuoti naudojant tinkamą klasterizavimo metodą. [Šiame straipsnyje](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonstruojamas skirtumas tarp K-Means klasterizavimo ir HDBSCAN algoritmų naudojimo triukšmingam duomenų rinkiniui su nevienodu klasterių tankiu tyrinėti.\n", "\n", "Gilinkite savo supratimą apie klasterizavimo technikas šiame [mokymosi modulyje](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n", "\n", "### **Klasterizavimo algoritmai**\n", "\n", "Yra daugiau nei 100 klasterizavimo algoritmų, ir jų naudojimas priklauso nuo turimų duomenų pobūdžio. Aptarkime keletą pagrindinių:\n", "\n", "- **Hierarchinis klasterizavimas**. Jei objektas klasifikuojamas pagal jo artumą prie netoliese esančio objekto, o ne prie tolimesnio, klasteriai formuojami pagal jų narių atstumą iki kitų objektų. Hierarchinis klasterizavimas pasižymi tuo, kad nuolat sujungiami du klasteriai.\n", "\n", "\n", "

\n", " \n", "

Infografikas: Dasani Madipalli
\n", "\n", "\n", "\n", "- **Centroidų klasterizavimas**. Šis populiarus algoritmas reikalauja pasirinkti „k“, arba klasterių skaičių, kurį reikia suformuoti, po to algoritmas nustato klasterio centrinį tašką ir surenka duomenis aplink tą tašką. [K-means klasterizavimas](https://wikipedia.org/wiki/K-means_clustering) yra populiari centroidų klasterizavimo versija, kuri duomenų rinkinį padalija į iš anksto apibrėžtas K grupes. Centras nustatomas pagal artimiausią vidurkį, todėl toks pavadinimas. Kvadratinis atstumas nuo klasterio yra minimalizuojamas.\n", "\n", "

\n", " \n", "

Infografikas: Dasani Madipalli
\n", "\n", "\n", "\n", "- **Paskirstymo pagrindu klasterizavimas**. Remiantis statistiniu modeliavimu, paskirstymo pagrindu klasterizavimas orientuojasi į tikimybės nustatymą, kad duomenų taškas priklauso klasteriui, ir priskiria jį atitinkamai. Gaussų mišinio metodai priklauso šiam tipui.\n", "\n", "- **Tankio pagrindu klasterizavimas**. Duomenų taškai priskiriami klasteriams pagal jų tankį arba grupavimą aplink vienas kitą. Duomenų taškai, esantys toli nuo grupės, laikomi išskirtiniais arba triukšmu. DBSCAN, Mean-shift ir OPTICS priklauso šiam klasterizavimo tipui.\n", "\n", "- **Tinklelio pagrindu klasterizavimas**. Daugiamatėms duomenų rinkiniams sukuriamas tinklelis, o duomenys padalijami tarp tinklelio langelių, taip sukuriant klasterius.\n", "\n", "Geriausias būdas išmokti apie klasterizavimą yra išbandyti jį patiems, todėl tai ir padarysite šiame pratime.\n", "\n", "Norint atlikti šį modulį, reikės tam tikrų paketų. Juos galite įdiegti naudodami: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "Arba galite naudoti žemiau pateiktą scenarijų, kuris patikrina, ar turite reikalingus paketus, ir įdiegia juos, jei kai kurių trūksta.\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": [ "## Pratimas - grupuokite savo duomenis\n", "\n", "Grupavimas kaip technika labai palengvinamas tinkamu vizualizavimu, todėl pradėkime nuo mūsų muzikos duomenų vizualizavimo. Šis pratimas padės nuspręsti, kurį grupavimo metodą efektyviausiai naudoti šių duomenų pobūdžiui.\n", "\n", "Pradėkime nuo duomenų importavimo.\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": [ "Kartais norime gauti šiek tiek daugiau informacijos apie savo duomenis. Galime peržiūrėti `duomenis` ir `jų struktūrą` naudodami [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) funkciją:\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": [ "Puikus darbas! 💪\n", "\n", "Galime pastebėti, kad `glimpse()` parodys bendrą eilučių (stebėjimų) ir stulpelių (kintamųjų) skaičių, o tada – pirmuosius kelis kiekvieno kintamojo įrašus eilutėje po kintamojo pavadinimu. Be to, *duomenų tipas* pateikiamas iškart po kiekvieno kintamojo pavadinimo, viduje `< >`.\n", "\n", "`DataExplorer::introduce()` gali tvarkingai apibendrinti šią informaciją:\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": [ "Puiku! Ką tik sužinojome, kad mūsų duomenyse nėra trūkstamų reikšmių.\n", "\n", "Kol esame prie šios temos, galime išnagrinėti dažniausiai naudojamus centrinės tendencijos statistinius rodiklius (pvz., [vidurkį](https://en.wikipedia.org/wiki/Arithmetic_mean) ir [medianą](https://en.wikipedia.org/wiki/Median)) bei sklaidos matavimo rodiklius (pvz., [standartinį nuokrypį](https://en.wikipedia.org/wiki/Standard_deviation)) naudodami `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": [ "Pažvelkime į bendrąsias duomenų reikšmes. Atkreipkite dėmesį, kad populiarumas gali būti `0`, o tai rodo dainas, neturinčias reitingo. Netrukus jas pašalinsime.\n", "\n", "> 🤔 Jei dirbame su klasterizavimu, neprižiūrimu metodu, kuriam nereikia pažymėtų duomenų, kodėl rodome šiuos duomenis su žymėmis? Duomenų tyrinėjimo etape jie yra naudingi, tačiau klasterizavimo algoritmams veikti jie nėra būtini.\n", "\n", "### 1. Populiarių žanrų tyrinėjimas\n", "\n", "Išsiaiškinkime, kurie žanrai yra populiariausi 🎶, suskaičiuodami, kiek kartų jie pasirodo.\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": [ "Tai pavyko puikiai! Jie sako, kad paveikslėlis vertas tūkstančio eilučių duomenų rėmelio (nors iš tikrųjų niekas taip nesako 😅). Bet esmę supratote, tiesa?\n", "\n", "Vienas iš būdų vizualizuoti kategorinius duomenis (simbolių arba faktorių kintamuosius) yra naudojant stulpelines diagramas. Sukurkime stulpelinę diagramą su 10 populiariausių žanrų:\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": [ "Dabar daug lengviau pastebėti, kad turime `trūkstamų` žanrų 🧐!\n", "\n", "> Gera vizualizacija parodys jums dalykus, kurių nesitikėjote, arba sukels naujų klausimų apie duomenis - Hadley Wickham ir Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "Atkreipkite dėmesį, kai pagrindinis žanras apibūdinamas kaip `Trūkstamas`, tai reiškia, kad Spotify jo nesuklasifikavo, todėl atsikratykime jo.\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": [ "Iš nedidelės duomenų analizės sužinome, kad trys pagrindiniai žanrai dominuoja šiame duomenų rinkinyje. Susitelkime į `afro dancehall`, `afropop` ir `nigerian pop`, papildomai filtruodami duomenų rinkinį, kad pašalintume viską, kas turi 0 populiarumo reikšmę (tai reiškia, kad jie nebuvo klasifikuoti pagal populiarumą duomenų rinkinyje ir mūsų tikslams gali būti laikomi triukšmu):\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": [ "Pažiūrėkime, ar mūsų duomenų rinkinyje yra akivaizdus linijinis ryšys tarp skaitinių kintamųjų. Šis ryšys matematiškai įvertinamas naudojant [koreliacijos statistiką](https://en.wikipedia.org/wiki/Correlation).\n", "\n", "Koreliacijos statistika yra reikšmė tarp -1 ir 1, kuri nurodo ryšio stiprumą. Reikšmės virš 0 rodo *teigiamą* koreliaciją (kai vieno kintamojo aukštos reikšmės dažnai sutampa su kito kintamojo aukštomis reikšmėmis), o reikšmės žemiau 0 rodo *neigiamą* koreliaciją (kai vieno kintamojo aukštos reikšmės dažnai sutampa su kito kintamojo žemomis reikšmėmis).\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": [ "Duomenys nėra stipriai susiję, išskyrus ryšį tarp `energy` ir `loudness`, kas yra logiška, nes garsiai muzika paprastai būna labai energinga. `Popularity` turi ryšį su `release date`, kas taip pat suprantama, nes naujesnės dainos greičiausiai yra populiaresnės. Ilgis ir energija taip pat atrodo turintys tam tikrą koreliaciją.\n", "\n", "Bus įdomu pamatyti, ką klasterizavimo algoritmas gali padaryti su šiais duomenimis!\n", "\n", "> 🎓 Atkreipkite dėmesį, kad koreliacija nereiškia priežastinio ryšio! Turime koreliacijos įrodymą, bet neturime priežastinio ryšio įrodymo. [Linksmas tinklalapis](https://tylervigen.com/spurious-correlations) pateikia vizualizacijas, kurios pabrėžia šį faktą.\n", "\n", "### 2. Duomenų pasiskirstymo tyrimas\n", "\n", "Užduokime keletą subtilesnių klausimų. Ar žanrai reikšmingai skiriasi pagal jų šokamumą, atsižvelgiant į jų populiarumą? Išnagrinėkime mūsų trijų populiariausių žanrų duomenų pasiskirstymą pagal populiarumą ir šokamumą, naudojant [tankio grafikus](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) palei nurodytą x ir y ašį.\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": [ "Matome, kad yra koncentriniai apskritimai, kurie sutampa, nepaisant žanro. Ar gali būti, kad Nigerijos skoniai tam tikru lygiu susilieja dėl šio žanro šokamumo?\n", "\n", "Apskritai, trys žanrai sutampa pagal jų populiarumą ir šokamumą. Nustatyti grupes šiuose laisvai suderintuose duomenyse bus iššūkis. Pažiūrėkime, ar sklaidos diagrama gali tai patvirtinti.\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": [ "Sklaidos diagrama su tais pačiais ašimis rodo panašų konvergencijos modelį.\n", "\n", "Apskritai, klasterizavimui galite naudoti sklaidos diagramas, kad parodytumėte duomenų klasterius, todėl šio vizualizacijos tipo įvaldymas yra labai naudingas. Kitoje pamokoje naudosime šiuos filtruotus duomenis ir taikysime k-vidurkių klasterizavimą, kad atrastume grupes, kurios įdomiai persidengia.\n", "\n", "## **🚀 Iššūkis**\n", "\n", "Ruošiantis kitai pamokai, sudarykite diagramą apie įvairius klasterizavimo algoritmus, kuriuos galite atrasti ir naudoti gamybinėje aplinkoje. Kokias problemas bando spręsti klasterizavimas?\n", "\n", "## [**Po paskaitos testas**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **Apžvalga ir savarankiškas mokymasis**\n", "\n", "Prieš taikydami klasterizavimo algoritmus, kaip jau išmokome, svarbu suprasti savo duomenų rinkinio pobūdį. Daugiau apie tai skaitykite [čia](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n", "\n", "Gilinkite savo supratimą apie klasterizavimo technikas:\n", "\n", "- [Mokykitės ir vertinkite klasterizavimo modelius naudodami Tidymodels ir draugus](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", "## **Užduotis**\n", "\n", "[Pasidomėkite kitomis vizualizacijomis, skirtomis klasterizavimui](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## AČIŪ:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) už originalios šio modulio Python versijos sukūrimą ♥️\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) už nuostabias iliustracijas, kurios padeda geriau suprasti mašininio mokymosi koncepcijas ir jas padaro lengviau įsisavinamas.\n", "\n", "Sėkmingo mokymosi,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.\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-03T20:04:37+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "lt" } }, "nbformat": 4, "nbformat_minor": 1 }