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

500 lines
27 KiB

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Nigeriansk musik hämtad från Spotify - en analys**\n",
"\n",
"Klustring är en typ av [Oövervakad inlärning](https://wikipedia.org/wiki/Unsupervised_learning) som förutsätter att en dataset är oetiketterad eller att dess indata inte matchas med fördefinierade utdata. Den använder olika algoritmer för att sortera igenom oetiketterad data och skapa grupper baserat på mönster den identifierar i datan.\n",
"\n",
"[**Quiz före föreläsningen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Introduktion**\n",
"\n",
"[Klustring](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) är mycket användbart för datautforskning. Låt oss se om det kan hjälpa oss att upptäcka trender och mönster i hur nigerianska lyssnare konsumerar musik.\n",
"\n",
"> ✅ Ta en minut och fundera över användningsområden för klustring. I vardagen sker klustring när du har en hög med tvätt och behöver sortera ut familjemedlemmarnas kläder 🧦👕👖🩲. Inom datavetenskap sker klustring när man försöker analysera en användares preferenser eller bestämma egenskaperna hos en oetiketterad dataset. Klustring hjälper på sätt och vis att skapa ordning i kaos, som en strumplåda.\n",
"\n",
"I en professionell miljö kan klustring användas för att bestämma saker som marknadssegmentering, till exempel vilka åldersgrupper som köper vilka produkter. Ett annat användningsområde kan vara att upptäcka avvikelser, kanske för att identifiera bedrägerier i en dataset med kreditkortstransaktioner. Eller så kan du använda klustring för att identifiera tumörer i en samling medicinska skanningar.\n",
"\n",
"✅ Fundera en minut på hur du kan ha stött på klustring \"i det vilda\", inom bank, e-handel eller affärsverksamhet.\n",
"\n",
"> 🎓 Intressant nog har klusteranalys sitt ursprung inom antropologi och psykologi på 1930-talet. Kan du föreställa dig hur det kan ha använts?\n",
"\n",
"Alternativt kan du använda det för att gruppera sökresultat - till exempel shoppinglänkar, bilder eller recensioner. Klustring är användbart när du har en stor dataset som du vill reducera och analysera mer detaljerat, så tekniken kan användas för att förstå data innan andra modeller konstrueras.\n",
"\n",
"✅ När din data är organiserad i kluster tilldelar du den ett kluster-ID, och denna teknik kan vara användbar för att bevara en datasets integritet; du kan istället referera till en datapunkt med dess kluster-ID, snarare än med mer avslöjande identifierbar data. Kan du tänka dig andra anledningar till varför du skulle referera till ett kluster-ID istället för andra element i klustret för att identifiera det?\n",
"\n",
"### Kom igång med klustring\n",
"\n",
"> 🎓 Hur vi skapar kluster har mycket att göra med hur vi samlar datapunkterna i grupper. Låt oss packa upp lite terminologi:\n",
">\n",
"> 🎓 ['Transduktiv' vs. 'induktiv'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transduktiv inferens härleds från observerade träningsfall som kartläggs till specifika testfall. Induktiv inferens härleds från träningsfall som kartläggs till generella regler som sedan tillämpas på testfall.\n",
">\n",
"> Ett exempel: Föreställ dig att du har en dataset som bara är delvis etiketterad. Vissa saker är \"skivor\", vissa \"cd-skivor\" och vissa är tomma. Din uppgift är att tilldela etiketter till de tomma. Om du väljer en induktiv metod skulle du träna en modell som letar efter \"skivor\" och \"cd-skivor\" och tillämpa dessa etiketter på din oetiketterade data. Denna metod skulle ha svårt att klassificera saker som faktiskt är \"kassetter\". En transduktiv metod, å andra sidan, hanterar denna okända data mer effektivt eftersom den arbetar för att gruppera liknande objekt och sedan tilldelar en etikett till en grupp. I detta fall kan kluster reflektera \"runda musikföremål\" och \"fyrkantiga musikföremål\".\n",
">\n",
"> 🎓 ['Icke-platt' vs. 'platt' geometri](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Härstammar från matematisk terminologi, icke-platt vs. platt geometri hänvisar till mätningen av avstånd mellan punkter antingen med \"platt\" ([Euklidisk](https://wikipedia.org/wiki/Euclidean_geometry)) eller \"icke-platt\" (icke-Euklidisk) geometriska metoder.\n",
">\n",
"> \"Platt\" i detta sammanhang hänvisar till Euklidisk geometri (delar av vilken lärs ut som \"plan\" geometri), och icke-platt hänvisar till icke-Euklidisk geometri. Vad har geometri med maskininlärning att göra? Tja, som två områden som är rotade i matematik måste det finnas ett gemensamt sätt att mäta avstånd mellan punkter i kluster, och det kan göras på ett \"platt\" eller \"icke-platt\" sätt, beroende på datans natur. [Euklidiska avstånd](https://wikipedia.org/wiki/Euclidean_distance) mäts som längden på en linjesegment mellan två punkter. [Icke-Euklidiska avstånd](https://wikipedia.org/wiki/Non-Euclidean_geometry) mäts längs en kurva. Om din data, visualiserad, verkar inte existera på en plan, kan du behöva använda en specialiserad algoritm för att hantera den.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik av Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Avstånd'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Kluster definieras av deras avståndsmatris, t.ex. avstånden mellan punkter. Detta avstånd kan mätas på några sätt. Euklidiska kluster definieras av medelvärdet av punktvärdena och innehåller en \"centroid\" eller mittpunkt. Avstånd mäts således genom avståndet till den centroiden. Icke-Euklidiska avstånd hänvisar till \"clustroids\", den punkt som är närmast andra punkter. Clustroids kan i sin tur definieras på olika sätt.\n",
">\n",
"> 🎓 ['Begränsad'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Begränsad klustring](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introducerar \"semi-övervakad\" inlärning i denna oövervakade metod. Relationerna mellan punkter flaggas som \"kan inte länka\" eller \"måste länka\" så att vissa regler tvingas på datasetet.\n",
">\n",
"> Ett exempel: Om en algoritm släpps fri på en samling oetiketterad eller semi-etiketterad data kan klustren den producerar vara av dålig kvalitet. I exemplet ovan kan klustren gruppera \"runda musikföremål\" och \"fyrkantiga musikföremål\" och \"triangulära föremål\" och \"kakor\". Om algoritmen ges vissa begränsningar, eller regler att följa (\"föremålet måste vara gjort av plast\", \"föremålet måste kunna producera musik\") kan detta hjälpa till att \"begränsa\" algoritmen att göra bättre val.\n",
">\n",
"> 🎓 'Densitet'\n",
">\n",
"> Data som är \"brusig\" anses vara \"tät\". Avstånden mellan punkter i varje kluster kan vid undersökning visa sig vara mer eller mindre täta, eller \"trånga\", och denna data behöver analyseras med lämplig klustringsmetod. [Denna artikel](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonstrerar skillnaden mellan att använda K-Means klustring och HDBSCAN-algoritmer för att utforska en brusig dataset med ojämn klusterdensitet.\n",
"\n",
"Fördjupa din förståelse av klustringstekniker i detta [Learn-modul](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Klustringsalgoritmer**\n",
"\n",
"Det finns över 100 klustringsalgoritmer, och deras användning beror på datans natur. Låt oss diskutera några av de viktigaste:\n",
"\n",
"- **Hierarkisk klustring**. Om ett objekt klassificeras baserat på dess närhet till ett närliggande objekt, snarare än till ett längre bort, bildas kluster baserat på medlemmarnas avstånd till och från andra objekt. Hierarkisk klustring kännetecknas av att två kluster upprepade gånger kombineras.\n",
"\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik av Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Centroid-klustring**. Denna populära algoritm kräver valet av \"k\", eller antalet kluster som ska bildas, varefter algoritmen bestämmer mittpunkten för ett kluster och samlar data runt den punkten. [K-means klustring](https://wikipedia.org/wiki/K-means_clustering) är en populär version av centroid-klustring som separerar en dataset i fördefinierade K-grupper. Centret bestäms av det närmaste medelvärdet, därav namnet. Det kvadrerade avståndet från klustret minimeras.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik av Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Fördelningsbaserad klustring**. Baserad på statistisk modellering fokuserar fördelningsbaserad klustring på att bestämma sannolikheten att en datapunkt tillhör ett kluster och tilldelar den därefter. Gaussiska blandningsmetoder tillhör denna typ.\n",
"\n",
"- **Densitetsbaserad klustring**. Datapunkter tilldelas kluster baserat på deras densitet, eller deras gruppering runt varandra. Datapunkter långt från gruppen anses vara avvikelser eller brus. DBSCAN, Mean-shift och OPTICS tillhör denna typ av klustring.\n",
"\n",
"- **Rutbaserad klustring**. För multidimensionella datasets skapas ett rutnät och datan delas upp mellan rutnätets celler, vilket skapar kluster.\n",
"\n",
"Det bästa sättet att lära sig om klustring är att prova det själv, så det är vad du kommer att göra i denna övning.\n",
"\n",
"Vi behöver några paket för att genomföra denna modul. Du kan installera dem med: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternativt kontrollerar skriptet nedan om du har de paket som krävs för att slutföra denna modul och installerar dem åt dig om några saknas.\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": [
"## Övning - klustra din data\n",
"\n",
"Klustring som teknik underlättas mycket av korrekt visualisering, så låt oss börja med att visualisera vår musikdata. Denna övning kommer att hjälpa oss att avgöra vilken av klustringsmetoderna vi bör använda mest effektivt för denna datas natur.\n",
"\n",
"Låt oss sätta igång genom att importera datan.\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": [
"Ibland kan vi vilja ha lite mer information om vår data. Vi kan titta på `data` och `dess struktur` genom att använda funktionen [*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": [
"Bra jobbat!💪\n",
"\n",
"Vi kan se att `glimpse()` visar det totala antalet rader (observationer) och kolumner (variabler), samt de första få värdena för varje variabel i en rad efter variabelns namn. Dessutom anges *datatypen* för variabeln direkt efter variabelns namn inom `< >`.\n",
"\n",
"`DataExplorer::introduce()` kan sammanfatta denna information på ett snyggt sätt:\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": [
"Fantastiskt! Vi har precis fått veta att vår data inte har några saknade värden.\n",
"\n",
"När vi ändå håller på kan vi utforska vanliga mått för central tendens (t.ex. [medelvärde](https://en.wikipedia.org/wiki/Arithmetic_mean) och [median](https://en.wikipedia.org/wiki/Median)) samt spridningsmått (t.ex. [standardavvikelse](https://en.wikipedia.org/wiki/Standard_deviation)) med hjälp av `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": [
"Låt oss titta på de generella värdena i datan. Observera att popularitet kan vara `0`, vilket visar låtar som inte har någon ranking. Vi kommer att ta bort dessa snart.\n",
"\n",
"> 🤔 Om vi arbetar med klustring, en osuperviserad metod som inte kräver märkt data, varför visar vi då denna data med etiketter? Under datautforskningsfasen är de användbara, men de är inte nödvändiga för att klustringsalgoritmerna ska fungera.\n",
"\n",
"### 1. Utforska populära genrer\n",
"\n",
"Låt oss gå vidare och ta reda på de mest populära genrerna 🎶 genom att räkna antalet förekomster.\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 gick bra! De säger att en bild säger mer än tusen rader i en data frame (fast egentligen säger ingen det 😅). Men du förstår poängen, eller hur?\n",
"\n",
"Ett sätt att visualisera kategoriska data (tecken- eller faktorvariabler) är att använda stapeldiagram. Låt oss skapa ett stapeldiagram över de 10 populäraste genrerna:\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": [
"Nu är det mycket enklare att identifiera att vi har `saknade` genrer 🧐!\n",
"\n",
"> En bra visualisering visar dig saker som du inte förväntade dig, eller väcker nya frågor om datan - Hadley Wickham och Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Observera, när den främsta genren beskrivs som `Saknad`, betyder det att Spotify inte har klassificerat den, så låt oss ta bort 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": [
"Från den lilla datautforskningen lär vi oss att de tre främsta genrerna dominerar denna dataset. Låt oss fokusera på `afro dancehall`, `afropop` och `nigerian pop`, och dessutom filtrera datasetet för att ta bort allt med ett popularitetsvärde på 0 (vilket innebär att det inte klassificerades med en popularitet i datasetet och kan betraktas som brus för våra syften):\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": [
"Låt oss undersöka om det finns någon tydlig linjär relation mellan de numeriska variablerna i vår datamängd. Denna relation kvantifieras matematiskt med [korrelationsstatistiken](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Korrelationsstatistiken är ett värde mellan -1 och 1 som anger styrkan i en relation. Värden över 0 indikerar en *positiv* korrelation (höga värden för en variabel tenderar att sammanfalla med höga värden för den andra), medan värden under 0 indikerar en *negativ* korrelation (höga värden för en variabel tenderar att sammanfalla med låga värden för den andra).\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": [
"Data är inte starkt korrelerad förutom mellan `energy` och `loudness`, vilket är logiskt eftersom hög musik oftast är ganska energisk. `Popularity` har en koppling till `release date`, vilket också är rimligt, eftersom nyare låtar förmodligen är mer populära. Längd och energi verkar också ha en korrelation.\n",
"\n",
"Det ska bli intressant att se vad en klustringsalgoritm kan göra med denna data!\n",
"\n",
"> 🎓 Observera att korrelation inte innebär kausalitet! Vi har bevis på korrelation men inget bevis på kausalitet. En [underhållande webbplats](https://tylervigen.com/spurious-correlations) har några visuella exempel som betonar denna poäng.\n",
"\n",
"### 2. Utforska datadistribution\n",
"\n",
"Låt oss ställa några mer subtila frågor. Är genrerna signifikant olika i uppfattningen av deras dansvänlighet, baserat på deras popularitet? Låt oss undersöka datadistributionen för våra tre främsta genrer när det gäller popularitet och dansvänlighet längs en given x- och y-axel med hjälp av [täthetsdiagram](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 att det finns koncentriska cirklar som stämmer överens, oavsett genre. Kan det vara så att nigerianska smakpreferenser möts vid en viss nivå av dansvänlighet för denna genre?\n",
"\n",
"Generellt sett är de tre genrerna i linje när det gäller deras popularitet och dansvänlighet. Att identifiera kluster i dessa löst sammanhängande data kommer att vara en utmaning. Låt oss se om ett spridningsdiagram kan ge stöd för detta.\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": [
"Ett spridningsdiagram med samma axlar visar ett liknande mönster av konvergens.\n",
"\n",
"Generellt sett, för klustring, kan du använda spridningsdiagram för att visa datakluster, så att bemästra denna typ av visualisering är mycket användbart. I nästa lektion kommer vi att ta denna filtrerade data och använda k-means klustring för att upptäcka grupper i denna data som verkar överlappa på intressanta sätt.\n",
"\n",
"## **🚀 Utmaning**\n",
"\n",
"Som förberedelse inför nästa lektion, skapa ett diagram över de olika klustringsalgoritmer du kan upptäcka och använda i en produktionsmiljö. Vilka typer av problem försöker klustringen lösa?\n",
"\n",
"## [**Quiz efter föreläsningen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Granskning & Självstudier**\n",
"\n",
"Innan du tillämpar klustringsalgoritmer, som vi har lärt oss, är det en bra idé att förstå naturen av din dataset. Läs mer om detta ämne [här](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Fördjupa din förståelse för klustringstekniker:\n",
"\n",
"- [Träna och utvärdera klustringsmodeller med Tidymodels och vänner](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",
"## **Uppgift**\n",
"\n",
"[Utforska andra visualiseringar för klustring](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## TACK TILL:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) för att ha skapat den ursprungliga Python-versionen av denna modul ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) för att ha skapat de fantastiska illustrationerna som gör maskininlärningskoncept mer begripliga och lättare att förstå.\n",
"\n",
"Lycka till med lärandet,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.\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:14:37+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "sv"
}
},
"nbformat": 4,
"nbformat_minor": 1
}