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

499 lines
29 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": [
"## **Nigerianische Musik von Spotify extrahiert - eine Analyse**\n",
"\n",
"Clustering ist eine Art des [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning), das davon ausgeht, dass ein Datensatz nicht beschriftet ist oder dass seine Eingaben nicht mit vordefinierten Ausgaben übereinstimmen. Es verwendet verschiedene Algorithmen, um unbeschriftete Daten zu sortieren und Gruppierungen basierend auf Mustern zu erstellen, die es in den Daten erkennt.\n",
"\n",
"[**Quiz vor der Vorlesung**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Einleitung**\n",
"\n",
"[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) ist sehr nützlich für die Datenexploration. Schauen wir, ob es dabei helfen kann, Trends und Muster im Musikgeschmack des nigerianischen Publikums zu entdecken.\n",
"\n",
"> ✅ Nehmen Sie sich eine Minute Zeit, um über die Einsatzmöglichkeiten von Clustering nachzudenken. Im Alltag passiert Clustering, wenn Sie einen Wäschehaufen haben und die Kleidung Ihrer Familienmitglieder sortieren müssen 🧦👕👖🩲. In der Datenwissenschaft passiert Clustering, wenn versucht wird, die Vorlieben eines Nutzers zu analysieren oder die Eigenschaften eines unbeschrifteten Datensatzes zu bestimmen. Clustering hilft gewissermaßen, Chaos zu ordnen, wie eine Sockenschublade.\n",
"\n",
"Im beruflichen Umfeld kann Clustering beispielsweise für die Marktsegmentierung verwendet werden, um herauszufinden, welche Altersgruppen welche Artikel kaufen. Ein weiterer Anwendungsfall wäre die Anomalieerkennung, etwa um Betrug in einem Datensatz mit Kreditkartentransaktionen aufzudecken. Oder Sie könnten Clustering verwenden, um Tumore in einer Reihe medizinischer Scans zu identifizieren.\n",
"\n",
"✅ Denken Sie eine Minute darüber nach, wie Sie Clustering „in freier Wildbahn“ erlebt haben könnten, etwa im Bankwesen, E-Commerce oder Geschäftsbereich.\n",
"\n",
"> 🎓 Interessanterweise stammt die Clusteranalyse aus den Bereichen Anthropologie und Psychologie der 1930er Jahre. Können Sie sich vorstellen, wie sie damals eingesetzt wurde?\n",
"\n",
"Alternativ könnten Sie Clustering verwenden, um Suchergebnisse zu gruppieren beispielsweise nach Einkaufslinks, Bildern oder Bewertungen. Clustering ist nützlich, wenn Sie einen großen Datensatz haben, den Sie reduzieren und auf dem Sie eine detailliertere Analyse durchführen möchten. Die Technik kann also genutzt werden, um Daten zu verstehen, bevor andere Modelle erstellt werden.\n",
"\n",
"✅ Sobald Ihre Daten in Clustern organisiert sind, weisen Sie ihnen eine Cluster-ID zu. Diese Technik kann nützlich sein, um die Privatsphäre eines Datensatzes zu wahren; Sie können sich stattdessen auf einen Datenpunkt durch seine Cluster-ID beziehen, anstatt durch aufschlussreichere identifizierbare Daten. Können Sie sich andere Gründe vorstellen, warum Sie sich auf eine Cluster-ID anstelle anderer Elemente des Clusters beziehen würden, um sie zu identifizieren?\n",
"\n",
"### Einstieg ins Clustering\n",
"\n",
"> 🎓 Wie wir Cluster erstellen, hängt stark davon ab, wie wir die Datenpunkte in Gruppen zusammenfassen. Lassen Sie uns einige Begriffe klären:\n",
">\n",
"> 🎓 ['Transduktiv' vs. 'induktiv'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transduktive Inferenz wird aus beobachteten Trainingsfällen abgeleitet, die auf spezifische Testfälle abgebildet werden. Induktive Inferenz wird aus Trainingsfällen abgeleitet, die auf allgemeine Regeln abgebildet werden, die dann auf Testfälle angewendet werden.\n",
">\n",
"> Ein Beispiel: Stellen Sie sich vor, Sie haben einen Datensatz, der nur teilweise beschriftet ist. Einige Dinge sind „Schallplatten“, einige „CDs“ und einige sind leer. Ihre Aufgabe ist es, die leeren Felder zu beschriften. Wenn Sie einen induktiven Ansatz wählen, würden Sie ein Modell trainieren, das nach „Schallplatten“ und „CDs“ sucht, und diese Beschriftungen auf Ihre unbeschrifteten Daten anwenden. Dieser Ansatz hätte Schwierigkeiten, Dinge zu klassifizieren, die tatsächlich „Kassetten“ sind. Ein transduktiver Ansatz hingegen geht mit diesen unbekannten Daten effektiver um, da er ähnliche Elemente gruppiert und dann einer Gruppe ein Label zuweist. In diesem Fall könnten Cluster „runde Musikdinge“ und „eckige Musikdinge“ widerspiegeln.\n",
">\n",
"> 🎓 ['Nicht-flache' vs. 'flache' Geometrie](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Abgeleitet aus der mathematischen Terminologie, bezieht sich nicht-flache vs. flache Geometrie auf die Messung von Abständen zwischen Punkten entweder durch „flache“ ([euklidische](https://wikipedia.org/wiki/Euclidean_geometry)) oder „nicht-flache“ (nicht-euklidische) geometrische Methoden.\n",
">\n",
"> „Flach“ bezieht sich in diesem Kontext auf die euklidische Geometrie (Teile davon werden als „Ebene Geometrie“ gelehrt), und nicht-flach auf die nicht-euklidische Geometrie. Was hat Geometrie mit maschinellem Lernen zu tun? Nun, als zwei Felder, die in der Mathematik verwurzelt sind, muss es eine gemeinsame Methode geben, um Abstände zwischen Punkten in Clustern zu messen, und das kann auf eine „flache“ oder „nicht-flache“ Weise geschehen, abhängig von der Natur der Daten. [Euklidische Abstände](https://wikipedia.org/wiki/Euclidean_distance) werden als die Länge eines Liniensegments zwischen zwei Punkten gemessen. [Nicht-euklidische Abstände](https://wikipedia.org/wiki/Non-Euclidean_geometry) werden entlang einer Kurve gemessen. Wenn Ihre Daten, visualisiert, nicht auf einer Ebene zu existieren scheinen, müssen Sie möglicherweise einen spezialisierten Algorithmus verwenden, um sie zu verarbeiten.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik von Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Abstände'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Cluster werden durch ihre Distanzmatrix definiert, z. B. die Abstände zwischen Punkten. Diese Abstände können auf verschiedene Weise gemessen werden. Euklidische Cluster werden durch den Durchschnitt der Punktwerte definiert und enthalten einen „Zentroid“ oder Mittelpunkt. Abstände werden somit durch die Entfernung zu diesem Zentroid gemessen. Nicht-euklidische Abstände beziehen sich auf „Clustroids“, den Punkt, der anderen Punkten am nächsten liegt. Clustroids können wiederum auf verschiedene Arten definiert werden.\n",
">\n",
"> 🎓 ['Eingeschränkt'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Eingeschränktes Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) führt „semi-supervised“ Lernen in diese unüberwachte Methode ein. Die Beziehungen zwischen Punkten werden als „kann nicht verknüpft werden“ oder „muss verknüpft werden“ markiert, sodass einige Regeln auf den Datensatz angewendet werden.\n",
">\n",
"> Ein Beispiel: Wenn ein Algorithmus auf einen Stapel unbeschrifteter oder halb beschrifteter Daten losgelassen wird, könnten die Cluster, die er erzeugt, von schlechter Qualität sein. In dem obigen Beispiel könnten die Cluster „runde Musikdinge“, „eckige Musikdinge“, „dreieckige Dinge“ und „Kekse“ gruppieren. Wenn einige Einschränkungen oder Regeln vorgegeben werden („das Element muss aus Plastik sein“, „das Element muss Musik produzieren können“), kann dies helfen, den Algorithmus zu besseren Entscheidungen zu führen.\n",
">\n",
"> 🎓 'Dichte'\n",
">\n",
"> Daten, die „rauschhaft“ sind, werden als „dicht“ betrachtet. Die Abstände zwischen Punkten in jedem ihrer Cluster können sich bei der Untersuchung als mehr oder weniger dicht oder „gedrängt“ erweisen, und daher müssen diese Daten mit der geeigneten Clustering-Methode analysiert werden. [Dieser Artikel](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) zeigt den Unterschied zwischen der Verwendung von K-Means-Clustering und HDBSCAN-Algorithmen zur Untersuchung eines rauschhaften Datensatzes mit ungleichmäßiger Clusterdichte.\n",
"\n",
"Vertiefen Sie Ihr Verständnis von Clustering-Techniken in diesem [Learn-Modul](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
"\n",
"### **Clustering-Algorithmen**\n",
"\n",
"Es gibt über 100 Clustering-Algorithmen, und ihre Verwendung hängt von der Art der vorliegenden Daten ab. Lassen Sie uns einige der wichtigsten besprechen:\n",
"\n",
"- **Hierarchisches Clustering**. Wenn ein Objekt basierend auf seiner Nähe zu einem nahegelegenen Objekt klassifiziert wird, anstatt zu einem weiter entfernten, werden Cluster basierend auf den Abständen ihrer Mitglieder zu anderen Objekten gebildet. Hierarchisches Clustering zeichnet sich dadurch aus, dass zwei Cluster wiederholt kombiniert werden.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik von Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Zentroid-Clustering**. Dieser beliebte Algorithmus erfordert die Wahl von „k“, oder der Anzahl der zu bildenden Cluster, wonach der Algorithmus den Mittelpunkt eines Clusters bestimmt und Daten um diesen Punkt sammelt. [K-Means-Clustering](https://wikipedia.org/wiki/K-means_clustering) ist eine beliebte Version des Zentroid-Clustering, die einen Datensatz in vordefinierte K-Gruppen unterteilt. Der Mittelpunkt wird durch den nächstgelegenen Mittelwert bestimmt, daher der Name. Der quadrierte Abstand vom Cluster wird minimiert.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Infografik von Dasani Madipalli</figcaption>\n",
"\n",
"\n",
"\n",
"- **Verteilungsbasiertes Clustering**. Basierend auf statistischen Modellen konzentriert sich das verteilungsbasierte Clustering darauf, die Wahrscheinlichkeit zu bestimmen, dass ein Datenpunkt zu einem Cluster gehört, und ihn entsprechend zuzuweisen. Gaussian-Mischmethoden gehören zu diesem Typ.\n",
"\n",
"- **Dichtebasiertes Clustering**. Datenpunkte werden basierend auf ihrer Dichte oder ihrer Gruppierung um andere Punkte herum Clustern zugewiesen. Datenpunkte, die weit von der Gruppe entfernt sind, werden als Ausreißer oder Rauschen betrachtet. DBSCAN, Mean-Shift und OPTICS gehören zu diesem Typ des Clustering.\n",
"\n",
"- **Rasterbasiertes Clustering**. Für mehrdimensionale Datensätze wird ein Raster erstellt, und die Daten werden auf die Zellen des Rasters verteilt, wodurch Cluster entstehen.\n",
"\n",
"Der beste Weg, Clustering zu lernen, ist, es selbst auszuprobieren. Genau das werden Sie in dieser Übung tun.\n",
"\n",
"Wir benötigen einige Pakete, um dieses Modul abzuschließen. Sie können sie wie folgt installieren: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternativ überprüft das folgende Skript, ob Sie die für dieses Modul erforderlichen Pakete haben, und installiert sie für Sie, falls einige fehlen.\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": [
"## Übung - Daten clustern\n",
"\n",
"Clustering als Technik wird durch eine geeignete Visualisierung erheblich erleichtert, also beginnen wir damit, unsere Musikdaten zu visualisieren. Diese Übung wird uns helfen zu entscheiden, welche der Clustering-Methoden wir am effektivsten für die Art dieser Daten verwenden sollten.\n",
"\n",
"Legen wir direkt los und importieren die Daten.\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": [
"Manchmal möchten wir etwas mehr Informationen über unsere Daten erhalten. Wir können uns die `Daten` und `deren Struktur` mit der Funktion [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) ansehen:\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": [
"Gute Arbeit!💪\n",
"\n",
"Wir können sehen, dass `glimpse()` die Gesamtanzahl der Zeilen (Beobachtungen) und Spalten (Variablen) anzeigt, gefolgt von den ersten Einträgen jeder Variable in einer Zeile nach dem Variablennamen. Zusätzlich wird der *Datentyp* der Variable direkt nach dem Variablennamen in `< >` angegeben.\n",
"\n",
"`DataExplorer::introduce()` kann diese Informationen übersichtlich zusammenfassen:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Super! Wir haben gerade festgestellt, dass unsere Daten keine fehlenden Werte enthalten.\n",
"\n",
"Während wir dabei sind, können wir gängige Statistiken zur zentralen Tendenz (z. B. [Mittelwert](https://de.wikipedia.org/wiki/Arithmetisches_Mittel) und [Median](https://de.wikipedia.org/wiki/Median)) sowie Streuungsmaße (z. B. [Standardabweichung](https://de.wikipedia.org/wiki/Standardabweichung)) mit `summarytools::descr()` untersuchen.\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": [
"Schauen wir uns die allgemeinen Werte der Daten an. Beachten Sie, dass die Beliebtheit `0` sein kann, was Songs ohne Ranking zeigt. Diese werden wir gleich entfernen.\n",
"\n",
"> 🤔 Wenn wir mit Clustering arbeiten, einer unüberwachten Methode, die keine gelabelten Daten benötigt, warum zeigen wir dann diese Daten mit Labels? In der Phase der Datenexploration sind sie hilfreich, aber für die Funktion der Clustering-Algorithmen sind sie nicht notwendig.\n",
"\n",
"### 1. Beliebte Genres erkunden\n",
"\n",
"Lassen Sie uns die beliebtesten Genres 🎶 herausfinden, indem wir die Häufigkeit ihrer Vorkommen zählen.\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": [
"Das hat gut geklappt! Man sagt, ein Bild sagt mehr als tausend Zeilen eines Dataframes (eigentlich sagt das niemand 😅). Aber du verstehst, was ich meine, oder?\n",
"\n",
"Eine Möglichkeit, kategoriale Daten (Zeichen- oder Faktorvariablen) zu visualisieren, ist die Verwendung von Balkendiagrammen. Lass uns ein Balkendiagramm der Top 10 Genres erstellen:\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": [
"Jetzt ist es viel einfacher zu erkennen, dass wir `fehlende` Genres haben 🧐!\n",
"\n",
"> Eine gute Visualisierung zeigt dir Dinge, die du nicht erwartet hast, oder wirft neue Fragen zu den Daten auf - Hadley Wickham und Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Beachte: Wenn das Top-Genre als `Missing` beschrieben wird, bedeutet das, dass Spotify es nicht klassifiziert hat. Also lass uns das entfernen.\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": [
"Aus der kleinen Datenexploration lernen wir, dass die drei führenden Genres dieses Dataset dominieren. Konzentrieren wir uns auf `afro dancehall`, `afropop` und `nigerian pop`, und filtern zusätzlich das Dataset, um alles mit einem Popularitätswert von 0 zu entfernen (das bedeutet, es wurde im Dataset nicht mit einer Popularität klassifiziert und kann für unsere Zwecke als Rauschen betrachtet werden):\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": [
"Lassen Sie uns prüfen, ob es eine offensichtliche lineare Beziehung zwischen den numerischen Variablen in unserem Datensatz gibt. Diese Beziehung wird mathematisch durch die [Korrelationsstatistik](https://en.wikipedia.org/wiki/Correlation) quantifiziert.\n",
"\n",
"Die Korrelationsstatistik ist ein Wert zwischen -1 und 1, der die Stärke einer Beziehung angibt. Werte über 0 weisen auf eine *positive* Korrelation hin (hohe Werte einer Variablen gehen tendenziell mit hohen Werten der anderen einher), während Werte unter 0 auf eine *negative* Korrelation hinweisen (hohe Werte einer Variablen gehen tendenziell mit niedrigen Werten der anderen einher).\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": [
"Die Daten sind nicht stark korreliert, außer zwischen `energy` und `loudness`, was Sinn ergibt, da laute Musik normalerweise ziemlich energiegeladen ist. `Popularity` hat eine Verbindung zu `release date`, was ebenfalls Sinn ergibt, da neuere Songs wahrscheinlich beliebter sind. Länge und Energie scheinen ebenfalls eine Korrelation zu haben.\n",
"\n",
"Es wird interessant sein zu sehen, was ein Clustering-Algorithmus aus diesen Daten machen kann!\n",
"\n",
"> 🎓 Beachten Sie, dass Korrelation keine Kausalität impliziert! Wir haben einen Beweis für Korrelation, aber keinen Beweis für Kausalität. Eine [amüsante Webseite](https://tylervigen.com/spurious-correlations) bietet einige Visualisierungen, die diesen Punkt verdeutlichen.\n",
"\n",
"### 2. Verteilung der Daten erkunden\n",
"\n",
"Lassen Sie uns einige subtilere Fragen stellen. Unterscheiden sich die Genres signifikant in ihrer Wahrnehmung der Tanzbarkeit, basierend auf ihrer Beliebtheit? Untersuchen wir die Datenverteilung unserer drei beliebtesten Genres hinsichtlich Beliebtheit und Tanzbarkeit entlang einer gegebenen x- und y-Achse mithilfe von [Dichteplots](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": [
"Wir sehen, dass es konzentrische Kreise gibt, die sich unabhängig vom Genre ausrichten. Könnte es sein, dass sich die nigerianischen Vorlieben bei einem bestimmten Grad an Tanzbarkeit für dieses Genre treffen?\n",
"\n",
"Im Allgemeinen stimmen die drei Genres in Bezug auf ihre Beliebtheit und Tanzbarkeit überein. Es wird eine Herausforderung sein, Cluster in diesen lose ausgerichteten Daten zu identifizieren. Schauen wir, ob ein Streudiagramm dabei helfen kann.\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": [
"Ein Streudiagramm der gleichen Achsen zeigt ein ähnliches Muster der Konvergenz.\n",
"\n",
"Im Allgemeinen können Streudiagramme für das Clustering verwendet werden, um Datencluster darzustellen. Daher ist es sehr nützlich, diese Art der Visualisierung zu beherrschen. In der nächsten Lektion werden wir diese gefilterten Daten verwenden und k-means Clustering einsetzen, um Gruppen in diesen Daten zu entdecken, die auf interessante Weise überlappen.\n",
"\n",
"## **🚀 Herausforderung**\n",
"\n",
"Zur Vorbereitung auf die nächste Lektion erstelle ein Diagramm über die verschiedenen Clustering-Algorithmen, die du möglicherweise entdecken und in einer Produktionsumgebung verwenden könntest. Welche Arten von Problemen versucht das Clustering zu lösen?\n",
"\n",
"## [**Quiz nach der Vorlesung**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Überblick & Selbststudium**\n",
"\n",
"Bevor du Clustering-Algorithmen anwendest, wie wir gelernt haben, ist es eine gute Idee, die Natur deines Datensatzes zu verstehen. Lies mehr zu diesem Thema [hier](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n",
"\n",
"Vertiefe dein Verständnis von Clustering-Techniken:\n",
"\n",
"- [Trainiere und evaluiere Clustering-Modelle mit Tidymodels und Freunden](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",
"## **Aufgabe**\n",
"\n",
"[Recherchiere andere Visualisierungen für Clustering](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## DANKE AN:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) für die Erstellung der ursprünglichen Python-Version dieses Moduls ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) für die Erstellung der großartigen Illustrationen, die maschinelle Lernkonzepte verständlicher und leichter nachvollziehbar machen.\n",
"\n",
"Viel Spaß beim Lernen,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Haftungsausschluss**: \nDieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, weisen wir darauf hin, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.\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-04T02:06:22+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "de"
}
},
"nbformat": 4,
"nbformat_minor": 1
}