Programmierung für
Data Science

Vorlesung 3

Prof. Dr. Michael Bücker

0.1 Heute arbeiten wir so

  • Grundlage heute: vor allem Induktive Statistik und Modellierung aus dem Skript.
  • Rhythmus je Block: Orientierung, zwei Kurzübungen, Arbeitsphase, Besprechung.
  • In den Kurzübungen klären wir Rechenschritte, Funktionsaufrufe und Interpretationen gemeinsam.
  • In den Arbeitsphasen bearbeiten Sie größere Aufgaben selbstständig oder in kleinen Teams.
  • Ziel für heute: Wahrscheinlichkeiten berechnen, Simulationen lesen, Testausgaben interpretieren und Modelle gezielt anwenden.

Heute zuerst ohne KI

Lösen Sie die Aufgaben heute zunächst ohne KI. Gerade bei Simulationen, Tests und Modellinterpretationen ist der eigene Diagnoseweg didaktisch wichtiger als ein schneller Lösungsvorschlag.

0.2 Tagesstruktur

Zeit Inhalt
08:30 - 09:45 Wahrscheinlichkeitsverteilungen in R: d/p/q/r, wichtige Verteilungen, kurze Rechenphase
Orientierung, zwei Kurzübungen, kompakte Arbeitsphase
10:00 - 11:30 Monte-Carlo-Simulation: Grundidee, Panini-Beispiel, Logistikzentrum mit Wartezeiten
gemeinsamer Einstieg, dann größere Simulationsaufgabe
12:15 - 13:15 Testen und Testausgaben: Testwahl, t.test, binom.test, prop.test, cor.test
kurze Rechen- und Interpretationsphase
13:30 - 15:30 Lineare Modelle und ANOVA: Formeln, lm, summary, predict, anova
gemeinsamer Modellaufbau, dann Arbeitsphase mit diamonds
15:45 - 17:30 Logistische Regression: glm(..., family = binomial), Wahrscheinlichkeiten, Klassifikation, Fehlerrate
Orientierung, Kurzübung, Arbeitsphase und Abschlussbesprechung

Pausen und Besprechungen nutzen wir wieder, um offene Fragen direkt zu klären und den Schwierigkeitsgrad bei Bedarf anzupassen.

1 Wahrscheinlichkeitsverteilungen in R

1.1 Orientierung: Das d/p/q/r-Schema

Präfix Bedeutung Typische Frage Beispiel
d Dichte- oder Wahrscheinlichkeitsfunktion Wie groß ist der Wert bei x? dbinom(3, size = 10, prob = 0.2)
p Verteilungsfunktion Wie groß ist P(X <= x)? pnorm(1.96)
q Quantilsfunktion Welcher Wert gehört zu einer Wahrscheinlichkeit p? qnorm(0.975)
r Zufallszahlen Wie simuliere ich Werte aus der Verteilung? rnorm(100, mean = 0, sd = 1)

Merksatz

Das wichtigste Lesemuster ist: d gibt Funktionswerte, p kumulierte Wahrscheinlichkeiten, q Schwellenwerte und r simulierte Realisationen.

1.2 Orientierung: Wichtige Verteilungen kompakt

Verteilung Schlüsselwort Typische Funktion Typischer Einsatz
Binomialverteilung binom dbinom, pbinom, rbinom Anzahlen von Erfolgen
Poissonverteilung pois dpois, ppois, rpois Ereignisse pro Zeitintervall
Normalverteilung norm dnorm, pnorm, qnorm, rnorm Messwerte und Standardisierung
t-Verteilung t dt, pt, qt, rt Tests und Konfidenzintervalle
Exponentialverteilung exp dexp, pexp, qexp, rexp Warte- und Zwischenankunftszeiten

Achtung

Die Funktionen sehen ähnlich aus, aber die Parameter unterscheiden sich. Bei rnorm heißen sie z. B. mean und sd, bei rbinom dagegen size und prob.

1.3 Kurzübung: Binomial- und Normalverteilung lesen

  1. Berechnen Sie dbinom(x = 3, size = 10, prob = 0.2).
  2. Berechnen Sie pbinom(q = 3, size = 10, prob = 0.2).
  3. Formulieren Sie in einem Satz den Unterschied zwischen beiden Ergebnissen.
  4. Berechnen Sie dnorm(x = 0.5, mean = 0, sd = 1) und pnorm(q = 1.96, mean = 0, sd = 1).
  5. Interpretieren Sie das Ergebnis von pnorm(1.96) als kumulierte Wahrscheinlichkeit.
dbinom(3, size = 10, prob = 0.2)
pbinom(3, size = 10, prob = 0.2)
dnorm(0.5)
pnorm(1.96)
  • Fokus:
  • Punktwahrscheinlichkeit
  • kumulierte Wahrscheinlichkeit
  • Ergebnis sprachlich deuten

1.4 Kurzübung: Quantile und Zufallszahlen

  1. Berechnen Sie qnorm(p = 0.975, mean = 0, sd = 1) und deuten Sie das Ergebnis.
  2. Setzen Sie mit set.seed(123) einen Startwert.
  3. Erzeugen Sie mit rbinom(n = 5, size = 10, prob = 0.3) fünf simulierte Stichprobenwerte.
  4. Erzeugen Sie mit rnorm(n = 5, mean = 100, sd = 15) fünf normalverteilte Werte.
  5. Wiederholen Sie Schritt 2 bis 4 und prüfen Sie, was sich ändert.
qnorm(0.975)
set.seed(123)
rbinom(5, size = 10, prob = 0.3)
rnorm(5, mean = 100, sd = 15)
  • Fokus:
  • Quantil lesen
  • set.seed(...)
  • Reproduzierbarkeit verstehen

1.5 Arbeitsphase: Wahrscheinlichkeiten, Quantile und Simulationen kombinieren

Bearbeiten Sie die folgenden vier Teilaufgaben systematisch:

  1. In einer Qualitätskontrolle ist jedes von 12 Bauteilen mit Wahrscheinlichkeit 0.08 defekt. Berechnen Sie die Wahrscheinlichkeit für genau 2 defekte Teile.
  2. Berechnen Sie zusätzlich die Wahrscheinlichkeit für höchstens 2 defekte Teile.
  3. Ein Merkmal sei normalverteilt mit Mittelwert 100 und Standardabweichung 15. Bestimmen Sie den Grenzwert, oberhalb dessen nur noch 5 % der Werte liegen.
  4. Simulieren Sie 5000 Stichproben des Defektproblems mit rbinom(...) und vergleichen Sie den empirischen Anteil aus Aufgabe 1 mit dem theoretischen Wert.
  • Starten Sie bei jeder Teilaufgabe mit der Frage:
  • Welche Verteilung?
  • Welche Funktion: d, p, q oder r?
  • Welche Parameter?

1.6 Besprechung: d, p, q und r sauber unterscheiden

  • d und p beantworten unterschiedliche Fragen, auch wenn dieselben Parameter verwendet werden.
  • q läuft die Richtung der Verteilungsfunktion gewissermaßen rückwärts.
  • r erzeugt keine Theorie, sondern simulierte Realisationen mit Zufallsschwankung.
  • Mit set.seed(...) werden Simulationen reproduzierbar.

Merksatz

Wenn ein Ergebnis unplausibel wirkt, prüfen Sie zuerst nicht den Taschenrechner, sondern die Frage: War eigentlich d, p, q oder r gemeint?

2 Monte-Carlo-Simulation

2.1 Orientierung: Monte Carlo in vier Schritten

  • Modellannahmen festlegen

  • einen Zufallsprozess simulieren

  • pro Durchlauf eine Kennzahl berechnen

  • viele Wiederholungen gemeinsam auswerten

  • Typische Schätzer sind Mittelwerte oder relative Häufigkeiten.

  • Mehr Wiederholungen stabilisieren die Schätzung, erhöhen aber den Rechenaufwand.

estimate_six <- function(n_rep) {
  mean(sample(1:6,
              size = n_rep,
              replace = TRUE) == 6)
}

sapply(c(100, 1000, 10000),
       estimate_six)

Merksatz

Monte Carlo liefert keine exakte Formel, sondern eine numerische Approximation. Entscheidend ist deshalb immer: Welcher Prozess wird simuliert, und welche Kennzahl wird anschließend geschätzt?

2.2 Orientierung: Panini-Album als Simulationslogik

  • Eine Tüte wird als zufällige Ziehung von Stickern modelliert.
  • Nach jedem Kauf wird die Sammlung aktualisiert.
  • Der Prozess endet erst, wenn alle Sticker mindestens einmal vorliegen.
  • Erst viele Wiederholungen liefern eine stabile Schätzung der Gesamtkosten.
simulate_panini_album <- function(...) {
  collected <- integer(0)
  n_packs <- 0

  while (length(collected) < n_stickers) {
    pack <- sample(...)
    collected <- unique(c(collected, pack))
    n_packs <- n_packs + 1
  }
}

Tipp

Lesen Sie Simulationsfunktionen immer in Phasen: Anfangszustand, ein Durchlauf, Abbruchbedingung, Rückgabe.

2.3 Kurzübung: Einen Panini-Durchlauf starten

  1. Setzen Sie set.seed(2025).
  2. Führen Sie simulate_panini_album() einmal aus.
  3. Lesen Sie die zurückgegebenen Größen n_packs, total_stickers und total_cost.
  4. Erhöhen Sie den Tütenpreis auf 1.20 und führen Sie denselben Durchlauf erneut aus.
  5. Beschreiben Sie, welche Größe sich deterministisch ändert und welche durch Zufall schwankt.
set.seed(2025)
simulate_panini_album()
  • Fokus:
  • ein Durchlauf
  • Rückgabewerte lesen
  • Parameter gezielt verändern

2.4 Kurzübung: Viele Durchläufe gemeinsam auswerten

  1. Simulieren Sie mindestens 1000 vollständige Panini-Durchläufe.
  2. Speichern Sie das Ergebnis so, dass total_cost als Variable zugänglich ist.
  3. Berechnen Sie Mittelwert, Median sowie erstes und drittes Quartil der Gesamtkosten.
  4. Vergleichen Sie diese Kennzahlen mit dem Histogramm rechts.
  5. Formulieren Sie in einem Satz, was die Verteilung über die Streuung der Kosten aussagt.

2.5 Arbeitsphase: Logistikzentrum mit Wartezeiten simulieren

Vervollständigen Sie eine Funktion simulate_day(...), die einen Arbeitstag im Logistikzentrum beschreibt:

  1. Erzeugen Sie Ankunftszeiten zwischen 6 und 18 Uhr auf Basis exponentialverteilter Zwischenankunftszeiten.
  2. Erzeugen Sie für alle Transporte Bearbeitungszeiten.
  3. Nutzen Sie available_at, um Transporte jeweils dem zuerst freien Mitarbeitenden zuzuweisen.
  4. Berechnen Sie daraus die Wartezeit jedes Transports.
  5. Zählen Sie, wie viele Transporte länger als 60 Minuten warten.
  6. Wiederholen Sie die Tagessimulation mindestens 2000-mal.
  7. Vergleichen Sie den Anteil kritischer Tage für n_staff = 2 und n_staff = 3.
simulate_day <- function(...) {
  arrival_times <- numeric(0)
  current_time <- start_hour
  # 1. Ankünfte
  # 2. Servicezeiten
  # 3. Zuordnung
  # 4. Kennzahlen
}
  • Starten Sie mit einem Tag.
  • Erst danach replicate(...).

2.6 Besprechung: Modellannahmen, Wiederholungen und Stabilität

  • Monte-Carlo-Ergebnisse hängen immer von den getroffenen Modellannahmen ab.
  • Ein einzelner Durchlauf ist fast nie aussagekräftig.
  • set.seed(...) macht Experimente reproduzierbar, nicht „wahrer“.
  • Kennzahlen aus vielen Durchläufen sind wichtiger als spektakuläre Einzelergebnisse.

Merksatz

Monte Carlo ist nur so gut wie das zugrunde liegende Modell. Mehr Wiederholungen reduzieren Zufallsschwankung, aber sie korrigieren keine schlechte Modellannahme.

3 Testen und Testausgaben interpretieren

3.1 Orientierung: Welche Frage, welcher Test?

Fragestellung Typische Funktion Typischer Datentyp
Mittelwert gegen Referenzwert t.test(x, mu = ...) metrische Stichprobe
Vorher-Nachher-Vergleich t.test(x, y, paired = TRUE) gepaarte metrische Daten
Anteil gegen Referenzwert binom.test(...) Erfolge/Misserfolge
Vergleich von Anteilen prop.test(...) Kontingenztafel
Zusammenhang kategorialer Variablen chisq.test(...) oder fisher.test(...) Häufigkeitstabelle
Zusammenhang metrischer Variablen cor.test(...) zwei metrische Variablen
Mehr als zwei Gruppen ohne Normalannahme kruskal.test(...) gruppierte Daten

Achtung

Starten Sie nicht mit der Funktion, sondern mit der Frage: Geht es um Mittelwerte, Anteile, Tabellen oder metrische Zusammenhänge?

3.2 Orientierung: Was in einer Testausgabe wichtig ist

  • estimate: geschätzter Effekt oder Kennzahl
  • p-value: Evidenz gegen die Nullhypothese
  • conf.int: plausibler Bereich für die geschätzte Größe
  • alternative: Richtung der Alternativhypothese
  • Bei vielen Tests gehören Schätzer und p-Wert zusammen und sollten gemeinsam interpretiert werden.
t.test(x, mu = 65)
cor.test(mtcars$wt,
         mtcars$mpg)
binom.test(58, 100, p = 0.5)

Tipp

Ein kleiner p-Wert beantwortet nicht die Frage nach der Größe oder Relevanz eines Effekts. Lesen Sie deshalb immer auch estimate und conf.int.

3.3 Kurzübung: t.test(...) für Vorher-Nachher-Daten

Arbeiten Sie mit den folgenden Daten:

vorher <- c(8.2, 7.9, 6.8, 7.1, 7.5, 6.9, 7.4, 8.1)
nachher <- c(7.8, 7.2, 6.5, 6.8, 7.0, 6.7, 7.1, 7.6)
  1. Führen Sie einen gepaarten Test mit t.test(vorher, nachher, paired = TRUE) durch.
  2. Lesen Sie die Richtung des beobachteten Unterschieds ab.
  3. Notieren Sie Null- und Alternativhypothese in Worten.
  4. Formulieren Sie eine fachliche Interpretation des p-Werts.
  • Fokus:
  • gepaarte Daten
  • Hypothesen in Worten
  • p-Wert und Richtung gemeinsam lesen

3.4 Kurzübung: Anteil, Tabelle oder Korrelation?

Ordnen Sie zu jeder Fragestellung zunächst eine Funktion zu und führen Sie sie dann aus:

  1. Eine Münze zeigt in 100 Würfen genau 58-mal Kopf. Passt das zu p = 0.5?
  2. Unterscheidet sich die Überlebenswahrscheinlichkeit auf der Titanic zwischen Frauen und Männern?
  3. Gibt es in mtcars einen linearen Zusammenhang zwischen wt und mpg?
  • Fokus:
  • Test passend auswählen
  • Datentyp erkennen
  • Ausgabe kurz interpretieren

3.5 Arbeitsphase: Drei Testfälle rechnen und interpretieren

Bearbeiten Sie die drei Fälle vollständig:

  1. Führen Sie einen Binomialtest für 58 Erfolge bei 100 Versuchen gegen p = 0.5 durch.
  2. Vergleichen Sie die Überlebenswahrscheinlichkeiten von Frauen und Männern auf der Titanic.
  3. Testen Sie den Zusammenhang zwischen wt und mpg in mtcars.

Schreiben Sie zu jedem Fall jeweils:

  1. die Nullhypothese in einem Satz,
  2. die passende Testfunktion,
  3. das zentrale Ergebnis der Ausgabe,
  4. und eine kurze fachliche Interpretation.
  • Schreiben Sie nicht nur den p-Wert auf.
  • Benennen Sie auch die geschätzte Richtung oder Größe des Effekts.
  • Kurze, präzise Sätze reichen.

3.6 Besprechung: Testwahl und Interpretation sauber trennen

  • Der Test wird durch die Struktur der Daten und die Fragestellung bestimmt.
  • Der p-Wert beantwortet nicht allein die fachliche Relevanz.
  • Konfidenzintervalle und Schätzer machen die Richtung und Größenordnung sichtbar.
  • Ein sauber formulierter Testsatz ist oft wertvoller als die bloße Funktionszeile.

Merksatz

Die Minimalstruktur einer guten Interpretation lautet: Fragestellung, Test, zentrales Ergebnis und fachlicher Satz dazu.

4 Lineare Modelle und ANOVA

4.1 Orientierung: Formeln für Modelle

Formel Bedeutung
y ~ x eine Zielvariable, ein Prädiktor
y ~ x1 + x2 additive Effekte zweier Prädiktoren
y ~ x1 * x2 Haupteffekte plus Interaktion
y ~ 0 + x1 + x2 Modell ohne Achsenabschnitt
y ~ x + I(x^2) transformierter Term direkt in der Formel

Tipp

Lesen Sie Formeln immer als Modellbeschreibung und nicht als Rechenbefehl. Links steht das Ziel, rechts stehen die erklärenden Variablen.

4.2 Orientierung: Der Workflow mit lm(...) am Beispiel diamonds

  • Datensatz prüfen und fachlich passende Variablen wählen
  • bei Bedarf Ausreißer begrenzen oder transformieren
  • Modell mit lm(...) fitten
  • summary(...), predict(...) und anova(...) gezielt lesen
  • bei Faktoren immer an Referenzkategorien denken

diamonds_new <- ggplot2::diamonds %>%
  filter(carat <= 2.5) %>%
  mutate(lcarat = log(carat),
         lprice = log(price))

Achtung

Ein gutes Modell beginnt nicht mit lm(...), sondern mit einer sinnvollen Zielgröße, einer plausiblen Variablenauswahl und einer prüfbaren Interpretation.

4.3 Kurzübung: Ein einfaches lineares Modell fitten

  1. Erstellen Sie diamonds_new mit lcarat und lprice.
  2. Fitten Sie lr1 <- lm(lprice ~ lcarat, data = diamonds_new).
  3. Lesen Sie die Koeffizienten und summary(lr1).
  4. Interpretieren Sie den Steigungskoeffizienten in einem Satz.
  5. Notieren Sie das Bestimmtheitsmaß R^2.
lr1 <- lm(lprice ~ lcarat,
          data = diamonds_new)
summary(lr1)
  • Fokus:
  • Formel lesen
  • Koeffizienten
  • R^2

4.4 Kurzübung: Vorhersagen und ANOVA lesen

  1. Erstellen Sie new_data <- data.frame(lcarat = log(c(0.5, 1.0))).
  2. Berechnen Sie Vorhersagen mit predict(lr1, newdata = new_data).
  3. Fitten Sie zusätzlich
lr2 <- lm(lprice ~ lcarat + cut + color + clarity,
          data = diamonds_new)
  1. Vergleichen Sie summary(lr1) und summary(lr2) über das adjustierte R^2.
  2. Prüfen Sie mit anova(lr2), welche Modellteile besonders viel Varianz erklären.
  • Fokus:
  • predict(...)
  • einfaches vs. erweitertes Modell
  • anova(...) als Interpretationshilfe

4.5 Arbeitsphase: Multiples lineares Modell mit Faktoren und Vorhersage

Bearbeiten Sie die folgenden Schritte zusammenhängend:

  1. Fitten Sie ein multiples Modell mit lprice ~ lcarat + cut + color + clarity.
  2. Vergleichen Sie das Modell mit dem einfachen Modell lr1.
  3. Identifizieren Sie in summary(...) mindestens zwei signifikante Modellteile.
  4. Erstellen Sie zwei neue Diamanten als new_data und berechnen Sie Vorhersagen.
  5. Transformieren Sie die Vorhersagen zurück auf die Preis-Skala.
  6. Berechnen Sie für die ersten 100 Beobachtungen die Differenz aus vorhergesagtem und tatsächlichem Preis.
  7. Lassen Sie sich die fünf Beobachtungen mit der größten positiven Differenz ausgeben.
lr2 <- lm(lprice ~ lcarat + cut +
            color + clarity,
          data = diamonds_new)
  • Nutzen Sie exp(...) für die Rücktransformation.
  • Denken Sie bei Faktoren an Referenzkategorien.

4.6 Besprechung: Koeffizienten, Referenzkategorien und Modellgüte

  • Bei Faktoren beschreibt ein Koeffizient immer die Abweichung zur Referenzkategorie.
  • Ein höheres R^2 allein reicht nicht, wichtiger ist die sinnvolle Modellinterpretation.
  • anova(...) hilft zu sehen, welche Modellteile zusätzliche erklärte Varianz liefern.
  • Vorhersagen sind nur so plausibel wie Modell und Datenbasis.

Merksatz

Ein lineares Modell ist erst dann didaktisch verstanden, wenn Sie Formel, Koeffizienten, Modellgüte und Vorhersage in Worten erklären können.

5 Logistische Regression

5.1 Orientierung: glm(..., family = binomial) als Modellworkflow

  • Die Zielvariable ist hier binär, also 0 oder 1.
  • glm(...) funktioniert wie lm(...), benötigt aber zusätzlich family = binomial(link = "logit").
  • Modelliert wird nicht direkt die Klasse, sondern die Wahrscheinlichkeit für Y = 1.
  • Mit predict(...) erhalten wir anschließend entweder den linearen Prädiktor oder direkt die Wahrscheinlichkeit.

Merksatz

Bei der logistischen Regression ist die harte Klassifikation immer nur ein zweiter Schritt. Zuerst kommt die geschätzte Wahrscheinlichkeit.

5.3 Kurzübung: Wahrscheinlichkeiten für neue Fälle berechnen

  1. Fitten Sie fit1 <- glm(Y ~ X1 + X2, family = binomial(link = "logit"), data = df_logit).
  2. Erstellen Sie
new <- data.frame(X1 = c(3, 5, 7),
                  X2 = c(18, 22, 25))
  1. Berechnen Sie Vorhersagen mit type = "link" und type = "response".
  2. Wandeln Sie die Wahrscheinlichkeiten mit Schwellenwert 0.5 in Klassen um.
  3. Vergleichen Sie die beiden Skalen sprachlich.
predict(fit1,
        newdata = new,
        type = "response")
  • Fokus:
  • glm(...)
  • link vs. response
  • Wahrscheinlichkeiten in Klassen

5.4 Arbeitsphase: Schwellenwerte und Fehlerraten vergleichen

Nutzen Sie df_logit und fit1 für eine kleine Klassifikationsanalyse:

  1. Berechnen Sie auf den Trainingsdaten p_hat <- predict(fit1, type = "response").
  2. Erzeugen Sie Klassenvorhersagen für die Schwellenwerte 0.3, 0.5 und 0.7.
  3. Bestimmen Sie für jeden Schwellenwert die Fehlerrate.
  4. Prüfen Sie, welche Beobachtungen ihre Klasse beim Wechsel des Schwellenwerts verändern.
  5. Formulieren Sie, welcher Schwellenwert strenger oder liberaler klassifiziert.
  6. Interpretieren Sie, warum die Trainingsfehlerrate keine faire Generalisierungsbewertung ist.
p_hat <- predict(fit1,
                 type = "response")
Y_hat <- ifelse(p_hat > 0.5, 1, 0)
  • Vergleichen Sie bewusst mehrere Schwellenwerte.
  • Wahrscheinlichkeit und Klasse sind nicht dasselbe.

5.5 Besprechung: Wahrscheinlichkeit, Klasse und Schwellenwert

  • glm(...) liefert zunächst Wahrscheinlichkeiten, keine endgültigen Klassen.
  • Der Schwellenwert 0.5 ist eine Konvention und keine Naturkonstante.
  • Verschiedene Schwellenwerte verschieben die Balance zwischen Fehlertypen.
  • Eine niedrige Trainingsfehlerrate ist noch kein Beweis für gute Generalisierung.

Merksatz

Die wichtigste Ausgabe eines logistischen Modells ist meist nicht 0 oder 1, sondern die geschätzte Wahrscheinlichkeit plus die Begründung, wie daraus eine Entscheidung entsteht.