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

500 lines
27 KiB

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Nigerijska glazba prikupljena sa Spotifyja - analiza**\n",
"\n",
"Klasteriranje je vrsta [nenadziranog učenja](https://wikipedia.org/wiki/Unsupervised_learning) koja pretpostavlja da je skup podataka neoznačen ili da njegovi ulazi nisu povezani s unaprijed definiranim izlazima. Koristi razne algoritme za analizu neoznačenih podataka i pruža grupiranja prema obrascima koje prepoznaje u podacima.\n",
"\n",
"[**Kviz prije predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Uvod**\n",
"\n",
"[Klasteriranje](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) je vrlo korisno za istraživanje podataka. Pogledajmo može li pomoći u otkrivanju trendova i obrazaca u načinu na koji nigerijska publika konzumira glazbu.\n",
"\n",
"> ✅ Odvojite trenutak da razmislite o primjenama klasteriranja. U stvarnom životu, klasteriranje se događa kad imate hrpu rublja i trebate razvrstati odjeću članova obitelji 🧦👕👖🩲. U znanosti o podacima, klasteriranje se događa pri analizi korisničkih preferencija ili određivanju karakteristika bilo kojeg neoznačenog skupa podataka. Klasteriranje, na neki način, pomaže u stvaranju reda iz kaosa, poput ladice za čarape.\n",
"\n",
"U profesionalnom okruženju, klasteriranje se može koristiti za određivanje stvari poput segmentacije tržišta, primjerice za utvrđivanje koje dobne skupine kupuju koje proizvode. Druga primjena mogla bi biti otkrivanje anomalija, možda za otkrivanje prijevara u skupu podataka o transakcijama kreditnim karticama. Ili biste mogli koristiti klasteriranje za određivanje tumora u seriji medicinskih skenova.\n",
"\n",
"✅ Razmislite na trenutak o tome kako ste možda naišli na klasteriranje 'u divljini', u bankarstvu, e-trgovini ili poslovnom okruženju.\n",
"\n",
"> 🎓 Zanimljivo je da je analiza klastera nastala u područjima antropologije i psihologije 1930-ih. Možete li zamisliti kako se mogla koristiti?\n",
"\n",
"Alternativno, mogli biste je koristiti za grupiranje rezultata pretraživanja - prema poveznicama za kupovinu, slikama ili recenzijama, na primjer. Klasteriranje je korisno kada imate veliki skup podataka koji želite smanjiti i na kojem želite provesti detaljniju analizu, pa se tehnika može koristiti za upoznavanje podataka prije nego što se izgrade drugi modeli.\n",
"\n",
"✅ Kada su vaši podaci organizirani u klastere, dodjeljujete im identifikator klastera, a ova tehnika može biti korisna pri očuvanju privatnosti skupa podataka; umjesto da se referirate na podatkovnu točku pomoću otkrivajućih identifikacijskih podataka, možete koristiti identifikator klastera. Možete li smisliti druge razloge zašto biste koristili identifikator klastera umjesto drugih elemenata klastera za identifikaciju?\n",
"\n",
"### Početak rada s klasteriranjem\n",
"\n",
"> 🎓 Način na koji stvaramo klastere uvelike ovisi o tome kako grupiramo podatkovne točke. Razjasnimo neke pojmove:\n",
">\n",
"> 🎓 ['Transduktivno' naspram 'induktivno'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transduktivno zaključivanje proizlazi iz promatranih slučajeva obuke koji se mapiraju na specifične testne slučajeve. Induktivno zaključivanje proizlazi iz slučajeva obuke koji se mapiraju na opća pravila koja se tek tada primjenjuju na testne slučajeve.\n",
">\n",
"> Primjer: Zamislite da imate skup podataka koji je samo djelomično označen. Neke stvari su 'ploče', neke 'CD-i', a neke su prazne. Vaš zadatak je dodijeliti oznake praznim podacima. Ako odaberete induktivni pristup, trenirali biste model tražeći 'ploče' i 'CD-e' te primijenili te oznake na neoznačene podatke. Ovaj pristup imat će poteškoća u klasifikaciji stvari koje su zapravo 'kazete'. Transduktivni pristup, s druge strane, učinkovitije obrađuje ove nepoznate podatke jer radi na grupiranju sličnih stavki i zatim primjenjuje oznaku na grupu. U ovom slučaju, klasteri bi mogli odražavati 'okrugle glazbene stvari' i 'kvadratne glazbene stvari'.\n",
">\n",
"> 🎓 ['Neravna' naspram 'ravna' geometrija](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Izvedeno iz matematičke terminologije, neravna naspram ravna geometrija odnosi se na mjerenje udaljenosti između točaka pomoću 'ravnih' ([Euklidskih](https://wikipedia.org/wiki/Euclidean_geometry)) ili 'neravnih' (ne-Euklidskih) geometrijskih metoda.\n",
">\n",
"> 'Ravna' u ovom kontekstu odnosi se na Euklidsku geometriju (dijelovi koje se uče kao 'planimetrija'), a neravna se odnosi na ne-Euklidsku geometriju. Što geometrija ima s učenjem strojeva? Pa, kao dva područja koja su ukorijenjena u matematici, mora postojati zajednički način mjerenja udaljenosti između točaka u klasterima, a to se može učiniti na 'ravni' ili 'neravni' način, ovisno o prirodi podataka. [Euklidske udaljenosti](https://wikipedia.org/wiki/Euclidean_distance) mjere se kao duljina segmenta između dvije točke. [Ne-Euklidske udaljenosti](https://wikipedia.org/wiki/Non-Euclidean_geometry) mjere se duž krivulje. Ako se vaši podaci, vizualizirani, čine kao da ne postoje na ravnini, možda ćete trebati koristiti specijalizirani algoritam za njihovu obradu.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Udaljenosti'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Klasteri su definirani svojom matricom udaljenosti, npr. udaljenostima između točaka. Ova udaljenost može se mjeriti na nekoliko načina. Euklidski klasteri definirani su prosjekom vrijednosti točaka i sadrže 'centroid' ili središnju točku. Udaljenosti se stoga mjere prema udaljenosti od tog centroida. Ne-Euklidske udaljenosti odnose se na 'clustroid', točku najbližu drugim točkama. Clustroidi se pak mogu definirati na različite načine.\n",
">\n",
"> 🎓 ['Ograničeno'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Ograničeno klasteriranje](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) uvodi 'polunadzirano' učenje u ovu nenadziranu metodu. Odnosi između točaka označeni su kao 'ne može se povezati' ili 'mora se povezati', pa se na skup podataka nameću neka pravila.\n",
">\n",
"> Primjer: Ako se algoritam pusti na skup neoznačenih ili poluoznačenih podataka, klasteri koje proizvede mogu biti loše kvalitete. U gore navedenom primjeru, klasteri bi mogli grupirati 'okrugle glazbene stvari', 'kvadratne glazbene stvari', 'trokutaste stvari' i 'kolačiće'. Ako se daju neka ograničenja ili pravila koja treba slijediti (\"stavka mora biti izrađena od plastike\", \"stavka mora moći proizvoditi glazbu\"), to može pomoći 'ograničiti' algoritam da donosi bolje odluke.\n",
">\n",
"> 🎓 'Gustoća'\n",
">\n",
"> Podaci koji su 'bučni' smatraju se 'gustima'. Udaljenosti između točaka u svakom od njegovih klastera mogu se pokazati, pri pregledu, više ili manje gustima, ili 'zbijenima', pa se ti podaci moraju analizirati odgovarajućom metodom klasteriranja. [Ovaj članak](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) pokazuje razliku između korištenja K-Means klasteriranja i HDBSCAN algoritama za istraživanje bučnog skupa podataka s neujednačenom gustoćom klastera.\n",
"\n",
"Produbite svoje razumijevanje tehnika klasteriranja u ovom [modulu za učenje](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Algoritmi klasteriranja**\n",
"\n",
"Postoji preko 100 algoritama klasteriranja, a njihova primjena ovisi o prirodi podataka. Razgovarajmo o nekima od glavnih:\n",
"\n",
"- **Hijerarhijsko klasteriranje**. Ako se objekt klasificira prema svojoj blizini drugom objektu, a ne prema udaljenijem, klasteri se formiraju na temelju udaljenosti članova od drugih objekata. Hijerarhijsko klasteriranje karakterizira ponovljeno kombiniranje dva klastera.\n",
"\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Centroid klasteriranje**. Ovaj popularni algoritam zahtijeva odabir 'k', odnosno broja klastera koji će se formirati, nakon čega algoritam određuje središnju točku klastera i okuplja podatke oko te točke. [K-means klasteriranje](https://wikipedia.org/wiki/K-means_clustering) je popularna verzija centroid klasteriranja koja razdvaja skup podataka u unaprijed definirane K grupe. Središte se određuje prema najbližem prosjeku, otuda i naziv. Kvadratna udaljenost od klastera se minimizira.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Klasteriranje temeljeno na distribuciji**. Temeljeno na statističkom modeliranju, klasteriranje temeljeno na distribuciji usredotočuje se na određivanje vjerojatnosti da podatkovna točka pripada klasteru i dodjeljuje je u skladu s tim. Metode Gaussove mješavine pripadaju ovom tipu.\n",
"\n",
"- **Klasteriranje temeljeno na gustoći**. Podatkovne točke dodjeljuju se klasterima na temelju njihove gustoće, odnosno grupiranja oko drugih točaka. Podatkovne točke udaljene od grupe smatraju se iznimkama ili šumom. DBSCAN, Mean-shift i OPTICS pripadaju ovom tipu klasteriranja.\n",
"\n",
"- **Klasteriranje temeljeno na mreži**. Za višedimenzionalne skupove podataka stvara se mreža, a podaci se dijele među ćelijama mreže, čime se stvaraju klasteri.\n",
"\n",
"Najbolji način za učenje o klasteriranju je isprobati ga sami, pa ćete to učiniti u ovom zadatku.\n",
"\n",
"Trebat ćemo neke pakete za dovršavanje ovog modula. Možete ih instalirati pomoću: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternativno, skripta ispod provjerava imate li potrebne pakete za dovršavanje ovog modula i instalira ih za vas ako neki nedostaju.\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": [
"## Vježba - grupirajte svoje podatke\n",
"\n",
"Grupiranje kao tehnika uvelike se poboljšava pravilnom vizualizacijom, pa krenimo s vizualizacijom naših podataka o glazbi. Ova vježba pomoći će nam odlučiti koji način grupiranja najefikasnije koristiti s obzirom na prirodu ovih podataka.\n",
"\n",
"Krenimo odmah s uvozom podataka.\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": [
"Ponekad želimo dobiti malo više informacija o našim podacima. Možemo pogledati `podatke` i `njihovu strukturu` koristeći funkciju [*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": [
"Bravo!💪\n",
"\n",
"Možemo primijetiti da `glimpse()` prikazuje ukupan broj redaka (opažanja) i stupaca (varijabli), zatim prvih nekoliko unosa svake varijable u retku nakon imena varijable. Osim toga, *tip podataka* varijable prikazan je odmah nakon imena varijable unutar `< >`.\n",
"\n",
"`DataExplorer::introduce()` može sažeti ove informacije na uredan način:\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": [
"Super! Upravo smo saznali da naši podaci nemaju nedostajućih vrijednosti.\n",
"\n",
"Dok smo na tome, možemo istražiti uobičajene statistike centralne tendencije (npr. [aritmetička sredina](https://en.wikipedia.org/wiki/Arithmetic_mean) i [medijan](https://en.wikipedia.org/wiki/Median)) te mjere disperzije (npr. [standardna devijacija](https://en.wikipedia.org/wiki/Standard_deviation)) koristeći `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": [
"Pogledajmo opće vrijednosti podataka. Imajte na umu da popularnost može biti `0`, što označava pjesme koje nemaju rangiranje. Uskoro ćemo ih ukloniti.\n",
"\n",
"> 🤔 Ako radimo s klasteriranjem, nenadziranom metodom koja ne zahtijeva označene podatke, zašto prikazujemo ove podatke s oznakama? Tijekom faze istraživanja podataka, oznake su korisne, ali nisu nužne za rad algoritama klasteriranja.\n",
"\n",
"### 1. Istražite popularne žanrove\n",
"\n",
"Idemo otkriti najpopularnije žanrove 🎶 tako da prebrojimo koliko se puta pojavljuju.\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 je prošlo dobro! Kažu da slika vrijedi tisuću redaka podatkovnog okvira (zapravo to nitko nikad ne kaže 😅). Ali shvaćaš poantu, zar ne?\n",
"\n",
"Jedan od načina za vizualizaciju kategorijskih podataka (znakovnih ili faktorskih varijabli) je korištenje stupčastih grafikona. Napravimo stupčasti grafikon za top 10 žanrova:\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": [
"Sada je puno lakše prepoznati da imamo `nedostajuće` žanrove 🧐!\n",
"\n",
"> Dobra vizualizacija pokazat će vam stvari koje niste očekivali ili postaviti nova pitanja o podacima - Hadley Wickham i Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Napomena: kada je glavni žanr opisan kao `Nedostaje`, to znači da ga Spotify nije klasificirao, pa ga uklonimo.\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": [
"Iz kratke analize podataka saznajemo da tri najpopularnija žanra dominiraju ovim skupom podataka. Usmjerimo se na `afro dancehall`, `afropop` i `nigerian pop`, te dodatno filtrirajmo skup podataka kako bismo uklonili sve što ima vrijednost popularnosti 0 (što znači da nije klasificirano s popularnošću u skupu podataka i može se smatrati šumom za naše potrebe):\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": [
"Pogledajmo postoji li očigledna linearna povezanost među numeričkim varijablama u našem skupu podataka. Ova povezanost se matematički kvantificira pomoću [statistike korelacije](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Statistika korelacije je vrijednost između -1 i 1 koja pokazuje jačinu veze. Vrijednosti iznad 0 ukazuju na *pozitivnu* korelaciju (visoke vrijednosti jedne varijable obično se podudaraju s visokim vrijednostima druge), dok vrijednosti ispod 0 ukazuju na *negativnu* korelaciju (visoke vrijednosti jedne varijable obično se podudaraju s niskim vrijednostima druge).\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": [
"Podaci nisu snažno povezani osim između `energy` i `loudness`, što ima smisla, s obzirom na to da je glasna glazba obično prilično energična. `Popularity` ima povezanost s `release date`, što također ima smisla, jer su novije pjesme vjerojatno popularnije. Duljina i energija također se čine povezane.\n",
"\n",
"Bit će zanimljivo vidjeti što algoritam za grupiranje može napraviti s ovim podacima!\n",
"\n",
"> 🎓 Imajte na umu da korelacija ne podrazumijeva uzročnost! Imamo dokaz o korelaciji, ali nemamo dokaz o uzročnosti. Jedna [zabavna web stranica](https://tylervigen.com/spurious-correlations) ima vizualizacije koje naglašavaju ovu točku.\n",
"\n",
"### 2. Istraživanje distribucije podataka\n",
"\n",
"Postavimo neka suptilnija pitanja. Jesu li žanrovi značajno različiti u percepciji njihove plesnosti, na temelju njihove popularnosti? Istražimo distribuciju podataka naših tri najpopularnija žanra za popularnost i plesnost duž zadane x i y osi koristeći [grafove gustoće](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": [
"Vidimo da postoje koncentrični krugovi koji se podudaraju, bez obzira na žanr. Može li biti da se ukusi u Nigeriji konvergiraju na određenoj razini plesnosti za ovaj žanr?\n",
"\n",
"Općenito, tri žanra se podudaraju u smislu svoje popularnosti i plesnosti. Određivanje klastera u ovim slabo usklađenim podacima bit će izazov. Pogledajmo može li raspršeni grafikon to podržati.\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": [
"Raspršeni dijagram istih osi pokazuje sličan obrazac konvergencije.\n",
"\n",
"Općenito, za grupiranje možete koristiti raspršene dijagrame kako biste prikazali skupove podataka, pa je savladavanje ove vrste vizualizacije vrlo korisno. U sljedećoj lekciji ćemo uzeti ove filtrirane podatke i koristiti k-means grupiranje kako bismo otkrili skupine u podacima koje se na zanimljive načine preklapaju.\n",
"\n",
"## **🚀 Izazov**\n",
"\n",
"U pripremi za sljedeću lekciju, napravite grafikon o raznim algoritmima za grupiranje koje biste mogli otkriti i koristiti u produkcijskom okruženju. Koje vrste problema grupiranje pokušava riješiti?\n",
"\n",
"## [**Kviz nakon predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Pregled i samostalno učenje**\n",
"\n",
"Prije nego primijenite algoritme za grupiranje, kao što smo naučili, dobro je razumjeti prirodu vašeg skupa podataka. Pročitajte više o ovoj temi [ovdje](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Produbite svoje razumijevanje tehnika grupiranja:\n",
"\n",
"- [Treniranje i evaluacija modela grupiranja koristeći Tidymodels i prijatelje](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",
"## **Zadatak**\n",
"\n",
"[Istrazite druge vizualizacije za grupiranje](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## HVALA:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) za kreiranje originalne Python verzije ovog modula ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) za kreiranje nevjerojatnih ilustracija koje čine koncepte strojnog učenja razumljivijima i lakšima za shvatiti.\n",
"\n",
"Sretno u učenju,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.\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:54:36+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "hr"
}
},
"nbformat": 4,
"nbformat_minor": 1
}