Author

Daria Tisch

1 Einführung in Quarto und R

1.1 Quarto

Quarto ermöglicht es, Inhalte und ausführbaren Code zu einem fertigen Dokument zu verweben. Mehr über Quarto unter https://quarto.org.

1.2 Code ausführen

Wenn Du auf die Schaltfläche Render klickst, wird ein Dokument erstellt, das sowohl den Inhalt als auch die Ausgabe des eingebetteten Codes enthält. Code kann wie folgt einbettet werden:

Code
# This is the first code chunk
1 + 1
[1] 2

Es können Optionen zu ausführbarem Code wie folgt hinzugefügt werden

[1] 4

echo: false deaktiviert das Drucken des Codes (nur die Ausgabe wird angezeigt).

1.3 Arbeitsverzeichnis festsetzen

Als ersten Schritt sollte immer das Arbeitsverzeichnis festgelegt weren. Ändere dies bitte zu Deinem.

Code
# set working directory
setwd("D:/Seafile/main/teaching/2024_wuppertal/wup2024/uebungen")

1.4 Packages installieren und laden

R als Füller

Bevor Du (die meisten) Dinge in R tun kannst, musst Du zunächst Pakete (packages) installieren und laden, die eine Bibliothek (library) mit praktischen Funktionen enthalten. Stell Dir vor, R ist ein Füller. Die Pakete sind die Tinte. Du brauchst zunächst die Tinte (Paket installieren) und dann musst Du die Tinte in den Stift geben (Paket laden), bevor Du mit dem Schreiben beginnen kannst (einen Befehl ausführen). Base R mag Dir die Standardtinte liefern, aber andere Pakete können wertvollere und interessantere Farben liefern.

Wir nutzen in dieser Übung zwei Pakete:

  1. tidyverse: Hilfreich, um Datensatz augzubereiten. Eine gute Einführung in das Paket ist hier oder hier zu finden.

  2. ggplot2: (im Paket tidyverse enthalten). Hilfreich, um schöne Graphen zu erstellen. Eine gute Einführung ist hier oder hier zu finden.

Code
# Packages
pkgs <- c(
  "tidyverse"
)

## Install uninstalled packages
lapply(pkgs[!(pkgs %in% installed.packages())], install.packages)

## Load all packages to library
lapply(pkgs, library, character.only = TRUE)

1.5 Daten einlesen

Wir arbeiten mit dem Übungsdatensatz des SOEP (DOI:10.5684/soep.practice.v36). Es werden zwei Datensätze eingelesen. Der erste Datensatz enthalt die tatsächlichen Umfragedaten, der zweite Datensatz enthält die Variablenlabels.

Code
# read data
df = read.csv("../daten/soep_uebung.csv")
df_labels = read.csv("../daten/soep_labels.csv")

1.6 Datenexploration

Code
# Wie viele Zeilen hat der Datensatz?
nrow(df)
[1] 23522

Der Datensatz enthält 23522 Beobachtungen.

1.7 Datenexploration

Schauen wir uns die ersten Zeilen des Datensatzes an, um einen ersten Überblick über den Datensatz zu gewinnen.

Code
head(df)

1.8 Welche Variablen sind im Datensatz enthalten?

Code
# Namen der Variablen
names(df)
 [1] "id"          "syear"       "sex"         "alter"       "anz_pers"   
 [6] "anz_kind"    "bildung"     "erwerb"      "branche"     "gesund_org" 
[11] "lebensz_org" "einkommenj1" "einkommenj2" "einkommenm1" "einkommenm2"
Code
#Namen, Datentyp und erste Einträge der Variablen
glimpse(df)
Rows: 23,522
Columns: 15
$ id          <int> 194, 194, 194, 194, 194, 19052, 27495, 27495, 27495, 22539…
$ syear       <int> 2015, 2016, 2017, 2018, 2019, 2015, 2016, 2018, 2019, 2015…
$ sex         <chr> "[1] weiblich", "[1] weiblich", "[1] weiblich", "[1] weibl…
$ alter       <int> 59, 60, 61, 62, 63, 74, 35, 37, 38, 85, 73, 74, 43, 44, 45…
$ anz_pers    <int> 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 1, 1, 4, 4, 4, 4, 4, 2, 2, 2…
$ anz_kind    <int> 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0…
$ bildung     <dbl> 10.5, 10.5, 10.5, 10.5, 10.5, 10.0, 15.0, 15.0, 15.0, 18.0…
$ erwerb      <chr> "[2] Teilzeitbeschäftigung", "[2] Teilzeitbeschäftigung", …
$ branche     <chr> "[84] Oeffentliche Verwaltung, Verteidigung; Sozialversich…
$ gesund_org  <chr> "[4] Weniger gut", "[3] Zufriedenstellend", "[3] Zufrieden…
$ lebensz_org <chr> "6", "5", "7", "5", "6", "8", "8", "8", "8", "8", "5", "8"…
$ einkommenj1 <dbl> 28678.94, 19962.29, 22227.68, 22100.38, 23157.92, 0.00, 14…
$ einkommenj2 <dbl> 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.…
$ einkommenm1 <dbl> 1659.1285, 1809.3364, 1849.0375, 1616.5137, 1901.0012, 0.0…
$ einkommenm2 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

2 Übungsaufgaben

2.1 Frauen im Datensatz

Wie viele Beobachtungen im Datensatz sind Frauen?

Code
table(df$sex)

[0] männlich [1] weiblich 
       10762        12760 

2.2 Balkendiagramm mit ggplot()

Erstelle ein Balkendiagramm, das die Verteilung des Alters darstellt.

Code
ggplot(df, aes(x = alter)) +
  geom_bar(fill = "skyblue", color = "black") +
  labs(
    title = "Verteilung des Alters",
    x = "Alter",
    y = "Häufigkeit"
  ) +
  theme_minimal()

2.3 Summary Statistics

Wir alt ist die jüngste und wie alt die älteste Person?

Code
summary(df$alter)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  17.00   34.00   48.00   48.28   62.00  102.00 

2.4 Variablentypen

Welcher Variablentyp ist Geschlecht (sex)? Welcher Alter? Welcher Bildung?

Code
glimpse(df)
Rows: 23,522
Columns: 15
$ id          <int> 194, 194, 194, 194, 194, 19052, 27495, 27495, 27495, 22539…
$ syear       <int> 2015, 2016, 2017, 2018, 2019, 2015, 2016, 2018, 2019, 2015…
$ sex         <chr> "[1] weiblich", "[1] weiblich", "[1] weiblich", "[1] weibl…
$ alter       <int> 59, 60, 61, 62, 63, 74, 35, 37, 38, 85, 73, 74, 43, 44, 45…
$ anz_pers    <int> 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 1, 1, 4, 4, 4, 4, 4, 2, 2, 2…
$ anz_kind    <int> 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0…
$ bildung     <dbl> 10.5, 10.5, 10.5, 10.5, 10.5, 10.0, 15.0, 15.0, 15.0, 18.0…
$ erwerb      <chr> "[2] Teilzeitbeschäftigung", "[2] Teilzeitbeschäftigung", …
$ branche     <chr> "[84] Oeffentliche Verwaltung, Verteidigung; Sozialversich…
$ gesund_org  <chr> "[4] Weniger gut", "[3] Zufriedenstellend", "[3] Zufrieden…
$ lebensz_org <chr> "6", "5", "7", "5", "6", "8", "8", "8", "8", "8", "5", "8"…
$ einkommenj1 <dbl> 28678.94, 19962.29, 22227.68, 22100.38, 23157.92, 0.00, 14…
$ einkommenj2 <dbl> 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.…
$ einkommenm1 <dbl> 1659.1285, 1809.3364, 1849.0375, 1616.5137, 1901.0012, 0.0…
$ einkommenm2 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

2.5 (Kreuz-)tabellen

Wie viele Beobachtungen gibt es pro Jahr? Und getrennt nach Geschlecht?

Code
table(df$syear)

2015 2016 2017 2018 2019 
5527 4987 4720 4351 3937 
Code
table(df$syear, df$sex)
      
       [0] männlich [1] weiblich
  2015         2533         2994
  2016         2291         2696
  2017         2167         2553
  2018         1992         2359
  2019         1779         2158

2.6 Datensatz Exploration

Was beinhaltet die Variable “einkommenj1” und “einkommenj2”?

Code
df_labels

2.7 Vektor

Erstelle einen Vektor, der die Ausprägungen der Variable “gesund_org” enthält. Und schaue Dir diesen Vektor an.

Code
# Eindeutige Ausprägungen der Variable 'gesund_org'
vektor_gesund_org <- unique(df$gesund_org)

# Ausgabe der eindeutigen Ausprägungen
print(vektor_gesund_org)
[1] "[4] Weniger gut"       "[3] Zufriedenstellend" "[5] Schlecht"         
[4] "[2] Gut"               ""                      "[1] Sehr gut"         

2.8 Data wrlangling

Wir möchten den subjektiven Gesundheitsstatus als numerische Variable nutzen. Wir müssen daher die Variable gesund_org in eine numerische Variable umwandeln. Achte auf fehlende Werte.

Code
table(df$gesund_org, useNA = "always")

                               [1] Sehr gut               [2] Gut 
                  102                  2535                  9488 
[3] Zufriedenstellend       [4] Weniger gut          [5] Schlecht 
                 7576                  3089                   732 
                 <NA> 
                    0 
Code
# Ersetze leere Zeichenketten "" durch NA in der Spalte 'gesund_org'
df$gesund_org[df$gesund_org == ""] <- NA

# Extrahiere die numerischen Werte aus der Spalte 'gesund_org'
df$gesund_org_numeric <- as.numeric(sub("\\[([0-9]+)\\].*", "\\1", df$gesund_org))

# Überprüfe die Änderungen
table(df$gesund_org_numeric, useNA = "always")

   1    2    3    4    5 <NA> 
2535 9488 7576 3089  732  102 
Code
table(df$gesund_org, useNA = "always")

         [1] Sehr gut               [2] Gut [3] Zufriedenstellend 
                 2535                  9488                  7576 
      [4] Weniger gut          [5] Schlecht                  <NA> 
                 3089                   732                   102 

2.9 Balkendiagramm

Stelle die Verteilung des subjetiven Gesundheitsstatus graphisch dar

Code
# Barplot erstellen
ggplot(df, aes(x = factor(gesund_org_numeric))) +
  geom_bar(fill = "skyblue", color = "black") +
  labs(
    title = "Univariate Verteilung des subjektiven Gesundheitsstatus",
    x = "Subjektiver Gesundheitsstatus (1 = Sehr gut, 5 = Schlecht)",
    y = "Häufigkeit"
  ) +
  theme_minimal()

2.10 Fehlende Werte

Gibt es fehlende Werte auf der Variable monatliches Einkommen (einkommenm1) und auf der Variable Alter?

Code
table(df$alter, useNA = "always")

  17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 
 472  470  437  392  347  290  281  263  244  254  283  282  293  304  337  341 
  33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48 
 331  368  387  387  379  397  413  430  447  450  454  434  450  466  466  473 
  49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64 
 500  517  526  518  479  447  412  381  381  359  339  336  326  296  298  312 
  65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80 
 325  314  309  294  272  239  242  244  246  256  276  271  270  247  223  192 
  81   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96 
 156  124  105   82   74   64   47   46   36   28   19   18   13   11    8    5 
  97   98   99  100  101  102 <NA> 
   5    4    3    3    1    1    0 
Code
summary(df$einkommenm1)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0     0.0   852.9  1645.6  2687.4 35260.9 

2.11 Zusammenhangsanalyse

Schaue Dir den Zusammenhang von subjektiven Gesundheitsstatus und Alter graphisch mit Hilfe eines Scatterplots an. Beschränke die Daten auf das Jahr 2019 und auf Personen, die jünger als 65 Jahre alt sind.

Code
# Scatterplot mit ggplot2 erstellen
ggplot(df %>% filter(syear=="2019", alter < 65), aes(x = alter , y = einkommenm1)) +
  geom_point(color = "blue", alpha = 0.6) +  # Punkte hinzufügen
  geom_smooth(method = "lm", color = "red", se = TRUE) +  # Lineare Trendlinie mit Konfidenzintervall
  labs(
    title = "Zusammenhang zwischen Einkommen und Alter",
    x = "Alter",
    y = "Einkommen"
  ) +
  theme_minimal()  # Minimalistisches Theme
`geom_smooth()` using formula = 'y ~ x'

2.12 Zusammenhangsanalyse mit log. Daten

Und nun mit logarithmiertem Einkommen. Was fällt auf?

Code
# Scatterplot mit ggplot2 erstellen
ggplot(df %>% filter(syear=="2019", alter < 65), aes(x = alter , y = log(einkommenm1))) +
  geom_point(color = "blue", alpha = 0.6) +  # Punkte hinzufügen
  geom_smooth(method = "lm", color = "red", se = TRUE) +  # Lineare Trendlinie mit Konfidenzintervall
  labs(
    title = "Zusammenhang zwischen Einkommen und Alter",
    x = "Alter",
    y = "Einkommen, log."
  ) +
  theme_minimal()  # Minimalistisches Theme
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 660 rows containing non-finite outside the scale range
(`stat_smooth()`).

2.13 Render

Wandle dieses Dokument in ein PDF und ein HTML Dokument um. Wo wird es gespeichert?

3 Weiterführende Literatur