{ "cells": [ { "cell_type": "markdown", "source": [ "## **Nigeriaanse muziek verzameld van Spotify - een analyse**\n", "\n", "Clustering is een type [Ongecontroleerd Leren](https://wikipedia.org/wiki/Unsupervised_learning) dat ervan uitgaat dat een dataset niet gelabeld is of dat de invoer niet gekoppeld is aan vooraf gedefinieerde uitkomsten. Het gebruikt verschillende algoritmen om door niet-gelabelde gegevens te sorteren en groeperingen te maken op basis van patronen die het in de gegevens herkent.\n", "\n", "[**Quiz voorafgaand aan de les**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **Introductie**\n", "\n", "[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) is erg nuttig voor data-exploratie. Laten we kijken of het kan helpen trends en patronen te ontdekken in de manier waarop Nigeriaanse luisteraars muziek consumeren.\n", "\n", "> โœ… Neem een minuut de tijd om na te denken over de toepassingen van clustering. In het dagelijks leven gebeurt clustering bijvoorbeeld wanneer je een stapel wasgoed hebt en de kleding van je gezinsleden moet sorteren ๐Ÿงฆ๐Ÿ‘•๐Ÿ‘–๐Ÿฉฒ. In data science gebeurt clustering wanneer je probeert de voorkeuren van een gebruiker te analyseren of de kenmerken van een niet-gelabelde dataset te bepalen. Clustering helpt op een bepaalde manier om chaos te ordenen, zoals een sokkenla.\n", "\n", "In een professionele omgeving kan clustering worden gebruikt om zaken zoals marktsegmentatie te bepalen, bijvoorbeeld welke leeftijdsgroepen welke producten kopen. Een andere toepassing is het detecteren van afwijkingen, bijvoorbeeld om fraude op te sporen in een dataset van creditcardtransacties. Of je kunt clustering gebruiken om tumoren te identificeren in een reeks medische scans.\n", "\n", "โœ… Denk een minuut na over hoe je clustering 'in het wild' bent tegengekomen, bijvoorbeeld in een bank-, e-commerce- of zakelijke omgeving.\n", "\n", "> ๐ŸŽ“ Interessant genoeg is clusteranalyse ontstaan in de vakgebieden antropologie en psychologie in de jaren 1930. Kun je je voorstellen hoe het toen werd gebruikt?\n", "\n", "Een andere toepassing zou kunnen zijn het groeperen van zoekresultaten - bijvoorbeeld op winkelpagina's, afbeeldingen of recensies. Clustering is nuttig wanneer je een grote dataset hebt die je wilt verkleinen en waarop je meer gedetailleerde analyses wilt uitvoeren. De techniek kan worden gebruikt om meer te leren over gegevens voordat andere modellen worden gebouwd.\n", "\n", "โœ… Zodra je gegevens zijn georganiseerd in clusters, wijs je ze een cluster-ID toe. Deze techniek kan nuttig zijn om de privacy van een dataset te behouden; je kunt in plaats daarvan verwijzen naar een datapunt via zijn cluster-ID, in plaats van via meer onthullende identificeerbare gegevens. Kun je andere redenen bedenken waarom je een cluster-ID zou gebruiken in plaats van andere elementen van het cluster om het te identificeren?\n", "\n", "### Aan de slag met clustering\n", "\n", "> ๐ŸŽ“ Hoe we clusters maken, heeft veel te maken met hoe we de datapunten in groepen verzamelen. Laten we wat terminologie uitpakken:\n", ">\n", "> ๐ŸŽ“ ['Transductief' vs. 'inductief'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> Transductieve inferentie is afgeleid van waargenomen trainingsgevallen die worden gekoppeld aan specifieke testgevallen. Inductieve inferentie is afgeleid van trainingsgevallen die algemene regels opleveren die vervolgens worden toegepast op testgevallen.\n", ">\n", "> Een voorbeeld: Stel je hebt een dataset die slechts gedeeltelijk gelabeld is. Sommige dingen zijn 'platen', sommige 'cd's', en sommige zijn blanco. Jouw taak is om labels toe te voegen aan de blanco items. Als je een inductieve aanpak kiest, train je een model dat zoekt naar 'platen' en 'cd's' en pas je die labels toe op je niet-gelabelde gegevens. Deze aanpak zal moeite hebben om dingen te classificeren die eigenlijk 'cassettes' zijn. Een transductieve aanpak daarentegen behandelt deze onbekende gegevens effectiever door vergelijkbare items samen te groeperen en vervolgens een label toe te passen op een groep. In dit geval kunnen clusters 'ronde muziekdingen' en 'vierkante muziekdingen' weerspiegelen.\n", ">\n", "> ๐ŸŽ“ ['Niet-vlakke' vs. 'vlakke' geometrie](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> Afgeleid van wiskundige terminologie verwijst niet-vlakke vs. vlakke geometrie naar het meten van afstanden tussen punten door middel van 'vlakke' ([Euclidische](https://wikipedia.org/wiki/Euclidean_geometry)) of 'niet-vlakke' (niet-Euclidische) geometrische methoden.\n", ">\n", "> 'Vlak' in deze context verwijst naar Euclidische geometrie (delen hiervan worden onderwezen als 'platte' geometrie), en niet-vlak verwijst naar niet-Euclidische geometrie. Wat heeft geometrie te maken met machine learning? Nou, als twee vakgebieden die geworteld zijn in wiskunde, moet er een gemeenschappelijke manier zijn om afstanden tussen punten in clusters te meten, en dat kan op een 'vlakke' of 'niet-vlakke' manier, afhankelijk van de aard van de gegevens. [Euclidische afstanden](https://wikipedia.org/wiki/Euclidean_distance) worden gemeten als de lengte van een lijnsegment tussen twee punten. [Niet-Euclidische afstanden](https://wikipedia.org/wiki/Non-Euclidean_geometry) worden gemeten langs een curve. Als je gegevens, gevisualiseerd, niet op een vlak lijken te bestaan, moet je mogelijk een gespecialiseerd algoritme gebruiken om ze te verwerken.\n", "\n", "

\n", " \n", "

Infographic door Dasani Madipalli
\n", "\n", "\n", "\n", "> ๐ŸŽ“ ['Afstanden'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> Clusters worden gedefinieerd door hun afstandsmatrix, bijvoorbeeld de afstanden tussen punten. Deze afstand kan op verschillende manieren worden gemeten. Euclidische clusters worden gedefinieerd door het gemiddelde van de puntwaarden en bevatten een 'centroid' of middelpunt. Afstanden worden dus gemeten door de afstand tot dat middelpunt. Niet-Euclidische afstanden verwijzen naar 'clustroids', het punt dat het dichtst bij andere punten ligt. Clustroids kunnen op verschillende manieren worden gedefinieerd.\n", ">\n", "> ๐ŸŽ“ ['Beperkt'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> [Beperkte clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introduceert 'semi-gecontroleerd' leren in deze ongecontroleerde methode. De relaties tussen punten worden gemarkeerd als 'kan niet koppelen' of 'moet koppelen', zodat enkele regels worden opgelegd aan de dataset.\n", ">\n", "> Een voorbeeld: Als een algoritme wordt losgelaten op een batch niet-gelabelde of semi-gelabelde gegevens, kunnen de clusters die het produceert van slechte kwaliteit zijn. In het bovenstaande voorbeeld kunnen de clusters 'ronde muziekdingen', 'vierkante muziekdingen', 'driehoekige dingen' en 'koekjes' groeperen. Als er enkele beperkingen of regels worden opgelegd (\"het item moet van plastic zijn\", \"het item moet muziek kunnen produceren\"), kan dit helpen om het algoritme te 'beperken' om betere keuzes te maken.\n", ">\n", "> ๐ŸŽ“ 'Dichtheid'\n", ">\n", "> Gegevens die 'ruis' bevatten, worden beschouwd als 'dicht'. De afstanden tussen punten in elk van zijn clusters kunnen bij nader onderzoek meer of minder dicht, of 'geconcentreerd' blijken te zijn, en deze gegevens moeten worden geanalyseerd met de juiste clusteringmethode. [Dit artikel](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) laat het verschil zien tussen het gebruik van K-Means clustering en HDBSCAN-algoritmen om een ruisachtige dataset met ongelijke clusterdichtheid te verkennen.\n", "\n", "Verdiep je begrip van clusteringtechnieken in deze [Learn-module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n", "\n", "### **Clustering-algoritmen**\n", "\n", "Er zijn meer dan 100 clustering-algoritmen, en het gebruik ervan hangt af van de aard van de gegevens. Laten we enkele belangrijke bespreken:\n", "\n", "- **Hiรซrarchische clustering**. Als een object wordt geclassificeerd op basis van zijn nabijheid tot een nabijgelegen object, in plaats van tot een verder verwijderd object, worden clusters gevormd op basis van de afstand van hun leden tot en van andere objecten. Hiรซrarchische clustering wordt gekenmerkt door het herhaaldelijk combineren van twee clusters.\n", "\n", "\n", "

\n", " \n", "

Infographic door Dasani Madipalli
\n", "\n", "\n", "\n", "- **Centroid clustering**. Dit populaire algoritme vereist de keuze van 'k', of het aantal clusters dat moet worden gevormd, waarna het algoritme het middelpunt van een cluster bepaalt en gegevens rond dat punt verzamelt. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) is een populaire versie van centroid clustering die een dataset scheidt in vooraf gedefinieerde K-groepen. Het middelpunt wordt bepaald door het dichtstbijzijnde gemiddelde, vandaar de naam. De kwadratische afstand tot het cluster wordt geminimaliseerd.\n", "\n", "

\n", " \n", "

Infographic door Dasani Madipalli
\n", "\n", "\n", "\n", "- **Distributie-gebaseerde clustering**. Gebaseerd op statistische modellering richt distributie-gebaseerde clustering zich op het bepalen van de waarschijnlijkheid dat een datapunt tot een cluster behoort, en wijst het dienovereenkomstig toe. Gaussiaanse mengmethoden behoren tot dit type.\n", "\n", "- **Dichtheid-gebaseerde clustering**. Datapunten worden toegewezen aan clusters op basis van hun dichtheid, of hun groepering rond elkaar. Datapunten die ver van de groep liggen, worden beschouwd als uitschieters of ruis. DBSCAN, Mean-shift en OPTICS behoren tot dit type clustering.\n", "\n", "- **Raster-gebaseerde clustering**. Voor multidimensionale datasets wordt een raster gemaakt en worden de gegevens verdeeld over de cellen van het raster, waardoor clusters ontstaan.\n", "\n", "De beste manier om meer te leren over clustering is door het zelf te proberen, en dat is precies wat je in deze oefening gaat doen.\n", "\n", "We hebben enkele pakketten nodig om dit onderdeel af te ronden. Je kunt ze installeren met: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "Alternatief controleert het onderstaande script of je de benodigde pakketten hebt om dit onderdeel te voltooien en installeert ze voor je als er pakketten ontbreken.\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": [ "## Oefening - cluster je gegevens\n", "\n", "Clusteren als techniek wordt enorm geholpen door goede visualisatie, dus laten we beginnen met het visualiseren van onze muziekgegevens. Deze oefening zal ons helpen beslissen welke clusteringmethode we het meest effectief kunnen gebruiken voor de aard van deze gegevens.\n", "\n", "Laten we meteen aan de slag gaan door de gegevens te importeren.\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": [ "Soms willen we wat meer informatie over onze data. We kunnen een kijkje nemen naar de `data` en `de structuur ervan` door de [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) functie te gebruiken:\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": [ "Goed gedaan!๐Ÿ’ช\n", "\n", "We kunnen zien dat `glimpse()` je het totale aantal rijen (observaties) en kolommen (variabelen) geeft, gevolgd door de eerste paar waarden van elke variabele in een rij na de variabelenaam. Daarnaast wordt het *datatype* van de variabele direct na de naam van elke variabele weergegeven binnen `< >`.\n", "\n", "`DataExplorer::introduce()` kan deze informatie overzichtelijk samenvatten:\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": [ "Geweldig! We hebben zojuist geleerd dat onze gegevens geen ontbrekende waarden bevatten.\n", "\n", "Nu we toch bezig zijn, kunnen we veelvoorkomende statistieken van centrale tendentie (bijv. [gemiddelde](https://en.wikipedia.org/wiki/Arithmetic_mean) en [mediaan](https://en.wikipedia.org/wiki/Median)) en spreidingsmaten (bijv. [standaarddeviatie](https://en.wikipedia.org/wiki/Standard_deviation)) verkennen met behulp van `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": [ "Laten we de algemene waarden van de gegevens bekijken. Let op dat populariteit `0` kan zijn, wat aangeeft dat nummers geen ranking hebben. We zullen deze binnenkort verwijderen.\n", "\n", "> ๐Ÿค” Als we werken met clustering, een onbegeleide methode die geen gelabelde gegevens vereist, waarom tonen we deze gegevens dan met labels? In de fase van gegevensverkenning zijn ze handig, maar ze zijn niet noodzakelijk voor het functioneren van clustering-algoritmen.\n", "\n", "### 1. Verken populaire genres\n", "\n", "Laten we ontdekken wat de meest populaire genres ๐ŸŽถ zijn door het aantal keren dat ze voorkomen te tellen.\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": [ "Dat ging goed! Ze zeggen dat een afbeelding meer waard is dan duizend rijen van een data frame (eigenlijk zegt niemand dat ๐Ÿ˜…). Maar je snapt het idee, toch?\n", "\n", "Een manier om categorische data (karakter- of factorvariabelen) te visualiseren is met staafdiagrammen. Laten we een staafdiagram maken van de top 10 genres:\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 is het veel makkelijker om te zien dat we `ontbrekende` genres hebben ๐Ÿง!\n", "\n", "> Een goede visualisatie laat je dingen zien die je niet verwachtte, of roept nieuwe vragen op over de data - Hadley Wickham en Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "Let op, wanneer het bovenste genre wordt beschreven als `Ontbrekend`, betekent dit dat Spotify het niet heeft geclassificeerd, dus laten we het verwijderen.\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": [ "Uit de kleine data-exploratie leren we dat de top drie genres dit dataset domineren. Laten we ons concentreren op `afro dancehall`, `afropop` en `nigerian pop`, en daarnaast het dataset filteren om alles met een populariteitswaarde van 0 te verwijderen (wat betekent dat het niet geclassificeerd was met een populariteit in het dataset en voor onze doeleinden als ruis kan worden beschouwd):\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": [ "Laten we kijken of er een duidelijke lineaire relatie is tussen de numerieke variabelen in onze dataset. Deze relatie wordt wiskundig gekwantificeerd door de [correlatiestatistiek](https://en.wikipedia.org/wiki/Correlation).\n", "\n", "De correlatiestatistiek is een waarde tussen -1 en 1 die de sterkte van een relatie aangeeft. Waarden boven 0 duiden op een *positieve* correlatie (hoge waarden van de ene variabele gaan vaak samen met hoge waarden van de andere), terwijl waarden onder 0 wijzen op een *negatieve* correlatie (hoge waarden van de ene variabele gaan vaak samen met lage waarden van de andere).\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": [ "De gegevens zijn niet sterk gecorreleerd, behalve tussen `energy` en `loudness`, wat logisch is, aangezien luide muziek meestal behoorlijk energiek is. `Popularity` heeft een verband met `release date`, wat ook logisch is, omdat recentere nummers waarschijnlijk populairder zijn. Lengte en energie lijken ook een correlatie te hebben.\n", "\n", "Het zal interessant zijn om te zien wat een clustering-algoritme van deze gegevens kan maken!\n", "\n", "> ๐ŸŽ“ Let op dat correlatie geen oorzakelijk verband impliceert! We hebben bewijs van correlatie, maar geen bewijs van causaliteit. Een [grappige website](https://tylervigen.com/spurious-correlations) bevat enkele visuals die dit punt benadrukken.\n", "\n", "### 2. Onderzoek de gegevensverdeling\n", "\n", "Laten we wat subtielere vragen stellen. Zijn de genres significant verschillend in de perceptie van hun dansbaarheid, gebaseerd op hun populariteit? Laten we de gegevensverdeling van onze top drie genres onderzoeken voor populariteit en dansbaarheid langs een gegeven x- en y-as met behulp van [dichtheidsplots](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": [ "We zien dat er concentrische cirkels zijn die op รฉรฉn lijn liggen, ongeacht het genre. Zou het kunnen dat Nigeriaanse smaken op een bepaald niveau van dansbaarheid voor dit genre samenkomen?\n", "\n", "Over het algemeen komen de drie genres overeen in termen van hun populariteit en dansbaarheid. Het bepalen van clusters in deze losjes uitgelijnde gegevens zal een uitdaging zijn. Laten we kijken of een spreidingsdiagram hierbij kan helpen.\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": [ "Een scatterplot van dezelfde assen toont een vergelijkbaar patroon van convergentie.\n", "\n", "Over het algemeen kun je voor clustering scatterplots gebruiken om clusters van data weer te geven, dus het beheersen van dit type visualisatie is erg nuttig. In de volgende les zullen we deze gefilterde data gebruiken en k-means clustering toepassen om groepen in deze data te ontdekken die op interessante manieren lijken samen te vallen.\n", "\n", "## **๐Ÿš€ Uitdaging**\n", "\n", "Ter voorbereiding op de volgende les, maak een diagram over de verschillende clustering-algoritmen die je zou kunnen ontdekken en gebruiken in een productieomgeving. Welke soorten problemen probeert clustering op te lossen?\n", "\n", "## [**Quiz na de les**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **Herziening & Zelfstudie**\n", "\n", "Voordat je clustering-algoritmen toepast, zoals we hebben geleerd, is het een goed idee om de aard van je dataset te begrijpen. Lees meer over dit onderwerp [hier](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n", "\n", "Verdiep je verder in clusteringtechnieken:\n", "\n", "- [Train en evalueer clusteringmodellen met Tidymodels en vrienden](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", "## **Opdracht**\n", "\n", "[Onderzoek andere visualisaties voor clustering](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## DANK AAN:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) voor het maken van de originele Python-versie van deze module โ™ฅ๏ธ\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) voor het maken van de geweldige illustraties die machine learning-concepten beter interpreteerbaar en gemakkelijker te begrijpen maken.\n", "\n", "Veel leerplezier,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\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:11:25+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "nl" } }, "nbformat": 4, "nbformat_minor": 1 }