🔨 Working with R

Session 03

06.11.2023

Seminarplan

Session Datum Topic Presenter
📂 Block 1 Introduction
1 23.10.2024 Kick-Off Christoph Adrian
2 30.10.2024 DBD: Overview & Introduction Christoph Adrian
3 06.11.2024 🔨 Introduction to working with R Christoph Adrian
📂 Block 2 Theoretical Background: Twitch & TV Election Debates
4 13.11.2024 📚 Twitch-Nutzung im Fokus Student groups
5 20.11.2024 📚 (Wirkungs-)Effekte von Twitch & TV-Debatten Student groups
6 27.11.2024 📚 Politische Debatten & Social Media Student groups
📂 Block 3 Method: Natural Language Processing
7 04.12.2024 🔨 Text as data I: Introduction Christoph Adrian
8 11.12.2024 🔨 Text as data II: Advanced Methods Christoph Adrian
9 18.12.2024 🔨 Advanced Method I: Topic Modeling Christoph Adrian
No lecture 🎄Christmas Break
10 08.01.2025 🔨 Advanced Method II: Machine Learning Christoph Adrian
📂 Block 4 Project Work
11 15.01.2025 🔨 Project work Student groups
12 22.01.2025 🔨 Project work Student groups
13 29.01.2025 📊 Project Presentation I Student groups (TBD)
14 05.02.2025 📊 Project Presentation & 🏁 Evaluation Studentds (TBD) & Christoph Adrian

Agenda

  1. Organisation & Koordination
  2. Die etwas andere Einführung in
  3. Anwedung von am Beispiel

Organisation & -koordination

Feedbacktermine

Kurzes organisatorische Update

Informationen zu Kursdetails und Prüfungsleistungen

  • Infos zur Zuteilung der Feedbackgespräche

    • Keine Anmeldung für Feedback notwendig, stattdessen Reihenfolge wie bei Präsentation
    • Bei Terminproblemen könnt ihr gerne auf mich zukommen
  • 🗣️ 2. Präsentationsgruppe: Bitte denkt

    • an die Zusendung des Entwurf der Präsentationsfolien bis spätestens nächste Woche Dienstag 12:00!

    • das Feedbackgespräch am Mittwoch im Anschluss an das Seminar.

Anything else?

Weitere Fragen zur Organisation oder Ablauf des Kurses

What I Wish I Knew …

… When I Started Using


Building best practice

Willkommen (zurück) zu

How most academics learn R:

How you should learn R:

  • R nicht systematisch lernen, sondern spezifisch anwenden.
  • Organisation der Arbeit mit RStudio-Projekten
  • Lesbaren und nachvollziehbaren Code schreiben!
  • (Nach-)Fragen!

Ein Repository voller Daten

Beispiel für Übung durch Anwendung: tidytuesday (social data project)

  • Data is posted to social media every Monday morning.

  • Explore the data, watching out for interesting relationships.

  • Create a visualization, a model, a shiny app, or some other piece of data-science-related output, using R or another programming language.

  • Share your output and the code used to generate it on social media with the #TidyTuesday hashtag.

Beispiele für #tidytuesday

Everything you need in one place

Organisation der Arbeit mit RStudio-Projekten

Empfehlungen:

  • Für jedes Projekt ein RStudio-Projekt.

  • Sicherung und Organisation von Daten, Skripte und Ouput an einem Ort, z.B. mit Unterstützung durch R-Pakete wie z.B. prodigenr

  • Verwendung von relative, keine absoluten Pfade. Empfehlung: here R-Paket

Versionskontrolle als Kür

Crashkurs zu Git(Hub)

MalikaIhle

  • Versionkontrolle für Code, gesichert in der Cloud
  • Vollständige Rückverfolgbarkeit von (gesicherten) Änderungen
  • Great effort, great return.

Run chunks, not (whole) scripts

Outputorientiertes Coding mit Quarto

Quarto ≥ RMarkdown ≥ RScript

Der Weg vom Code zum Output

  • Grundidee von Quarto : ein Quelldokument kann in eine Vielzahl von Ausgabeformaten umgewandelt werden

  • Markdown-Syntax für Text, verschiedene Programmiersprachen (wie z.B. R und Python) in einem Dokument

Develop your style

Wichtigkeit der Codeformatierung und -dokumentierung

# Strive for 
short_flights <- flights |> filter(air_time < 60)

# Avoid:
SHTFTS <- flights |> filter(air_time < 60)
# Strive for 
flights |>  
  filter(!is.na(arr_delay), !is.na(tailnum)) |> 
  count(dest)

# Avoid
flights|>filter(!is.na(arr_delay), !is.na(tailnum))|>count(dest)


  • Die Entwicklung (oder Aneignung) eines Codestils ist wichtig!
  • Was sich zunächst willkürlich anfühlt, hilft mit der Zeit sehr
  • Unterstützung durch den tidyverse style guide bzw. die Pakete styler oder lintr

Empfehlung: tidyverse is your friend!

Verschiedenen Paketen für alle Schritte eines Projektes

Quelle: RStudio

The friend of your friend: easystats

Fokus auf die Analyse

Quelle: Lüdecke et al. (2022)

Working with

… in the real world!

Im Fokus: Hollywood Age Gap Project

Am Anfang steht die Theorie

Typischer “data science process” als Kontext der Sitzung

Quelle: Wickham et al. (2023)

Age difference in years between move love interests

Datengrundlage für die Beispiele: Hollywood Age Gap ( | )


  • “An informational site showing the age gap between movie love interests.”
  • Community-Projekt
Guidlines for participation/submission:
  • The two (or more) actors play actual love interests (not just friends, coworkers, or some other non-romantic type of relationship)
  • The youngest of the two actors is at least 17 years old
  • Not animated characters

Explore ➞ Adapt ➞ Repeat ⟳

Prozess der Datenaufbereitung

  • nimmt in der Regel den Großteil der Zeit der Datenanalyse in Anspruch
  • häufig bedarf es der mehrfachen Wiederholung dreier Schritte:
    • der (explorativen) Erkundung,
    • der Standartdisierung und
    • der (erneuten) Bereinung der Daten

Drei Stufen der Datenqualität

Typische Strategien zur Datenbereinigung nach Pearson (2018)


Quelle: Jonge & Loo (2013)
  1. Bewertung allgemeiner Merkmale des Datensatzes, z. B.:

    • Wie viele Fälle sind enthalten? Wie viele Variablen?

    • Wie lauten die Variablennamen? Sind sie sinnvoll?

    • Welchen Typ hat jede Variable, z. B. numerisch, kategorisch, logisch?

    • Wie viele eindeutige Werte hat jede Variable?

    • Welcher Wert tritt am häufigsten auf, und wie oft kommt er vor?

    • Gibt es fehlende Werte? Wenn ja, wie häufig ist dies der Fall?

  2. Untersuchung deskriptiver Statistiken für jede Variable;

  3. Explorative Visualisierung;

  4. Verschiedene Verfahren zur Suche nach Anomalien in den Daten;

  5. Untersuchung der Beziehungen zwischen Schlüsselvariablen mit Hilfe von Scatterplots/Boxplots/Mosaic-Plots;

  6. Dokumentation des Vorgehens und der Ergebnisse (z.B. mit .rmd-Dokument). Dient als Grundlage für die anschließende Analyse und Erläuterung der Ergebnisse.

Direkter Download via URL

Datenimport und -preview

Bewertung allgemeiner Merkmale des Datensatzes, z. B.:

  • 🔍 Wie viele Fälle sind enthalten? Wie viele Variablen?
  • 🔍 Wie lauten die Variablennamen? Sind sie sinnvoll?
  • Welchen Typ hat jede Variable, z. B. numerisch, kategorisch, logisch?
  • Wie viele eindeutige Werte hat jede Variable?
  • Welcher Wert tritt am häufigsten auf, und wie oft kommt er vor?
  • Gibt es fehlende Werte? Wenn ja, wie häufig ist dies der Fall?
age_gaps <- read_csv("http://hollywoodagegap.com/movies.csv") 
age_gaps 
# A tibble: 1,199 × 12
   `Movie Name`       `Release Year` Director    `Age Difference` `Actor 1 Name`
   <chr>                       <dbl> <chr>                  <dbl> <chr>         
 1 Harold and Maude             1971 Hal Ashby                 52 Bud Cort      
 2 Venus                        2006 Roger Mich…               50 Peter O'Toole 
 3 The Quiet American           2002 Phillip No…               49 Michael Caine 
 4 Solitary Man                 2009 Brian Kopp…               45 Michael Dougl…
 5 The Big Lebowski             1998 Joel Coen                 45 David Huddles…
 6 Beginners                    2010 Mike Mills                43 Christopher P…
 7 Poison Ivy                   1992 Katt Shea                 42 Tom Skerritt  
 8 Dirty Grandpa                2016 Dan Mazer                 41 Robert De Niro
 9 Whatever Works               2009 Woody Allen               40 Larry David   
10 Entrapment                   1999 Jon Amiel                 39 Sean Connery  
# ℹ 1,189 more rows
# ℹ 7 more variables: `Actor 1 Gender` <chr>, `Actor 1 Birthdate` <date>,
#   `Actor 1 Age` <dbl>, `Actor 2 Name` <chr>, `Actor 2 Gender` <chr>,
#   `Actor 2 Birthdate` <chr>, `Actor 2 Age` <dbl>

Let the cleaning beginn

Erste Schritte der Datenbereinigung

Bewertung allgemeiner Merkmale des Datensatzes, z. B.:

  • Wie viele Fälle sind enthalten? Wie viele Variablen?
  • Wie lauten die Variablennamen? Sind sie sinnvoll?
  • 🔍 Welchen Typ hat jede Variable, z. B. numerisch, kategorisch, logisch?
  • Wie viele eindeutige Werte hat jede Variable?
  • Welcher Wert tritt am häufigsten auf, und wie oft kommt er vor?
  • Gibt es fehlende Werte? Wenn ja, wie häufig ist dies der Fall?
age_gaps %<>% janitor::clean_names()
age_gaps %>% glimpse()
Rows: 1,199
Columns: 12
$ movie_name        <chr> "Harold and Maude", "Venus", "The Quiet American", "…
$ release_year      <dbl> 1971, 2006, 2002, 2009, 1998, 2010, 1992, 2016, 2009…
$ director          <chr> "Hal Ashby", "Roger Michell", "Phillip Noyce", "Bria…
$ age_difference    <dbl> 52, 50, 49, 45, 45, 43, 42, 41, 40, 39, 38, 38, 36, …
$ actor_1_name      <chr> "Bud Cort", "Peter O'Toole", "Michael Caine", "Micha…
$ actor_1_gender    <chr> "man", "man", "man", "man", "man", "man", "man", "ma…
$ actor_1_birthdate <date> 1948-03-29, 1932-08-02, 1933-03-14, 1944-09-25, 193…
$ actor_1_age       <dbl> 23, 74, 69, 65, 68, 81, 59, 73, 62, 69, 57, 77, 59, …
$ actor_2_name      <chr> "Ruth Gordon", "Jodie Whittaker", "Do Thi Hai Yen", …
$ actor_2_gender    <chr> "woman", "woman", "woman", "woman", "woman", "man", …
$ actor_2_birthdate <chr> "1896-10-30", "1982-06-03", "1982-10-01", "1989-01-0…
$ actor_2_age       <dbl> 75, 24, 20, 20, 23, 38, 17, 32, 22, 30, 19, 39, 23, …

Building the habits!

Erste Schritte der Datenbereinigung

Bewertung allgemeiner Merkmale des Datensatzes, z. B.:

  • Wie viele Fälle sind enthalten? Wie viele Variablen?
  • Wie lauten die Variablennamen? Sind sie sinnvoll?
  • Welchen Typ hat jede Variable, z. B. numerisch, kategorisch, logisch?
  • Wie viele eindeutige Werte hat jede Variable?
  • Welcher Wert tritt am häufigsten auf, und wie oft kommt er vor?
  • Gibt es fehlende Werte? Wenn ja, wie häufig ist dies der Fall?
age_gaps_correct <- age_gaps %>% 
  mutate(
    across(ends_with("_birthdate"), ~as.Date(.)) # set dates to dates
  )


Reminder
  • Veränderungen nicht im selben Datensatz speichern
  • Verständliche Benennung & Kommentierung der Daten
  • Bearbeitungsschritte kommentieren

Kontrolle der Lageparameter

Erste Schritte der Datenbereinigung

Bewertung allgemeiner Merkmale des Datensatzes, z. B.:

  • Wie viele Fälle sind enthalten? Wie viele Variablen?
  • Wie lauten die Variablennamen? Sind sie sinnvoll?
  • Welchen Typ hat jede Variable, z. B. numerisch, kategorisch, logisch?
  • 🔍 Wie viele eindeutige Werte hat jede Variable?
  • 🔍 Welcher Wert tritt am häufigsten auf, und wie oft kommt er vor?
  • 🔍 Gibt es fehlende Werte? Wenn ja, wie häufig ist dies der Fall?
age_gaps_correct %>% 
    datawizard::describe_distribution() %>% 
    print_html()
Variable Mean SD IQR Min Max Skewness Kurtosis n n_Missing
release_year 2000.53 17.07 15 1935 2024 -1.62 2.52 1199 0
age_difference 10.62 8.62 12 0 52 1.19 1.54 1199 0
actor_1_age 40.07 10.93 15 17 81 0.54 0.22 1199 0
actor_2_age 31.22 8.47 10 17 81 1.39 3.71 1199 0

Let’s start exploring!

Wie sind die Altersunterschiede verteilt?

age_gaps_correct %>% 
    ggplot(aes(age_difference)) +
    geom_bar() +
    theme_pubr()

A recent past …

In welchen Filmen ist der Altersunterschied am höchsten?

age_gaps_correct %>% 
    arrange(desc(age_difference)) %>% 
    select(movie_name, age_difference, release_year) 
# A tibble: 1,199 × 3
   movie_name         age_difference release_year
   <chr>                       <dbl>        <dbl>
 1 Harold and Maude               52         1971
 2 Venus                          50         2006
 3 The Quiet American             49         2002
 4 Solitary Man                   45         2009
 5 The Big Lebowski               45         1998
 6 Beginners                      43         2010
 7 Poison Ivy                     42         1992
 8 Dirty Grandpa                  41         2016
 9 Whatever Works                 40         2009
10 Entrapment                     39         1999
# ℹ 1,189 more rows

… or still present?

In welchen Filmen ist der Altersunterschied am höchsten?

age_gaps_correct %>% 
    filter(release_year >= 2022) %>% 
    arrange(desc(age_difference)) %>% 
    select(
        movie_name, age_difference, release_year, 
        actor_1_name, actor_2_name)
# A tibble: 19 × 5
   movie_name              age_difference release_year actor_1_name actor_2_name
   <chr>                            <dbl>        <dbl> <chr>        <chr>       
 1 Poor Things                         21         2023 Mark Ruffalo Emma Stone  
 2 The Bubble                          21         2022 Pedro Pascal Maria Bakal…
 3 Oppenheimer                         20         2023 Cillian Mur… Florence Pu…
 4 The Northman                        20         2022 Alexander S… Anya Taylor…
 5 Spaceman                            19         2024 Adam Sandler Carey Mulli…
 6 The Lost City                       16         2022 Channing Ta… Sandra Bull…
 7 We Live in Time                     13         2024 Andrew Garf… Florence Pu…
 8 The Idea of You                     12         2024 Nicholas Ga… Anne Hathaw…
 9 Barbie                              10         2023 Ryan Gosling Margot Robb…
10 Twisters                            10         2024 Glen Powell  Daisy Edgar…
11 Anyone but You                       9         2023 Glen Powell  Sydney Swee…
12 Everything Everywhere …              9         2022 Ke Huy Quan  Michelle Ye…
13 Top Gun: Maverick                    8         2022 Tom Cruise   Jennifer Co…
14 Oppenheimer                          7         2023 Cillian Mur… Emily Blunt 
15 Your Place or Mine                   7         2023 Ashton Kutc… Zoë Chao    
16 Your Place or Mine                   5         2023 Jesse Willi… Reese Withe…
17 Poor Things                          2         2023 Christopher… Emma Stone  
18 Your Place or Mine                   2         2023 Ashton Kutc… Reese Withe…
19 You People                           1         2023 Jonah Hill   Lauren Lond…

(Durchschnitts-)Unterschied nach Jahren

Gibt es einen Zusammenhang zwischen Altersunterschied und Releasedatum?

age_gaps_correct %>% 
    group_by(release_year) %>% 
    summarise(age_difference_mean = mean(age_difference)) %>% 
    ggplot(aes(release_year, age_difference_mean)) +
    geom_col() +
    theme_pubr()

Verteilung nach Jahren

Gibt es einen Zusammenhang zwischen Altersunterschied und Releasedatum?

ggpubr::ggboxplot(
    data = age_gaps_correct, 
    x = "release_year", 
    y = "age_difference"
  ) +
  # Rotate x-axis labels by 90 degrees
  theme(
    axis.text.x = element_text(
        angle = 90,
        vjust = 0.5,
         hjust=1))  

Ein Blick auf die Korrelation

Gibt es einen Zusammenhang zwischen Altersunterschied und Releasedatum?

age_gaps %>%
  select(release_year, age_difference) %>% 
  correlation::correlation()
# Correlation Matrix (pearson-method)

Parameter1   |     Parameter2 |     r |         95% CI | t(1197) |         p
----------------------------------------------------------------------------
release_year | age_difference | -0.22 | [-0.27, -0.17] |   -7.83 | < .001***

p-value adjustment method: Holm (1979)
Observations: 1199

Mit Kanonen auf Spatzen schießen

Gibt es einen Zusammenhang zwischen Altersunterschied und Releasedatum?

# Schätzung des Models
mdl <- lm(age_difference ~ release_year, data = age_gaps_correct)


mdl %>% parameters::parameters()
Parameter    | Coefficient |    SE |           95% CI | t(1197) |      p
------------------------------------------------------------------------
(Intercept)  |      233.69 | 28.48 | [177.82, 289.57] |    8.21 | < .001
release year |       -0.11 |  0.01 | [ -0.14,  -0.08] |   -7.83 | < .001


mdl %>% performance::model_performance()
# Indices of model performance

AIC      |     AICc |      BIC |    R2 | R2 (adj.) |  RMSE | Sigma
------------------------------------------------------------------
8512.891 | 8512.911 | 8528.159 | 0.049 |     0.048 | 8.403 | 8.410

Convenience wrapper

Gibt es einen Zusammenhang zwischen Altersunterschied und Releasedatum?

mdl %>% report::report()
We fitted a linear model (estimated using OLS) to predict age_difference with
release_year (formula: age_difference ~ release_year). The model explains a
statistically significant and weak proportion of variance (R2 = 0.05, F(1,
1197) = 61.35, p < .001, adj. R2 = 0.05). The model's intercept, corresponding
to release_year = 0, is at 233.69 (95% CI [177.82, 289.57], t(1197) = 8.21, p <
.001). Within this model:

  - The effect of release year is statistically significant and negative (beta =
-0.11, 95% CI [-0.14, -0.08], t(1197) = -7.83, p < .001; Std. beta = -0.22, 95%
CI [-0.28, -0.17])

Standardized parameters were obtained by fitting the model on a standardized
version of the dataset. 95% Confidence Intervals (CIs) and p-values were
computed using a Wald t-distribution approximation.

Try - Fail - Repeat

Kurzes Fazit der heutigen Sitzung


  • Wenn R, dann mit RStudio + Quarto!

  • Anschauen - nachmachen - ausprobieren

  • Keep it tidy

  • (Gute) Routinen bilden

  • “There is almost always a package for that …”

Time for questions

Bis zur nächsten Sitzung!

Literatur

Jonge, E. de, & Loo, M. van der. (2013). An introduction to data cleaning with R.
Lüdecke, D., Ben-Shachar, M. S., Patil, I., Wiernik, B. M., Bacher, E., Thériault, R., & Makowski, D. (2022). Easystats: Framework for easy statistical modeling, visualization, and reporting. CRAN. https://easystats.github.io/easystats/
Pearson, R. K. (2018). Exploratory data analysis using r. CRC Press/Taylor & Francis Group.
Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for data science: import, tidy, transform, visualize, and model data (2nd edition). O’Reilly.