{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_2-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "f3c335f9940cfd76528b3ef918b9b342", "translation_date": "2025-09-04T01:43:23+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "de" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Erstellen eines Regressionsmodells: Daten vorbereiten und visualisieren\n", "\n", "## **Lineare Regression für Kürbisse - Lektion 2**\n", "#### Einführung\n", "\n", "Jetzt, da Sie mit den Werkzeugen ausgestattet sind, die Sie für den Einstieg in den Aufbau von Machine-Learning-Modellen mit Tidymodels und dem Tidyverse benötigen, können Sie beginnen, Fragen an Ihre Daten zu stellen. Wenn Sie mit Daten arbeiten und ML-Lösungen anwenden, ist es äußerst wichtig, zu verstehen, wie man die richtigen Fragen stellt, um das Potenzial Ihres Datensatzes vollständig auszuschöpfen.\n", "\n", "In dieser Lektion lernen Sie:\n", "\n", "- Wie Sie Ihre Daten für den Modellaufbau vorbereiten.\n", "\n", "- Wie Sie `ggplot2` für die Datenvisualisierung nutzen.\n", "\n", "Die Frage, die Sie beantwortet haben möchten, bestimmt, welche Art von ML-Algorithmen Sie verwenden werden. Und die Qualität der Antwort, die Sie erhalten, hängt stark von der Beschaffenheit Ihrer Daten ab.\n", "\n", "Lassen Sie uns dies anhand einer praktischen Übung genauer betrachten.\n", "\n", "

\n", " \n", "

Kunstwerk von @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "Pg5aexcOPqAZ" } }, { "cell_type": "markdown", "source": [ "## 1. Importieren von Kürbisdaten und Aufrufen des Tidyverse\n", "\n", "Wir benötigen die folgenden Pakete, um diese Lektion zu bearbeiten:\n", "\n", "- `tidyverse`: Das [tidyverse](https://www.tidyverse.org/) ist eine [Sammlung von R-Paketen](https://www.tidyverse.org/packages), die darauf ausgelegt ist, Datenwissenschaft schneller, einfacher und unterhaltsamer zu machen!\n", "\n", "Sie können sie wie folgt installieren:\n", "\n", "`install.packages(c(\"tidyverse\"))`\n", "\n", "Das untenstehende Skript überprüft, ob Sie die für dieses Modul benötigten Pakete haben, und installiert sie für Sie, falls einige fehlen.\n" ], "metadata": { "id": "dc5WhyVdXAjR" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n", "pacman::p_load(tidyverse)" ], "outputs": [], "metadata": { "id": "GqPYUZgfXOBt" } }, { "cell_type": "markdown", "source": [ "Lassen Sie uns nun einige Pakete starten und die [Daten](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) laden, die für diese Lektion bereitgestellt wurden!\n" ], "metadata": { "id": "kvjDTPDSXRr2" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core Tidyverse packages\n", "library(tidyverse)\n", "\n", "# Import the pumpkins data\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n", "\n", "\n", "# Get a glimpse and dimensions of the data\n", "glimpse(pumpkins)\n", "\n", "\n", "# Print the first 50 rows of the data set\n", "pumpkins %>% \n", " slice_head(n =50)" ], "outputs": [], "metadata": { "id": "VMri-t2zXqgD" } }, { "cell_type": "markdown", "source": [ "Ein schneller `glimpse()` zeigt sofort, dass es Lücken gibt und eine Mischung aus Zeichenketten (`chr`) und numerischen Daten (`dbl`). Das `Date`-Feld ist vom Typ Zeichenkette, und es gibt auch eine seltsame Spalte namens `Package`, in der die Daten eine Mischung aus `sacks`, `bins` und anderen Werten sind. Die Daten sind, ehrlich gesagt, ein bisschen chaotisch 😤.\n", "\n", "Tatsächlich ist es nicht sehr häufig, ein Datenset zu erhalten, das vollständig einsatzbereit ist, um direkt ein ML-Modell daraus zu erstellen. Aber keine Sorge, in dieser Lektion wirst du lernen, wie man ein rohes Datenset mit Standardbibliotheken in R vorbereitet 🧑‍🔧. Außerdem wirst du verschiedene Techniken zur Visualisierung der Daten kennenlernen. 📈📊\n", "
\n", "\n", "> Eine Auffrischung: Der Pipe-Operator (`%>%`) führt Operationen in logischer Reihenfolge aus, indem er ein Objekt an eine Funktion oder einen Ausdruck weiterleitet. Du kannst den Pipe-Operator so verstehen, als würdest du in deinem Code \"und dann\" sagen.\n" ], "metadata": { "id": "REWcIv9yX29v" } }, { "cell_type": "markdown", "source": [ "## 2. Überprüfung auf fehlende Daten\n", "\n", "Eines der häufigsten Probleme, mit denen Datenwissenschaftler umgehen müssen, sind unvollständige oder fehlende Daten. R stellt fehlende oder unbekannte Werte mit einem speziellen Platzhalter dar: `NA` (Not Available).\n", "\n", "Wie können wir also feststellen, ob der Data Frame fehlende Werte enthält? \n", "
\n", "- Eine einfache Möglichkeit wäre die Verwendung der Basis-R-Funktion `anyNA`, die die logischen Werte `TRUE` oder `FALSE` zurückgibt.\n" ], "metadata": { "id": "Zxfb3AM5YbUe" } }, { "cell_type": "code", "execution_count": null, "source": [ "pumpkins %>% \n", " anyNA()" ], "outputs": [], "metadata": { "id": "G--DQutAYltj" } }, { "cell_type": "markdown", "source": [ "Super, es scheint, als ob einige Daten fehlen! Das ist ein guter Ausgangspunkt.\n", "\n", "- Eine andere Möglichkeit wäre, die Funktion `is.na()` zu verwenden, die anzeigt, welche einzelnen Spaltenelemente mit einem logischen `TRUE` fehlen.\n" ], "metadata": { "id": "mU-7-SB6YokF" } }, { "cell_type": "code", "execution_count": null, "source": [ "pumpkins %>% \n", " is.na() %>% \n", " head(n = 7)" ], "outputs": [], "metadata": { "id": "W-DxDOR4YxSW" } }, { "cell_type": "markdown", "source": [ "Okay, erledigt, aber bei einem so großen Dataframe wie diesem wäre es ineffizient und praktisch unmöglich, alle Zeilen und Spalten einzeln zu überprüfen😴.\n", "\n", "- Eine intuitivere Methode wäre, die Summe der fehlenden Werte für jede Spalte zu berechnen:\n" ], "metadata": { "id": "xUWxipKYY0o7" } }, { "cell_type": "code", "execution_count": null, "source": [ "pumpkins %>% \n", " is.na() %>% \n", " colSums()" ], "outputs": [], "metadata": { "id": "ZRBWV6P9ZArL" } }, { "cell_type": "markdown", "source": [ "Viel besser! Es fehlen einige Daten, aber vielleicht spielt das für die Aufgabe keine Rolle. Mal sehen, welche weiteren Analysen Ergebnisse bringen.\n", "\n", "> Neben den großartigen Paketen und Funktionen verfügt R über eine sehr gute Dokumentation. Zum Beispiel können Sie `help(colSums)` oder `?colSums` verwenden, um mehr über die Funktion zu erfahren.\n" ], "metadata": { "id": "9gv-crB6ZD1Y" } }, { "cell_type": "markdown", "source": [ "## 3. Dplyr: Eine Grammatik für Datenmanipulation\n", "\n", "

\n", " \n", "

Illustration von @allison_horst
\n", "\n", "\n", "\n" ], "metadata": { "id": "o4jLY5-VZO2C" } }, { "cell_type": "markdown", "source": [ "[`dplyr`](https://dplyr.tidyverse.org/), ein Paket im Tidyverse, ist eine Grammatik für Datenmanipulation, die eine einheitliche Sammlung von Verben bereitstellt, um die häufigsten Herausforderungen bei der Datenmanipulation zu lösen. In diesem Abschnitt werden wir einige der Verben von dplyr erkunden! \n", "
\n" ], "metadata": { "id": "i5o33MQBZWWw" } }, { "cell_type": "markdown", "source": [ "#### dplyr::select()\n", "\n", "`select()` ist eine Funktion aus dem Paket `dplyr`, mit der du Spalten auswählen kannst, die du behalten oder ausschließen möchtest.\n", "\n", "Um deinen Data Frame übersichtlicher zu gestalten, kannst du mit `select()` mehrere Spalten entfernen und nur die behalten, die du benötigst.\n", "\n", "Zum Beispiel werden wir in dieser Übung die Spalten `Package`, `Low Price`, `High Price` und `Date` für unsere Analyse verwenden. Lass uns diese Spalten auswählen.\n" ], "metadata": { "id": "x3VGMAGBZiUr" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Select desired columns\n", "pumpkins <- pumpkins %>% \n", " select(Package, `Low Price`, `High Price`, Date)\n", "\n", "\n", "# Print data set\n", "pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "F_FgxQnVZnM0" } }, { "cell_type": "markdown", "source": [ "#### dplyr::mutate()\n", "\n", "`mutate()` ist eine Funktion im Paket `dplyr`, mit der Sie Spalten erstellen oder ändern können, während die bestehenden Spalten erhalten bleiben.\n", "\n", "Die allgemeine Struktur von `mutate` lautet:\n", "\n", "`data %>% mutate(new_column_name = what_it_contains)`\n", "\n", "Lassen Sie uns `mutate` ausprobieren, indem wir die Spalte `Date` verwenden und die folgenden Operationen durchführen:\n", "\n", "1. Konvertieren Sie die Daten (derzeit vom Typ Zeichenkette) in ein Monatsformat (es handelt sich um US-Daten, das Format ist also `MM/DD/YYYY`).\n", "\n", "2. Extrahieren Sie den Monat aus den Daten in eine neue Spalte.\n", "\n", "Im R-Paket [lubridate](https://lubridate.tidyverse.org/) wird die Arbeit mit Datums- und Zeitdaten erleichtert. Also verwenden wir `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` und schauen, wie wir die oben genannten Ziele erreichen können. Wir können die Spalte `Date` entfernen, da wir sie in den nachfolgenden Operationen nicht mehr benötigen.\n" ], "metadata": { "id": "2KKo0Ed9Z1VB" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load lubridate\n", "library(lubridate)\n", "\n", "pumpkins <- pumpkins %>% \n", " # Convert the Date column to a date object\n", " mutate(Date = mdy(Date)) %>% \n", " # Extract month from Date\n", " mutate(Month = month(Date)) %>% \n", " # Drop Date column\n", " select(-Date)\n", "\n", "# View the first few rows\n", "pumpkins %>% \n", " slice_head(n = 7)" ], "outputs": [], "metadata": { "id": "5joszIVSZ6xe" } }, { "cell_type": "markdown", "source": [ "Woohoo! 🤩\n", "\n", "Als Nächstes erstellen wir eine neue Spalte `Price`, die den Durchschnittspreis eines Kürbisses darstellt. Jetzt berechnen wir den Durchschnitt der Spalten `Low Price` und `High Price`, um die neue Spalte Price zu füllen.\n", "
\n" ], "metadata": { "id": "nIgLjNMCZ-6Y" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Create a new column Price\n", "pumpkins <- pumpkins %>% \n", " mutate(Price = (`Low Price` + `High Price`)/2)\n", "\n", "# View the first few rows of the data\n", "pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "Zo0BsqqtaJw2" } }, { "cell_type": "markdown", "source": [ "Yeees!💪\n", "\n", "„Aber Moment mal!“, wirst du sagen, nachdem du das gesamte Datenset mit `View(pumpkins)` durchgesehen hast, „Hier stimmt doch etwas nicht!“🤔\n", "\n", "Wenn du dir die Spalte `Package` ansiehst, werden Kürbisse in vielen verschiedenen Konfigurationen verkauft. Einige werden in `1 1/9 bushel`-Maßen verkauft, andere in `1/2 bushel`-Maßen, einige pro Kürbis, einige pro Pfund und einige in großen Kisten mit unterschiedlichen Breiten.\n", "\n", "Lass uns das überprüfen:\n" ], "metadata": { "id": "p77WZr-9aQAR" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Verify the distinct observations in Package column\n", "pumpkins %>% \n", " distinct(Package)" ], "outputs": [], "metadata": { "id": "XISGfh0IaUy6" } }, { "cell_type": "markdown", "source": [ "Erstaunlich!👏\n", "\n", "Kürbisse scheinen sehr schwer konsistent zu wiegen zu sein, daher filtern wir sie, indem wir nur Kürbisse mit dem String *bushel* in der Spalte `Package` auswählen und diese in einen neuen Dataframe `new_pumpkins` speichern.\n", "
\n" ], "metadata": { "id": "7sMjiVujaZxY" } }, { "cell_type": "markdown", "source": [ "#### dplyr::filter() und stringr::str_detect()\n", "\n", "[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): erstellt eine Teilmenge der Daten, die nur **Zeilen** enthält, die Ihre Bedingungen erfüllen, in diesem Fall Kürbisse mit dem String *bushel* in der Spalte `Package`.\n", "\n", "[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): erkennt das Vorhandensein oder Fehlen eines Musters in einem String.\n", "\n", "Das [`stringr`](https://github.com/tidyverse/stringr)-Paket bietet einfache Funktionen für gängige String-Operationen.\n" ], "metadata": { "id": "L8Qfcs92ageF" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Retain only pumpkins with \"bushel\"\n", "new_pumpkins <- pumpkins %>% \n", " filter(str_detect(Package, \"bushel\"))\n", "\n", "# Get the dimensions of the new data\n", "dim(new_pumpkins)\n", "\n", "# View a few rows of the new data\n", "new_pumpkins %>% \n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "hy_SGYREampd" } }, { "cell_type": "markdown", "source": [ "Du kannst sehen, dass wir uns auf etwa 415 Zeilen Daten beschränkt haben, die Kürbisse in großen Mengen enthalten. 🤩\n", "
\n" ], "metadata": { "id": "VrDwF031avlR" } }, { "cell_type": "markdown", "source": [ "#### dplyr::case_when()\n", "\n", "**Aber Moment! Es gibt noch etwas zu tun**\n", "\n", "Hast du bemerkt, dass die Menge pro Scheffel je nach Zeile variiert? Du musst die Preise normalisieren, sodass sie pro Scheffel angezeigt werden und nicht pro 1 1/9 oder 1/2 Scheffel. Zeit für etwas Mathematik, um das zu standardisieren.\n", "\n", "Wir verwenden die Funktion [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html), um die Spalte \"Price\" je nach bestimmten Bedingungen zu *mutieren*. `case_when` ermöglicht es, mehrere `if_else()`-Anweisungen zu vektorisieren.\n" ], "metadata": { "id": "mLpw2jH4a0tx" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Convert the price if the Package contains fractional bushel values\n", "new_pumpkins <- new_pumpkins %>% \n", " mutate(Price = case_when(\n", " str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n", " str_detect(Package, \"1/2\") ~ Price/(1/2),\n", " TRUE ~ Price))\n", "\n", "# View the first few rows of the data\n", "new_pumpkins %>% \n", " slice_head(n = 30)" ], "outputs": [], "metadata": { "id": "P68kLVQmbM6I" } }, { "cell_type": "markdown", "source": [ "Jetzt können wir die Preise pro Einheit basierend auf ihrer Buschel-Messung analysieren. All diese Untersuchung der Kürbis-Buschel zeigt jedoch, wie `wichtig` es ist, `die Natur Ihrer Daten zu verstehen`!\n", "\n", "> ✅ Laut [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) hängt das Gewicht eines Buschels von der Art des Produkts ab, da es sich um eine Volumenmessung handelt. \"Ein Buschel Tomaten soll beispielsweise 56 Pfund wiegen... Blätter und Grünzeug nehmen mehr Platz mit weniger Gewicht ein, sodass ein Buschel Spinat nur 20 Pfund wiegt.\" Das ist alles ziemlich kompliziert! Lassen wir die Umrechnung von Buschel zu Pfund beiseite und setzen stattdessen den Preis pro Buschel an. All diese Untersuchung der Kürbis-Buschel zeigt jedoch, wie wichtig es ist, die Natur Ihrer Daten zu verstehen!\n", ">\n", "> ✅ Ist Ihnen aufgefallen, dass Kürbisse, die pro halbem Buschel verkauft werden, sehr teuer sind? Können Sie herausfinden, warum? Hinweis: Kleine Kürbisse sind viel teurer als große, wahrscheinlich weil es viel mehr von ihnen pro Buschel gibt, da der ungenutzte Raum von einem großen hohlen Kuchen-Kürbis eingenommen wird.\n" ], "metadata": { "id": "pS2GNPagbSdb" } }, { "cell_type": "markdown", "source": [ "Nun, zum Schluss, einfach aus Abenteuerlust 💁‍♀️, verschieben wir die Spalte \"Month\" an die erste Position, also `vor` die Spalte \"Package\".\n", "\n", "`dplyr::relocate()` wird verwendet, um die Position von Spalten zu ändern.\n" ], "metadata": { "id": "qql1SowfbdnP" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Create a new data frame new_pumpkins\n", "new_pumpkins <- new_pumpkins %>% \n", " relocate(Month, .before = Package)\n", "\n", "new_pumpkins %>% \n", " slice_head(n = 7)" ], "outputs": [], "metadata": { "id": "JJ1x6kw8bixF" } }, { "cell_type": "markdown", "source": [ "Gute Arbeit! 👌 Du hast jetzt einen sauberen, aufgeräumten Datensatz, mit dem du dein neues Regressionsmodell erstellen kannst! \n", "
\n" ], "metadata": { "id": "y8TJ0Za_bn5Y" } }, { "cell_type": "markdown", "source": [ "## 4. Datenvisualisierung mit ggplot2\n", "\n", "

\n", " \n", "

Infografik von Dasani Madipalli
\n", "\n", "\n", "\n", "\n", "Es gibt ein *weises* Sprichwort, das so lautet:\n", "\n", "> \"Das einfache Diagramm hat dem Datenanalysten mehr Informationen geliefert als jedes andere Hilfsmittel.\" --- John Tukey\n", "\n", "Ein Teil der Aufgabe eines Data Scientists besteht darin, die Qualität und die Eigenschaften der Daten, mit denen er arbeitet, zu demonstrieren. Dazu erstellen sie oft interessante Visualisierungen, wie Diagramme, Grafiken und Charts, die verschiedene Aspekte der Daten zeigen. Auf diese Weise können sie Beziehungen und Lücken visuell darstellen, die sonst schwer zu erkennen wären.\n", "\n", "Visualisierungen können auch dabei helfen, die am besten geeignete Machine-Learning-Technik für die Daten zu bestimmen. Ein Streudiagramm, das einer Linie zu folgen scheint, deutet beispielsweise darauf hin, dass die Daten gut für eine lineare Regression geeignet sind.\n", "\n", "R bietet mehrere Systeme zur Erstellung von Grafiken, aber [`ggplot2`](https://ggplot2.tidyverse.org/index.html) ist eines der elegantesten und vielseitigsten. Mit `ggplot2` können Sie Grafiken erstellen, indem Sie **unabhängige Komponenten kombinieren**.\n", "\n", "Beginnen wir mit einem einfachen Streudiagramm für die Spalten Price und Month.\n", "\n", "In diesem Fall starten wir mit [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), geben einen Datensatz und eine ästhetische Zuordnung (mit [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) an und fügen dann Schichten hinzu (wie [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) für Streudiagramme.\n" ], "metadata": { "id": "mYSH6-EtbvNa" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Set a theme for the plots\n", "theme_set(theme_light())\n", "\n", "# Create a scatter plot\n", "p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n", "p + geom_point()" ], "outputs": [], "metadata": { "id": "g2YjnGeOcLo4" } }, { "cell_type": "markdown", "source": [ "Ist das ein nützlicher Plot 🤷? Überrascht dich irgendetwas daran?\n", "\n", "Er ist nicht besonders nützlich, da er lediglich deine Daten als eine Ansammlung von Punkten in einem bestimmten Monat darstellt.\n", "
\n" ], "metadata": { "id": "Ml7SDCLQcPvE" } }, { "cell_type": "markdown", "source": [ "### **Wie machen wir es nützlich?**\n", "\n", "Um Diagramme mit nützlichen Daten anzuzeigen, müssen die Daten normalerweise irgendwie gruppiert werden. In unserem Fall würde beispielsweise das Ermitteln des Durchschnittspreises von Kürbissen für jeden Monat mehr Einblicke in die zugrunde liegenden Muster unserer Daten liefern. Das führt uns zu einem weiteren **dplyr**-Überblick:\n", "\n", "#### `dplyr::group_by() %>% summarize()`\n", "\n", "Gruppierte Aggregationen in R können einfach berechnet werden mit\n", "\n", "`dplyr::group_by() %>% summarize()`\n", "\n", "- `dplyr::group_by()` ändert die Analyseebene von dem gesamten Datensatz zu einzelnen Gruppen, wie beispielsweise pro Monat.\n", "\n", "- `dplyr::summarize()` erstellt einen neuen Dataframe mit einer Spalte für jede Gruppierungsvariable und einer Spalte für jede der angegebenen Zusammenfassungsstatistiken.\n", "\n", "Zum Beispiel können wir `dplyr::group_by() %>% summarize()` verwenden, um die Kürbisse basierend auf der **Monat**-Spalte zu gruppieren und dann den **Durchschnittspreis** für jeden Monat zu berechnen.\n" ], "metadata": { "id": "jMakvJZIcVkh" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Find the average price of pumpkins per month\r\n", "new_pumpkins %>%\r\n", " group_by(Month) %>% \r\n", " summarise(mean_price = mean(Price))" ], "outputs": [], "metadata": { "id": "6kVSUa2Bcilf" } }, { "cell_type": "markdown", "source": [ "Knapp und bündig!✨\n", "\n", "Kategorische Merkmale wie Monate werden besser mit einem Balkendiagramm 📊 dargestellt. Die Ebenen, die für Balkendiagramme zuständig sind, sind `geom_bar()` und `geom_col()`. Sieh dir `?geom_bar` an, um mehr zu erfahren.\n", "\n", "Lass uns eins erstellen!\n" ], "metadata": { "id": "Kds48GUBcj3W" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Find the average price of pumpkins per month then plot a bar chart\r\n", "new_pumpkins %>%\r\n", " group_by(Month) %>% \r\n", " summarise(mean_price = mean(Price)) %>% \r\n", " ggplot(aes(x = Month, y = mean_price)) +\r\n", " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n", " ylab(\"Pumpkin Price\")" ], "outputs": [], "metadata": { "id": "VNbU1S3BcrxO" } }, { "cell_type": "markdown", "source": [ "🤩🤩 Dies ist eine nützlichere Datenvisualisierung! Sie scheint darauf hinzudeuten, dass die höchsten Preise für Kürbisse im September und Oktober auftreten. Entspricht das deinen Erwartungen? Warum oder warum nicht?\n", "\n", "Herzlichen Glückwunsch zum Abschluss der zweiten Lektion 👏! Du hast deine Daten für den Modellaufbau vorbereitet und anschließend weitere Erkenntnisse mithilfe von Visualisierungen gewonnen!\n" ], "metadata": { "id": "zDm0VOzzcuzR" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Haftungsausschluss**: \nDieses Dokument wurde mithilfe des KI-Übersetzungsdienstes [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" ] } ] }