class: title-slide <script async defer data-domain="rstatszh.github.io/website" src="https://plausible.io/js/plausible.js"></script> # rstatsZH - Data Science mit R ## Daten Transformation mit dplyr .bottom[
Lars Schöbitz
2023-09-28
] --- class: middle, inverse # .large[Data Science Lifecycle] ??? - Wir haben bereits eine ganze Menge über Visualisierungen gelernt und diese sind ein guter Ausgangspunkt wenn wir mit Daten arbeiten - Was die Daten bisher alle gemeinsam hatten ist, dass diese in einem Format kommen, welches es uns ermöglicht direkt in die Visualsierungen einzusteigen - In der Realität ist das allerdings selten der Fall --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.001.png) background-size: contain ??? - Jedes Data Science Projekt folgt in etwa einem ähnlichen Zyklus, auch als als Data Science Lifecycle bezeichnet - Ich möchte diesen jetzt etwas erläutern und in Zukunft nutzen um uns zu orientieren --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.002.png) background-size: contain ??? 1. Als erstes müssen wir unsere Daten importieren. Typischerweise bedeuetet dies, dass wirt Daten: - aus einer Datei - aus einer Datenbank - oder aus einer Web Applikation haben, welche wir in R importieren wollen. 2. Wenn wir es schaffen Daten zu importieren, dann können wir auch Data Science damit machen. --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.003.png) background-size: contain ??? 1. Sobald die Daten importiert sind, müssen wir sie säubern und aufräumen (Dazu werde ich auch tidying sagen) 2. Dies bedeutet Daten in eine Struktur zu bringen, welche es uns erlaubt uns auf unsere Fragen zu konzentrieren und nicht auf das Format in welchem die Daten sein müssen 3. In diesem Schritt verbringen wir typischwerweise den grössten Anteil unserer Zeit. 4. Es wurde geschätzt, dass wir etwa 3/4 unserer Zeit mit dem Data tidying verbringen, bevor wir diese für eine Analyse nutzen können. 5. Es lohnt sich also hier Zeit in Übungen zu investieren, in welchen ihr lernt Daten in ein Format zu bringen, welches tidy ist und das vielleicht schon wenn diese gesammelt werden und bevor sie importiert werdern. --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.004.png) background-size: contain ??? 1. Sobald unsere Daten tidy sind, ist ein typischer erster Schritt die Daten Transfomationen oder auch Manipulation gennannt. 2. Dies beinhaltet, zum Beispiel: - Daten auf das eingrenzen was uns interessiert (z.B. Alle Personen über 18 Jahre in einer bestimmten Gemeinde; Oder alle Daten aus dem letzten Jahr anstatt der letzten 20 Jahre) - neue Variablen aus existierenden Variablen erstellen (z.B. Bevölkerungsdichte aus der Bevölkerung und Fläche einer Gemeinde) - zusammenfassende Statistiken berechnen, wie Häufigkeiten oder den Durchschnitt --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.005.png) background-size: contain ??? 1. Sobald wir die tidy Daten und die Variablen haben welche wir brauchen, gibt es zwei Wege um Wissen zu generieren: - Visualisierungen, und - Modellierungen 2. Diese haben komplementäre Stärken und die meisten Analysen werden einige Male zwischen den beiden iterieren 3. Visualiserungen ist eine fundamental menschliche Aktivität. Eine gute Visualisierungen zeigt uns Dinge die wir nicht erwartet haben, oder wirft neue Fragen über unsere Daten auf. --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.006.png) background-size: contain ??? 1. Modelle sind komplementäre Werkzeuge zu Visualisierungen. Sobald wir unsere Fragen präzise definiert haben, können wir Modelle nutzen um diese zu beantworten. 2. Modellierungen spielen eine untergeordnete Rolle in unserem Kurs. Aber, ich bin überzeugt, dass ihr euch am Ende des Kurses selbstständig und effizient in diesem Bereich weiterbilden könnt. Wichtiger ist es, dass ihr die Grundprinzipien versteht welche immer wieder angewendet werden. --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.007.png) background-size: contain ??? 1. Der letzte Schritt ist die Kommunikation. Ein kritischer Aspekt eines jeden Analyse Projektes. 2. Es spielt keine Rolle wie gut wir unsere Daten durch Modelle und Visualisierungen kennengelernt haben, wenn wir die Ergebnisse nicht auch mit anderen kommunizieren können. 3. R ist hat in diesem Bereich in den letzten Jahren deutlich zu gelegt. Es ist zu einer Programmiersprache auch für die Kommunikation geworden. --- background-image: url(img/data-science-lifecycle_de/data-science-lifecycle_de.008.png) background-size: contain ??? 1. In den nächsten 2 Wochen werden wir uns vor Allem mit dem Tidying und der Tranformation von Daten beschäftigen. 2. Dies wird oft auch als Data Wrangling bezeichnet, da es wie ein Kampf sein kann die Daten in das richtige Format zu bringen. --- class: middle, inverse # .large[Was bedeutet Tidy Data?] --- background-image: url(img/tidydata_1.jpg) background-size: 90% .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Das Wort Tidy, also "aufgeräumt" ist uns bisher nur im Zusammenhang mit dem "tidyverse" begegnet 2. Wir wollen jetzt beginnen uns mit dem Konzept von "tidy data" zu beschäftigen 3. Tidy Data ist eine Art um Daten zu beschreiben, die mit einer bestimmten Struktur organisiert sind 4. Es sind tabellarische Daten, bei der - jede Variable in einer eigenen Spalte steht, - jede Beobachtung ihrer eigene Zeile hat, und - jede Zelle genau ein einen Wert angibt --- background-image: url(img/tidydata_2.jpg) background-size: contain .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Der Autor Leo Tolstoy hat einmal gesagt, dass "alle glücklichen Familien einander gleichen, aber dass jede unglückliche Familien auf ihre eigene Art unglücklich ist" 2. Und so beschreibt Hadley Wickham Daten. 3. Die Struktur von Tidy Data gleicht einander, aber jeder unaufgeräumte, messy Datensatz ist messy auf seine eigene Weise --- background-image: url(img/tidydata_3.jpg) background-size: contain .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Tidy data macht uns effizienter 2. Denn wenn unsere Daten tidy sind, dann können wir verschiedenste Werkzeuge nutzen die dafür entwickelt wurden mit dieser Struktur zu arbeiten 3. Genau das sind die Werkzeuge des tidyverse --- background-image: url(img/tidydata_4.jpg) background-size: contain .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Tidy data erleichtert die Zusammenarbeit 2. Und das unabhängig davon ob wir dabei an an uns selbst in der Zukunft denken, oder an aktuelle und zukünftige Teamkolleginnen und Kollegen 3. Eine Organisation, und gemeinsame Nutzung von Daten auf konsistente und vorhersehbare Weise, beudeutet weniger Anpassung, Zeit und Aufwand für Alle --- background-image: url(img/tidydata_5.jpg) background-size: contain .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Tidy data unterstüzt auch die Reproduzierbarkeit und Wiederverwendbarkeit unseres Codes 2. Analysen können leichter verstanden, aktualisiert und wiederverwendete werden, da alle die gleichen Datenstruktur erwarten --- background-image: url(img/tidydata_6.jpg) background-size: contain .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Sobald ihr mit den Werkzeugen für die Arbeit mit tidy data ausgestattet seid, eröffnet sich eine ganze neue Welt von Datensätzen 2. Diese fühlen sich zugänglicher an, da mit vertrauten Werkzeugen gearbeitet werden kann 3. Dieses Vertrauen und die Fähigkeit zur Zusammenarbeit sind wahrscheinlich das Beste an Tidy Data --- background-image: url(img/tidydata_7.jpg) background-size: contain .footnote[Illustrations from the [Openscapes](https://www.openscapes.org/) blog [Tidy Data for reproducibility, efficiency, and collaboration](https://www.openscapes.org/blog/2020/10/12/tidy-data/) by [Julia Lowndes](https://twitter.com/juliesquid) and [Allison Horst](https://twitter.com/allison_horst)] ??? 1. Also, fangen wir an Bekanntschaft mit tidy data zu machen und den Werkzeugen die wir nutzen können --- # Eigenschaften von Tidy Data Eigenschaften von Tidy Data: - Eigenschaft 1: Jede Spalte ist eine Variable - Eigenschaft 2: Jede Reihe ist eine Beobachtung - Eigenschaft 3: Jede Zelle enthält eine Messung --- # Penguins .question[ Erfüllen die Daten die Eingeschaften für Tidy data? ] <table class="table" style="font-size: 20px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> species </th> <th style="text-align:left;"> island </th> <th style="text-align:right;"> bill_length_mm </th> <th style="text-align:right;"> bill_depth_mm </th> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> <th style="text-align:left;"> sex </th> <th style="text-align:right;"> year </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.1 </td> <td style="text-align:right;"> 18.7 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3750 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.5 </td> <td style="text-align:right;"> 17.4 </td> <td style="text-align:right;"> 186 </td> <td style="text-align:right;"> 3800 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 40.3 </td> <td style="text-align:right;"> 18.0 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 3250 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 36.7 </td> <td style="text-align:right;"> 19.3 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3450 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.3 </td> <td style="text-align:right;"> 20.6 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 3650 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 38.9 </td> <td style="text-align:right;"> 17.8 </td> <td style="text-align:right;"> 181 </td> <td style="text-align:right;"> 3625 </td> <td style="text-align:left;"> female </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 39.2 </td> <td style="text-align:right;"> 19.6 </td> <td style="text-align:right;"> 195 </td> <td style="text-align:right;"> 4675 </td> <td style="text-align:left;"> male </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 34.1 </td> <td style="text-align:right;"> 18.1 </td> <td style="text-align:right;"> 193 </td> <td style="text-align:right;"> 3475 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2007 </td> </tr> <tr> <td style="text-align:left;"> Adelie </td> <td style="text-align:left;"> Torgersen </td> <td style="text-align:right;"> 42.0 </td> <td style="text-align:right;"> 20.2 </td> <td style="text-align:right;"> 190 </td> <td style="text-align:right;"> 4250 </td> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 2007 </td> </tr> </tbody> </table> --- class: middle, inverse # .large[Daten Transformation mit {dplyr}] --- ## Eine Grammatik für Daten Transformation... ...basierend auf dem Konzept von Funktionen als Verben, die Daten manipulieren .pull-left-narrow[ <img src="img/dplyr-part-of-tidyverse.png" width="70%" style="display: block; margin: auto;" /> ] .pull-right-wide[ - `select`: Spalten beim Namen auswählen - `arrange`: Zeilen neu ordnen - `slice`: Zeilen über einen Index auswählen - `filter`: Zeilen mit bestimmten Kriterien auswählen - `mutate`: Neue Variablen hinzufügen - `summarise`: Variablen auf Werte reduzieren - `group_by`: Gruppierte Arbeitsgänge - ... (und viele viele mehr) ] ??? - Vorlesen und auf die Wortwahl hinweisen --- # Regeln für `{dplyr}` Funktionen 1. Das erste Argument ist immer ein Dataframe (genau wie bei ggplot) 2. Die folgenden Argumente geben an was mit dem Dataframe gemacht werden soll 3. Geben immer einen Dataframe zurück 4. Ändern nichts an Ort und Stelle ```r filter(.data = penguins, species == "Adelie") ``` ``` # A tibble: 152 × 8 species island bill_length_mm bill_depth_mm flipper_length_mm <fct> <fct> <dbl> <dbl> <int> 1 Adelie Torgers… 39.1 18.7 181 2 Adelie Torgers… 39.5 17.4 186 3 Adelie Torgers… 40.3 18 195 4 Adelie Torgers… NA NA NA 5 Adelie Torgers… 36.7 19.3 193 6 Adelie Torgers… 39.3 20.6 190 # ℹ 146 more rows # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int> ``` --- class: middle, inverse # .big[Praktikum 5 - dplyr] --- .note[ # Praktikum 5 - dplyr ## Live Code 1. **GitHub**: Öffne die GitHub Organisation für den Kurs: https://github.com/rstatszh-k007 2. **GitHub**: Nutze die Suche um das Praktikum 5 (prak-05) mit deinem Benutzernamen zu finden 3. **GitHub**: Klicke auf den grünen Button (Code) und kopiere die URL in die Zwischenablage 3. **Posit Cloud**: Öffne deinen Arbeitsbereich für den Kurs in der Posit Cloud 4. **Posit Cloud / Projects**: Klicke auf "New Project from GitHub Repository" 5. **RStudio IDE**: Finde den Datei Manager und den Git Reiter 6. **Zoom Chat**: Schreibt wenn ihr soweit seid ] --- class: middle, inverse # .big[Praktikum 6 - dplyr] --- .note[ # Praktikum 6 - dplyr ## In 2er Teams 1. **GitHub**: Öffne die GitHub Organisation für den Kurs: https://github.com/rstatszh-k007 2. **GitHub**: Nutze die Suche um das Praktikum 6 (prak-06) mit deinem Benutzernamen zu finden 3. **GitHub**: Klicke auf den grünen Button (Code) und kopiere die URL in die Zwischenablage 3. **Posit Cloud**: Öffne deinen Arbeitsbereich für den Kurs in der Posit Cloud 4. **Posit Cloud / Projects**: Klicke auf "New Project from GitHub Repository" 5. **RStudio IDE**: Finde den Datei Manager und den Git Reiter 6. **Zoom Chat**: Schreibt wenn ihr soweit seid ] --- # [tidyverse.org](https://www.tidyverse.org/) .pull-left[ - Lesezeichen - ggplot2.tidyverse.org - dplyr.tidyverse.org - readr.tidyverse.org - ... ] .pull-right[ <img src="img/tidyverse.png" width="80%" style="display: block; margin: auto;" /> ] --- class: middle, inverse # .big[Feedback] --- class: left background-image: url(img/tor.jpg) background-position: right background-size: contain # Ziele erreicht? Bitte ausfüllen: [kutt.it/rstatszh-eval](https://kutt.it/rstatszh-eval) .pull-left[ .footnote[Photo by: [Virgil Cayasa](https://unsplash.com/@virgilcayasa)] ] --- class: middle, inverse # .big[Hausaufgabe] --- # 🌻 Danke Für die Aufmerksamkeit! Für die R packages [{xaringan}](https://github.com/yihui/xaringan) und [{xaringanthemer}](https://github.com/gadenbuie/xaringanthemer) mit welchen die Folien geschrieben wurden. Eine PDF Version der Folien kann hier heruntergeladen werden: https://github.com/rstatsZH/website/raw/master/slides/e1_d04-data-transform/e1_d04-data-transform.pdf
Für [Data Science in a Box](https://datasciencebox.org/) und [Remaster the Tidyverse](https://github.com/rstudio-education/remaster-the-tidyverse), von welchen ich Materialien für diesen Kurs nutze und welche genau wie diese Folien mit [Creative Commons Attribution Share Alike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/) lizensiert sind.