7.1. 🚀 Übung: Reproduzierbarkeit Nationaler Bildungsbericht#

In dem vorangegangenen Kapitel wurden Sie mit ersten Grundbausteinen im Arbeiten mit R vertraut gemacht. Diese Fähigkeiten können Sie nutzen, um die Reproduzierbarkeit von Grafiken, Daten, etc. zu überprüfen.

Doch was genau ist eigentlich Reproduzierbarkeit?

Der Begriff Reproduzierbarkeit umschreibt in der Wissenschaft die Möglichkeit, durch Verwenden der gleichen Ausgangsdaten und Auswertungsmethoden die gleichen Ergebnisse zu erhalten [National Academies of Sciences and Medicine, 2019]. Dadurch können diese validiert werden, um sicherzustellen, dass sie nicht durch Zufall oder falsche Annahmen entstanden sind. Reproduzierbarkeit erfordert das Offenlegen von Forschungsdaten und -techniken.

7.1.1. Fallbeispiel: Bildungsbericht#

Im nationalen Bildungsbericht 2022 befindet sich auf der Seite 259 folgende Abbildung:

Kreisdiagramme, die die Verteilung von wissenschaftlichem und künstlerischem Personal an Hochschulen zeigen.

Fig. 7.1 Die Abb.H1-3 aus dem Nationalen Bildungsbericht 2022.#

Werfen wir einen Blick auf das erste Kreisdiagramm links oben “Hochschulen insgesamt” und “Personen”. Wir wollen dieses Diagramm als Ergebnis der Auswertung eines Datensatzen reproduzieren. Dafür analysieren wir die Daten aus der Primärquelle.

Achtung!

Der Bildungsbericht verweist auf einzelne Excel-Dateien als Datenbasis (Hier: “Tab. H1-9web”), die der Veröffentlichung des Berichts beigefügt sind. Wir wollen aber einen Schritt weiter gehen und prüfen, ob das Ergebnis auch aus der Primärquelle nachvollzogen werden kann.

Primärquelle finden#

Unter der Grafik sind als Quelle unter anderem die “Statistische[n] Ämter des Bundes und der Länder” angegeben. Wie Sie vermutlich erkannt haben, handelt es sich bei der nun von uns benötigten Datei um die CSV-Ausgangsdatei aus dem vorangegangenen Kapitel (s. 6.2 Übung: Arbeiten mit CSV-Dateien in R).

Nachbauen des Kreisdiagramms in R#

Das nachfolgende Skript knüpft an die vorangegangene Übung an. Es wird vorausgesetzt, dass die Daten entsprechend des Skriptes angepasst wurden. Ihre Tabellendaten sollten wie folgt aussehen:

head(Tabellendaten)
A data.frame: 6 × 5
AngestelltenverhaeltnisGeschlechtAngestelltenzahl_2020PersonalkategorieArt_der_Anstellung
<chr><chr><int><chr><chr>
1Wissenschaftliches und kuenstlerisches Personal maennlich247720Wissenschaftliches und künstlerisches PersonalInsgesamt
2Wissenschaftliches und kuenstlerisches Personal weiblich 167112Wissenschaftliches und künstlerisches PersonalInsgesamt
3Wissenschaftliches und kuenstlerisches Personal Insgesamt414832Wissenschaftliches und künstlerisches PersonalInsgesamt
4Hauptberufl. wissenschaftl. u. kuenstler. Personalmaennlich159567Wissenschaftliches und künstlerisches PersonalHauptberuflich
5Hauptberufl. wissenschaftl. u. kuenstler. Personalweiblich 109708Wissenschaftliches und künstlerisches PersonalHauptberuflich
6Hauptberufl. wissenschaftl. u. kuenstler. PersonalInsgesamt269275Wissenschaftliches und künstlerisches PersonalHauptberuflich

Aufbau des Kreisdiagramms#

Abbildung von Kreisdiagrammen mit Hervorhebung des Diagramms zu Personal an Hochschulen insgesamt.

Fig. 7.2 Das zu reproduzierende Kreisdiagramm aus dem Bildungsbericht 2022.#

Um das Kreisdiagramm reproduzieren zu können, müssen Sie zunächst die einzelnen Bestandteile verstehen. Das Diagramm unterteilt in die folgenden drei Personalgruppen:

  • Professor:innen

  • Wissenschaftliche und künstlerische Mitarbeiter:innen

  • Nebenberufliche Mitarbeiter:innen

Zu diesen Personalgruppen werden jeweils die absoluten Beschäftigungszahlen und der jeweilige prozentuale Anteil zur Gesamtsumme für das Jahr 2020 angegeben.

Lesebeispiel: Im Jahr 2020 waren insgesamt 49.293 Professor:innen an Universitäten und Fachhochschulen in Deutschland angestellt.

Einzelne Datenwerte finden#

Zur eigenständigen Erstellung des Kreisdiagramms müssen Sie nun die absoluten Beschäftigungszahlen in Ihren Tabellendaten finden. Hierzu bietet sich das Suchen mittels der filter()-Funktion an, welche zum Ende der letzten Übung thematisiert wurde.

Filtern nach Professoren:

filter(Tabellendaten, Tabellendaten$Angestelltenverhaeltnis == "Professoren" & Tabellendaten$Geschlecht == "Insgesamt")
A data.frame: 1 × 5
AngestelltenverhaeltnisGeschlechtAngestelltenzahl_2020PersonalkategorieArt_der_Anstellung
<chr><chr><int><chr><chr>
ProfessorenInsgesamt49293Wissenschaftliches und künstlerisches PersonalHauptberuflich

Wie Sie erkennen können, stimmt die Angestelltenzahl von 49293 mit der aus dem Kreisdiagramm überein. Diese Ausgabe können Sie sich nun abspeichern.

Professoren_Insgesamt <- filter(Tabellendaten, Tabellendaten$Angestelltenverhaeltnis == "Professoren" & Tabellendaten$Geschlecht == "Insgesamt")

Für Nebenberufliche Mitarbeiter:innen gehen Sie analog vor:

Nebenberuflich_Insgesamt <- filter(Tabellendaten, Tabellendaten$Angestelltenverhaeltnis == "Nebenberufl. wissenschaftl. u. kuenstler. Personal" & Tabellendaten$Geschlecht == "Insgesamt")
Nebenberuflich_Insgesamt
A data.frame: 1 × 5
AngestelltenverhaeltnisGeschlechtAngestelltenzahl_2020PersonalkategorieArt_der_Anstellung
<chr><chr><int><chr><chr>
Nebenberufl. wissenschaftl. u. kuenstler. PersonalInsgesamt145557Wissenschaftliches und künstlerisches PersonalNebenberuflich

Den Wert für “wissenschaftlichen und künstlerischen Mitarbeiter:innen” im Kreisdiagramm können Sie nicht direkt aus der Tabelle ablesen. Sie erhalten diese Zahl indem Sie die “Professoren - Insgesamt” von “Hauptberuflich wissenschaftliches und künstlerisches Personal - Insgesamt” abziehen, da die Professoren in der DESTATIS-Datei auch unter der Kategorie “Hauptberuflich wissenschaftliches und künstlerisches Personal” gelistet werden.

Hauptberuflich_Insgesamt <- filter(Tabellendaten, Tabellendaten$Angestelltenverhaeltnis == "Hauptberufl. wissenschaftl. u. kuenstler. Personal" & Tabellendaten$Geschlecht == "Insgesamt")
Hauptberuflich_Insgesamt
A data.frame: 1 × 5
AngestelltenverhaeltnisGeschlechtAngestelltenzahl_2020PersonalkategorieArt_der_Anstellung
<chr><chr><int><chr><chr>
Hauptberufl. wissenschaftl. u. kuenstler. PersonalInsgesamt269275Wissenschaftliches und künstlerisches PersonalHauptberuflich
Hauptberuflich_exlusive_Professoren <- Hauptberuflich_Insgesamt$Angestelltenzahl_2020 - Professoren_Insgesamt$Angestelltenzahl_2020
Hauptberuflich_exlusive_Professoren
219982

Dataframe erstellen#

Sie haben nun die einzelnen Datenwerte abgespeichert. Damit Sie diese für ein Kreisdiagramm verwenden können, müssen Sie diese Werte in einem neu erstellen Dataframe kombinieren.

Hierzu erstellen Sie zunächst einen Vektor mit den passenden Bezeichnungen (Grundlage: Legende der Originalabbildung).

Personalgruppe <- c("Wissenschaftliche und kuenstlerische Mitarbeiter:innen", "Professor:innen", "Nebenberufliche Mitarbeiter:innen")
Personalgruppe
  1. 'Wissenschaftliche und kuenstlerische Mitarbeiter:innen'
  2. 'Professor:innen'
  3. 'Nebenberufliche Mitarbeiter:innen'

Nun erzeugen Sie einen zweiten Vektor, welcher die abgespeicherten Datenwerte zu den jeweiligen Personalgruppen enthält.

Achtung!: Hier ist die richtige Reihenfolge analog zum Vektor “Arbeitsverhältnis” wichtig.

Absolute_Werte <- c(Hauptberuflich_exlusive_Professoren, Professoren_Insgesamt$Angestelltenzahl_2020, Nebenberuflich_Insgesamt$Angestelltenzahl_2020)
Absolute_Werte
  1. 219982
  2. 49293
  3. 145557

Nun können Sie beide Vektoren kombinieren und einen Dataframe erstellen:

Daten_kreisdiagramm <- data.frame(Personalgruppe, Absolute_Werte)
Daten_kreisdiagramm
A data.frame: 3 × 2
PersonalgruppeAbsolute_Werte
<chr><int>
Wissenschaftliche und kuenstlerische Mitarbeiter:innen219982
Professor:innen 49293
Nebenberufliche Mitarbeiter:innen 145557

Der erstellte Dataframe kann nun um eine neue Variable erweitert werden, welche die Datenwerte in Prozent zum Gesamtwert anzeigt. Hierfür können Sie sich die folgenden zwei Befehle zu nutze machen:

  • Der Befehl round()rundet eine Zahl auf die nach dem Komma angegebene Nachkommastelle.

  • Der Befehl paste() kombiniert zwei einzelne Objekte (z.B. Vektoren, einzelne Datenwerte, etc.). Mittels sep = können Sie angeben, welches Zeichen zwischen den Objekten stehen soll. Falls Sie diese Spezifikation weglassen, wird R ein einzelnes Leerzeichen verwenden.

#Varibale "Prozent" erzeugen
Daten_kreisdiagramm$Prozent <- paste(round(Daten_kreisdiagramm$Absolute_Werte/sum(Daten_kreisdiagramm$Absolute_Werte)*100,0), "%")

#Absolute Werte und Prozentwerte kombinieren
Daten_kreisdiagramm$Werte_kombiniert <- paste(Daten_kreisdiagramm$Absolute_Werte, sep = " | ", Daten_kreisdiagramm$Prozent)

#Neue Variablen begutachten
Daten_kreisdiagramm
A data.frame: 3 × 4
PersonalgruppeAbsolute_WerteProzentWerte_kombiniert
<chr><int><chr><chr>
Wissenschaftliche und kuenstlerische Mitarbeiter:innen21998253 %219982 | 53 %
Professor:innen 4929312 %49293 | 12 %
Nebenberufliche Mitarbeiter:innen 14555735 %145557 | 35 %

Falls Sie wie in dem originalen Kreisdiagramm Tausenderpunkte angezeigt bekommen möchten, können Sie die Funktion prettyNum verwenden.

Daten_kreisdiagramm$Werte_kombiniert <- prettyNum(Daten_kreisdiagramm$Werte_kombiniert, big.mark = ".", decimal.mark = ",")

Visualisierung des Kreisdiagramms#

Aus dem erzeugten Dataframe können Sie sich nun ein Kreisdiagramm erstellen lassen. Hierzu könnten Sie den Befehl pie() nutzen. Diese Funktion bietet jedoch nicht viele Anpassungsmöglichkeiten und im folgenden wird auf die weit verbreitete ggplot-Funktion zurückgegriffen.

Lassen Sie sich nicht von der Länge des folgenden Codes abschrecken. Jede einzelne Zeile spezifiziert den Aufbau des Kreisdiagramms. Wenn Sie weitere Details zu bestimmten Befehlen erfahren wollen, schlagen Sie diese in der R-Dokumentation nach (z.B. ?geom_label()) oder lassen Sie mal bestimmte Zeilen weg, um nachzugucken, was sich am Output verändert.

ggplot(Daten_kreisdiagramm, aes(x="", y=Absolute_Werte, fill=Personalgruppe))+ #Setzen der Datenbasis
  geom_bar(stat="identity")+ #Setzen wie die Werte verarbeitet werden sollen
  coord_polar("y")+ #Zusatz für Kreisdiagramme
  theme_void()+ #Hintergrund wird weiß eingefärbt
  scale_fill_manual(values = c("#FF9900", "#333399", "#CC0033"))+ #Farben für einzelne Diagrammteile setzen. Farbcodes sind online abrufbar.
  ggtitle("Hochschulen insgesamt")+ #Überschrift setzen
  geom_label(aes(label=Werte_kombiniert), #Beschriftung setzen
             position = position_stack(vjust = 0.5), #Position der Beschriftung setzen
             color="white", #Schriftfarbe setzen
             label.size = 0, #Größe des Randes um Beschriftung setzen
             size=4, #Schriftgröße setzen
             show.legend = FALSE) #Beschriftung soll nicht in der Legende angezeigt werden

Voilà, Sie haben soeben das Kreisdiagramm nachgebaut!

Fazit#

Betrachten Sie nun das originale Diagramm aus dem Bildungsbericht und das von Ihnen selbstständig erzeugte im Vergleich:

Das mit R nachgebaute Kreisdiagramm und das originale Kreisdiagramm zu Personal an Hochschulen im Vergleich.

Fig. 7.3 Vergleich des nachgebauten (links) und des originalen (rechts) Kreisdiagramms.#

Bis auf kleine Schönheitsfehler fällt im direkten Vergleich kein Unterschied auf.

Das Kreisdiagramm ist somit mittels der Primärquelle reproduzierbar!

7.1.2. Literatur#

[NAoSM19]

Engineering National Academies of Sciences and Medicine. Reproducibility and Replicability in Science. National Academies Press, September 2019. ISBN 978-0-309-48619-4.