Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Mit R Daten analysieren - die anschauliche und verständliche Einführung - 2. Auflage des US-Bestellers, jetzt vollständig aktualisiert und erweitert - Hadley Wickham ist eine Legende auf dem Gebiet der Data Science: Er hat eine vollkommen neue, bahnbrechende Methode der Datenanalyse mit R entwickelt - Wickhams innovative Herangehensweise wird in diesem Buch beschrieben, es ist ein Standardwerk für Datenanalysten Erfahren Sie, wie Sie mit R aus Ihren Daten Erkenntnisse und Einsichten gewinnen. Dieses Buch führt Sie in R und RStudio ein sowie in Tidyverse, eine Sammlung von R-Paketen, mit denen Data-Science-Aufgaben effektiv und zeitsparend erledigt werden können. Auch wenn Sie keine Programmiererfahrung haben, können Sie mit diesem aktualisierten Standardwerk schnell in die Praxis der Data Science einsteigen. Sie lernen, Daten zu importieren, aufzubereiten, zu visualisieren und die Ergebnisse zu präsentieren. Darüber hinaus bekommen Sie einen umfassenden Überblick über den Data-Science-Zyklus und die Tools, die für die Detailarbeit erforderlich sind. Die zweite Auflage behandelt die neuesten Funktionen und Best Practices von Tidyverse und zeigt Ihnen in neu hinzugekommenen Kapiteln, wie Sie Daten aus Spreadsheets, Datenbanken und Websites nutzen. Zahlreiche Übungen unterstützen Sie dabei, das Gelernte praktisch auszuprobieren. Themen des Buchs sind: - Visualisieren – Erstellen Sie Diagramme für die Datenauswertung und die Kommunikation von Ergebnissen - Transformieren – Erkunden Sie Variablentypen und die Werkzeuge, um mit ihnen zu arbeiten - Importieren – Lesen Sie Daten in R ein und bringen Sie sie in eine für die Analyse geeignete Form - Programmieren – Lernen Sie leistungsfähige R-Tools kennen, mit denen Sie Datenprobleme leichter lösen können - Kommunizieren – Verwenden Sie Quarto, um Text, Code und Ergebnisse kombiniert darzustellen
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 772
Veröffentlichungsjahr: 2024
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Copyright und Urheberrechte:
Die durch die dpunkt.verlag GmbH vertriebenen digitalen Inhalte sind urheberrechtlich geschützt. Der Nutzer verpflichtet sich, die Urheberrechte anzuerkennen und einzuhalten. Es werden keine Urheber-, Nutzungs- und sonstigen Schutzrechte an den Inhalten auf den Nutzer übertragen. Der Nutzer ist nur berechtigt, den abgerufenen Inhalt zu eigenen Zwecken zu nutzen. Er ist nicht berechtigt, den Inhalt im Internet, in Intranets, in Extranets oder sonst wie Dritten zur Verwertung zur Verfügung zu stellen. Eine öffentliche Wiedergabe oder sonstige Weiterveröffentlichung und eine gewerbliche Vervielfältigung der Inhalte wird ausdrücklich ausgeschlossen. Der Nutzer darf Urheberrechtsvermerke, Markenzeichen und andere Rechtsvorbehalte im abgerufenen Inhalt nicht entfernen.
Daten importieren, bereinigen, umformen und visualisieren
Hadley Wickham,Mine Çetinkaya-Rundelund Garrett Grolemund
Deutsche Übersetzung vonFrank Langenau
Hadley Wickham, Mine Çetinkaya-Rundel, Garrett Grolemund
Lektorat: Alexandra Follenius
Übersetzung: Frank Langenau
Copy-Editing: Sibylle Feldmann, www.richtiger-text.de
Satz: III-Satz, www.drei-satz.de
Herstellung: Stefanie Weidner
Umschlaggestaltung: Karen Montgomery, Michael Oréal, www.oreal.de
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-96009-234-6
PDF 978-3-96010-830-6
ePub 978-3-96010-834-4
2., aktualisierte und erweiterte Auflage 2024
Translation Copyright für die deutschsprachige Ausgabe © 2024 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Authorized German translation of the English edition of R for Data Science, 2nd Edition ISBN 9781492097402 © 2023 Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund. This translation is published and sold by permission of O'Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
Dieses Buch erscheint in Kooperation mit O'Reilly Media, Inc. unter dem Imprint »O’REILLY«.
O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.
Schreiben Sie uns:
Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: [email protected].
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autoren noch Autorin noch Verlag noch Übersetzer können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
Einführung
Teil IGesamtbild
1Datenvisualisierung
Einführung
Erste Schritte
Zielsetzung
ggplot2-Aufrufe
Verteilungen visualisieren
Beziehungen visualisieren
Diagramme speichern
Häufige Probleme
Zusammenfassung
2Workflow: Grundlagen
Grundlagen der Codierung
Kommentare
Was macht einen Namen aus?
Funktionen aufrufen
Zusammenfassung
3Datentransformation
Einführung
Voraussetzungen
Zeilen
Spalten
Die Pipe
Gruppen
Fallstudie: Aggregate und Stichprobengröße
Zusammenfassung
4Workflow: Programmierstil
Namen
Leerzeichen
Pipes
ggplot2
Abschnittskommentare
Übungen
Zusammenfassung
5Datenaufbereitung
Einführung
Aufbereitete Daten
Daten länger machen
Daten breiter machen
Zusammenfassung
6Workflow: Skripte und Projekte
Skripte
Projekte
Übungen
Zusammenfassung
7Daten importieren
Einführung
Daten aus einer Datei lesen
Spaltentypen steuern
Daten aus mehreren Dateien einlesen
In eine Datei schreiben
Dateneingabe
Zusammenfassung
8Workflow: Hilfe abrufen
Google ist Ihr Freund
Ein Reprex erstellen
Sich selbst einbringen
Zusammenfassung
Teil IIVisualisieren
9Datenvisualisierung
Einführung
Ästhetische Zuordnungen
Geometrische Objekte
Facetten
Statistische Transformationen
Positionsanpassungen
Koordinatensysteme
Die geschichtete Grammatik der grafischen Darstellung
Zusammenfassung
10Explorative Datenanalyse
Einführung
Fragen
Variation
Ungewöhnliche Werte
Kovariation
Muster und Modelle
Zusammenfassung
11Kommunikation
Einführung
Beschriftungen
Anmerkungen
Skalen
Themen
Layout
Zusammenfassung
Teil IIITransformieren
12Logische Vektoren
Einführung
Vergleiche
Boolesche Algebra
Zusammenfassungen
Bedingte Transformationen
Zusammenfassung
13Zahlen
Einführung
Zahlen erzeugen
Zähler
Numerische Transformationen
Zahlen in Bereiche aufteilen
Allgemeine Transformationen
Numerische Zusammenfassungen
Zusammenfassung
14Strings
Einführung
Einen String erzeugen
Viele Strings aus Daten erstellen
Daten aus Strings extrahieren
Buchstaben
Nicht englischer Text
Zusammenfassung
15Reguläre Ausdrücke
Einführung
Muster – Grundlagen
Wichtige Funktionen
Details zu Mustern
Mustersteuerung
Praxis
Reguläre Ausdrücke an anderen Stellen
Zusammenfassung
16Faktoren
Einführung
Faktoren-Basics
General Social Survey
Faktorreihenfolge ändern
Faktorlevels ändern
Geordnete Faktoren
Zusammenfassung
17Datum und Uhrzeit
Einführung
Datums-/Zeitwerte erzeugen
Datums-/Zeitkomponenten
Zeiträume
Zeitzonen
Zusammenfassung
18Fehlende Werte
Einführung
Explizit fehlende Werte
Implizit fehlende Werte
Faktoren und leere Gruppen
Zusammenfassung
19Verknüpfungen
Einführung
Schlüssel
Grundlegende Verknüpfungen
Wie funktionieren Verknüpfungen?
Nicht-Gleichheitsverknüpfungen
Zusammenfassung
Teil IVImportieren
20Tabellenkalkulationen
Einführung
Excel
Google Sheets
Zusammenfassung
21Datenbanken
Einführung
Datenbankgrundlagen
Mit einer Datenbank verbinden
Grundlagen von dbplyr
SQL
Übersetzung von Funktionen
Zusammenfassung
22Arrow
Einführung
Die Daten erhalten
Ein Datenset öffnen
Das Parquet-Format
Das Paket dplyr mit Arrow verwenden
Das Paket dbplyr mit Arrow verwenden
Zusammenfassung
23Hierarchische Daten
Einführung
Listen
Verschachtelung beseitigen
Fallstudien
JSON
Zusammenfassung
24Web-Scraping
Einführung
Ethische und rechtliche Anmerkungen zum Scraping
HTML-Grundlagen
Daten extrahieren
Die richtigen Selektoren finden
Alles zusammen
Dynamische Sites
Zusammenfassung
Teil VProgrammieren
25Funktionen
Einführung
Vektorfunktionen
Dataframe-Funktionen
Diagrammfunktionen
Stil
Zusammenfassung
26Iteration
Einführung
Mehrere Spalten ändern
Mehrere Dateien lesen
Mehrere Ausgaben speichern
Zusammenfassung
27Ein Praxisleitfaden zu Basis-R
Einführung
Mehrere Elemente mit [ auswählen
Ein einzelnes Element mit $ und [[ auswählen
Familie der apply-Funktionen
for-Schleifen
Diagramme
Zusammenfassung
Teil VIKommunizieren
28Quarto
Einführung
Quarto-Grundlagen
Visueller Editor
Quelltexteditor
Codeblöcke
Bilder
Tabellen
Zwischenspeichern (Caching)
Fehlersuche
YAML-Header
Workflow
Zusammenfassung
29Quarto-Formate
Einführung
Ausgabeoptionen
Dokumente
Präsentationen
Interaktivität
Websites und Bücher
Andere Formate
Zusammenfassung
Index
Data Science ist eine spannende Disziplin, in der Sie Rohdaten in Verständnis, Erkenntnis und Wissen umwandeln können. Das Buch R für Data Science soll Ihnen die wichtigsten Tools in R nahebringen, damit Sie Aufgaben in Data Science effizient und reproduzierbar bearbeiten können, noch dazu in unterhaltsamer Weise! Nachdem Sie dieses Buch gelesen haben, verfügen Sie über das Handwerkszeug, um ein breites Spektrum anspruchsvoller Data-Science-Problemstellungen mithilfe der besten Bestandteile von R anzugehen.
Willkommen zur zweiten Auflage von R für Data Science (R4DS), die sich durch eine umfassende Überarbeitung der ersten Auflage auszeichnet. Wir haben Material entfernt, das wir nicht mehr für nützlich halten, Material hinzugefügt, das wir gern schon in die erste Auflage aufgenommen hätten, und generell den Text und den Code aktualisiert, um Änderungen bei den Best Practices zu berücksichtigen. Zudem freuen wir uns sehr, Mine Çetinkaya-Rundel als neue Co-Autorin gewonnen zu haben. Sie ist eine bekannte Lehrerin für Data Science und eine unserer Kolleginnen bei Posit (dem Unternehmen, das früher als RStudio bekannt war).
Die folgenden Punkte fassen kurz die wichtigsten Änderungen zusammen:
Der erste Teil des Buchs hat den neuen Titel »Gesamtbild« bekommen. Dieser Abschnitt soll Ihnen zeigen, worum es bei Data Science im Großen und Ganzen geht, bevor wir uns näher mit den Details beschäftigen.
Der zweite Teil des Buchs ist mit »Visualisieren« überschrieben. Dieser Teil beschreibt Visualisierungstools und Best Practices ausführlicher und detaillierter, als es in der ersten Auflage geschehen ist. Um alle Details kennenzulernen, empfiehlt sich immer noch das Buch
ggplot2: Elegant Graphics for Data Analysis
(Springer 2016,
https://oreil.ly/HNIie
), wobei aber das Ihnen hier vorliegende Buch schon mehr als die wichtigsten Techniken abhandelt.
Der dritte Teil des Buchs heißt nun »Transformieren« mit neuen Kapiteln über Zahlen, logische Vektoren und fehlende Werte. Bislang waren diese Themen im Kapitel über Datentransformationen angesiedelt, nun aber wird mehr Platz benötigt, um alle relevanten Details zu behandeln.
Im vierten Teil des Buchs geht es um das »Importieren«. Hier finden Sie eine Reihe von neuen Kapiteln, die über das Lesen von einfachen Textdateien hinausgehen und sich damit befassen, wie Sie mit Tabellenkalkulationen arbeiten, Daten aus Datenbanken abrufen, mit Big Data umgehen, hierarchische Daten in Rechteckform bringen und Daten aus Websites übernehmen.
Der Teil »Programmieren« wurde beibehalten, aber von Anfang bis Ende umgeschrieben, um sich auf die wichtigsten Teile zu konzentrieren, die für Funktionen und Iteration relevant sind. In Bezug auf Funktionen lernen Sie nun, wie Sie Tidyverse-Funktionen (die sich mit den Herausforderungen einer bereinigten Auswertung befassen) einhüllen, da dies in den letzten Jahren viel einfacher und wichtiger geworden ist. Neu hinzugekommen ist ein Kapitel über wichtige R-Basisfunktionen, die Sie wahrscheinlich in praxisnahem R-Code vorfinden werden.
Der Teil »Modellieren« ist weggefallen. Der Platz hat nie gereicht, um das Thema Modellieren adäquat darzustellen. Zudem gibt es jetzt viel bessere Ressourcen. Generell empfehlen wir, die
tidymodels
-Pakete (
https://oreil.ly/0giAa
) zu verwenden und
Tidy Modeling with R
(
https://oreil.ly/9Op9s
) von Max Kuhn und Julia Silge (O’Reilly) zu lesen.
Der Teil »Kommunizieren« besteht weiter, wurde aber gründlich aktualisiert, um
Quarto
(
https://oreil.ly/_6LNH
) anstelle von
R Markdown
vorzustellen. Diese Auflage des Buchs ist in Quarto geschrieben worden, das zweifellos das Tool der Zukunft ist.
Data Science ist ein riesiges Gebiet, und Sie werden es wahrscheinlich nicht meistern, wenn Sie nur ein einziges Buch lesen. Dieses Buch soll Ihnen eine solide Basis für die wichtigsten Tools vermitteln und Ihnen Quellen zeigen, um bei Bedarf mehr zu lernen. Unser Modell der Schritte in einem typischen Data-Science-Projekt sieht in etwa wie in Abbildung E-1 aus.
Zuerst müssen Sie Ihre Daten in R importieren. In der Regel heißt dies, dass Sie gespeicherte Daten aus einer Datei, Datenbank oder Web-API übernehmen und in einen Dataframe in R laden. Können Sie Ihre Daten nicht nach R übernehmen, lässt sich keine Data Science damit anstellen!
Nachdem Sie die Daten importiert haben, empfiehlt es sich, sie zu bereinigen oder aufzubereiten. Dabei speichert man die Daten in einer konsistenten Form, die die Semantik des Datensets mit der Art und Weise der Speicherung abstimmt. Kurz gesagt, wenn Ihre Daten bereinigt sind, ist jede Spalte eine Variable und jede Zeile eine Beobachtung. Das Bereinigen von Daten ist wichtig, weil Sie sich dann aufgrund der konsistenten Struktur auf Fragen über die Daten konzentrieren können und sich nicht damit abmühen müssen, die Daten für verschiedene Funktionen in die richtige Form zu bekommen.
Abbildung E-1: In unserem Modell des Data-Science-Prozesses geht es los mit dem Importieren und Bereinigen der Daten. Daran schließt sich das Verstehen der Daten an, das in einem iterativen Zyklus von Transformieren, Visualisieren und Modellieren abläuft. Den Prozess beenden Sie, indem Sie Ihre Ergebnisse anderen Menschen kommunizieren.
Wenn die Daten bereinigt sind, werden sie oftmals in einem nächsten Schritt transformiert. Das Transformieren schließt das Eingrenzen auf konkrete Beobachtungen ein (wie zum Beispiel alle Personen in einer Stadt oder alle Daten aus dem letzten Jahr), das Erstellen neuer Variablen, die Funktionen von vorhandenen Variablen sind (wie das Berechnen der Geschwindigkeit aus Weg und Zeit), und das Berechnen einer Menge von Zusammenfassungsstatistiken (wie Anzahlen oder Mittelwerte). Bereinigen und Transformieren bezeichnet man zusammengenommen als Aufbereiten – im Englischen Wrangling (Rangelei, Gezerre) genannt, weil es sich oft wie ein Kampf anfühlt, die Daten in eine Form zu bringen, mit der man gut arbeiten kann!
Nachdem Sie über bereinigte Daten mit den benötigten Variablen verfügen, gibt es zwei Hauptmodule der Wissensgenerierung: Visualisierung und Modellierung. Diese weisen viele Stärken und Schwächen auf, die komplementär zueinander sind, sodass jede reale Analyse diese Schritte mehrfach durchlaufen wird.
Visualisierung ist eine fundamentale menschliche Aktivität. Eine gute Visualisierung zeigt Ihnen Dinge, die Sie nicht erwartet haben, oder wirft neue Fragen über die Daten auf. Außerdem kann eine gute Visualisierung darauf hinweisen, dass Sie die falschen Fragen stellen oder andersartige Daten erfassen müssen. Visualisierungen können Sie überraschen, lassen sich aber nicht besonders gut normieren, weil ein Mensch sie interpretieren muss.
Modelle ergänzen die Visualisierung. Haben Sie Ihre Fragen einmal ausreichend präzisiert, können Sie sie mithilfe eines Modells beantworten. Modelle sind ein fundamentales mathematisches oder rechentechnisches Werkzeug, sodass sie sich im Allgemeinen gut skalieren lassen. Und selbst wenn das nicht zutrifft, ist es normalerweise billiger, mehr Computer zu kaufen als mehr Gehirne! Doch jedes Modell geht von Annahmen aus, und seinem Wesen nach kann ein Modell seine eigenen Annahmen nicht beantworten. Ein Modell kann Sie also grundsätzlich nicht überraschen.
Der letzte Schritt bei der Data Science ist die Kommunikation, ein absolut entscheidender Teil jedes Datenanalyseprojekts. Es spielt keine Rolle, wie gut Ihre Modelle und die Visualisierung Sie dazu gebracht haben, die Daten zu verstehen, sofern Sie nicht auch Ihre Ergebnisse für andere kommunizieren können.
Den Rahmen für alle diese Tools bildet die Programmierung. Als übergreifendes Tool haben Sie mit Programmierung in jedem Teil des Projekts zu tun. Dabei müssen Sie keine Programmierexpertinnen und -experten sein, um als Data Scientists erfolgreich zu arbeiten, doch wenn Sie mehr über Programmierung lernen, zahlt sich das aus, denn als besserer Programmierer können Sie häufig anfallende Aufgaben automatisieren und neue Probleme wesentlich leichter lösen.
Diese Tools verwenden Sie in fast jedem Data-Science-Projekt, doch für die meisten Projekte sind sie nicht ausreichend. Als Faustregel gilt ein 80-20-Verhältnis: Etwa 80 % jedes Projekts können Sie angehen mit den Tools, die Sie in diesem Buch kennenlernen, doch um die restlichen 20 % zu lösen, brauchen Sie weitere Tools. Das ganze Buch hindurch verweisen wir auf Quellen, unter denen Sie mehr zu den jeweiligen Themen lernen können.
Der letzte Abschnitt hat die Data-Science-Tools ungefähr in der Reihenfolge beschrieben, in der Sie sie in einer Analyse einsetzen (auch wenn Sie diese Schritte natürlich mehrfach durchlaufen). Unserer Erfahrung nach ist es allerdings suboptimal, wenn Sie sich zuerst mit dem Importieren und Bereinigen der Daten befassen, weil Sie dabei 80 % Ihrer Zeit mit langweiligen Routinearbeiten zubringen und die anderen 20 % der Zeit bizarre und frustrierende Aufgaben lösen müssen. Das ist ein schlechter Ausgangspunkt, um sich in ein neues Thema einzuarbeiten! Stattdessen beginnen wir mit Visualisierung und Transformation von Daten, die bereits importiert und bereinigt wurden. Wenn Sie später also Ihre eigenen Daten erfassen und bereinigen, bleibt Ihre Motivation hoch, weil Sie wissen, dass der Aufwand gerechtfertigt ist.
In jedem Kapitel versuchen wir, uns an ein ähnliches Muster zu halten: Wir beginnen mit einigen motivierenden Beispielen, sodass Sie ein Gesamtbild bekommen, und tauchen dann ab in die Details. Jeder Abschnitt des Buchs ist angereichert mit Übungen, anhand deren Sie Ihre erworbenen Kenntnisse überprüfen können. Es mag verlockend sein, die Übungen zu überspringen, doch es gibt keine bessere Möglichkeit zu lernen, als sich an echten Problemen zu versuchen.
Es gibt weitere wichtige Themen, die dieses Buch aber nicht behandelt. Unserer Ansicht nach ist es von zentraler Bedeutung, konsequent auf das Wesentliche konzentriert zu bleiben, sodass Sie möglichst schnell selbst aktiv werden können. Das heißt, dass dieses Buch nicht jedes wichtige Thema behandeln kann.
Modellieren ist unabdingbar in der Data Science, doch da es sich um ein so großes Thema handelt, haben wir leider nicht den Platz, es hier so zu behandeln, wie es sich gehört. Um mehr über Modellierung zu erfahren, empfehlen wir Ihnen Tidy Modeling with R (https://oreil.ly/9Op9s) von unseren Kollegen Max Kuhn und Julia Silge (O’Reilly). In diesem Buch lernen Sie die Familie der tidymodels-Pakete kennen, die, wie der Name schon vermuten lässt, viele Konventionen mit den tidyverse-Paketen teilen, die wir in diesem Buch verwenden.
Dieses Buch konzentriert sich stolz und hauptsächlich auf kleine, speicherresidente Datensets. Das ist der richtige Einstieg, weil Sie große Datenmengen (sprich: Big Data) erst dann beherrschen, wenn Sie genügend Erfahrungen mit kleineren Datenmengen gesammelt haben. Die Tools, die Sie in diesem Buch kennenlernen, verarbeiten problemlos Hunderte Megabyte Daten, und mit etwas Sorgfalt können Sie sie normalerweise auch für einige Gigabyte Daten verwenden. Außerdem zeigen wir Ihnen, wie Sie Daten aus Datenbanken und Parquet-Dateien abrufen, die oftmals für das Speichern großer Datenmengen herangezogen werden. Sie werden nicht unbedingt mit dem gesamten Datensatz arbeiten können, doch ist das kein Problem, weil Sie immer nur eine Teilmenge oder Stichprobe benötigen, um die Frage zu beantworten, die Sie interessiert.
Wenn Sie regelmäßig mit größeren Datenmengen (sagen wir 10 bis 100 GB) zu tun haben, sollten Sie mehr über data.table lernen (https://oreil.ly/GG4Et). Dieses Buch geht nicht auf data.table ein, weil es eine andere Benutzeroberfläche als tidyverse hat und davon abweichenden Konventionen folgt. Allerdings ist es unglaublich viel schneller, und der Leistungsgewinn gleicht den zusätzlich erforderlichen Lernaufwand bei Weitem aus, wenn Sie mit großen Datenmengen arbeiten.
In diesem Buch lernen Sie weder etwas über Python und Julia noch über irgendeine andere Programmiersprache, die für Data Science geeignet ist. Das hat nichts damit zu tun, dass diese Tools unserer Ansicht nach schlecht sind. Ganz und gar nicht! Und in der Praxis verwenden die meisten Data-Science-Teams eine Mischung aus Sprachen, oftmals mindestens R und Python. Allerdings sind wir überzeugt davon, dass es am besten ist, immer nur ein Tool auf einmal beherrschen zu lernen. Und R bietet sich als Startplattform an.
Wir haben einige Annahmen darüber getroffen, was Sie bereits wissen, um möglichst gut von diesem Buch profitieren zu können. Allgemein sollten Sie gut mit Zahlenmaterial umgehen können, und es ist hilfreich, wenn Sie bereits etwas Programmiererfahrung mitbringen. Falls Sie noch nie programmiert haben, dürfte Ihnen das Buch Hands-On Programming with R (https://oreil.ly/8uiH5) von Garrett Grolemund (O’Reilly) eine nützliche Begleitung zu diesem Buch sein.
Um den Code in diesem Buch auszuführen, brauchen Sie vier Dinge: R, RStudio, eine Auswahl von R-Paketen – das sogenannte Tidyverse – und eine Handvoll anderer Pakete. Pakete sind die grundlegenden Einheiten von reproduzierbarem R-Code. Sie umfassen wiederverwendbare Funktionen, die dazugehörenden Dokumentationen sowie Beispieldaten.
Um R herunterzuladen, besuchen Sie die Site von CRAN (https://oreil.ly/p3_RG). CRAN steht für Comprehensive R Archive Network (ein Netzwerk mit einem umfassenden Archiv von Modulen für die Programmiersprache R). Eine neue Hauptversion von R erscheint einmal im Jahr, und jedes Jahr gibt es zwei bis drei kleinere Versionen. Es empfiehlt sich, die Programme regelmäßig zu aktualisieren. Ein Upgrade kann etwas mühsam sein, vor allem bei Hauptversionen, bei denen es erforderlich ist, alle Pakete erneut zu installieren. Doch ganz unprofessionell ist es, die Upgrades auf die lange Bank zu schieben. Für dieses Buch empfehlen wir die Version R 4.2.0 oder neuer.
RStudio ist eine integrierte Entwicklungsumgebung (Integrated Development Environment, IDE) für die R-Programmierung. Sie können RStudio von der RStudio-Downloadseite (https://oreil.ly/pxF-k) herunterladen. Die Software wird mehrmals im Jahr aktualisiert. Ist eine neue Version verfügbar, teilt Ihnen RStudio dies mit. Es empfiehlt sich, die Upgrades regelmäßig zu installieren, um von den neuesten und besten Features zu profitieren. Für dieses Buch ist mindestens die RStudio-Version 2022.02.0 erforderlich.
Wenn Sie RStudio starten, sehen Sie in der Benutzeroberfläche zwei Schlüsselbereiche: den Konsolenbereich und den Ausgabebereich. Fürs Erste müssen Sie nur wissen, dass Sie R-Code in den Konsolenbereich eintippen und drücken, um ihn auszuführen. Mehr lernen Sie im weiteren Verlauf dieses Buchs.1
Abbildung E-2: Die Benutzeroberfläche von RStudio zeigt zwei Schlüsselbereiche: In den Bereich Konsole auf der linken Seite geben Sie R-Code ein, und im Bereich Ausgabe auf der rechten Seite finden Sie die erzeugten Diagramme.
Des Weiteren müssen Sie einige R-Pakete installieren. Ein R-Paket ist eine Sammlung von Funktionen, Daten und Dokumentationen, die die Fähigkeiten des grundlegenden R erweitern. Pakete zu verwenden, ist der Schlüssel für erfolgreiches Arbeiten mit R. Die meisten Pakete, die Sie in diesem Buch kennenlernen, gehören zum sogenannten Tidyverse. Die Pakete im Tidyverse sind auf Basis einer gemeinsamen Philosophie von Daten und R-Programmierung konzipiert und von Haus aus für eine Zusammenarbeit ausgelegt.
Das vollständige Tidyverse lässt sich mit einer einzigen Codezeile installieren:
install.packages("tidyverse")
Tippen Sie auf Ihrem Computer diese Codezeile in die Konsole ein und drücken Sie , um die Anweisung auszuführen. R lädt die Pakete von CRAN herunter und installiert sie auf Ihrem Computer.
Die Funktionen, Objekte und Hilfedateien in einem Paket können Sie erst dann verwenden, wenn Sie es geladen haben. Nachdem ein Paket installiert ist, können Sie es mit der Funktion library() laden:
library(tidyverse)
#>──Attaching core tidyverse packages─────────────────────tidyverse 2.0.0──
#>dplyr 1.1.0.9000readr 2.1.4
#>forcats 1.0.0stringr 1.5.0
#>ggplot2 3.4.1tibble 3.1.8
#>lubridate 1.9.2tidyr 1.3.0
#>purrr 1.0.1
#>──Conflicts───────────────────────────────────────tidyverse_conflicts()──
#>dplyr::filter() masks stats::filter()
#>dplyr::lag() masks stats::lag()
#>іUse the conflicted package (<http://conflicted.r-lib.org/>) to force all
#> conflicts to become errors
Hieraus geht hervor, dass Tidyverse neun Pakete lädt: dplyr, forcats, ggplot2, lubridate, purrr, readr, stringr, tibble und tidyr. Diese Pakete gelten als Kern des Tidyverse, weil Sie sie in fast jeder Analyse verwenden.
Pakete im Tidyverse ändern sich ziemlich häufig. Mit tidyverse_update() können Sie feststellen, ob Updates verfügbar sind.
Es gibt viele weitere ausgezeichnete Pakete, die nicht Bestandteil des Tidyverse sind, weil sie Probleme in einem anderen Bereich lösen oder für andere zugrunde liegenden Prinzipien konzipiert sind. Das macht sie weder besser noch schlechter, nur anders. Mit anderen Worten, die Ergänzung zum Tidyverse ist nicht das Messyverse, sondern viele andere Universen von zusammenhängenden Paketen. Wenn Sie mehr Data-Science-Projekte mit R angehen, lernen Sie neue Pakete kennen und neue Methoden, um Daten möglichst effektiv zu analysieren.
In diesem Buch greifen wir auf diverse Pakete zurück, die nicht im Tidyverse enthalten sind. Zum Beispiel stellen die folgenden Pakete interessante Datensets bereit, auf die wir beim Erlernen von R zurückgreifen können:
install.packages(c("arrow", "babynames", "curl", "duckdb", "gapminder", "ggrepel", "ggridges", "ggthemes", "hexbin", "janitor", "Lahman", "leaflet", "maps", "nycflights13", "openxlsx", "palmerpenguins", "repurrrsive", "tidymodels", "writexl"))
Darüber hinaus stützen wir uns auf weitere Pakete, die in Beispielen nur einmal vorkommen. Diese brauchen Sie nicht sofort zu installieren, denken Sie aber daran, wenn Sie einen Fehler wie diesen sehen:
library(ggrepel)
#> Error in library(ggrepel) : there is no package called ‘ggrepel’
In diesem Fall müssen Sie install.packages("ggrepel") ausführen, um das Paket zu installieren.
Der letzte Abschnitt hat einige Beispiele für die Ausführung von R-Code gezeigt. Der Code im Buch sieht folgendermaßen aus:
1+2
#> [1] 3
Wenn Sie denselben Code in der Konsole auf Ihrem Computer ausführen, sieht er so aus:
> 1 + 2
[1] 3
Die beiden Codefragmente unterscheiden sich vor allem in zwei Punkten. In Ihrer Konsole tippen Sie den Code nach dem Zeichen > ein. Dieses Zeichen ist der sogenannte Prompt, den wir aber im Buch nicht wiedergeben. Die Ausgaben haben wir im Buch mit #> auskommentiert, während sie in Ihrer Konsole direkt nach dem Code erscheinen. Wenn Sie mit einer elektronischen Version des Buchs arbeiten, können Sie aufgrund dieser beiden Unterschiede den Code ganz einfach aus dem Buch in die Konsole kopieren.
Das gesamte Buch hindurch halten wir uns an einen einheitlichen Satz von Konventionen in Bezug auf den Code:
Funktionen werden in einer Listingschrift wiedergegeben und mit Klammern versehen, wie zum Beispiel
sum()
oder
mean()
.
Andere R-Objekte (wie zum Beispiel Daten oder Funktionsargumente) sind in Listingschrift formatiert, und es gibt keine nachfolgenden Klammern, zum Beispiel
flights
oder
x
.
Wenn wir klarmachen wollen, aus welchem Paket ein Objekt stammt, schreiben wir den Paketnamen gefolgt von zwei Doppelpunkten, zum Beispiel
dplyr::mutate()
oder
nycflights13::flights
. Dies ist ebenfalls gültiger R-Code.
In diesem Buch werden die folgenden typografische Konventionen verwendet:
Kursiv
Kennzeichnet neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen.
Schreibmaschinenschrift
Wird in Programmlistings verwendet und im Fließtext für Programmelemente wie zum Beispiel Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter.
Schreibmaschinenschrift fett
Kennzeichnet Befehle oder andere Texte, die von den Benutzenden buchstäblich eingegeben werden sollen.
Schreibmaschinenschrift kursiv
Zeigt Text, der ersetzt werden soll durch Werte, die die Benutzenden bereitstellen, oder Werte, die sich aus dem Kontext ergeben.
Dieses Element kennzeichnet einen allgemeinen Hinweis.
Im GitHub-Repository ist unter https://oreil.ly/8GLe7 eine Onlineversion dieses Buchs (in Englisch) verfügbar. Dort finden Sie auch Ergänzungen, Änderungen und Erweiterungen, die zwischen den gedruckten Ausgaben des Buchs vorgenommen wurden. Den Quellcode für das Buch finden Sie unter https://oreil.ly/Q8z_O. Das Buch wird von Quarto (https://oreil.ly/_6LNH) unterstützt, was es erleichtert, Bücher zu schreiben, die Text und ausführbaren Code vereinen.
Dieses Buch ist nicht nur das Produkt von Hadley, Mine und Garrett, sondern das Ergebnis diverser Gespräche (persönlich und online), die wir mit vielen Menschen in der R-Community geführt haben. Wir sind unglaublich dankbar für alle diese Unterhaltungen, die wir mit Ihnen allen geführt haben, vielen Dank!
Wir möchten uns bei unseren technischen Rezensenten für ihr wertvolles Feedback bedanken: Ben Baumer, Lorna Barclay, Richard Cotton, Emma Rand und Kelly Bodwin.
Dieses Buch wurde öffentlich geschrieben, und viele Menschen haben über Pull-Requests mitgewirkt. Ein besonderer Dank geht an alle 259 Personen, die über GitHub-Pull-Requests zu Verbesserungen beigetragen haben (in alphabetischer Reihenfolge nach Benutzernamen): @a-rosenberg, Tim Becker (@a2800276), Abinash Satapathy (@Abinashbunty), Adam Gruer (@adam-gruer), adi pradhan (@adidoit), A. s. (@Adrianzo), Aep Hidyatuloh (@aephidayatuloh), Andrea Gilardi (@agila5), Ajay Deonarine (@ajay-d), @AlanFeder, Daihe Sui (@alansuidaihe), @alberto-agudo, @AlbertRapp, @aleloi, pete (@alonzi), Alex (@ALShum), Andrew M. (@amacfarland), Andrew Landgraf (@andland), @andyhuynh92, Angela Li (@angela-li), Antti Rask (@AnttiRask), LOU Xun (@aquarhead), @ariespirgel, @august-18, Michael Henry (@aviast), Azza Ahmed (@azzaea), Steven Moran (@bambooforest), Brian G. Barkley (@BarkleyBG), Mara Averick (@batpigandme), Oluwafemi OYEDELE (@BB1464), Brent Brewington (@bbrewington), Bill Behrman (@behrman), Ben Herbertson (@benherbertson), Ben Marwick (@benmarwick), Ben Steinberg (@bensteinberg), Benjamin Yeh (@bentyeh), Betul Turkoglu (@betulturkoglu), Brandon Greenwell (@bgreenwell), Bianca Peterson (@BinxiePeterson), Birger Niklas (@BirgerNi), Brett Klamer (@bklamer), @boardtc, Christian (@c-hoh), Caddy (@caddycarine), Camille V Leonard (@camillevleonard), @canovasjm, Cedric Batailler (@cedricbatailler), Christina Wei (@christina-wei), Christian Mongeau (@chr-Mongeau), Cooper Morris (@coopermor), Colin Gillespie (@csgillespie), Rademeyer Vermaak (@csrvermaak), Chloe Thierstein (@cthierst), Chris Saunders (@ctsa), Abhinav Singh (@curious-abhinav), Curtis Alexander (@curtisalexander), Christian G. Warden (@cwarden), Charlotte Wickham (@cwickham), Kenny Darrell (@darrkj), David Kane (@davidkane9), David (@davidrsch), David Rubinger (@davidrubinger), David Clark (@DDClark), Derwin McGeary (@derwinmcgeary), Daniel Gromer (@dgromer), @Divider85, @djbirke, Danielle Navarro (@djnavarro), Russell Shean (@DOH-RPS1303), Zhuoer Dong (@dongzhuoer), Devin Pastoor (@dpastoor), @DSGeoff, Devarshi Thakkar (@dthakkar09), Julian During (@duju211), Dylan Cashman (@dylancashman), Dirk Eddelbuettel (@eddelbuettel), Edwin Thoen (@EdwinTh), Ahmed El-Gabbas (@elgabbas), Henry Webel (@enryH), Ercan Karadas (@ercan7), Eric Kitaif (@EricKit), Eric Watt (@ericwatt), Erik Erhardt (@erikerhardt), Etienne B. Racine (@etiennebr), Everett Robinson (@evjrob), @fellennert, Flemming Miguel (@flemmingmiguel), Floris Vanderhaeghe (@florisvdh), @funkybluehen, @gabrivera, Garrick Aden-Buie (@gadenbuie), Peter Ganong (@ganong123), Gerome Meyer (@GeroVanMi), Gleb Ebert (@gl-eb), Josh Goldberg (@GoldbergData), bahadir cankardes (@gridgrad), Gustav W Delius (@gustavdelius), Hao Chen (@hao-trivago), Harris McGehee (@harrismcgehee), @hendrikweisser, Hengni Cai (@hengnicai), Iain (@Iain-S), Ian Sealy (@iansealy), Ian Lyttle (@ijlyttle), Ivan Krukov (@ivan-krukov), Jacob Kaplan (@jacobkap), Jazz Weisman (@jazzlw), John Blischak (@jdblischak), John D. Storey (@jdstorey), Gregory Jefferis (@jefferis), Jeffrey Stevens (@JeffreyRStevens), 蒋雨蒙 (@JeldorPKU), Jennifer (Jenny) Bryan (@jennybc), Jen Ren (@jenren), Jeroen Janssens (@jeroenjanssens), @jeromecholewa, Janet Wesner (@jilmun), Jim Hester (@jimhester), JJ Chen (@jjchern), Jacek Kolacz (@jkolacz), Joanne Jang (@joannejang), @johannes4998, John Sears (@johnsears), @jonathanflint, Jon Calder (@jonmcalder), Jonathan Page (@jonpage), Jon Harmon (@jonthegeek), JooYoung Seo (@jooyoungseo), Justinas Petuchovas (@jpetuchovas), Jordan (@jrdnbradford), Jeffrey Arnold (@jrnold), Jose Roberto Ayala Solares (@jroberayalas), Joyce Robbins (@jtr13), @juandering, Julia Stewart Lowndes (@jules32), Sonja (@kaetschap), Kara Woo (@karawoo), Katrin Leinweber (@katrinleinweber), Karandeep Singh (@kdpsingh), Kevin Perese (@kevinxperese), Kevin Ferris (@kferris10), Kirill Sevastyanenko (@kirillseva), Jonathan Kitt (@KittJonathan), @koalabearski, Kirill Müller (@krlmlr), Rafał Kucharski (@kucharsky), Kevin Wright (@kwstat), Noah Landesberg (@landesbergn), Lawrence Wu (@lawwu), @lindbrook, Luke W Johnston (@lwjohnst86), Kara de la Marck (@MarckK), Kunal Marwaha (@marwahaha), Matan Hakim (@matanhakim), Matthias Liew (@MatthiasLiew), Matt Wittbrodt (@MattWittbrodt), Mauro Lepore (@maurolepore), Mark Beveridge (@mbeveridge), @mcewenkhundi, mcsnowface, PhD (@mcsnowface), Matt Herman (@mfherman), Michael Boerman (@michaelboerman), Mitsuo Shiota (@mitsuoxv), Matthew Hendrickson (@mjhendrickson), @MJMarshall, Misty Knight-Finley (@mkfin7), Mohammed Hamdy (@mmhamdy), Maxim Nazarov (@mnazarov), Maria Paula Caldas (@mpaulacaldas), Mustafa Ascha (@mustafaascha), Nelson Areal (@nareal), Nate Olson (@nate-d-olson), Nathanael (@nateaff), @nattalides, Ned Western (@NedJWestern), Nick Clark (@nickclark1000), @nickelas, Nirmal Patel (@nirmalpatel), Nischal Shrestha (@nischalshrestha), Nicholas Tierney (@njtierney), Jakub Nowosad (@Nowosad), Nick Pullen (@nstjhp), @olivier6088, Olivier Cailloux (@oliviercailloux), Robin Penfold (@p0bs), Pablo E. Garcia (@pabloedug), Paul Adamson (@padamson), Penelope Y (@penelopeysm), Peter Hurford (@peterhurford), Peter Baumgartner (@petzi53), Patrick Kennedy (@pkq), Pooya Taherkhani (@pooyataher), Y. Yu (@PursuitOfDataScience), Radu Grosu (@radugrosu), Ranae Dietzel (@Ranae), Ralph Straumann (@rastrau), Rayna M Harris (@raynamharris), @ReeceGoding, Robin Gertenbach (@rgertenbach), Jajo (@RIngyao), Riva Quiroga (@rivaquiroga), Richard Knight (@RJHKnight), Richard Zijdeman (@rlzijdeman), @robertchu03, Robin Kohrs (@RobinKohrs), Robin (@Robinlovelace), Emily Robinson (@robinsones), Rob Tenorio (@robtenorio), Rod Mazloomi (@RodAli), Rohan Alexander (@RohanAlexander), Romero Morais (@RomeroBarata), Albert Y. Kim (@rudeboybert), Saghir (@saghirb), Hojjat Salmasian (@salmasian), Jonas (@sauercrowd), Vebash Naidoo (@sciencificity), Seamus McKinsey (@seamus-mckinsey), @seanpwilliams, Luke Smith (@seasmith), Matthew Sedaghatfar (@sedaghatfar), Sebastian Kraus (@sekR4), Sam Firke (@sfirke), Shannon Ellis (@ShanEllis), @shoili, Christian Heinrich (@Shurakai), S’busiso Mkhondwane (@sibusiso16), SM Raiyyan (@smraiyyan), Jakob Krigovsky (@sonicdoe), Stephan Koenig (@stephan-koenig), Stephen Balogun (@stephenbalogun), Steven M. Mortimer (@StevenMMortimer), Stéphane Guillou (@stragu), Sulgi Kim (@sulgik), Sergiusz Bleja (@svenski), Tal Galili (@talgalili), Alec Fisher (@Taurenamo), Todd Gerarden (@tgerarden), Tom Godfrey (@thomasggodfrey), Tim Broderick (@timbroderick), Tim Waterhouse (@timwaterhouse), TJ Mahr (@tjmahr), Thomas Klebel (@tklebel), Tom Prior (@tomjamesprior), Terence Teo (@tteo), @twgardner2, Ulrik Lyngs (@ulyngs), Shinya Uryu (@uribo), Martin Van der Linden (@vanderlindenma), Walter Somerville (@waltersom), @werkstattcodes, Will Beasley (@wibeasley), Yihui Xie (@yihui), Yiming (Paul) Li (@yimingli), @yingxingwu, Hiroaki Yutani (@yutannihilation), Yu Yu Aung (@yuyu-aung), Zach Bogart (@zachbogart), @zeal626 und Zeki Akyol (@zekiakyol).
Der erste Teil dieses Buchs soll Ihnen einen schnellen Überblick über die wichtigsten Tools der Data Science geben: Importieren, Bereinigen, Transformieren und Visualisieren von Daten, wie Abbildung I-1 zeigt. Dabei wollen wir Ihnen das »Gesamtbild« der Data Science vor Augen führen, wobei wir von den entscheidenden Werkzeugen gerade so viel vermitteln, dass Sie echte, wenn auch einfache Datensets angehen können. Die späteren Teile des Buchs vertiefen jedes dieser Themen, sodass Sie für ein größeres Spektrum von Data-Science-Herausforderungen gerüstet sind.
Abbildung I-1: In diesem Teil des Buchs lernen Sie, wie Sie Daten importieren, bereinigen, transformieren und visualisieren.
Die Tools der Data Science stehen in vier Kapiteln im Mittelpunkt:
Visualisierung eignet sich gut, um mit R-Programmierung zu beginnen, denn die Vorteile liegen auf der Hand: Es entstehen elegante und informative Diagramme, die Ihnen beim Verstehen der Daten helfen. In
Kapitel 1
steigen Sie ein in die Visualisierung. Dabei lernen Sie die grundlegende Struktur eines
ggplot2
-Diagramms und leistungsfähige Techniken kennen, um Daten in Diagramme zu überführen.
Da Visualisierung allein in der Regel nicht genügt, macht Sie
Kapitel 3
vertraut mit den Schlüsselbegriffen, mit denen Sie wichtige Variablen auswählen, Schlüsselbeobachtungen ausfiltern, neue Variablen erzeugen und Zusammenfassungen berechnen können.
In
Kapitel 5
geht es um bereinigte Daten, d.h. eine konsistente Methode der Datenspeicherung, die Transformation, Visualisierung und Modellierung erleichtert. Sie lernen die zugrunde liegenden Prinzipien kennen und erfahren, wie Sie Ihre Daten in eine bereinigte Form bringen.
Bevor Sie Ihre Daten transformieren und visualisieren können, müssen Sie sie zunächst nach R übertragen.
Kapitel 7
vermittelt Ihnen die Grundlagen, die Sie benötigen, um
.csv
-Dateien nach R bringen.
In diese vier Kapitel eingebettet sind vier weitere Kapitel, die sich auf Ihren R-Workflow konzentrieren. In den Kapiteln 2, 4 und 6 lernen Sie bewährte Praktiken kennen, um R-Code zu schreiben und zu organisieren. Damit werden Sie auf lange Sicht erfolgreich bleiben, weil Sie die Tools in die Hand bekommen, um organisiert zu bleiben, wenn Sie reale Projekte angehen müssen. Schließlich lernen Sie in Kapitel 8, wie Sie sich Hilfe holen und wo Sie weiterlernen können.
»The simple graph has brought more information to the data analyst’s mind than any other device.«
– John Tukey
R verfügt über mehrere Systeme, um Diagramme zu erzeugen, doch ggplot2 ist eines der elegantesten und flexibelsten. Das Paket ggplot2 implementiert die Grammar of Graphics, ein einheitliches System, um Grafiken zu beschreiben und zu erstellen. Mit ggplot2 beschleunigen Sie Ihre Arbeit – Sie brauchen nur ein System zu lernen und können es in vielen verschiedenen Situationen anwenden.
In diesem Kapitel erfahren Sie, wie Sie Ihre Daten mit ggplot2 visualisieren. Zunächst erzeugen wir ein einfaches Streudiagramm und nutzen es, um ästhetische Zuordnungen und geometrische Objekte einzuführen – die fundamentalen Bausteine von ggplot2. Dann führen wir Sie durch die Visualisierung von Verteilungen einzelner Variablen sowie die Visualisierung von Beziehungen zwischen zwei oder mehr Variablen. Zum Abschluss speichern Sie Ihre Diagramme und bekommen Tipps zur Fehlersuche.
Im Mittelpunkt dieses Kapitels steht ggplot2, eine Kernkomponente des Tidyverse. Um auf die Datensets, Hilfeseiten und Funktionen, die wir in diesem Kapitel verwenden, zugreifen zu können, laden Sie das Tidyverse mit folgendem Code:
library(tidyverse)
#>──Attaching core tidyverse packages─────────────────────tidyverse 2.0.0──
#>dplyr 1.1.0.9000readr 2.1.4
#>forcats 1.0.0stringr 1.5.0
#>ggplot2 3.4.1tibble 3.1.8
#>lubridate 1.9.2tidyr 1.3.0
#>purrr 1.0.1
#>──Conflicts───────────────────────────────────────tidyverse_conflicts()──
#>dplyr::filter() masks stats::filter()
#>dplyr::lag() masks stats::lag()
#>іUse the conflicted package (<http://conflicted.r-lib.org/>) to force all
#> conflicts to become errors
Diese eine Codezeile lädt den Kern des Tidyverse, d.h. Pakete, die Sie in fast jeder Datenanalyse verwenden werden. Außerdem weist der Text in der Ausgabe darauf hin, welche Funktionen aus dem Tidyverse mit Funktionen im Basis-R (oder anderen Paketen, die Sie möglicherweise geladen haben) kollidieren.1
Wenn Sie diesen Code ausführen und die Fehlermeldung there is no package called 'tidyverse' (kein Paket mit dem Namen tidyverse vorhanden) ernten, müssen Sie das Paket zunächst installieren und dann die Anweisung library() erneut ausführen:
install.packages("tidyverse")
library(tidyverse)
Ein Paket müssen Sie nur einmal installieren, doch Sie müssen es jedes Mal erneut laden, wenn Sie eine neue Sitzung beginnen.
Zusätzlich zum Tidyverse verwenden wir das Paket palmerpenguins, das das Datenset penguins mit Körpermaßen von Pinguinen auf drei Inseln des Palmer-Archipels enthält, und das Paket ggthemes, das eine sichere Farbpalette für Farbenblinde bietet.
library(palmerpenguins)
library(ggthemes)
Wiegen Pinguine mit längeren Flossen mehr oder weniger als Pinguine mit kürzeren Flossen? Wahrscheinlich haben Sie schon eine Antwort parat, aber versuchen Sie, Ihre Antwort zu präzisieren. Wie sieht die Beziehung zwischen Flossenlänge und Körpermasse aus? Ist sie positiv? Negativ? Linear? Nicht linear? Hängt die Beziehung von der Pinguinart ab? Wie sieht es mit der Insel aus, auf der der Pinguin lebt? Lassen Sie uns Visualisierungen erstellen, die wir heranziehen können, um diese Fragen zu beantworten.
Ihre Antworten auf diese Fragen können Sie anhand des Dataframes penguins testen, den Sie in palmerpenguins (aka palmerpenguins::penguins) finden. Ein Dataframe ist eine rechteckige Sammlung von Variablen (in den Spalten) und Beobachtungen (in den Zeilen). Der Dataframe penguins enthält 344 Beobachtungen, die Dr. Kristen Gorman und die Palmer-Station, Antarctica LTER, zusammengetragen und zugänglich gemacht haben.2
Um die Diskussion zu erleichtern, definieren wir einige Begriffe:
Variable
Eine Quantität, Qualität oder Eigenschaft, die man messen kann.
Wert
Der Zustand einer Variablen, wenn sie gemessen wird. Der Wert einer Variablen kann sich von Messung zu Messung ändern.
Beobachtung
Ein Satz von Messungen, die unter ähnlichen Bedingungen erfolgen (wobei man normalerweise alle Messungen einer Beobachtung zur gleichen Zeit am selben Objekt vornimmt). Eine Beobachtung enthält mehrere Werte, die jeweils einer anderen Variablen zugewiesen werden. Manchmal sprechen wir bei einer Beobachtung auch von einem Datenpunkt.
Tabellarische Daten
Eine Menge von Werten, die jeweils einer Variablen und einer Beobachtung zugeordnet sind. Tabellarische Daten sind bereinigt, wenn jeder Wert in seiner eigenen »Zelle«, jede Variable in ihrer eigenen Spalte und jede Beobachtung in ihrer eigenen Zeile platziert ist.
In diesem Zusammenhang bezieht sich eine Variable auf ein Attribut aller Pinguine und eine Beobachtung auf alle Attribute eines einzelnen Pinguins.
Geben Sie den Namen des Dataframes in der Konsole ein, und R gibt daraufhin eine Vorschau seines Inhalts. In der ersten Zeile dieser Vorschau sehen Sie die Bezeichnung tibble. Im Tidyverse verwenden wir spezielle Dataframes, die man Tibbles nennt und die Sie bald kennenlernen werden.
penguins
#> # A tibble: 344 × 8
#> species island bill_length_mm bill_depth_mm flipper_length_mm
#> <fct> <fct> <dbl> <dbl> <int>
#> 1 Adelie Torgersen 39.1 18.7 181
#> 2 Adelie Torgersen 39.5 17.4 186
#> 3 Adelie Torgersen 40.3 18 195
#> 4 Adelie Torgersen NA NA NA
#> 5 Adelie Torgersen 36.7 19.3 193
#> 6 Adelie Torgersen 39.3 20.6 190
#> # … with 338 more rows, and 3 more variables: body_mass_g <int>, sex <fct>,
#> # year <int>
Dieser Dataframe umfasst acht Spalten. Für eine alternative Ansicht, bei der Sie alle Variablen und die ersten Beobachtungen jeder Variablen sehen können, rufen Sie glimpse() auf. Falls Sie sich in RStudio befinden, öffnen Sie mit View(penguins) einen interaktiven Datenviewer.
glimpse(penguins)
#> Rows: 344
#> Columns: 8
#> $ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, A…
#> $ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torge…
#> $ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.…
#> $ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.…
#> $ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, …
#> $ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 347…
#> $ sex <fct> male, female, female, NA, female, male, female, m…
#> $ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2…
Der Dataframe penguins enthält unter anderem folgende Variablen:
species
Die Art der Pinguine (Adelie, Chinstrap oder Gentoo).
flipper_length_mm
Die Länge der Flossen eines Pinguins in Millimeter.
body_mass_g
Die Körpermasse eines Pinguins in Gramm.
Um mehr über den Dataframe penguins zu erfahren, öffnen Sie dessen Hilfeseite mit ?penguins.
In diesem Kapitel wollen wir die Visualisierung erzeugen, die das Verhältnis zwischen Flossenlängen und Körpermassen dieser Pinguine unter Berücksichtigung der Pinguinarten darstellt.
Erstellen wir nun dieses Diagramm Schritt für Schritt.
ggplot(datapenguins)
Als Nächstes müssen wir ggplot() mitteilen, wie die Informationen aus unseren Daten visuell dargestellt werden sollen. Das Argument mapping der Funktion ggplot() definiert, wie Variablen in Ihrem Datenset visuellen Eigenschaften (sogenannten Ästhetiken) Ihres Diagramms zugeordnet werden. Das Argument mapping wird immer in der Funktion aes() definiert, und die Argumente x und y von aes() geben an, welche Variablen den x- und y-Achsen zuzuordnen sind. Fürs Erste ordnen wir nur die Flossenlänge der x-Ästhetik und die Körpermasse der y-Ästhetik zu. Nun sucht ggplot2 nach den zugeordneten Variablen im Argument data, in diesem Fall penguins.
Das folgende Diagramm zeigt das Ergebnis, nachdem diese Zuordnungen hinzugefügt wurden.
Unsere leere Zeichenfläche hat Struktur bekommen – es ist jetzt klar ersichtlich, wo die Flossenlängen (flipper_length_mm) angezeigt werden (auf der x-Achse) und wo die Körpermassen (body_masse_g) erscheinen (auf der y-Achse). Die Pinguine selbst sind aber noch nicht im Diagramm zu sehen. Das liegt daran, dass wir in unserem Code noch nicht ausgedrückt haben, wie die Beobachtungen aus unserem Dataframe in unserem Diagramm dargestellt werden.
Hierfür müssen wir eine Geometrie definieren: das geometrische Objekt, in dem ein Diagramm die Daten darstellt. Diese geometrischen Objekte stellt ggplot2 über Funktionen bereit, die mit geom_ beginnen. Häufig beschreibt man ein Diagramm durch den Typ der Geometrie, auf der das Diagramm aufbaut. Zum Beispiel verwenden Balkendiagramme Balkengeometrien (geom_bar()), Liniendiagramme Liniengeometrien (geom_line()), Boxplots verwenden Boxplot-Geometrien (geom_boxplot()), Streudiagramme Punktgeometrien (geom_point()) usw.
Die Funktion geom_point() fügt eine Schicht mit Punkten in das Diagramm ein, was ein Streudiagramm ergibt. Das Paket ggplot2 bringt viele geometrische Funktionen mit, die jeweils einen anderen Schichtentyp zu einem Diagramm hinzufügen. Im Buch lernen Sie noch eine ganze Menge solcher Funktionen kennen, insbesondere in Kapitel 9.
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
) +
geom_point()
#> Warning: Removed 2 rows containing missing values (`geom_point()`).
Nun haben wir etwas, das unserer Vorstellung von einem »Streudiagramm« entspricht. Zwar sind wir von unserer Zielsetzung noch etwas entfernt, aber mithilfe dieses Diagramms können wir damit beginnen, die Frage zu beantworten, die unsere Untersuchung motiviert hat: »Wie sieht die Beziehung zwischen Flossenlänge und Körpermasse aus?« Die Beziehung scheint positiv zu sein (mit zunehmender Flossenlänge nimmt auch die Körpermasse zu), ziemlich linear zu verlaufen (die Punkte gruppieren sich entlang einer Geraden und nicht um eine Kurve) und mäßig stark zu sein (um die gedachte Gerade ist keine allzu große Streuung vorhanden). Pinguine mit längeren Flossen sind im Allgemeinen auch schwerer.
Bevor wir diesem Diagramm weitere Schichten hinzufügen, wollen wir erst einmal die Warnung untersuchen, die in der Ausgabe erscheint:
Removed 2 rows containing missing values (`geom_point()`).
Übersetzt: 2 Zeilen mit fehlenden Werten entfernt (`geom_point()`).
Diese Meldung erscheint, weil in unserem Datenset für zwei Pinguine die Werte der Körpermasse und/oder der Flossenlänge nicht angegeben sind und ggplot2 keine Möglichkeit hat, sie ohne diese beiden Werte im Diagramm darzustellen. Wie R folgt auch ggplot2 der Philosophie, dass fehlende Werte niemals stillschweigend verschwinden sollten. Eine derartige Warnung werden Sie wahrscheinlich am häufigsten stehen, wenn Sie mit realen Daten arbeiten. Mehr zu diesem oft vorkommenden Problem werden Sie im Laufe des Buchs und insbesondere in Kapitel 18 erfahren. Für die übrigen Diagramme in diesem Kapitel werden wir diese Warnung unterdrücken, damit sie nicht bei jedem einzelnen Diagramm, das wir erstellen, ausgegeben wird.
Streudiagramme sind nützlich, um die Beziehung zwischen numerischen Variablen darzustellen, doch es empfiehlt sich immer, gegenüber jeder offensichtlichen Beziehung zwischen zwei Variablen skeptisch zu sein und zu hinterfragen, ob es vielleicht andere Variablen gibt, die die Art dieser offensichtlichen Beziehung erklären oder verändern. Unterscheidet sich zum Beispiel die Beziehung zwischen Flossenlänge und Körpermasse je nach Pinguinart? Wir wollen deshalb die Arten in unser Diagramm einbinden und sehen, ob dies zusätzliche Erkenntnisse über die offensichtliche Beziehung zwischen diesen Variablen liefert. Hierzu stellen wir die Art mit verschiedenfarbigen Punkten dar.
Müssen wir dafür die Ästhetik oder die Geometrie ändern? Wenn Sie »die ästhetische Zuordnung innerhalb von aes()« vermuten, haben Sie bereits den Dreh raus, wie man Datenvisualisierungen mit ggplot2 erstellt! Und wenn nicht, keine Sorge. Im Laufe des Buchs werden Sie jede Menge andere ggplot-Diagramme erstellen und dabei viele weitere Gelegenheiten bekommen, Ihre Intuition zu überprüfen.
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g, colorspecies)
) +
geom_point()
Wenn eine kategoriale Variable einer Ästhetik zugeordnet wird, weist ggplot2 automatisch jeder einzelnen Schicht der Variablen (jeder der drei Arten) einen eindeutigen Wert der Ästhetik (hier eine eindeutige Farbe) zu. Dieser Vorgang wird auch als Skalierung bezeichnet. Außerdem fügt ggplot2 eine Legende hinzu, die erklärt, welche Werte welchen Schichten entsprechen.
Fügen wir nun eine weitere Schicht hinzu: eine gleichmäßige Kurve, die die Beziehung zwischen Körpermasse und Flossenlänge darstellt. Bevor Sie fortfahren, sollten Sie sich noch einmal den obigen Code ansehen und überlegen, wie Sie diese Kurve zu unserem bestehenden Diagramm hinzufügen können.
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g, colorspecies)
) +
geom_point() +
geom_smooth(method"lm")
Wir haben erfolgreich Geraden hinzugefügt, doch sieht dieses Diagramm noch nicht so aus wie das im Abschnitt »Zielsetzung« auf Seite 32, das nur einen Linienzug für das gesamte Datenset enthält im Gegensatz zu den separaten Geraden für jede der Pinguinarten.
Wenn ästhetische Zuordnungen in ggplot() definiert werden, also auf der globalen Schicht, werden sie an jede der nachfolgenden geometrischen Schichten des Diagramms weitergegeben. Allerdings kann jede geometrische Funktion in ggplot2 auch ein mapping-Argument übernehmen; es ermöglicht ästhetische Zuordnungen auf der lokalen Schicht, die zu denen hinzugefügt werden, die die Schicht von der globalen Schicht erbt.
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
) +
geom_point(mappingaes(colorspecies)) +
geom_smooth(method"lm")
Voilà! Wir haben etwas, das fast schon unserer Zielsetzung entspricht, auch wenn es noch nicht perfekt ist. Denn wir wollen die Pinguinarten durch verschiedene Formen symbolisieren und die Beschriftungen verbessern.
Im Allgemeinen empfiehlt es sich nicht, Informationen nur mithilfe von Farben in einem Diagramm darzustellen, da Menschen Farben aufgrund von Farbenblindheit oder anderen Formen der Farbenfehlsichtigkeit unterschiedlich wahrnehmen. Daher können wir, zusätzlich zu den Farben, die Arten (species) der Ästhetik shape zuordnen.
Wie Sie sich überzeugen können, wird auch die Legende automatisch aktualisiert, um die verschiedenen Punktformen widerzuspiegeln.
Schließlich können wir die Beschriftungen unseres Diagramms mithilfe der Funktion labs() in einer neuen Schicht verbessern. Einige der Argumente für labs() sind sicherlich selbsterklärend: title fügt dem Diagramm einen Titel hinzu und subtitle einen Untertitel. Andere Argumente entsprechen den ästhetischen Zuordnungen: x ist die Beschriftung der x-Achse, y die Beschriftung der y-Achse, und color und shape definieren die Beschriftung für die Legende. Darüber hinaus können wir die Farbpalette mit der Funktion scale_color_colorblind() aus dem Paket ggthemes dahin gehend verbessern, dass die Darstellung auch für Farbenblinde geeignet ist:
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
) +
geom_point(aes(colorspecies, shapespecies)) +
geom_smooth(method"lm") +
labs(
title"Bodymassandflipperlength",
subtitle"Dimensions for Adelie, Chinstrap, and Gentoo Penguins",
x"Flipper length (mm)", y"Body mass (g)",
color"Species", shape"Species"
) +
scale_color_colorblind()
Schließlich haben wir ein Diagramm, das unserer »Zielsetzung« perfekt entspricht!
1.Wie viele Zeilen enthält der Dataframe
penguins
? Wie viele Spalten?
2.Was beschreibt die Variable
bill_depth_mm
im Dataframe
penguins
? Öffnen Sie mit
?penguins
die zugehörige R-Dokumentation, um dies herauszufinden.
3.Erstellen Sie ein Streudiagramm für
bill_depth_mm
versus
bill_length_mm
, also ein Streudiagramm mit
bill_depth_mm
(der Schnabelbreite) auf der y-Achse und
bill_length_mm
(der Schnabellänge) auf der x-Achse. Beschreiben Sie die Beziehung zwischen diesen beiden Variablen.
4.Was passiert, wenn Sie ein Streudiagramm für
species
(Arten) versus
bill_depth_mm
(Schnabelbreite) erstellen? Welche Geometrie könnte besser geeignet sein?
5.Weshalb liefert die folgende Anweisung einen Fehler, und wie lässt sich dieser beseitigen?
ggplot(datapenguins) +
geom_point()
6.Was bewirkt das Argument
na.rm
in
geom_point()
? Welchen Standardwert hat das Argument? Erstellen Sie ein Streudiagramm, in dem Sie dieses Argument erfolgreich verwenden, wenn Sie es auf
TRUE
setzen.
7.Fügen Sie dem Diagramm, das Sie in der vorherigen Übung erstellt haben, die folgende Beschriftung hinzu: »Data come from the palmerpenguins package.« (Übersetzt: Die Daten stammen aus dem Paket palmerpenguins.) Tipp: Werfen Sie einen Blick in die Dokumentation von
labs()
.
8.Erstellen Sie die folgende Visualisierung neu. Welcher Ästhetik sollte
bill_depth_mm
zugeordnet werden? Und sollte die Zuordnung auf der globalen oder der geometrischen Schicht erfolgen?
9.Führen Sie diesen Code gedanklich aus und sagen Sie voraus, wie die Ausgabe aussehen wird. Starten Sie dann den Code in R und überprüfen Sie Ihre Vorhersagen.
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g, colorisland)
) +
geom_point() +
geom_smooth(seFALSE)
10.Werden diese beiden Diagramme unterschiedlich aussehen? Warum bzw. warum nicht?
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
) +
geom_point() +
geom_smooth()
ggplot() +
geom_point(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
) +
geom_smooth(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
)
Wir verlassen nun diese einführenden Abschnitte und gehen über zu einer prägnanteren Ausdrucksweise des ggplot2-Codes. Bislang haben wir alles sehr explizit angegeben, was beim Lernen hilfreich ist:
ggplot(
datapenguins,
mappingaes(xflipper_length_mm, ybody_mass_g)
) +
geom_point()
Normalerweise ist das erste oder sind die beiden ersten Argumente einer Funktion so wichtig, dass Sie sie auswendig runterbeten können. Bei ggplot() lauten die beiden ersten Argumente data und mapping. Ab jetzt verzichten wir in diesem Buch darauf, diese Namen anzugeben. Das spart Tipparbeit, und wegen des geringeren Textumfangs ist es leichter zu sehen, worin sich Diagramme unterscheiden. Auf dieses wichtige Programmierproblem kommen wir in Kapitel 25 zurück.
Schreibt man den obigen Diagrammcode prägnanter, sieht er folgendermaßen aus:
ggplot(penguins, aes(xflipper_length_mm, ybody_mass_g)) +
geom_point()
Später lernen Sie auch die Pipe |> kennen, mit der Sie das Diagramm erstellen können:
penguins|>
ggplot(aes(xflipper_length_mm, ybody_mass_g)) +
geom_point()
Wie Sie die Verteilung einer Variablen visualisieren, hängt vom Typ der Variablen ab: kategorial oder numerisch.
Eine Variable ist kategorial, wenn sie nur eine kleine Menge von Werten annehmen kann. Um die Verteilung einer kategorialen Variablen zu untersuchen, ist ein Balkendiagramm geeignet. Die Höhe der Balken zeigt an, wie viele Beobachtungen bei jedem x-Wert aufgetreten sind.
ggplot(penguins, aes(xspecies)) +
geom_bar()
In Balkendiagrammen von kategorialen Variablen mit ungeordneten Schichten, wie bei den obigen species der Pinguine, ist es oftmals besser, die Balken nach ihren Häufigkeiten neu zu ordnen. Hierzu ist es erforderlich, die Variable in einen Faktor umzuwandeln (wie R kategoriale Daten verarbeitet) und dann die Schichten dieses Faktors neu zu ordnen.
ggplot(penguins, aes(xfct_infreq(species))) +
geom_bar()
Mehr über Faktoren und Funktionen für den Umgang mit Faktoren (wie zum Beispiel fct_infreq()) erfahren Sie in Kapitel 16.
Eine Variable ist numerisch (oder quantitativ), wenn sie einen weiten Bereich von numerischen Werten annehmen kann und es sinnvoll ist, diese Werte zu addieren, zu subtrahieren oder den Mittelwert dieser Werte zu bilden. Numerische Variablen können stetig oder diskret sein. Eine gebräuchliche Visualisierung für Verteilungen von stetigen Variablen ist ein Histogramm.
ggplot(penguins, aes(xbody_mass_g)) +
geom_histogram(binwidth200)
Ein Histogramm unterteilt die x-Achse in Bereiche mit gleichen Abständen und zeigt dann durch die Höhe von Balken die Anzahl der Beobachtungen an, die in jeden Bereich fallen. Im obigen Diagramm zeigt der kleinste Balken, dass 39 Beobachtungen einen body_mass_g-Wert zwischen 3.500 (linker Rand des Balkens) und 3.700 Gramm (rechter Rand des Balkens) haben.
Die Breite der Intervalle in einem Histogramm können Sie mit dem Argument binwidth festlegen, das in den Einheiten der Variablen x gemessen wird. Bei Histogrammen sollten Sie immer verschiedene binwidth-Werte ausprobieren, da sich bei verschiedenen Werten unterschiedliche Muster ergeben können. In den folgenden Diagrammen liefert ein binwidth-Wert von 20 zu schmale Bereiche, was zu viele Balken ergibt, sodass sich die Gestalt der Verteilung nur schwer bestimmen lässt. Ebenso ist ein binwidth-Wert von 2.000 zu hoch, da dann alle Daten in nur drei Bereiche fallen und die Gestalt der Verteilung ebenfalls kaum zu bestimmen ist. Eine binwidth von 200 bietet ein vernünftiges Gleichgewicht.
ggplot(penguins, aes(xbody_mass_g)) +
geom_histogram(binwidth20)
ggplot(penguins, aes(xbody_mass_g)) +
geom_histogram(binwidth2000)
Eine alternative Visualisierung für Verteilungen von numerischen Variablen ist ein Dichtediagramm. Dabei handelt es sich gewissermaßen um eine geglättete Version eines Histogramms und eine praktische Alternative, insbesondere für stetige Daten, die aus einer zugrunde liegenden glatten Verteilung stammen. Wir gehen hier nicht näher darauf ein, wie geom_density() die Dichte schätzt (mehr darüber finden Sie in der Funktionsdokumentation), doch wollen wir anhand einer Analogie erklären, wie die Dichtekurve gezeichnet wird. Stellen Sie sich ein Histogramm vor, das aus Holzklötzen besteht. Weiterhin sei angenommen, dass Sie gekochte Spaghetti auf die Klötze fallen lassen. Die Form, die die Spaghetti annehmen, wenn sie über die Klötze drapiert werden, kann man sich als die Form der Dichtekurve vorstellen. Sie zeigt weniger Details als ein Histogramm, erleichtert es aber, die Form der Verteilung schnell zu erfassen, insbesondere im Hinblick auf Modi und Schiefe.
ggplot(penguins, aes(xbody_mass_g)) +
geom_density()
#> Warning: Removed 2 rows containing non-finite values (`stat_density()`).
Erstellen Sie ein Balkendiagramm für die Pinguinarten (
species
von
penguins
), bei dem Sie
species
der
y
-Ästhetik zuweisen. Worin unterscheidet sich dieses Diagramm gegenüber den bisher gezeigten?
Worin unterscheiden sich die beiden folgenden Diagramme? Welche Ästhetik –
color
oder
fill
– ist nützlicher, um die Farbe der Balken zu ändern?
ggplot(penguins, aes(xspecies)) +
geom_bar(color"red")
ggplot(penguins, aes(xspecies)) +
geom_bar(fill"red")
Was bewirkt das Argument
bins
in
geom_histogram()
?
Erstellen Sie ein Histogramm für die Variable
carat
im Datenset
diamonds
, das verfügbar ist, wenn Sie das Paket
tidyverse
laden. Experimentieren Sie mit verschiedenen
binwidth
-Werten. Welcher Wert fördert die interessantesten Muster zutage?
Um eine Beziehung zu visualisieren, brauchen wir mindestens zwei Variablen, die Ästhetiken eines Diagramms zugeordnet werden. In den folgenden Abschnitten erfahren Sie mehr über häufig verwendete Diagramme zur Visualisierung von Beziehungen zwischen zwei oder mehr Variablen sowie die Geometrien, mit denen sie erzeugt wurden.
Um die Beziehung zwischen einer numerischen und einer kategorialen Variablen darzustellen, können wir Boxplots (auch Kastengrafiken genannt) nebeneinanderstellen. Ein Boxplot ist eine Art visualisierte Zusammenfassung für Positionsmaße (Perzentile), die eine Verteilung beschreiben. Er ist auch nützlich, um potenzielle Ausreißer festzustellen. Wie Abbildung 1-1 zeigt, besteht jeder Boxplot aus folgenden Elementen:
Einer Box, die sich vom 0,25-Perzentil der Verteilung bis zum 0,75-Perzentil erstreckt. Diese Strecke wird als
Interquartilsabstand
(
Interquartile Range
, IQR) bezeichnet. In der Mitte der Box zeigt eine Linie den Median der Verteilung an, d.h. das 0,50-Perzentil. Diese drei Linien vermitteln einen Eindruck von der Ausdehnung der Verteilung und ob die Verteilung symmetrisch zum Median oder zu einer Seite schief ist.
Separate Punkte für Beobachtungen, die mehr als das 1,5-Fache des IQR von der einen oder anderen Kante der Box entfernt liegen. Diese abseits liegenden Punkte sind ungewöhnlich und werden deshalb einzeln gezeichnet.
Zwei Linien (auch
Antennen
oder
Whisker
genannt), die vom jeweiligen Ende der Box zum weitesten Punkt in der Verteilung, der nicht als Ausreißer gilt, führen.
Abbildung 1-1: Diese Grafik zeigt, wie ein Boxplot erstellt wird.
Sehen wir uns nun die Verteilung der Körpermasse nach Arten mithilfe von geom_boxplot() an:
ggplot(penguins, aes(xspecies, ybody_mass_g)) +
geom_boxplot()
Alternativ lassen sich die Dichtediagramme mit geom_density() erstellen:
ggplot(penguins, aes(xbody_mass_g, colorspecies)) +
geom_density(linewidth0.75)
Wir haben auch die Dicke der Linien mit dem Argument linewidth angepasst, um sie etwas stärker vom Hintergrund abzuheben.
Außerdem können wir species den beiden Ästhetiken color und fill zuordnen und mit der Ästhetik alpha die gefüllten Dichtekurven transparent erscheinen lassen. Die Ästhetik alpha nimmt Werte zwischen 0 (vollkommen transparent) und 1 (völlig undurchsichtig) an. Im folgenden Diagramm ist sie auf 0,5 gesetzt:
ggplot(penguins, aes(xbody_mass_g, colorspecies, fillspecies)) +
geom_density(alpha0.5)
Beachten Sie die Begrifflichkeiten, die wir hier verwendet haben:
Wir
ordnen
Variablen Ästhetiken
zu
, wenn sich das durch diese Ästhetik dargestellte visuelle Attribut abhängig von den Werten dieser Variablen ändern soll.
Andernfalls
legen
wir den Wert einer Ästhetik
fest
.
Die Beziehung zwischen zwei kategorialen Variablen lässt sich mit gestapelten Balkendiagrammen darstellen. So zeigen zum Beispiel die folgenden beiden gestapelten Balkendiagramme die Beziehung zwischen island und species oder, genauer gesagt, die Verteilung der Arten innerhalb jeder Insel.
Das erste Diagramm zeigt die Häufigkeiten der Pinguinarten auf jeder Insel. Zwar geht aus dem Häufigkeitsdiagramm hervor, dass die Art Adelie auf jeder Insel gleich stark vertreten ist, aber wir können nicht erkennen, wie die prozentuale Verteilung innerhalb jeder Insel aussieht.
ggplot(penguins, aes(xisland, fillspecies)) +
geom_bar()
ggplot(penguins, aes(xisland, fillspecies)) +
geom_bar(position"fill")
Beim Erstellen dieser Balkendiagramme ordnen wir die Variable, die in Balken unterteilt wird, der x-Ästhetik und die Variable, die die Farben innerhalb der Balken ändert, der fill-Ästhetik zu.
Um die Beziehung zwischen zwei numerischen Variablen darzustellen, haben Sie bisher Streudiagramme (mit geom_point() erstellt) und glatte Kurven (mit geom_smooth() erstellt) kennengelernt. Das Streudiagramm ist wahrscheinlich die gebräuchlichste Diagrammform, die die Beziehung zwischen zwei numerischen Variablen visualisiert.
ggplot(penguins, aes(xflipper_length_mm, ybody_mass_g)) +
geom_point()
Wie der Abschnitt »Ästhetiken und Schichten hinzufügen« auf Seite 35 erläutert hat, können wir weitere Variablen in ein Diagramm einbeziehen, indem wir sie zusätzlichen Ästhetiken zuordnen. Zum Beispiel stehen im folgenden Streudiagramm die Farben der Punkte für die Arten, und die Formen der Punkte verkörpern die Inseln:
ggplot(penguins, aes(xflipper_length_mm, ybody_mass_g)) +
geom_point(aes(colorspecies, shapeisland))
Wenn man einem Diagramm jedoch zu viele ästhetische Zuordnungen hinzufügt, wird es unübersichtlich und schwer zu verstehen. Eine andere Option, die insbesondere für kategoriale Variablen nützlich ist, besteht darin, das Diagramm in Facetten aufzuteilen, d.h. in Teildiagramme, die jeweils eine Teilmenge der Daten anzeigen.
Um Ihr Diagramm nach einer einzelnen Variablen zu facettieren, verwenden Sie facet_wrap(). Das erste Argument von facet_wrap() ist eine Formel,3 die Sie mit einer Tilde (~) gefolgt von einem Variablennamen erstellen. Die Variable, die Sie an facet_wrap() übergeben, sollte kategorial sein.
ggplot(penguins, aes(xflipper_length_mm, ybody_mass_g)) +
geom_point(aes(colorspecies, shapespecies)) +
facet_wrap(~island)
In Kapitel 9 lernen Sie viele weitere Geometrien kennen, um Verteilungen von Variablen und Beziehungen zwischen ihnen grafisch darzustellen.
Der mit dem Paket
ggplot2
gebündelte Dataframe
mpg
enthält 234 Beobachtungen, die von der US-Umweltschutzbehörde für 38 Fahrzeugmodelle gesammelt wurden. Welche Variablen in
mpg
sind kategorial? Welche Variablen sind numerisch? (Tipp: Geben Sie
?mpg
ein, um die Dokumentation für das Datenset zu lesen.) Wie können Sie diese Informationen sehen, wenn Sie
mpg
ausführen?
Erstellen Sie mit dem Dataframe
mpg
ein Streudiagramm von
hwy
über
displ
. Als Nächstes ordnen Sie eine dritte, numerische Variable
color
zu, dann zu
size
, dann sowohl zu
color
als auch zu
size
und schließlich zu
shape
. Wie verschieden verhalten sich diese Ästhetiken für kategoriale Variablen gegenüber numerischen Variablen?
Was passiert im Streudiagramm
hwy
über
displ
, wenn Sie eine dritte Variable
linewidth
zuordnen?
Was passiert, wenn Sie dieselbe Variable mehreren Ästhetiken zuordnen?
Erstellen Sie ein Streudiagramm von
bill_depth_mm
über
bill_length_mm
und färben Sie die Punkte nach
species
ein. Was wird über die Beziehung zwischen diesen beiden Variablen aufgedeckt, wenn die Färbung nach der Art hinzugefügt wird? Wie sieht es mit der Bildung von Facetten nach Arten aus?
Weshalb liefert der folgende Code zwei separate Legenden? Wie lässt er sich korrigieren, um die beiden Legenden zusammenzufassen?
ggplot(
datapenguins,
mappingaes(
xbill_length_mm, ybill_depth_mm,
colorspecies, shapespecies
)
) +
geom_point() +
labs(color"Species")
Erstellen Sie die beiden folgenden gestapelten Balkendiagramme. Welche Frage können Sie mit dem ersten Balkendiagramm beantworten? Welche Frage können Sie mit dem zweiten Diagramm beantworten?
ggplot(penguins, aes(xisland, fillspecies)) +
geom_bar(position"fill")
ggplot(penguins, aes(xspecies, fillisland)) +
geom_bar(position"fill")
Nachdem Sie ein Diagramm erstellt haben, möchten Sie es vielleicht aus R herausholen, indem Sie es als Bild speichern, das Sie an anderer Stelle verwenden können. Dies ist die Aufgabe der Funktion ggsave(), die das zuletzt erzeugte Diagramm auf einem Datenträger speichert:
ggplot(penguins, aes(xflipper_length_mm, ybody_mass_g)) +
geom_point()
ggsave(filename"penguin-plot.png")
Dieser Code speichert Ihr Diagramm in Ihrem Arbeitsverzeichnis. Mehr zu diesem Konzept erfahren Sie in Kapitel 6.
Wenn Sie width und height nicht angeben, werden die jeweiligen Werte aus den Abmessungen des aktuellen Zeichengeräts übernommen. Im Sinne von reproduzierbarem Code sollten Sie Breite und Höhe angeben. Mehr über ggsave() finden Sie in der Dokumentation.
Im Allgemeinen empfehlen wir Ihnen jedoch, Ihre Abschlussberichte mit Quarto zu verfassen. Dabei handelt es sich um ein reproduzierbares Autorensystem, das es Ihnen ermöglicht, Code und Textbeschreibungen ineinander zu verschachteln und Ihre Diagramme automatisch in Ihre Aufzeichnungen einzubinden. Mehr über Quarto lernen Sie in Kapitel 28.
Führen Sie die folgenden Codezeilen aus. Welches der beiden Diagramme wird als
mpg-plot.png
gespeichert? Warum?
ggplot(mpg, aes(xclass)) +
geom_bar()
ggplot(mpg, aes(xcty, yhwy)) +
geom_point()
ggsave("mpg-plot.png")
Was müssen Sie im vorherigen Code ändern, um das Diagramm als PDF-Dokument statt als PNG-Grafik zu speichern? Wie könnten Sie herausfinden, welche Arten von Bilddateien in
ggsave()
funktionieren?
Wenn Sie R-Code ausführen, werden Sie wahrscheinlich auch auf Probleme stoßen. Machen Sie sich keine Sorgen – das passiert jedem. Obwohl wir bereits seit Jahren R-Code schreiben, produzieren wir immer noch Code, der nicht auf Anhieb funktioniert.
Vergleichen Sie zunächst den Code, den Sie ausführen, mit dem Code im Buch. R ist äußerst pingelig, und ein falsch gesetztes Zeichen kann den Unterschied ausmachen. Stellen Sie sicher, dass jede öffnende Klammer ( mit einer schließenden Klammer ) und jedes Anführungszeichen " mit einem zweiten Anführungszeichen " gepaart ist. Manchmal starten Sie den Code, und nichts passiert. Kontrollieren Sie die linke Seite Ihrer Konsole: Ein Pluszeichen bedeutet, dass R von einem nicht vollständig eingegebenen Ausdruck ausgeht und darauf wartet, dass Sie ihn abschließen. In diesem Fall ist es normalerweise recht einfach, wieder von vorn zu beginnen, indem Sie die Verarbeitung des aktuellen Befehls mit abbrechen.
Ein häufig auftretendes Problem beim Erstellen von ggplot2-Grafiken besteht darin, das Pluszeichen an der falschen Stelle zu schreiben: Es muss am Ende der Zeile stehen, nicht am Anfang. Mit anderen Worten, Sie sollten darauf achten, dass Sie den Code nicht versehentlich wie folgt geschrieben haben:
ggplot(
