Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Effiziente Datenaufbereitung mit R: Ein Leitfaden für SOCS0055 – Von UKHLS-Rohdaten zu bereinigten Datensätzen

Lerne, wie du mit R und Quarto den UKHLS-Datensatz für deine SOCS0055-Aufgabe aufbereitest – inklusive Tipps zur effizienten Code-Gestaltung und zur Erstellung publikationsreifer Tabellen.

SOCS0055 Advanced Computational Techniques Datenaufbereitung mit R UKHLS Datensatz bereinigen Quarto Datenanalyse R Programmierung Studium deskriptive Statistik Tabelle Regression automatisieren R Panel Datenanalyse Understanding Society Code-Effizienz R Publikationsreife Tabelle KI assistive Tools UCL Prüfungsrichtlinien Datenwissenschaft Aufgaben

Einleitung: Warum effiziente Datenaufbereitung in SOCS0055 entscheidend ist

Die Datenaufbereitung ist das Herzstück jeder datenwissenschaftlichen Arbeit – und in der SOCS0055 Advanced Computational Techniques for Data Science macht sie den Unterschied zwischen Bestehen und Herausragen. Im Mai 2026, wo KI-gestützte Tools wie ChatGPT den Alltag erleichtern, aber auch neue Herausforderungen für die Prüfungsintegrität schaffen, verlangt die University of London von dir, dass du deine Daten selbstständig und nachvollziehbar bereinigst. Dieser Leitfaden zeigt dir, wie du mit R und Quarto den UKHLS-Datensatz (Understanding Society) effizient in ein bereinigtes „long“-Format überführst – ohne dabei die Aufgabenlösung vorwegzunehmen.

Grundlagen: Die UKHLS-Datenstruktur verstehen

Der UK Household Longitudinal Study (UKHLS) liefert Panel-Daten, die über mehrere Wellen (Waves) hinweg dieselben Personen befragen. Für SOCS0055 musst du aus den adult interview Files (*_indresp.dta) einen Datensatz erstellen, der pro Person (pidp) und Welle eine Zeile enthält. Stell dir das wie eine Playlist vor: Jeder Song (Person) hat mehrere Auftritte (Wellen), und du willst alle Auftritte in einer Liste haben – aber nur die, die in der ersten Welle (a_indresp.dta) dabei waren.

Tipp: Nutze die labelled::lookfor()-Funktion, um Variablen wie *_sf12pcs_dv oder die Lebenszufriedenheit (du musst sie selbst finden!) zu identifizieren. Die Website Understanding Society Variable Search hilft dir, die passenden Variablenstubs zu finden.

Schritt 1: Effizientes Einlesen und Zusammenführen der Wellen

Statt jede Welle einzeln zu laden, schreibst du eine Schleife oder nutzt purrr::map(). Das reduziert Code und vermeidet Tippfehler. Ein Beispiel:

library(tidyverse)
library(haven)

# Wellen 1-14 (a bis n)
waves <- letters[1:14]

daten_liste <- map(waves, ~ read_dta(paste0(.x, "_indresp.dta")) %>%
  select(pidp, matches("^[a-z]_")))

# Nur Personen aus Welle a behalten
ids_welle_a <- daten_liste[[1]]$pidp

daten_long <- map_dfr(daten_liste, ~ .x %>% filter(pidp %in% ids_welle_a))

Dieser Ansatz ist vergleichbar mit einem KI-Chatbot, der aus verschiedenen Quellen Informationen zusammenführt – nur dass du die Kontrolle behältst. Kommentiere deinen Code ausführlich, damit deine Prüfer sehen, dass du verstehst, was passiert.

Schritt 2: Variablen bereinigen – Sauberkeit ist Trumpf

Jetzt kommen die abgeleiteten Variablen. Für das Rauchen erstellst du einen binären Indikator aus *_smever und *_smnow. Achte auf fehlende Werte: In manchen Wellen werden bestimmte Variablen nicht erhoben. Ein Beispiel:

daten_long <- daten_long %>%
  mutate(
    smoking = case_when(
      smever == 1 & smnow == 1 ~ 1,
      smever == 1 & smnow == 0 ~ 0,
      TRUE ~ NA_real_
    ),
    obesity = ifelse(bmi_dv >= 30, 1, 0),
    degree = ifelse(hiqual_dv %in% c(1,2), 1, 0),
    employed = ifelse(jbhas == 1 & jboff == 0, 1, 0)
  )

Die Variablen sf12pcs_dv und sf12mcs_dv sowie age_dv und sex_dv übernimmst du direkt. Für das Datum des Interviews suchst du nach Variablen wie *_istrtdaty oder *_istrtdatm – auch hier hilft die lookfor-Funktion. Speichere das Ergebnis mit saveRDS(), damit du es in den nächsten Aufgaben laden kannst.

Schritt 3: Deskriptive Statistik mit „Table 1“ – Publikationsreif

In Task 2 erstellst du eine Tabelle mit deskriptiven Statistiken, getrennt nach Wellen. Nutze gtsummary für eine ansprechende Formatierung:

library(gtsummary)

daten_long %>%
  select(wave, smoking, obesity, sf12pcs_dv, sf12mcs_dv, life_satisfaction, age_dv, sex_dv, degree, employed) %>%
  tbl_summary(
    by = wave,
    statistic = list(all_continuous() ~ "{mean} ({sd})",
                     all_categorical() ~ "{n} ({p}%)"),
    label = list(smoking ~ "Raucher (binär)",
                 obesity ~ "Adipositas (BMI ≥ 30)",
                 sf12pcs_dv ~ "SF-12 Physische Summe",
                 sf12mcs_dv ~ "SF-12 Mentale Summe",
                 life_satisfaction ~ "Lebenszufriedenheit",
                 age_dv ~ "Alter",
                 sex_dv ~ "Geschlecht",
                 degree ~ "Hochschulabschluss",
                 employed ~ "Erwerbstätig")
  ) %>%
  as_gt() %>%
  gt::gtsave("partA_task2_table.html")

Diese Tabelle ist wie ein Dashboard einer Finanz-App: Sie gibt dir auf einen Blick die wichtigsten Kennzahlen, sortiert nach Zeiträumen. Achte darauf, dass du nur sinnvolle Variablen anzeigst – pidp und date_interview gehören nicht in die Tabelle.

Schritt 4: Regressionen automatisieren – Mit purrr und broom

In Task 3 führst du zahlreiche Regressionen durch: für jedes Outcome (Rauchstatus, SF-12 MCS, SF-12 PCS, Adipositas, Lebenszufriedenheit) jede Exposure (Erwerbsstatus, Hochschulabschluss), getrennt nach Welle und Geschlecht. Das manuelle Schreiben wäre eine Qual – automatisiere es mit expand.grid() und purrr::map2():

kombinationen <- expand.grid(
  outcome = c("smoking", "sf12mcs_dv", "sf12pcs_dv", "obesity", "life_satisfaction"),
  exposure = c("employed", "degree"),
  wave = 1:14,
  sex = c("male", "female", "all"),
  stringsAsFactors = FALSE
)

regressionen <- pmap(kombinationen, function(outcome, exposure, wave, sex) {
  daten_sub <- daten_long %>%
    filter(wave == !!wave) %>%
    mutate(age_sq = age_dv^2)
  
  if(sex == "male") daten_sub <- filter(daten_sub, sex_dv == 1)
  if(sex == "female") daten_sub <- filter(daten_sub, sex_dv == 2)
  
  formel <- as.formula(paste(outcome, "~", exposure, "+ age_dv + age_sq + date_interview"))
  modell <- lm(formel, data = daten_sub)
  
  broom::tidy(modell, conf.int = TRUE) %>%
    filter(term == exposure) %>%
    mutate(outcome = outcome, exposure = exposure, wave = wave, sex = sex)
})

ergebnisse <- bind_rows(regressionen)

Dieses Vorgehen erinnert an maschinelles Lernen, wo Hyperparameter automatisch durchgetestet werden – nur dass du hier die Ergebnisse in einer sauberen Tabelle sammelst. Kommentiere jede Zeile, damit deine Prüfer deine Gedankengänge nachvollziehen können.

Best Practices für SOCS0055: Code-Effizienz und Nachvollziehbarkeit

Die Aufgabenstellung betont, dass du Code-Wiederholungen vermeiden sollst. Nutze Funktionen, Schleifen oder purrr, um Aufgaben zu automatisieren. Ein gutes Beispiel ist die einheitliche Bereinigung aller Wellen: Statt für jede Welle den gleichen Code zu kopieren, schreibst du eine Funktion, die auf jede Welle angewendet wird. Das spart nicht nur Zeit, sondern reduziert auch Fehler.

Denk an die Kryptowährungs-Börsen: Sie verarbeiten tausende Transaktionen pro Sekunde mit standardisierten Skripten – genau so solltest du deine Datenverarbeitung aufziehen.

Vergiss nicht, am Ende deines Quarto-Dokuments einen Abschnitt zur KI-Nutzung einzufügen, falls du assistive Tools verwendet hast. Das ist nicht nur ehrlich, sondern zeigt auch, dass du die Richtlinien der UCL kennst.

Fazit: Mit Struktur zum Erfolg

Die Datenaufbereitung in SOCS0055 erfordert sowohl technisches Know-how als auch strategisches Denken. Indem du deinen Code modularisierst, kommentierst und auf Effizienz achtest, legst du den Grundstein für eine herausragende Bewertung. Nutze die Kraft von R und Quarto, um aus Rohdaten eine klare, analysierbare Struktur zu schaffen – ganz wie ein Datenjournalist, der aus komplexen Zahlen eine verständliche Geschichte macht. Viel Erfolg bei deiner Abgabe!