🔨 Working with R

Session 03

15.11.2023

Seminarplan

Session Datum Topic Presenter

Introduction

1

25.10.2023

Kick-Off

Christoph Adrian

01.11.2023

🎃 Holiday (No Lecture)

2

08.11.2023

Einführung in DBD

Christoph Adrian

3

15.11.2023

🔨 Working with R

Christoph Adrian

🗣️

Presentations

4

22.11.2023

📚 Media routines & habits

Group C

5

29.11.2023

📚 Digital disconnection

Group A

6

06.12.2023

📦 Data collection methods

Group D

7

13.12.2023

📦 Automatic text analysis

Group B

8

20.12.2023

Buffer Session

🎄Christmas Break (No Lecture)

📂 Project

Analysis of media content

9

10.01.2024

🔨 Text as data

Christoph Adrian

10

17.01.2024

🔨 Topic Modeling

Christoph Adrian

11

24.01.2024

🔨 Q&A

Christoph Adrian

12

31.01.2024

📊 Presentation & Discussion

All groups

13

07.02.2024

🏁 Recap, Evaluation & Discussion

Christoph Adrian

Agenda

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

Organisation & -koordination

R Zertifikate, Sprache der Prüfungsleistungen

Kurzes organisatorische Update

Informationen zu Kursdetails und Prüfungsleistungen

  • Alle Zertifikat vom R-Basiskurs erhalten 🎉

  • Informationen zum Kursablauf wurden geupdatet, Update zu Prüfungleistungen folgt noch

  • Für alle Prüfungleistungen gilt: 🇩🇪 ist immer möglich, aber gerne 🇬🇧

  • 🗣️ 2. Präsentationsgruppe: Denken Sie bitte

    • an die Zusendung des Entwurf der Präsentationsfolien bis spätestens nächste Woche Dienstag 11: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 R


Die etwas andere Einführung in R

Buliding best practice

Willkommen (zurück) zu R

How most academics learn R:

How you should learn R:

  • Versuchen Sie R nicht systematisch zu lernen, sondern spezifisch anzuwenden.
  • Organisieren Sie Ihre Arbeit in R (mit Projekten)
  • Schreiben Sie lesbaren und nachvollziehbaren Code!
  • Fragen Sie nach!

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

  • Verwenden Sie immer nur 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

RScript ≤ RMarkdown ≤ Quarto

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 Ihnen 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 R …

… in the real world!

Im Fokus: Hollywood Age Gap Project

Quarto Document Binder RStudio

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,177 × 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 The Big Lebowski             1998 Joel Coen                 45 David Huddles…
 5 Beginners                    2010 Mike Mills                43 Christopher P…
 6 Poison Ivy                   1992 Katt Shea                 42 Tom Skerritt  
 7 Whatever Works               2009 Woody Allen               40 Larry David   
 8 Entrapment                   1999 Jon Amiel                 39 Sean Connery  
 9 Husbands and Wives           1992 Woody Allen               38 Woody Allen   
10 Magnolia                     1999 Paul Thoma…               38 Jason Robards 
# ℹ 1,167 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,177
Columns: 12
$ movie_name        <chr> "Harold and Maude", "Venus", "The Quiet American", "…
$ release_year      <dbl> 1971, 2006, 2002, 1998, 2010, 1992, 2009, 1999, 1992…
$ director          <chr> "Hal Ashby", "Roger Michell", "Phillip Noyce", "Joel…
$ age_difference    <dbl> 52, 50, 49, 45, 43, 42, 40, 39, 38, 38, 36, 36, 35, …
$ actor_1_name      <chr> "Bud Cort", "Peter O'Toole", "Michael Caine", "David…
$ 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, 1930-09-17, 192…
$ actor_1_age       <dbl> 23, 74, 69, 68, 81, 59, 62, 69, 57, 77, 59, 56, 65, …
$ actor_2_name      <chr> "Ruth Gordon", "Jodie Whittaker", "Do Thi Hai Yen", …
$ actor_2_gender    <chr> "woman", "woman", "woman", "woman", "man", "woman", …
$ actor_2_birthdate <chr> "1896-10-30", "1982-06-03", "1982-10-01", "1975-11-0…
$ actor_2_age       <dbl> 75, 24, 20, 23, 38, 17, 22, 30, 19, 39, 23, 20, 30, …

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 %>% sjmisc::descr()

## Basic descriptive statistics

            var    type          label    n NA.prc    mean    sd   se   md
   release_year numeric   release_year 1177      0 2000.74 16.67 0.49 2004
 age_difference numeric age_difference 1177      0   10.48  8.53 0.25    8
    actor_1_age numeric    actor_1_age 1177      0   39.97 10.90 0.32   39
    actor_2_age numeric    actor_2_age 1177      0   31.27  8.50 0.25   30
 trimmed          range iqr  skew
 2003.65 88 (1935-2023)  15 -1.68
    9.41      52 (0-52)  12  1.19
   39.41     64 (17-81)  15  0.53
   30.42     64 (17-81)   9  1.39

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,177 × 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 The Big Lebowski               45         1998
 5 Beginners                      43         2010
 6 Poison Ivy                     42         1992
 7 Whatever Works                 40         2009
 8 Entrapment                     39         1999
 9 Husbands and Wives             38         1992
10 Magnolia                       38         1999
# ℹ 1,167 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: 12 × 5
   movie_name              age_difference release_year actor_1_name actor_2_name
   <chr>                            <dbl>        <dbl> <chr>        <chr>       
 1 The Bubble                          21         2022 Pedro Pascal Maria Bakal…
 2 Oppenheimer                         20         2023 Cillian Mur… Florence Pu…
 3 The Northman                        20         2022 Alexander S… Anya Taylor…
 4 The Lost City                       16         2022 Channing Ta… Sandra Bull…
 5 Barbie                              10         2023 Ryan Gosling Margot Robb…
 6 Everything Everywhere …              9         2022 Ke Huy Quan  Michelle Ye…
 7 Top Gun: Maverick                    8         2022 Tom Cruise   Jennifer Co…
 8 Oppenheimer                          7         2023 Cillian Mur… Emily Blunt 
 9 Your Place or Mine                   7         2023 Ashton Kutc… Zoë Chao    
10 Your Place or Mine                   5         2023 Jesse Willi… Reese Withe…
11 Your Place or Mine                   2         2023 Ashton Kutc… Reese Withe…
12 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(1175) |         p
----------------------------------------------------------------------------
release_year | age_difference | -0.22 | [-0.27, -0.16] |   -7.68 | < .001***

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

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(1175) |      p
------------------------------------------------------------------------
(Intercept)  |      234.30 | 29.15 | [177.11, 291.50] |    8.04 | < .001
release year |       -0.11 |  0.01 | [ -0.14,  -0.08] |   -7.68 | < .001


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

AIC      |     AICc |      BIC |    R2 | R2 (adj.) |  RMSE | Sigma
------------------------------------------------------------------
8334.623 | 8334.643 | 8349.835 | 0.048 |     0.047 | 8.324 | 8.331

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,
1175) = 58.96, p < .001, adj. R2 = 0.05). The model's intercept, corresponding
to release_year = 0, is at 234.30 (95% CI [177.11, 291.50], t(1175) = 8.04, 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(1175) = -7.68, p < .001; Std. beta = -0.22, 95%
CI [-0.27, -0.16])

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.