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.
488 lines
26 KiB
488 lines
26 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **Nigerijska glasba pridobljena s Spotifyja - analiza**\n",
|
|
"\n",
|
|
"Grozdanje je vrsta [nenadzorovanega učenja](https://wikipedia.org/wiki/Unsupervised_learning), ki predpostavlja, da je podatkovni niz neoznačen ali da njegovi vnosi niso povezani z vnaprej določenimi izhodi. Uporablja različne algoritme za razvrščanje neoznačenih podatkov in zagotavljanje skupin glede na vzorce, ki jih zazna v podatkih.\n",
|
|
"\n",
|
|
"[**Predhodni kviz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
|
|
"\n",
|
|
"### **Uvod**\n",
|
|
"\n",
|
|
"[Grozdanje](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) je zelo uporabno za raziskovanje podatkov. Poglejmo, ali lahko pomaga odkriti trende in vzorce v načinu, kako nigerijsko občinstvo posluša glasbo.\n",
|
|
"\n",
|
|
"> ✅ Vzemite si trenutek in razmislite o uporabi grozdanja. V vsakdanjem življenju se grozdanje zgodi, kadar imate kup perila in morate razvrstiti oblačila družinskih članov 🧦👕👖🩲. V podatkovni znanosti se grozdanje zgodi, ko poskušate analizirati uporabnikove preference ali določiti značilnosti katerega koli neoznačenega podatkovnega niza. Grozdanje na nek način pomaga ustvariti red iz kaosa, kot je predal za nogavice.\n",
|
|
"\n",
|
|
"V profesionalnem okolju se grozdanje lahko uporablja za določanje stvari, kot je segmentacija trga, na primer za ugotavljanje, katere starostne skupine kupujejo določene izdelke. Druga uporaba bi bila odkrivanje anomalij, morda za zaznavanje goljufij v podatkovnem nizu transakcij s kreditnimi karticami. Lahko pa uporabite grozdanje za določanje tumorjev v seriji medicinskih skenov.\n",
|
|
"\n",
|
|
"✅ Razmislite za trenutek, kako ste morda naleteli na grozdanje 'v naravi', v bančništvu, e-trgovini ali poslovnem okolju.\n",
|
|
"\n",
|
|
"> 🎓 Zanimivo je, da analiza grozdov izvira iz področij antropologije in psihologije v 1930-ih. Si lahko predstavljate, kako bi jo takrat uporabljali?\n",
|
|
"\n",
|
|
"Alternativno bi jo lahko uporabili za razvrščanje rezultatov iskanja - na primer po nakupovalnih povezavah, slikah ali ocenah. Grozdanje je uporabno, kadar imate velik podatkovni niz, ki ga želite zmanjšati in na katerem želite opraviti bolj podrobno analizo, zato se tehnika lahko uporablja za spoznavanje podatkov, preden se zgradijo drugi modeli.\n",
|
|
"\n",
|
|
"✅ Ko so vaši podatki organizirani v grozde, jim dodelite ID grozda, kar je lahko uporabno pri ohranjanju zasebnosti podatkovnega niza; namesto bolj razkrivajočih identifikacijskih podatkov lahko uporabite ID grozda za sklicevanje na podatkovno točko. Ali lahko pomislite na druge razloge, zakaj bi za identifikacijo raje uporabili ID grozda kot druge elemente grozda?\n",
|
|
"\n",
|
|
"### Začetek z grozdanjem\n",
|
|
"\n",
|
|
"> 🎓 Način, kako ustvarimo grozde, je močno povezan s tem, kako združimo podatkovne točke v skupine. Razčistimo nekaj terminologije:\n",
|
|
">\n",
|
|
"> 🎓 ['Transduktivno' vs. 'induktivno'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
|
|
">\n",
|
|
"> Transduktivno sklepanje izhaja iz opazovanih primerov usposabljanja, ki se preslikajo na specifične testne primere. Induktivno sklepanje izhaja iz primerov usposabljanja, ki se preslikajo na splošna pravila, ki se nato uporabijo na testnih primerih.\n",
|
|
">\n",
|
|
"> Primer: Predstavljajte si, da imate podatkovni niz, ki je le delno označen. Nekatere stvari so 'plošče', nekatere 'CD-ji', nekatere pa so prazne. Vaša naloga je dodeliti oznake praznim. Če izberete induktivni pristop, bi usposobili model za iskanje 'plošč' in 'CD-jev' ter te oznake uporabili na neoznačenih podatkih. Ta pristop bo imel težave pri razvrščanju stvari, ki so dejansko 'kasete'. Transduktivni pristop pa bo to neznano podatkovno točko obravnaval bolj učinkovito, saj deluje tako, da združi podobne predmete in nato skupini dodeli oznako. V tem primeru bi grozdi lahko odražali 'okrogle glasbene stvari' in 'kvadratne glasbene stvari'.\n",
|
|
">\n",
|
|
"> 🎓 ['Neploskovna' vs. 'ploskovna' geometrija](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
|
|
">\n",
|
|
"> Izpeljano iz matematične terminologije, neploskovna vs. ploskovna geometrija se nanaša na merjenje razdalj med točkami bodisi s 'ploskovnimi' ([Evklidskimi](https://wikipedia.org/wiki/Euclidean_geometry)) bodisi z neploskovnimi (neevklidskimi) geometrijskimi metodami.\n",
|
|
">\n",
|
|
"> 'Ploskovna' v tem kontekstu se nanaša na evklidsko geometrijo (deli katere se učijo kot 'ravninska' geometrija), medtem ko se neploskovna nanaša na neevklidsko geometrijo. Kaj ima geometrija skupnega z strojno učenje? Kot dve področji, ki temeljita na matematiki, mora obstajati skupen način za merjenje razdalj med točkami v grozdih, kar se lahko izvede na 'ploskovni' ali 'neploskovni' način, odvisno od narave podatkov. [Evklidske razdalje](https://wikipedia.org/wiki/Euclidean_distance) se merijo kot dolžina odseka med dvema točkama. [Neevklidske razdalje](https://wikipedia.org/wiki/Non-Euclidean_geometry) se merijo vzdolž krivulje. Če se vaši podatki, vizualizirani, ne nahajajo na ravnini, boste morda morali uporabiti specializiran algoritem za obdelavo.\n",
|
|
">\n",
|
|
"> 🎓 ['Razdalje'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
|
|
">\n",
|
|
"> Grozdi so opredeljeni z matriko razdalj, npr. razdaljami med točkami. Te razdalje je mogoče meriti na več načinov. Evklidski grozdi so opredeljeni z povprečjem vrednosti točk in vsebujejo 'centroid' ali osrednjo točko. Razdalje se tako merijo glede na razdaljo do tega centroida. Neevklidske razdalje se nanašajo na 'clustroid', točko, ki je najbližja drugim točkam. Clustroidi so lahko opredeljeni na različne načine.\n",
|
|
">\n",
|
|
"> 🎓 ['Omejeno'](https://wikipedia.org/wiki/Constrained_clustering)\n",
|
|
">\n",
|
|
"> [Omejeno grozdanje](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) uvaja 'polnadzorovano' učenje v to nenadzorovano metodo. Razmerja med točkami so označena kot 'ne smejo se povezati' ali 'morajo se povezati', tako da se na podatkovni niz uvedejo določena pravila.\n",
|
|
">\n",
|
|
"> Primer: Če je algoritem sproščen na serijo neoznačenih ali delno označenih podatkov, so lahko grozdi, ki jih ustvari, slabe kakovosti. V zgornjem primeru bi grozdi lahko združevali 'okrogle glasbene stvari', 'kvadratne glasbene stvari', 'trikotne stvari' in 'piškote'. Če se uvedejo določene omejitve ali pravila (\"predmet mora biti iz plastike\", \"predmet mora biti sposoben proizvajati glasbo\"), to lahko pomaga 'omejiti' algoritem, da sprejema boljše odločitve.\n",
|
|
">\n",
|
|
"> 🎓 'Gostota'\n",
|
|
">\n",
|
|
"> Podatki, ki so 'hrupni', se štejejo za 'goste'. Razdalje med točkami v vsakem od njegovih grozdov se lahko ob pregledu izkažejo za bolj ali manj goste ali 'natrpane', zato je treba te podatke analizirati z ustrezno metodo grozdanja. [Ta članek](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) prikazuje razliko med uporabo algoritmov K-Means grozdanja in HDBSCAN za raziskovanje hrupnega podatkovnega niza z neenakomerno gostoto grozdov.\n",
|
|
"\n",
|
|
"Poglobite svoje razumevanje tehnik grozdanja v tem [učnem modulu](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
|
|
"\n",
|
|
"### **Algoritmi grozdanja**\n",
|
|
"\n",
|
|
"Obstaja več kot 100 algoritmov za grozdanje, njihova uporaba pa je odvisna od narave podatkov. Oglejmo si nekatere glavne:\n",
|
|
"\n",
|
|
"- **Hierarhično grozdanje**. Če je predmet razvrščen glede na svojo bližino bližnjemu predmetu, namesto bolj oddaljenemu, se grozdi oblikujejo na podlagi razdalje med člani. Hierarhično grozdanje je značilno po tem, da se dva grozda večkrat združita.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/hierarchical.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"- **Centroidno grozdanje**. Ta priljubljeni algoritem zahteva izbiro 'k', ali število grozdov, ki jih je treba oblikovati, nato pa algoritem določi osrednjo točko grozda in zbira podatke okoli te točke. [K-means grozdanje](https://wikipedia.org/wiki/K-means_clustering) je priljubljena različica centroidnega grozdanja, ki razdeli podatkovni niz v vnaprej določene K skupine. Center je določen z najbližjim povprečjem, od tod tudi ime. Kvadratna razdalja od grozda je minimizirana.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/centroid.png\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>Infografika: Dasani Madipalli</figcaption>\n",
|
|
"\n",
|
|
"- **Grozdanje na podlagi porazdelitve**. Temelji na statističnem modeliranju, grozdanje na podlagi porazdelitve se osredotoča na določanje verjetnosti, da podatkovna točka pripada grozdu, in ji ustrezno dodeli mesto. Metode Gaussove mešanice spadajo v to vrsto.\n",
|
|
"\n",
|
|
"- **Grozdanje na podlagi gostote**. Podatkovne točke so dodeljene grozdom glede na njihovo gostoto ali njihovo združevanje okoli drugih točk. Podatkovne točke, ki so daleč od skupine, se štejejo za odstopanja ali hrup. DBSCAN, Mean-shift in OPTICS spadajo v to vrsto grozdanja.\n",
|
|
"\n",
|
|
"- **Grozdanje na podlagi mreže**. Za večdimenzionalne podatkovne nize se ustvari mreža, podatki pa se razdelijo med celice mreže, s čimer se ustvarijo grozdi.\n",
|
|
"\n",
|
|
"Najboljši način za učenje o grozdanju je, da ga preizkusite sami, kar boste storili v tej vaji.\n",
|
|
"\n",
|
|
"Za dokončanje tega modula bomo potrebovali nekaj paketov. Namestite jih lahko z ukazom: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
|
|
"\n",
|
|
"Alternativno spodnji skript preveri, ali imate potrebne pakete za dokončanje tega modula, in jih namesti, če manjkajo.\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": [
|
|
"## Naloga - razvrščanje podatkov v skupine\n",
|
|
"\n",
|
|
"Razvrščanje v skupine kot tehnika je močno podprto z ustrezno vizualizacijo, zato začnimo z vizualizacijo naših glasbenih podatkov. Ta naloga nam bo pomagala odločiti, katero metodo razvrščanja v skupine bi morali najučinkoviteje uporabiti glede na naravo teh podatkov.\n",
|
|
"\n",
|
|
"Začnimo z uvozom podatkov.\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": [
|
|
"Včasih si želimo pridobiti malo več informacij o naših podatkih. Podatke in njihovo strukturo si lahko ogledamo z uporabo funkcije [*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": [
|
|
"Odlično delo!💪\n",
|
|
"\n",
|
|
"Opazimo lahko, da `glimpse()` prikaže skupno število vrstic (opazovanj) in stolpcev (spremenljivk), nato pa prvih nekaj vnosov vsake spremenljivke v vrstici za imenom spremenljivke. Poleg tega je *tip podatkov* spremenljivke prikazan takoj za imenom spremenljivke znotraj `< >`.\n",
|
|
"\n",
|
|
"`DataExplorer::introduce()` lahko to informacijo povzame na urejen 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": [
|
|
"Odlično! Pravkar smo ugotovili, da naši podatki nimajo manjkajočih vrednosti.\n",
|
|
"\n",
|
|
"Medtem lahko raziščemo pogoste statistike centralne tendence (npr. [povprečje](https://en.wikipedia.org/wiki/Arithmetic_mean) in [mediano](https://en.wikipedia.org/wiki/Median)) ter mere razpršenosti (npr. [standardni odklon](https://en.wikipedia.org/wiki/Standard_deviation)) z uporabo `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": [
|
|
"Poglejmo splošne vrednosti podatkov. Upoštevajte, da lahko priljubljenost znaša `0`, kar pomeni pesmi, ki nimajo uvrstitve. Te bomo kmalu odstranili.\n",
|
|
"\n",
|
|
"> 🤔 Če delamo s gručenjem, nenadzorovano metodo, ki ne zahteva označenih podatkov, zakaj prikazujemo te podatke z oznakami? V fazi raziskovanja podatkov so koristni, vendar niso nujni za delovanje algoritmov za gručenje.\n",
|
|
"\n",
|
|
"### 1. Raziskovanje priljubljenih žanrov\n",
|
|
"\n",
|
|
"Pojdimo naprej in ugotovimo najbolj priljubljene žanre 🎶 tako, da preštejemo, kolikokrat se pojavijo.\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 šlo dobro! Pravijo, da slika pove več kot tisoč vrstic podatkovnega okvira (pravzaprav tega nihče nikoli ne reče 😅). Ampak razumete bistvo, kajne?\n",
|
|
"\n",
|
|
"Eden od načinov za vizualizacijo kategorijskih podatkov (znakovnih ali faktorskih spremenljivk) je uporaba stolpčnih grafov. Naredimo stolpčni graf za 10 najbolj priljubljenih žanrov:\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": [
|
|
"Zdaj je veliko lažje prepoznati, da imamo `manjkajoče` žanre 🧐!\n",
|
|
"\n",
|
|
"> Dobra vizualizacija vam bo pokazala stvari, ki jih niste pričakovali, ali pa sprožila nova vprašanja o podatkih - Hadley Wickham in Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
|
|
"\n",
|
|
"Opomba: ko je glavni žanr opisan kot `Manjkajoč`, to pomeni, da ga Spotify ni klasificiral, zato ga odstranimo.\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 osnovnega raziskovanja podatkov ugotovimo, da tri najbolj priljubljene zvrsti prevladujejo v tem naboru podatkov. Osredotočimo se na `afro dancehall`, `afropop` in `nigerian pop`, poleg tega pa filtrirajmo nabor podatkov, da odstranimo vse, kar ima vrednost priljubljenosti 0 (kar pomeni, da ni bilo razvrščeno glede na priljubljenost v naboru podatkov in se lahko za naše namene šteje kot šum):\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"nigerian_songs <- df %>% \r\n",
|
|
" # Concentrate on top 3 genres\r\n",
|
|
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
|
|
" # Remove unclassified observations\r\n",
|
|
" filter(popularity != 0)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Visualize popular genres\r\n",
|
|
"nigerian_songs %>%\r\n",
|
|
" count(artist_top_genre) %>%\r\n",
|
|
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
|
" fill = artist_top_genre)) +\r\n",
|
|
" geom_col(alpha = 0.8) +\r\n",
|
|
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
|
|
" ggtitle(\"Top genres\") +\r\n",
|
|
" theme(plot.title = element_text(hjust = 0.5))\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Poglejmo, ali obstaja kakšna očitna linearna povezava med številskimi spremenljivkami v našem naboru podatkov. To povezavo matematično kvantificira [statistika korelacije](https://en.wikipedia.org/wiki/Correlation).\n",
|
|
"\n",
|
|
"Statistika korelacije je vrednost med -1 in 1, ki kaže na moč povezave. Vrednosti nad 0 kažejo na *pozitivno* korelacijo (visoke vrednosti ene spremenljivke običajno sovpadajo z visokimi vrednostmi druge), medtem ko vrednosti pod 0 kažejo na *negativno* korelacijo (visoke vrednosti ene spremenljivke običajno sovpadajo z nizkimi vrednostmi 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": [
|
|
"Podatki niso močno povezani, razen med `energy` in `loudness`, kar je smiselno, saj je glasna glasba običajno precej energična. `Popularity` ima povezavo z `release date`, kar prav tako ni presenetljivo, saj so novejše pesmi verjetno bolj priljubljene. Dolžina in energija se zdita tudi povezani.\n",
|
|
"\n",
|
|
"Zanimivo bo videti, kaj lahko algoritem za razvrščanje naredi s temi podatki!\n",
|
|
"\n",
|
|
"> 🎓 Upoštevajte, da korelacija ne pomeni vzročne povezanosti! Imamo dokaz o korelaciji, vendar nimamo dokaza o vzročnosti. [Zabavna spletna stran](https://tylervigen.com/spurious-correlations) ponuja nekaj vizualizacij, ki poudarjajo to točko.\n",
|
|
"\n",
|
|
"### 2. Raziskovanje porazdelitve podatkov\n",
|
|
"\n",
|
|
"Postavimo si nekaj bolj subtilnih vprašanj. Ali se žanri bistveno razlikujejo v zaznavanju njihove plesnosti glede na njihovo priljubljenost? Preučimo porazdelitev podatkov naših treh najbolj priljubljenih žanrov glede priljubljenosti in plesnosti vzdolž določene osi x in y z uporabo [gostotnih grafov](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 so tu koncentrični krogi, ki se ujemajo, ne glede na žanr. Ali je mogoče, da se nigerijski okusi pri tem žanru zbližajo na določeni ravni plesnosti?\n",
|
|
"\n",
|
|
"Na splošno se trije žanri ujemajo glede na svojo priljubljenost in plesnost. Določanje skupkov v teh ohlapno poravnanih podatkih bo izziv. Poglejmo, ali lahko raztreseni diagram to podpre.\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": [
|
|
"Razpršeni diagram istih osi prikazuje podoben vzorec konvergence.\n",
|
|
"\n",
|
|
"Na splošno lahko za razvrščanje uporabite razpršene diagrame, da prikažete skupine podatkov, zato je obvladovanje te vrste vizualizacije zelo koristno. V naslednji lekciji bomo uporabili te filtrirane podatke in s k-means razvrščanjem odkrili skupine v teh podatkih, ki se na zanimive načine prekrivajo.\n",
|
|
"\n",
|
|
"## **🚀 Izziv**\n",
|
|
"\n",
|
|
"V pripravi na naslednjo lekcijo naredite diagram o različnih algoritmih za razvrščanje, ki jih morda odkrijete in uporabite v produkcijskem okolju. Kakšne vrste težav poskuša razvrščanje rešiti?\n",
|
|
"\n",
|
|
"## [**Kvizi po predavanju**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
|
|
"\n",
|
|
"## **Pregled & Samostojno učenje**\n",
|
|
"\n",
|
|
"Preden uporabite algoritme za razvrščanje, kot smo se naučili, je dobro razumeti naravo vašega nabora podatkov. Več o tej temi preberite [tukaj](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n",
|
|
"\n",
|
|
"Poglobite svoje razumevanje tehnik razvrščanja:\n",
|
|
"\n",
|
|
"- [Usposabljanje in ocenjevanje modelov za razvrščanje z uporabo Tidymodels in prijateljev](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",
|
|
"## **Naloga**\n",
|
|
"\n",
|
|
"[Raziskujte druge vizualizacije za razvrščanje](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 ustvarjanje izvirne Python različice tega modula ♥️\n",
|
|
"\n",
|
|
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) za ustvarjanje neverjetnih ilustracij, ki omogočajo boljše razumevanje konceptov strojnega učenja in jih naredijo bolj dostopne.\n",
|
|
"\n",
|
|
"Veselo učenje,\n",
|
|
"\n",
|
|
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\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-06T14:12:22+00:00",
|
|
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
|
|
"language_code": "sl"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
} |