3 Datenmanagement

Fragen des Datenmanagments stellen – neben technischen Grundlagen für die Erstellung von Reports – die Basis eines effizienten Reporting mit R und Markdown dar. Eine diffuse Datenhaltung, die weder Standards noch der zentralen Ressource – den Daten – die erforderliche Aufmerksamkeit zukommen lässt, verhindert ein Reporting zwar nicht gänzlich, erschwert selbiges jedoch erheblich. Insofern werden im Folgenden Vorschläge für ein Datenmanagement unterbreitet, die zur Erleichterung des Erstellens von standardisierten Berichten dienen und sich im Wesentlichen auf die Fragen der Datenablage und der Standardisierung von Daten beziehen. Nicht beachtet wird dabei der Prozess der Datenerhebung und -generierung.

3.1 Datenhaltung

In vielen Kontexten werden die Ergebnisse von Datenerhebungen als unstrukturierte Einzeldatensätze vorgehalten und gespeichert. Die folgenden Ausführungen konzentrieren sich daher auf derartige Datensätze. Eine Datenhaltung in Form von Datenbanken oder Data Warehouses stellen weitere – technisch anspruchsvollere – Möglichkeiten dar, um eine Grundlage für ein Reporting zu schaffen. Diese werden hier jedoch nicht weiter beschrieben.11

Ziel einer effizienten Datenhaltung sollte sein, eine hohe Datenqualität sicherzustellen. Dadurch wird beispielsweise gewährleistet, dass unterschiedliche Nutzerinnen und Nutzer mit derselben Datenquelle zu denselben Ergebnissen kommen und während der alltäglichen Arbeit die Notwendigkeit zur Aufklärung von Inkonsistenzen möglichst gering gehalten wird.

Dazu bietet es sich an, alle Datensätze aus einer Datenerhebung an einem Ort vorzuhalten. Da Datenbanklösungen hier nicht weiter betrachtet werden, bietet es sich hierfür an, ein entsprechendes Verzeichnis anzulegen. Dieses sollte als Unterordner im Arbeitsverzeichnis angelegt werden12 – hier also: C:\Reporting mit R\data. Vorausgesetzt wird, dass dieses Verzeichnis nur für Personen mit entsprechenden Berechtigungen für den Datenzugriff sicht- und lesbar ist, sodass den gültigen Datenschutzbestimmungen Rechnung getragen wird.

In diesem Ordner sollten alle Dateien, die für den zu erzeugenden Report benötigt werden, abgelegt werden. Um eine manuelle, lokale Variante einer Versionierung – abseits des Einsatzes von SVN oder Git – umzusetzen, bietet es sich an, bereits bei der Ablage der Dateien ein Schema anzuwenden. Bewährt haben sich dabei sprechende Dateibezeichnungen, die mit dem jeweiligen Tagesdatum – geschrieben als Jahr-Monat-Tag (YYYY-MM-DD) – kombiniert werden. Die zum Skript gehördenden Beispieldateien wären demnach wie folgt umzubenennen: Beispieldaten DKF.sav wird zu 2021-05-11 divis-kermit-foerderungen schuljahr 2020-21.sav. Zu beachten ist dabei, dass die Dateiendung beibehalten wird. Dieses Schema ermöglicht, auch bei etwaigen Änderungen am Datenbestand zügig den zum spezifischen Report zugehörigen Datenbestand zu finden.

Bei durchgängiger Anwendung dieses Schemas ermöglicht dies, den entsprechenden Ordner per Code zu “überwachen” und bei jedem Erzeugen eines Reports den dann aktuellen Datenstand zu berücksichtigen. Dazu kann der folgende Code eingesetzt werden (adaptiert nach Shah 15.06.2018):

filelist <- file.info(list.files("C:/Reporting mit R/data", full.names = T))
data_newest <- rownames(filelist)[which.max(filelist$mtime)]

Der Code erzeugt zunächst im Objekt filelist eine Liste aller Dateien im Verzeichnis C:\Reporting mit R\data und weist anschließend – über den Operator <- – dem Objekt data_newest den vollständigen Dateipfad inklusive des Namens des aktuellsten Datensatzes zu. Der Operator <- ist universell einsetzbar und ermöglicht im R Code immer die Zuordnung eines Objektes auf der rechten Seite des Pfeiloperators zu einem Objekt auf der linken Seite des Pfeiloperators – also in Pfeilrichtung.

Eine Erweiterung des Befehls zur Suche nach spezifischen Dateien im Ordner kann über die Angabe einer Zeichenfolge hinter dem Argument pattern13 und die folgende Modifikation vorgenommen werden:

filelist <- file.info(list.files("C:/Reporting mit R/data", full.names = T, pattern = "*divis-kermit-foerderungen schuljahr 2020-21.sav"))
data_newest <- rownames(filelist)[which.max(filelist$mtime)]

Sollten verschiedene Dateien zur Erzeugung eines Reports benötigt werden und im selben Ordner abgelegt sein, kann mit diesem Befehl sichergestellt werden, dass – wie in diesem Beispiel – nur der aktuellste Datensatz aus dem Schuljahr 2020/21 verwendet wird. Gerade, wenn eine zentrale Datenhaltung etabliert ist, stellt dies eine Vereinfachung hinsichtlich der Datenverarbeitung für das Reporting dar.

3.2 Datenstrukturierung

Neben einer Vereinheitlichung der Datenhaltung ist eine Standardisierung von Daten hilfreich für ein effizientes Reporting. Das bedeutet, dass – gerade wenn gleichartige Berichtsformate nicht einmalig, sondern mehrfach benötigt werden – die äußere und innere Struktur der Daten (weitestgehend) unverändert bleiben sollte. Anpassungen an der Datenstruktur lassen sich zwar mit R (teilweise) berücksichtigen, erfordern jedoch in jedem Fall eine Prüfung der Konsistenz.

Insofern sollten für gleichbleibende Objekte in unterschiedlichen Datensätze auch gleichlautende, zeitkonstante Variablenbezeichnungen verwendet werden. Beispielsweise sollte für den Namen einer Schule in allen Datensätzen durchweg die Bezeichnung schulname und nicht SName, Schulname, Schuln oder ähnliches verwendet werden. Besonders wichtig ist dabei, dass R in der Regel zwischen der Groß- und Kleinschreibung unterscheidet. Für R sind Schulname und schulname also unterschiedliche Dinge, selbst wenn die Bezeichnungen für den Lesenden eindeutig sein mögen. Daher ist es ratsam, bei der Generierung neuer Objekte (siehe dazu den Abschnitt Generierung neuer Objekte) eine einheitliche Schreibweise zu verwenden, welche die Groß- und Kleinschreibung als mögliche Fehlerquelle ausschließt. Ratsam ist es durchgängig auf Kleinschreibung zu setzen.

Ebenso ist bei der Arbeit mit Tabellenkalkulationen (beispielsweise EXCEL) zu beachten, dass im Idealfall die Reihenfolge der Spalten sowie deren Bezeichnungen unverändert bleiben. Auch wenn R mit Spaltenbezeichnungen umgehen kann, würde eine simple Umbennung einer Spalte, die fehlerfreie Ausführung eines automatischen Skripts verhindern. Besonders problematisch können in diesem Kontext Verschiebungen von Spalten sein, insofern der R Code nicht auf den Spaltenbezeichnungen, sondern der Position der Spalten basiert. Ist dies der Fall, führen Anpassungen an der Datenstruktur unweigerlich zu Fehlern bei der Ausführung von Codes oder gar zu inhaltlich falschen Berichten.

Eine Einhaltung dieser Regeln ermöglicht, dass im Zuge des Reporting mit R und Markdown Anpassungen in der Programmierung des R Codes auf ein Minimum reduziert oder sogar gänzlich entbehrlich werden, wenn aktualisierte Datensätze für einen neuen Erhebungszeitpunkt vorliegen. Insofern kann hierin eine Grundvoraussetzung für die wiederholte Erstellung von Reports gesehen werden.

References

Shah, Ronak. 15.06.2018. “Find Most Recent File in a Directory (in Windows System) in r [Duplicate].” https://stackoverflow.com/a/50870673.

  1. Einige der unten beschriebenen Herausforderungen stellen sich bei einer Datenhaltung mit Datenbanken oder in einem Data Warehouse nicht, da mit diesen Formen der Datenhaltung bereits eine Strukturierung und Standardisierung von Daten einhergeht. Insofern können diese Formen der Datenhaltung als Weiterentwicklung der im Folgenden beschriebenen Optionen zur Datenhaltung verstanden werden.↩︎

  2. Dies ist in erster Linie eine Empfehlung, die dazu dient, ein strukturiertes Arbeiten zu ermöglichen. R ist technisch in der Lage mit einem beliebigen anderen Pfad umzugehen.↩︎

  3. Aufmerksamen Lesenden fällt das Sternchen * zu Beginn der Zeichenfolge auf, das – wie in der Dateisuche – als Platzhalter für eine Zeichenzahl unbestimmter Länge steht. Ist bekannt, wie und an welcher Stelle in der Zeichenfolge mit Zufallszeichen zu rechnen ist kann auch eine bestimmte Zahl an Fragezeichen ? verwendet im Suchbefehl verwendet werden. Sternchen und Fragezeichen lassen sich ebenso kombinieren.↩︎