library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)

1. Einleitung

Forschungsfrage: Inwiefern lässt sich die durchschnittliche Lesekompetenz von Schüler:innen in einem Bundesland durch das dortige Schüler-Lehrer-Verhältnis statistisch vorhersagen?

Hypothese: Es wird ein negativer linearer Zusammenhang zwischen dem Schüler-Lehrer-Verhältnis und den mittleren Lesekompetenzwerten angenommen: Je mehr Schüler:innen auf eine Lehrkraft kommen (höheres Verhältnis), desto niedriger sollte der mittlere Kompetenzwert im Bundesland ausfallen. Die Idee dahinter: Bei mehr Schüler:innen pro Lehrkraft bleibt weniger Zeit für den Einzelnen, was sich negativ auf den Lernerfolg auswirken könnte.

Die Daten stammen von zwei offiziellen Quellen (bildungsbericht.de – Nationaler Bildungsbericht “Bildung in Deutschland”):

  1. Pädagogisches Personal im Schulwesen (Datei: SKL_Teil_Z_Zusammenfassung_2024.xlsx): Diese Tabelle zeigt für jedes Bundesland, wie viele Schüler:innen im Schnitt auf eine Lehrkraft kommen (Schüler-Lehrer-Relation).

  2. Kognitive Kompetenzen – IQB-Bildungstrend (Datei: d7-anhang.xlsx): Diese Tabelle enthält die Lesekompetenz-Ergebnisse aus dem IQB-Bildungstrend, einer bundesweiten Schulleistungsstudie. Wichtig zu wissen: Der IQB-Bildungstrend testet ausschließlich zwei Klassenstufen – Klasse 4 und Klasse 9. Das sind keine zufällig gewählten Jahrgänge, sondern die beiden zentralen Übergangspunkte im deutschen Schulsystem:

Klasse 4 markiert das Ende der Grundschulzeit – direkt bevor die Schüler:innen auf eine weiterführende Schule wechseln (Gymnasium, Realschule, etc.).

Klasse 9 markiert das Ende der Sekundarstufe I – also den Punkt, an dem viele Schüler:innen die Schule mit einem ersten Abschluss verlassen oder in die gymnasiale Oberstufe übergehen.

Genau an diesen beiden Übergängen wird bundesweit geprüft, ob die Schüler:innen die in den Bildungsstandards festgelegten Kompetenzziele erreicht haben. Für andere Klassenstufen gibt es in dieser Studie keine bundesweit vergleichbaren Daten. Die Beschränkung auf Klasse 4 und Klasse 9 ist also keine eigene Auswahl meinerseits, sondern ergibt sich direkt aus der Datenquelle selbst.

Ich vergleiche in dieser Analyse nicht einzelne Schüler:innen, sondern ganze Bundesländer miteinander – ich habe also nur 16 “Datenpunkte” (die 16 Bundesländer).

2. Daten importieren - Lesekompetenz

Zunächst wird die Excel-Tabelle mit den Lesekompetenz-Werten für Klasse 4 (2021) und Klasse 9 (2022) eingelesen. Die Rohdaten enthalten oben ein paar Titelzeilen, die übersprungen werden müssen, und teilweise steht statt einer Zahl ein Punkt-Symbol (“●”) in der Tabelle – das bedeutet, dass für dieses Bundesland aus Datenschutzgründen kein Wert vorliegt. Diese Symbole werden in “fehlender Wert” (NA) umgewandelt, damit R sie bei der Berechnung von Mittelwerten korrekt ignoriert.

lesekompetenz <- read_excel(
  "/Users/consti/Desktop/d7-anhang.xlsx",
  sheet = "Tab. D7-2web",
  skip = 7,          
  n_max = 16,        
  col_names = c("Bundesland", "Lese4_2016", "Lese4_2021", "Lese9_2015", "Lese9_2022")
)

lesekompetenz <- lesekompetenz %>%
  mutate(
    Bundesland = str_remove(Bundesland, "\\d\\)$"),
    Bundesland = str_trim(Bundesland),
   
    Lese4_2021 = as.numeric(na_if(as.character(Lese4_2021), "●")),
    Lese9_2022 = as.numeric(na_if(as.character(Lese9_2022), "●"))
  )

print(lesekompetenz)
## # A tibble: 16 × 5
##    Bundesland             Lese4_2016 Lese4_2021 Lese9_2015 Lese9_2022
##    <chr>                       <dbl>      <dbl>      <dbl>      <dbl>
##  1 Baden-Württemberg             492        468        496        486
##  2 Bayern                        514        496        513        496
##  3 Berlin                        475        448        483        451
##  4 Brandenburg                   492        456        511        472
##  5 Bremen                        444        432        458        436
##  6 Hamburg                       487        479        496        472
##  7 Hessen                        499        476        492        460
##  8 Mecklenburg-Vorpommern        490         NA        506        477
##  9 Niedersachsen                 490        462        498        474
## 10 Nordrhein-Westfalen           480        460        492        458
## 11 Rheinland-Pfalz               485        474        494        466
## 12 Saarland                      498        473        496        478
## 13 Sachsen                       509        496        528        503
## 14 Sachsen-Anhalt                497        476        504        483
## 15 Schleswig-Holstein            501        479        514        476
## 16 Thüringen                     493        465        511        482

Für Mecklenburg-Vorpommern liegt bei Klasse 4 kein Wert vor – dieser Fall wird bei den späteren Berechnungen automatisch ausgeschlossen (n = 15 statt n = 16).

3. Daten importieren Schüler-Lehrer-Relation

Anschließend wird die zweite Excel-Tabelle geladen, die für jedes Bundesland angibt, wie viele Schüler:innen im Schnitt auf eine Lehrkraft kommen. Diese Tabelle ist so aufgebaut, dass die Bundesländer als Kürzel (z. B. “BW” für Baden-Württemberg) in einzelnen Spalten nebeneinanderstehen. Die Tabelle wird so umgeformt, dass jedes Bundesland eine eigene Zeile bekommt; die Kürzel werden anschließend in die vollen Namen übersetzt, damit die beiden Datensätze später zusammengeführt werden können.

slr_roh <- read_excel(
  "/Users/consti/Desktop/SKL_Teil_Z_Zusammenfassung_2024.xlsx",
  sheet = "Z6.2 ",   # Achtung: Leerzeichen im Sheetnamen, wie im Original geprüft
  skip = 4
)
## New names:
## • `` -> `...1`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
slr_gefiltert <- slr_roh %>%
  filter(`Schulstufe/Schulart` == "Allgemeinbildende Schulen")

kuerzel_tabelle <- tibble(
  Kuerzel = c("BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"),
  Bundesland = c("Baden-Württemberg","Bayern","Berlin","Brandenburg","Bremen","Hamburg","Hessen",
                 "Mecklenburg-Vorpommern","Niedersachsen","Nordrhein-Westfalen","Rheinland-Pfalz",
                 "Saarland","Sachsen","Sachsen-Anhalt","Schleswig-Holstein","Thüringen")
)

schueler_lehrer <- slr_gefiltert %>%
  select(BW:TH) %>%                     # nur die 16 Länderspalten (ohne Gesamt-D)
  pivot_longer(cols = everything(),
               names_to = "Kuerzel",
               values_to = "Schueler_je_Lehrkraft") %>%
  left_join(kuerzel_tabelle, by = "Kuerzel") %>%
  select(Bundesland, Schueler_je_Lehrkraft)

print(schueler_lehrer)
## # A tibble: 16 × 2
##    Bundesland             Schueler_je_Lehrkraft
##    <chr>                                  <dbl>
##  1 Baden-Württemberg                       13.1
##  2 Bayern                                  13.6
##  3 Berlin                                  12.9
##  4 Brandenburg                             12.9
##  5 Bremen                                  12.8
##  6 Hamburg                                 12.3
##  7 Hessen                                  12.9
##  8 Mecklenburg-Vorpommern                  14.2
##  9 Niedersachsen                           12.9
## 10 Nordrhein-Westfalen                     12.9
## 11 Rheinland-Pfalz                         13.6
## 12 Saarland                                12.8
## 13 Sachsen                                 14.3
## 14 Sachsen-Anhalt                          14.1
## 15 Schleswig-Holstein                      13.4
## 16 Thüringen                               13.8

4. Zusammenführen der Datensätze

Die beiden Datensätze werden nun zusammengeführt, sodass am Ende eine einzige Tabelle vorliegt: pro Bundesland die Lesekompetenz-Werte und die Schüler-Lehrer-Relation nebeneinander. Anschließend wird geprüft, ob beim Zusammenführen (dem sogenannten “Join”) irgendwo versehentlich Werte verloren gegangen sind.

projekt_daten <- lesekompetenz %>%
  left_join(schueler_lehrer, by = "Bundesland")

print(projekt_daten)
## # A tibble: 16 × 6
##    Bundesland  Lese4_2016 Lese4_2021 Lese9_2015 Lese9_2022 Schueler_je_Lehrkraft
##    <chr>            <dbl>      <dbl>      <dbl>      <dbl>                 <dbl>
##  1 Baden-Würt…        492        468        496        486                  13.1
##  2 Bayern             514        496        513        496                  13.6
##  3 Berlin             475        448        483        451                  12.9
##  4 Brandenburg        492        456        511        472                  12.9
##  5 Bremen             444        432        458        436                  12.8
##  6 Hamburg            487        479        496        472                  12.3
##  7 Hessen             499        476        492        460                  12.9
##  8 Mecklenbur…        490         NA        506        477                  14.2
##  9 Niedersach…        490        462        498        474                  12.9
## 10 Nordrhein-…        480        460        492        458                  12.9
## 11 Rheinland-…        485        474        494        466                  13.6
## 12 Saarland           498        473        496        478                  12.8
## 13 Sachsen            509        496        528        503                  14.3
## 14 Sachsen-An…        497        476        504        483                  14.1
## 15 Schleswig-…        501        479        514        476                  13.4
## 16 Thüringen          493        465        511        482                  13.8
# Kontrolle: sind nach dem Join alle 16 Bundesländer vollständig gematcht?
cat("Fehlende Werte nach Join (Schueler_je_Lehrkraft):",
    sum(is.na(projekt_daten$Schueler_je_Lehrkraft)), "\n")
## Fehlende Werte nach Join (Schueler_je_Lehrkraft): 0
cat("Fehlende Werte nach Join (Lese4_2021):",
    sum(is.na(projekt_daten$Lese4_2021)), "\n")
## Fehlende Werte nach Join (Lese4_2021): 1
cat("Fehlende Werte nach Join (Lese9_2022):",
    sum(is.na(projekt_daten$Lese9_2022)), "\n")
## Fehlende Werte nach Join (Lese9_2022): 0

Das Ergebnis zeigt: Bis auf den einen bekannten fehlenden Wert bei Mecklenburg-Vorpommern (Klasse 4) hat alles gepasst.

5. Deskriptive Statistik

Bevor komplexere statistische Tests durchgeführt werden, erfolgt zunächst ein grundlegender Überblick über die Daten: Wie hoch ist die durchschnittliche Lesekompetenz, und wie stark schwankt sie zwischen den Bundesländern? Das Gleiche wird für die Schüler-Lehrer-Relation betrachtet.

str(projekt_daten)
## tibble [16 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Bundesland           : chr [1:16] "Baden-Württemberg" "Bayern" "Berlin" "Brandenburg" ...
##  $ Lese4_2016           : num [1:16] 492 514 475 492 444 487 499 490 490 480 ...
##  $ Lese4_2021           : num [1:16] 468 496 448 456 432 479 476 NA 462 460 ...
##  $ Lese9_2015           : num [1:16] 496 513 483 511 458 496 492 506 498 492 ...
##  $ Lese9_2022           : num [1:16] 486 496 451 472 436 472 460 477 474 458 ...
##  $ Schueler_je_Lehrkraft: num [1:16] 13.1 13.6 12.9 12.9 12.8 ...
projekt_daten %>%
  summarise(
    n_Lese4          = sum(!is.na(Lese4_2021)),
    Mittelwert_Lese4 = mean(Lese4_2021, na.rm = TRUE),
    SD_Lese4         = sd(Lese4_2021, na.rm = TRUE),
    n_Lese9          = sum(!is.na(Lese9_2022)),
    Mittelwert_Lese9 = mean(Lese9_2022, na.rm = TRUE),
    SD_Lese9         = sd(Lese9_2022, na.rm = TRUE),
    Mittelwert_SLR   = mean(Schueler_je_Lehrkraft, na.rm = TRUE),
    SD_SLR           = sd(Schueler_je_Lehrkraft, na.rm = TRUE)
  )
## # A tibble: 1 × 8
##   n_Lese4 Mittelwert_Lese4 SD_Lese4 n_Lese9 Mittelwert_Lese9 SD_Lese9
##     <int>            <dbl>    <dbl>   <int>            <dbl>    <dbl>
## 1      15             469.     16.7      16             473.     16.6
## # ℹ 2 more variables: Mittelwert_SLR <dbl>, SD_SLR <dbl>

Die mittlere Lesekompetenz liegt in Klasse 4 (2021) bei etwa 469 Punkten (Standardabweichung ≈ 17, n = 15) und in Klasse 9 (2022) bei etwa 473 Punkten (Standardabweichung ≈ 17, n = 16). Die Schüler-Lehrer-Relation liegt im Schnitt bei 13,3 Schüler:innen pro Lehrkraft und unterscheidet sich zwischen den Bundesländern nur relativ wenig (zwischen etwa 12,3 und 14,3).

6. Visualisierung

Um den Zusammenhang zwischen beiden Größen sichtbar zu machen, werden für Klasse 4 und Klasse 9 jeweils Streudiagramme erstellt: Jeder Punkt entspricht einem Bundesland, auf der x-Achse steht die Schüler-Lehrer-Relation, auf der y-Achse die Lesekompetenz. Zusätzlich wird eine Regressionsgerade eingezeichnet, die den allgemeinen Trend in den Daten zeigt.

Klasse 4

ggplot(projekt_daten, aes(x = Schueler_je_Lehrkraft, y = Lese4_2021)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = TRUE, color = "steelblue") +
  geom_text(aes(label = Bundesland), vjust = -0.7, size = 3) +
  labs(
    title = "Schüler-Lehrer-Relation und Lesekompetenz (Klasse 4, 2021)",
    x = "Schüler:innen je Lehrkraft",
    y = "Mittlere Lesekompetenz (Klasse 4)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_text()`).

Klasse 9

ggplot(projekt_daten, aes(x = Schueler_je_Lehrkraft, y = Lese9_2022)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = TRUE, color = "darkorange") +
  geom_text(aes(label = Bundesland), vjust = -0.7, size = 3) +
  labs(
    title = "Schüler-Lehrer-Relation und Lesekompetenz (Klasse 9, 2022)",
    x = "Schüler:innen je Lehrkraft",
    y = "Mittlere Lesekompetenz (Klasse 9)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Bereits in den Diagrammen zeigt sich das überraschende Hauptergebnis dieser Analyse: Die Linie steigt in beiden Fällen an, statt wie erwartet zu fallen. Bundesländer mit einer höheren Schüler-Lehrer-Relation (zum Beispiel Sachsen oder Sachsen-Anhalt) weisen tendenziell eine höhere, nicht niedrigere, Lesekompetenz auf.

7. Korrelation

Um den Zusammenhang auch in Zahlen auszudrücken, wird der Korrelationskoeffizient berechnet: Er zeigt, wie stark und in welche Richtung zwei Größen zusammenhängen. Werte nahe -1 bedeuten einen starken negativen Zusammenhang (wie in der Hypothese erwartet), Werte nahe +1 einen starken positiven. Da ein negativer Zusammenhang erwartet wurde, wird gezielt in diese Richtung getestet (einseitiger Test).

cor.test(projekt_daten$Schueler_je_Lehrkraft, projekt_daten$Lese4_2021,
         alternative = "less")
## 
##  Pearson's product-moment correlation
## 
## data:  projekt_daten$Schueler_je_Lehrkraft and projekt_daten$Lese4_2021
## t = 2.174, df = 13, p-value = 0.9756
## alternative hypothesis: true correlation is less than 0
## 95 percent confidence interval:
##  -1.0000000  0.7803169
## sample estimates:
##       cor 
## 0.5163515
cor.test(projekt_daten$Schueler_je_Lehrkraft, projekt_daten$Lese9_2022,
         alternative = "less")
## 
##  Pearson's product-moment correlation
## 
## data:  projekt_daten$Schueler_je_Lehrkraft and projekt_daten$Lese9_2022
## t = 2.7927, df = 14, p-value = 0.9928
## alternative hypothesis: true correlation is less than 0
## 95 percent confidence interval:
##  -1.0000000  0.8165732
## sample estimates:
##       cor 
## 0.5981396

Für beide Klassenstufen zeigt sich eine positive Korrelation (Klasse 4: r = 0,52; Klasse 9: r = 0,60) – also genau das Gegenteil der Hypothese. Weil gezielt auf einen negativen Zusammenhang getestet wurde, kommt der Test folgerichtig zu keinem signifikanten Ergebnis in diese Richtung (Klasse 4: p = 0,976; Klasse 9: p = 0,993). Da es sich um zwei inhaltlich getrennte Fragestellungen handelt (zwei Altersstufen), wurde bewusst keine Korrektur für mehrfaches Testen vorgenommen.

8. Lineare Regression

Mit der Regression wird ein Modell gebaut, das aus der Schüler-Lehrer-Relation die Lesekompetenz vorhersagt; zusätzlich wird geprüft, wie gut dieses Modell die Daten erklärt.

modell_klasse4 <- lm(Lese4_2021 ~ Schueler_je_Lehrkraft, data = projekt_daten)
summary(modell_klasse4)
## 
## Call:
## lm(formula = Lese4_2021 ~ Schueler_je_Lehrkraft, data = projekt_daten)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -30.706  -7.853  -1.607   9.943  23.503 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)  
## (Intercept)            268.711     92.364   2.909   0.0122 *
## Schueler_je_Lehrkraft   15.181      6.983   2.174   0.0488 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.87 on 13 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.2666, Adjusted R-squared:  0.2102 
## F-statistic: 4.726 on 1 and 13 DF,  p-value: 0.04877
modell_klasse9 <- lm(Lese9_2022 ~ Schueler_je_Lehrkraft, data = projekt_daten)
summary(modell_klasse9)
## 
## Call:
## lm(formula = Lese9_2022 ~ Schueler_je_Lehrkraft, data = projekt_daten)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -28.913  -8.851   1.020  12.642  16.731 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)   
## (Intercept)            253.503     78.717   3.220  0.00616 **
## Schueler_je_Lehrkraft   16.543      5.924   2.793  0.01439 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 13.76 on 14 degrees of freedom
## Multiple R-squared:  0.3578, Adjusted R-squared:  0.3119 
## F-statistic: 7.799 on 1 and 14 DF,  p-value: 0.01439

Beide Modelle sind statistisch signifikant (Klasse 4: p = 0,049; Klasse 9: p = 0,014) – aber wieder mit umgekehrtem Vorzeichen als erwartet: Ein Anstieg der Schüler-Lehrer-Relation um eine Einheit geht im Modell mit einem Anstieg der Lesekompetenz um etwa 15 bis 17 Punkte einher, nicht mit einem Rückgang. Das Modell für Klasse 9 erklärt mit einem R² von 0,36 etwas mehr der Unterschiede zwischen den Bundesländern als das Modell für Klasse 4 (R² = 0,27). Beide Werte zeigen jedoch nur einen moderaten Erklärungsgehalt: Ein großer Teil der Unterschiede in der Lesekompetenz bleibt durch die Schüler-Lehrer-Relation allein unerklärt.

9. Diskussion

Die ursprüngliche Hypothese hat sich nicht bestätigt – stattdessen zeigt sich das Gegenteil: Bundesländer mit mehr Schüler:innen pro Lehrkraft schneiden in diesen Daten tendenziell besser ab, nicht schlechter. Eine mögliche Erklärung dafür ist, dass hier keine einzelnen Schulklassen verglichen werden, sondern ganze Bundesländer. Auf dieser Ebene spielen viele andere Faktoren eine Rolle, die sich gegenseitig überlagern können – zum Beispiel wie der Unterricht organisiert ist, welche Rahmenbedingungen ein Bundesland hat, oder wie sich die Bevölkerung zusammensetzt. Es ist also möglich, dass gar nicht die Schüler-Lehrer-Relation selbst für die guten Werte verantwortlich ist, sondern ein anderer Faktor, der zufällig mit ihr zusammenhängt. Ein Zusammenhang zwischen zwei Größen bedeutet eben nicht automatisch, dass die eine die andere tatsächlich verursacht. Zu bedenken ist außerdem, dass nur 16 Bundesländer verglichen werden – eine sehr kleine Datenbasis, bei der einzelne “Ausreißer” das Gesamtergebnis schnell verschieben können.

10. Fazit

Insgesamt zeigt die Analyse: Der erwartete negative Zusammenhang zwischen Schüler-Lehrer-Relation und Lesekompetenz lässt sich mit diesen Daten nicht bestätigen. Stattdessen deutet sich das Gegenteil an. Das heißt aber nicht, dass kleinere Klassen grundsätzlich schlechter sind – vermutlich spielen andere, nicht erfasste Unterschiede zwischen den Bundesländern eine größere Rolle als die reine Schüler-Lehrer-Relation. Um das genauer zu klären, wären detailliertere Daten nötig, zum Beispiel auf Ebene einzelner Schulen statt ganzer Bundesländer.