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

499 lines
26 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Nigeriansk musikk hentet fra Spotify - en analyse**\n",
"\n",
"Clustering er en type [usupervisert læring](https://wikipedia.org/wiki/Unsupervised_learning) som forutsetter at et datasett er umerket, eller at inngangene ikke er koblet til forhåndsdefinerte utganger. Det bruker ulike algoritmer for å sortere gjennom umerkede data og gi grupperinger basert på mønstre det oppdager i dataene.\n",
"\n",
"[**Quiz før forelesning**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Introduksjon**\n",
"\n",
"[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) er svært nyttig for datautforskning. La oss se om det kan hjelpe oss med å oppdage trender og mønstre i hvordan nigerianske lyttere konsumerer musikk.\n",
"\n",
"> ✅ Ta et øyeblikk til å tenke på bruksområdene for clustering. I hverdagen skjer clustering når du har en haug med klesvask og må sortere klærne til familiemedlemmene dine 🧦👕👖🩲. I dataanalyse skjer clustering når man prøver å analysere brukerpreferanser eller bestemme egenskapene til et umerket datasett. Clustering hjelper på en måte med å skape orden i kaos, som i en sokkeskuff.\n",
"\n",
"I en profesjonell sammenheng kan clustering brukes til ting som markedssegmentering, for eksempel for å finne ut hvilke aldersgrupper som kjøper hvilke varer. Et annet bruksområde kan være å oppdage avvik, som for eksempel å avsløre svindel i et datasett med kredittkorttransaksjoner. Eller du kan bruke clustering til å identifisere svulster i en samling medisinske skanninger.\n",
"\n",
"✅ Tenk et øyeblikk på hvordan du kan ha støtt på clustering i praksis, enten i bank, e-handel eller forretningssammenheng.\n",
"\n",
"> 🎓 Interessant nok oppsto clusteranalyse innen antropologi og psykologi på 1930-tallet. Kan du forestille deg hvordan det kan ha blitt brukt?\n",
"\n",
"Alternativt kan du bruke det til å gruppere søkeresultater for eksempel etter shoppinglenker, bilder eller anmeldelser. Clustering er nyttig når du har et stort datasett som du ønsker å redusere og analysere mer detaljert, slik at teknikken kan brukes til å lære om data før andre modeller bygges.\n",
"\n",
"✅ Når dataene dine er organisert i klynger, tildeler du dem en cluster-ID. Denne teknikken kan være nyttig for å bevare et datasets personvern; du kan referere til et datapunkt med cluster-ID-en i stedet for mer avslørende identifiserbare data. Kan du tenke på andre grunner til å bruke en cluster-ID i stedet for andre elementer i klyngen for å identifisere den?\n",
"\n",
"### Komme i gang med clustering\n",
"\n",
"> 🎓 Hvordan vi lager klynger har mye å gjøre med hvordan vi samler datapunktene i grupper. La oss se nærmere på noen begreper:\n",
">\n",
"> 🎓 ['Transduktiv' vs. 'induktiv'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transduktiv inferens er avledet fra observerte treningsdata som kartlegges til spesifikke testdata. Induktiv inferens er avledet fra treningsdata som kartlegges til generelle regler som deretter brukes på testdata.\n",
">\n",
"> Et eksempel: Tenk deg at du har et datasett som bare er delvis merket. Noen ting er 'plater', noen 'CD-er', og noen er blanke. Oppgaven din er å gi etiketter til de blanke. Hvis du velger en induktiv tilnærming, vil du trene en modell for å finne 'plater' og 'CD-er' og bruke disse etikettene på de umerkede dataene. Denne tilnærmingen vil ha problemer med å klassifisere ting som faktisk er 'kassetter'. En transduktiv tilnærming håndterer derimot ukjente data mer effektivt ved å gruppere lignende elementer sammen og deretter tildele en etikett til en gruppe. I dette tilfellet kan klynger reflektere 'runde musikalske ting' og 'firkantede musikalske ting'.\n",
">\n",
"> 🎓 ['Ikke-flat' vs. 'flat' geometri](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Avledet fra matematisk terminologi refererer ikke-flat vs. flat geometri til måling av avstander mellom punkter ved enten 'flat' ([Euklidsk](https://wikipedia.org/wiki/Euclidean_geometry)) eller 'ikke-flat' (ikke-Euklidsk) geometriske metoder.\n",
">\n",
"> 'Flat' i denne sammenhengen refererer til Euklidsk geometri (deler av dette læres som 'plan' geometri), og ikke-flat refererer til ikke-Euklidsk geometri. Hva har geometri med maskinlæring å gjøre? Vel, som to felt som er forankret i matematikk, må det finnes en felles måte å måle avstander mellom punkter i klynger, og det kan gjøres på en 'flat' eller 'ikke-flat' måte, avhengig av dataens natur. [Euklidske avstander](https://wikipedia.org/wiki/Euclidean_distance) måles som lengden på en linjesegment mellom to punkter. [Ikke-Euklidske avstander](https://wikipedia.org/wiki/Non-Euclidean_geometry) måles langs en kurve. Hvis dataene dine, visualisert, ikke ser ut til å eksistere på et plan, kan det hende du må bruke en spesialisert algoritme for å håndtere det.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografikk av Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Avstander'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Klynger defineres av deres avstandsmatrise, f.eks. avstandene mellom punkter. Denne avstanden kan måles på flere måter. Euklidske klynger defineres av gjennomsnittet av punktverdiene og inneholder et 'sentroid' eller midtpunkt. Avstander måles dermed som avstanden til dette sentroidet. Ikke-Euklidske avstander refererer til 'clustroids', punktet nærmest andre punkter. Clustroids kan igjen defineres på ulike måter.\n",
">\n",
"> 🎓 ['Begrenset'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Begrenset clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introduserer 'semi-supervisert' læring i denne usuperviserte metoden. Forholdene mellom punkter flagges som 'kan ikke kobles' eller 'må kobles', slik at noen regler tvinges på datasettet.\n",
">\n",
"> Et eksempel: Hvis en algoritme får frie tøyler på et parti umerkede eller semi-merkede data, kan klyngene den produserer være av dårlig kvalitet. I eksempelet ovenfor kan klyngene gruppere 'runde musikalske ting', 'firkantede musikalske ting', 'trekantede ting' og 'kjeks'. Hvis algoritmen gis noen begrensninger eller regler å følge (\"elementet må være laget av plast\", \"elementet må kunne produsere musikk\"), kan dette hjelpe med å 'begrense' algoritmen til å ta bedre valg.\n",
">\n",
"> 🎓 'Tetthet'\n",
">\n",
"> Data som er 'støyete' anses å være 'tett'. Avstandene mellom punktene i hver av klyngene kan vise seg, ved undersøkelse, å være mer eller mindre tette, eller 'trange', og dermed må disse dataene analyseres med en passende clustering-metode. [Denne artikkelen](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) viser forskjellen mellom å bruke K-Means clustering og HDBSCAN-algoritmer for å utforske et støyete datasett med ujevn klyngetetthet.\n",
"\n",
"Fordyp deg i clustering-teknikker i denne [Learn-modulen](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Clustering-algoritmer**\n",
"\n",
"Det finnes over 100 clustering-algoritmer, og bruken avhenger av dataens natur. La oss diskutere noen av de viktigste:\n",
"\n",
"- **Hierarkisk clustering**. Hvis et objekt klassifiseres basert på dets nærhet til et nærliggende objekt, snarere enn til et som er lenger unna, dannes klynger basert på medlemmenes avstand til og fra andre objekter. Hierarkisk clustering kjennetegnes ved gjentatte kombinasjoner av to klynger.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografikk av Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Sentroid clustering**. Denne populære algoritmen krever at man velger 'k', eller antall klynger som skal dannes, hvoretter algoritmen bestemmer midtpunktet i en klynge og samler data rundt dette punktet. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) er en populær versjon av sentroid clustering som deler et datasett i forhåndsdefinerte K-grupper. Midtpunktet bestemmes av nærmeste gjennomsnitt, derav navnet. Den kvadrerte avstanden fra klyngen minimeres.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografikk av Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Distribusjonsbasert clustering**. Basert på statistisk modellering fokuserer distribusjonsbasert clustering på å bestemme sannsynligheten for at et datapunkt tilhører en klynge, og tildele det deretter. Gaussian mixture-metoder tilhører denne typen.\n",
"\n",
"- **Tetthetsbasert clustering**. Datapunkter tildeles klynger basert på deres tetthet, eller deres gruppering rundt hverandre. Datapunkter langt fra gruppen anses som uteliggere eller støy. DBSCAN, Mean-shift og OPTICS tilhører denne typen clustering.\n",
"\n",
"- **Rutenettbasert clustering**. For flerdimensjonale datasett opprettes et rutenett, og dataene deles mellom rutenettets celler, og danner dermed klynger.\n",
"\n",
"Den beste måten å lære om clustering på er å prøve det selv, og det er nettopp det du skal gjøre i denne øvelsen.\n",
"\n",
"Vi trenger noen pakker for å komme i gang med denne modulen. Du kan installere dem slik: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternativt kan skriptet nedenfor sjekke om du har de nødvendige pakkene for å fullføre denne modulen og installere dem for deg hvis noen mangler.\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": [
"## Øvelse - klustrer dataene dine\n",
"\n",
"Klustring som teknikk blir sterkt forbedret av riktig visualisering, så la oss komme i gang med å visualisere musikkdataene våre. Denne øvelsen vil hjelpe oss med å avgjøre hvilken metode for klustring vi mest effektivt bør bruke for denne typen data.\n",
"\n",
"La oss sette i gang ved å importere dataene.\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": [
"Noen ganger ønsker vi kanskje litt mer informasjon om dataene våre. Vi kan se på `data` og `strukturen deres` ved å bruke [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html)-funksjonen:\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": [
"Bra jobba!💪\n",
"\n",
"Vi kan se at `glimpse()` gir deg totalt antall rader (observasjoner) og kolonner (variabler), og deretter de første få oppføringene av hver variabel på en rad etter variabelnavnet. I tillegg vises *datatypen* til variabelen umiddelbart etter variabelnavnet innenfor `< >`.\n",
"\n",
"`DataExplorer::introduce()` kan oppsummere denne informasjonen på en ryddig måte:\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": [
"Fantastisk! Vi har nettopp lært at dataene våre ikke har noen manglende verdier.\n",
"\n",
"Mens vi er i gang, kan vi utforske vanlige statistikker for sentral tendens (f.eks. [gjennomsnitt](https://en.wikipedia.org/wiki/Arithmetic_mean) og [median](https://en.wikipedia.org/wiki/Median)) og spredningsmål (f.eks. [standardavvik](https://en.wikipedia.org/wiki/Standard_deviation)) ved å bruke `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": [
"La oss se på de generelle verdiene i dataene. Merk at popularitet kan være `0`, som viser sanger uten rangering. Vi fjerner disse snart.\n",
"\n",
"> 🤔 Hvis vi jobber med klynging, en usupervisert metode som ikke krever merkede data, hvorfor viser vi da disse dataene med etiketter? I utforskningsfasen av dataene er de nyttige, men de er ikke nødvendige for at klyngealgoritmene skal fungere.\n",
"\n",
"### 1. Utforsk populære sjangre\n",
"\n",
"La oss finne ut hvilke sjangre 🎶 som er mest populære ved å telle hvor ofte de forekommer.\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": [
"Det gikk bra! De sier at et bilde er verdt tusen rader i en data frame (egentlig sier ingen det 😅). Men du skjønner poenget, ikke sant?\n",
"\n",
"En måte å visualisere kategoriske data (tekst- eller faktorvariabler) på er ved å bruke stolpediagrammer. La oss lage et stolpediagram av de 10 mest populære sjangrene:\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å er det mye enklere å identifisere at vi har `manglende` sjangre 🧐!\n",
"\n",
"> En god visualisering vil vise deg ting du ikke forventet, eller vekke nye spørsmål om dataene - Hadley Wickham og Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Merk, når den øverste sjangeren er beskrevet som `Manglende`, betyr det at Spotify ikke har klassifisert den, så la oss fjerne den.\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": [
"Fra den lille datautforskningen lærer vi at de tre mest populære sjangrene dominerer dette datasettet. La oss fokusere på `afro dancehall`, `afropop` og `nigerian pop`, og i tillegg filtrere datasettet for å fjerne alt med en popularitetsverdi på 0 (som betyr at det ikke ble klassifisert med en popularitet i datasettet og kan anses som støy for våre formål):\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": [
"La oss undersøke om det finnes noen tydelig lineær sammenheng mellom de numeriske variablene i datasettet vårt. Denne sammenhengen kvantifiseres matematisk ved [korrelasjonsstatistikken](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Korrelasjonsstatistikken er en verdi mellom -1 og 1 som indikerer styrken av en sammenheng. Verdier over 0 indikerer en *positiv* korrelasjon (høye verdier for én variabel har en tendens til å sammenfalle med høye verdier for den andre), mens verdier under 0 indikerer en *negativ* korrelasjon (høye verdier for én variabel har en tendens til å sammenfalle med lave verdier for den andre).\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": [
"Dataene er ikke sterkt korrelert, bortsett fra mellom `energy` og `loudness`, noe som gir mening, ettersom høy musikk vanligvis er ganske energisk. `Popularity` har en sammenheng med `release date`, noe som også gir mening, siden nyere sanger sannsynligvis er mer populære. Lengde og energi ser også ut til å ha en korrelasjon.\n",
"\n",
"Det blir interessant å se hva en klyngingsalgoritme kan få ut av disse dataene!\n",
"\n",
"> 🎓 Merk at korrelasjon ikke innebærer årsakssammenheng! Vi har bevis på korrelasjon, men ingen bevis på årsakssammenheng. Et [morsomt nettsted](https://tylervigen.com/spurious-correlations) har noen visualiseringer som understreker dette poenget.\n",
"\n",
"### 2. Utforsk datadistribusjon\n",
"\n",
"La oss stille noen mer subtile spørsmål. Er sjangrene betydelig forskjellige i oppfatningen av deres dansbarhet, basert på deres popularitet? La oss undersøke datadistribusjonen for våre tre mest populære sjangre når det gjelder popularitet og dansbarhet langs en gitt x- og y-akse ved hjelp av [tetthetsgrafer](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": [
"Vi ser at det er konsentriske sirkler som stemmer overens, uavhengig av sjanger. Kan det være at nigerianske preferanser møtes på et visst nivå av dansbarhet for denne sjangeren?\n",
"\n",
"Generelt sett er de tre sjangrene på linje når det gjelder popularitet og dansbarhet. Å identifisere klynger i disse løst tilpassede dataene vil være en utfordring. La oss se om et spredningsdiagram kan støtte dette.\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": [
"Et spredningsdiagram av de samme aksene viser et lignende mønster av konvergens.\n",
"\n",
"Generelt, for klynging, kan du bruke spredningsdiagrammer for å vise klynger av data, så det å mestre denne typen visualisering er veldig nyttig. I neste leksjon vil vi ta disse filtrerte dataene og bruke k-means klynging for å oppdage grupper i disse dataene som ser ut til å overlappe på interessante måter.\n",
"\n",
"## **🚀 Utfordring**\n",
"\n",
"Som forberedelse til neste leksjon, lag et diagram over de ulike klyngingsalgoritmene du kan oppdage og bruke i et produksjonsmiljø. Hvilke typer problemer prøver klyngingen å løse?\n",
"\n",
"## [**Quiz etter leksjonen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Gjennomgang & Selvstudium**\n",
"\n",
"Før du bruker klyngingsalgoritmer, som vi har lært, er det en god idé å forstå naturen til datasettet ditt. Les mer om dette emnet [her](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Fordyp deg i klyngingsteknikker:\n",
"\n",
"- [Tren og evaluer klyngingsmodeller ved hjelp av Tidymodels og venner](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",
"## **Oppgave**\n",
"\n",
"[Undersøk andre visualiseringer for klynging](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## TAKK TIL:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) for å ha laget den originale Python-versjonen av dette modulen ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) for å ha laget de fantastiske illustrasjonene som gjør maskinlæringskonsepter mer forståelige og enklere å forstå.\n",
"\n",
"Lykke til med læringen,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\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-06T12:12:25+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "no"
}
},
"nbformat": 4,
"nbformat_minor": 1
}