Automatisierung im Journalismus: Wenn das Skript Texte schreibt

Teaserbild Automatisierung

Schneller, tiefgehender und persönlicher sollen die Inhalte werden: Automatisierung im Journalismus ist ein ziemlich neues Feld. Und ein ziemlich spannendes.

Es ist eine Horrorvorstellung für viele Arbeitnehmer: Entlassen, weil der eigene Job jetzt von einem Computer gemacht werden kann. Besser und billiger. Zwischen 75 und 375 Millionen Jobs könnte das bis 2030 treffen, hat eine Studie von McKinsey mal geschätzt. Was man dabei aber nicht vergessen darf: Neue Jobs entstehen.

Im Journalismus sind das beispielsweise Berufsbilder im Automation-Bereich (im Deutschen oft unter dem Begriff „Roboterjournalismus“ – als ob da eine Maschine säße und in die Tastatur eintippt…). In den USA gibt es schon einige Newsrooms mit Automation-Editors, auch der BR startet gerade ein Automation und AI-Lab:

Der Inhalt ist nicht verfügbar.
Bitte erlaube Cookies, indem du auf Übernehmen im Banner klickst.

Und tatsächlich steckt sehr viel Potenzial im Bereich Automatisierung und Journalismus. Der US-amerikanische Journalistikforscher Nick Diakopoulos hat 2019 dazu das Buch „Automating the News“ veröffentlicht. Darin beschreibt er anhand vieler Beispiele im Groben vier Bereiche, in denen Automatisierung Journalisten und Medienhäusern helfen kann:

  • Geschwindigkeit: Automatisierung kann Daten in wenigen Sekunden in vordefinierte Text-Templates füllen und veröffentlichen,
  • Qualität: gerade Zahlen können ohne menschliches Zutun mit weniger Fehlern weiterverarbeitet werden – wenn die Input-Daten fehlerfrei sind,
  • Breite: Automatisierung kann mehr Bereiche abdecken, als das menschliche Journalisten leisten können,
  • und Personalisierung: mit Automatisierung können wir die Daten hervorheben, die die Nutzer persönlich betreffen.

(Ich habe mit Diakopolous ein Interview für die SZ geführt / Für das Nieman Lab hat er außerdem einen spannenden Post über das Thema geschrieben)

Die Überschneidung von Automatisierung und Journalismus hat ziemlich viele Facetten: Welche Datenquellen nehmen wir für die Automatisierung? Wie bringen wir den Computerprogrammen journalistische Grundsätze bei? Wie kontrollieren wir die Programme? Und wie machen wir kenntlich, dass nicht ein Mensch, sondern ein Skript einen Text verfasst hat?

Ich konzentriere mich in diesem Blogpost aber vor allem auf meine Erfahrungen aus der Praxis.

Automatisierung bei der SZ

Auch bei der SZ haben bisher vor allem Katharina Brunner und Martina Schories mit dem Thema Automatisierung experimentiert. Vom Datenjournalismus zur Automatisierung ist es auch kein sehr weiter Weg: Beide nutzen Daten, und bei beiden wird programmiert.

Im Projekt „Better Polls“ [hier auf Github] wurden Umfragen auf eine neue Art dargestellt – ohne absolute Werte, mit ihrem Fehlerbereich. So wie es inzwischen Medien auf der ganzen Welt machen: New York Times, FiveThirtyEight oder die BBC.

Screenshot SZ.de: Projekt Better Polls, Liniendiagramm mit aggregierten Umfragen zur Bundestagswahl 2017
Quelle: Screenshot SZ.de

Bei den Bundestagswahlen 2017 und den Landtagswahlen in Bayern 2018 hat die SZ zum ersten Mal auf mit automatisch erstellten Texten gearbeitet. Wobei „automatisch“ nicht heißt, dass davor nicht ziemlich viel Arbeitsaufwand in Entwicklung, Berechnung und Testen gesteckt worden wäre. Für jeden Wahlkreis haben die Datenjournalistinnen damals das Wahlergebnis einzeln, als eigener Artikel über ein Skript ausgespielt und mit vielen Vergleichsgrafiken angereichert.
[Ein Beispiel gibt es hier]

Automatisierung für die US-Wahlen 2020

Und auch jetzt, im Beginn des US-Wahlkampfes 2020 haben wir uns wieder gefragt, wie wir unseren Nutzerinnen und Nutzern aktuelle Grafiken bieten können – ohne die ständig händisch aktualisieren zu müssen.

Für die US-Vorwahlen nutzen amerikanische Medien Umfrage-Aggregatoren. Sie berechnen also aus allen einzelnen Umfragen einen Mittelwert. Der Gedanke dabei: Umfragen sind immer mit Ungenauigkeiten behaftet. Bildet man aus Umfragen aber den Durchschnitt, so gleichen sich die verschiedenen Abweichung nach Oben und Unten im Idealfall wieder aus. Auch wir haben uns daher für eine solche Aggregation entschieden. Wir nutzen dabei die Daten von FiveThirtyEight, das alle Umfrageergebnisse verfügbar macht, und alle amerikanischen Umfrageinstitute nach ihrer Leistung einstuft. Wir können daher nur die besten Instituten auswählen.

Die Berechnung für unseren Mittelwert machen wir (wie so oft) in der Programmiersprache R. Am Ende entstehen zwei Grafiken. Ein Scatterplot mit Liniendiagramm für die nationalen Umfragen über die Zeit hinweg…

Quelle: Screenshot SZ.de

… und eine Tabelle in Datawrapper, die die Umfragen in den Einzelstaaten der kommenden Vorwahlen aggregiert:

Screenshot SZ.de Datawrapper-Tabelle mit Umfragen in US-Einzelstaaten

Die Tabelle befülle ich über das DatawRappr-Package, das ich neulich veröffentlicht habe.

Jeden Morgen um 5.30 Uhr läuft ein Skript auf unserem Server und aktualisiert die Umfragen. So haben wir einen immer aktuellen Überblick über das demokratische Rennen in den USA. [Hier der Link auf den Überblicksartikel zu den Vorwahlen auf SZ.de]

Weiterführende Links zu Automatisierung im Journalismus:

Anmerkung: Ich habe bei den SZ-Beispielen nochmal präzisiert, wer die Projekte umgesetzt hat. War da ein bisschen zu pauschal.

Introducing DatawRappr

Datawrapper ist eines der erfolgreichsten Visualisierungstools für Journalisten. Mit einer neuen Erweiterung können die Daten aus R jetzt auch ohne Umwege in Datawrapper-Grafiken geladen werden.

Nein, dieser Blogpost soll keine Werbung für Datawrapper werden. Und der „Tippfehler“ im Titel ist gar keiner (na, wer hat sich gewundert?). Ich will in diesem Post kurz beschreiben, warum ich eine Bibliothek für die Statistiksoftware R geschrieben habe, die auf die Datawrapper-API zugreift. Und weil viele dieser R-Erweiterungen gerne mit dem Namen der Software spielen (ihr Vorgänger hieß übrigens S), wollte ich dem in nichts nachstehen: DatawRappr.

In vielen meiner Arbeitsstellen wurde Datawrapper eingesetzt. In meinem aktuellen Job visualisieren wir damit alle möglichen Grafiken auf der Homepage, oder erstellen damit schnelle Karten in Breaking-News-Situationen.

Inzwischen tauchen die Grafiken sogar schon in der gedruckten Zeitung auf:

https://twitter.com/Datawrapper/status/1175365864406822912

[/cookie]

In der Regel nutzen wir Datenjournalisten für unsere Auswertungen die Software R. Sie ist frei verfügbar und hat eine riesige Community, die für jeden Anwendungsfall eigene Erweiterungen geschrieben hat. (Vor allem aus der Informatik-Richtung kommt Python, die Sprache kann quasi dasselbe. Manche Leute mögen die eine, andere die andere mehr.)

[Mehr zu R habe ich in einem eigenen Blogpost aufgeschrieben.]

Um die Daten von R in Datawrapper zu bekommen, ist momentan noch ein Umweg nötig:

  • Entweder wir speichern die Ergebnisse für die Grafik als CSV und copy&pasten sie in Datawrapper (oder laden die CSV dort hoch)
  • Oder wir nutzen die Bibliothek clipr, die die Ergebnisse der Berechnungen in die Zwischenablage kopiert:

In einem aktuellen Projekt wollen wir aber automatisiert und regelmäßig Berechnungen durchführen (die Daten verändern sich ständig), und daraus Datawrapper-Grafiken generieren. Wir wollen aber ungern dauernd selbst daran denken müssen, die Grafiken zu aktualisieren. Außerdem müssen wir manchmal nicht nur die Daten, sondern auch die Beschreibungstexte ändern.

Die Datawrapper-API

Zum Glück hat Datawrapper dafür eine Lösung: Die API.

Über diese Schnittstelle können wir auf alle Funktionen zugreifen, die Datawrapper auch über sein Web-Interface anbietet. Gerade wurde die API von Version 1 auf Version 3 geupgradet. (Mehr dazu hat Datawrapper hier gebloggt)

Damit man direkt aus R darauf zugreifen kann, habe ich also die R-Erweiterung geschrieben. Mit ihr kann man zum Beispiel:

Was genau DatawRappr kann – und wie es genau funktioniert, steht in der Dokumentation. Zwar ist die Erweiterung schon in Version 1.0, aber vermutlich wäre 0.9 – also eher eine Beta-Version – angebrachter. Noch ist sie einfach zu wenig getestet, vor allem auf Windowssystemen. Aber: Sie geht! 😉

Infos zu DatawRappr

Der Code von DatawRappr steht auf Github. Es gibt eine eigene Dokumentation dazu.

Installiert wird es ganz einfach in R mit dem Package devtools:

Überstunden-Tracking mit R und IFTTT

Previewbild eines Balken-Diagrams mit meinen Überstunden

Der Europäische Gerichtshof will, dass Arbeitgeber die Arbeitszeit ihrer Mitarbeiter erfassen. Bis das eingeführt wird, behelfe ich mir selbst.

Ein Urteil aus Luxemburg hat die Arbeitgeber ziemlich durchgeschüttelt. Der Europäische Gerichtshof hat entschieden, dass Arbeitgeber die Arbeitszeiten von ihren Angestellten systematisch erfassen müssen. Für die Arbeitgeber das Ende der flexiblen Arbeitszeiten und der Vertrauensarbeitszeit. Für die Angestellten aber wohl die Chance auf mehr Gesundheit. Denn Überstunden machen krank, hat zumindest eine Studie der Unis Halle-Wittenberg und Erlangen-Nürnberg für Angestellte im öffentlichen Dienst herausgefunden.

Nicht nur deshalb, sondern vor allem, weil ich einen Überblick über meine Arbeitszeiten haben wollte, habe ich im Januar begonnen, zu tracken, wann ich meine Arbeit betrete, und wann ich sie verlasse. Das klappt gut, wenn man einen festen Ort hat, den man morgens betritt.

Mein Handy erkennt, wann ich die Arbeit betrete und verlasse

Ich nutze für mein Tracking IFTTT. Das steht für „If This Then That“ – eine Webseite, auf der die Nutzer verschiedene Webanwendungen zusammenbinden können. In meinem Fall benutze ich deren App auf meinem Handy mit einem sogenannten „Geo-Fencing“. Wie der Name andeutet, lege ich einen „umzäunten“ Bereich fest, durch den eine Aktion ausgelöst wird, wenn ich ihn betrete oder verlasse. In meinem Fall schreibt die App dann die Uhrzeit und entered oder exited in ein Google Spreadsheet.

So sieht das Google Spreadsheet mit den Rohdaten aus.

Diese Apps könnte man selbst entwickeln. Bei IFTTT ist die Infrastruktur aber schon vorhanden. Und andere Entwickler haben diese Schnittstellen schon gebaut. Ich konnte sie also ganz einfach wiederverwenden.

So sieht das Applet in IFTTT aus.

Von den Daten zur Auswertung

Die Daten laufen also seit Januar in das Spreadsheet ein. Doch ich wollte ja auch irgendwie davon profitieren, dass ich diese Daten erhebe. Meine Idee: Jeden Freitag bekomme ich eine Übersicht meiner Überstunden für die vergangene Woche per Mail geschickt.

Zunächst habe ich ein Auswertungsskript geschrieben. Dafür nutze ich diese Bibliotheken in R:

In meinem Workflow downloade ich die Daten aus dem Spreadsheet und arbeite dann mit ihnen weiter. Das geht ganz einfach mit einem Spreadsheet, das öffentlich gestellt wurde. Das kann man als CSV herunterladen: https://docs.google.com/spreadsheets/d/[ID zum Spreadsheet]/export?format=csv

In R wandle ich die computer-ungeeignete Datumsangabe in ein Format um, mit dem ich weiterrechnen kann. Außerdem berechne ich Wochentag und Kalenderwoche:

Und dann gibt’s’s auch schon erste Ergebnisse. Ich berechne für jeden Arbeitstag die Differenz zwischen den Soll- und Ist-Stunden. Weil ich 36,5 Stunden in der Woche arbeiten muss, komme ich auf 7,3 Stunden pro Tag (ohne Pausen). Das fasse ich dann nach KWs zusammen:

Das Ergebnis sieht in R so aus:

Die Wochenarbeitszeiten in R

Mit zwei Filterbefehlen kann ich aus diesen Daten schon ein bisschen Text für meine Mail generieren:

berechnet mir, wie viele Überstunden ich in der vergangenen Woche gemacht habe. Mit einem if_else bekomme ich dann eine Aussage, welches Vorzeichen dieser Wert hat – und kann daraus Worte generieren:

Das Ergebnis wird dann zu text_result zusammengebunden und ergibt den veränderbaren Text für meine Mail:

Damit das ganze anschaulicher wird, gebe ich außerdem noch zwei Grafiken aus.

Der E-Mailtext body_text selber ist eigentlich nur ein Zusammenfügen von Bruchstücken in HTML:

Mit der Bibliothek MailR verbinde ich mich dann mit meinem Mailaccount und schicke die Mail ab:

Das Ergebnis sieht dann auf dem Handy so aus:

Screenshot aus der Arbeitszeiten-Mail auf dem Handy

Wie sich das Grundgesetz in 70 Jahren verändert hat

Unsere Verfassung feiert runden Geburtstag – wie stark der Text seit 1949 umgeschrieben wurde, habe ich in einem Projekt recherchiert.

Rund 70 000 Zeichen hatte das Grundgesetz im Jahr 1949. Heute sind es deutlich mehr, denn in insgesamt 63 Änderungen wurde viel gestrichen und vor allem hinzugefügt.

In der SZ haben wir zum Verfassungsjubiläum eine Sonderbeilage gemacht. Darin war auch eine Seite voller Grafiken. Unsere Idee dafür: Können wir zeigen, wie sehr sich das Gesetz von heute und das Gesetz von damals unterscheiden?

Ein CCC-Projekt will das Grundgesetz versionieren

Ein bisschen Glück hatten wir in diesem Fall, denn die Daten waren schon zum großen Teil da. Ein Projekt des chaospott in Essen hat vor einigen Jahren versucht, das Grundgesetz versionierbar zu machen – also jede Änderung im Text nachvollziehbar zu speichern. Ähnlich wie Computercode (aus der Richtung kommen die chaospott-Leute auch).

Für das Projekt haben sie extra die Software DocPatch geschrieben (hier auf Github). Die sorgt dafür, dass aus den einzelnen Dateien, die jede Änderung im Text beschreiben (sogenannte Patches) am Ende wieder ein kompletter Text wird – und sogar in verschiedenen Ausgabeformaten ausgegeben werden kann (zum Beispiel in PDF, Word, Markdown, Plaintext).

Mit dem Versionskontrolltool quilt tracken die Leute vom chaospott jede Änderung, die eine neue Version des Grundgesetzes enthält. Und das kann auf einmal gleich mehrere Artikel betreffen. Sie spielen quasi jede Version einmal durch, damit quilt weiß, was es für eine bestimmte Version verändern muss.

Auf einem Githubrepository werden dann alle Versionen Patches gespeichert, die geben an, was vom ursprünglichen Text verändert werden muss, damit der jeweilige Text rauskommt. Der Vorteil: DocPatch kann ganz einfach auch andere Versionen als die aktuelle ausgeben.

So sieht ein solcher Patch aus:

Die Zeilen mit + und - geben jeweils an, welcher Text hinzugefügt oder entfernt werden soll. Der Ausschnitt bezieht sich auf 013.md – also Artikel 13. md ist der Dateiname für Markdown-Dateien. Die lassen sich sehr einfach in andere Dateiformate umwandeln.

Die Daten waren da – und dann?

Wir hatten also eine gute Datengrundlage für die jeweiligen Versionen des Grundgesetzes – aber wie konnten wir zwei Versionen vergleichen? Dafür habe ich die Software wdiff genutzt.

Anders als die Patches, die versuchen, möglichst große Bereiche zu finden, die sich unterscheiden, vergleicht wdiff auf einer Wort-zu-Wort-Basis. Ist ein Wort, oder nur ein Buchstabe anders, wird die Änderung ausgegeben. Der Vorteil: wdiff gibt den kompletten Text aus, markiert aber, was eingefügt und was gelöscht wurde. Hier am Beispiel einer kleinen Änderung in Artikel 1 Abs. 3:

In R mussten wir also nur noch für jeden Artikel die Zeichen zwischen [--] und {++} zählen – und kamen so auf die Gesetzesteile, die verändert wurden.

Der R-Code für diese Zählung sieht kompliziert aus. Aber hauptsächlich, weil man mit sogenanntem RegEx (Regular Expressions) die Texte zwischen den Klammern extrahieren muss. nchar() berechnet die Zahl der einzelnen Zeichen. Und aus denen kann man hinterher ganz einfach einen Anteil berechnen.

Das klingt eigentlich ganz einfach. Trotzdem hat das Projekt mehrere Wochen gedauert. Denn zuerst wollte ich jeweils den kompletten Grundgesetztext vergleichen. Das hat überhaupt nicht funktioniert, weil wdiff immer ein Problem damit hatte, wenn neue Artikel eingefügt wurden (also alles mit Kleinbuchstaben: 16a, etc.). Die Lösung war relativ einfach: Immer nur einzelne Artikel vergleichen. In quilt lassen sich diese neuen Artikel auch anlegen, sie werden aber bei der Ausgabe von früheren Versionen des Grundgesetzes nicht mit angezeigt, wenn sie damals noch nicht drinstanden. Ziemlich cooles Tool.

Das Ergebnis fand in der Zeitung auf einer Grafikseite statt – und kann sich sehen lassen, finde ich:

Durchs Internet surfen – mit einem Skript in R

Im Internet stehen so viele Informationen. Ein Paradies für Datenjournalisten, die große Mengen an Informationen automatisiert abfragen wollen. Manchmal ist es einfach, an sie heranzukommen, manchmal etwas schwieriger. Denn manche Webseiten laden ihre Daten nicht in den Quellcode – dort, wo die einfachen Lösungen zum sogenannten Webscraping (über Scraping mit Python habe ich schon mal gebloggt) ansetzen. Doch mit ein bisschen Aufwand, können Datenjournalisten auch Seiten abfragen, die ihre Inhalte nachladen oder über Skripte generieren. Der einfachste Anwendungsfall ist aber: Der Weiter-Button.

Neulich hatte ich einen Fall, in dem ich knapp 1500 Daten von Abgeordneten abrufen wollte. Sie waren über eine Suche zugänglich, wurden allerdings nur in Hunderterschritten angezeigt. Ich habe ein Skript geschrieben, dass die Suche startet, jede Seite aufruft, die Informationen speichert und nach allen Abgeordneten auf einer Seite den Weiter-Button drückt. Später kann ich dann jede einzelne Abgeordnetenseite herunterladen.

Zum Glück gibt es „Selenium“. Das ist ein Framework, das ursprünglich dafür entwickelte wurde, um Tests in Browsern zu automatisieren. Um also schnell testen zu können, ob Softwareupdates irgendein Problem für die Nutzer erzeugen. Selenium ahmt dafür das Verhalten eines Nutzers im Webbrowser nach. Es kann Felder ausfüllen, Buttons anwählen oder einen Mausklick simulieren.

Eigentlich basiert Selenium auf HTML und Javascript, für R gibt es aber (wie so oft, zum Glück) ein Package, das die Funktionen anbietet: RSelenium. Für die Extraktion der Informationen benutze ich rvest, eine weitere R-Bibliothek, die HTML-Code in R durchsuchbar macht.

RSelenium im Einsatz

RSelenium hat zwar eine gute Dokumentation, ich musste trotzdem viel rumprobieren, weswegen ich hier mal meine Vorgehensweise dokumentiere. Um rechtlich nicht angreifbar zu sein, habe ich den Namen der URL gelöscht.

Zunächst laden wir die beteiligten Bibliotheken. rvest und RSelenium erwähnte ich bereits, tidyverse ist eine Sammlung von mehreren R-Packages, die für die Arbeit mit Dataframes (also einer Tabelle) in R benutzt werden.

RSelenium startet auf einem lokalen Server und lädt dann ein neues Fenster in R. Darin wird ein Browser geöffnet, über den ich nachvollziehen kann was meine Befehle in R bewirken. remDr ist quasi der Browser, den ich steuere. Zum Beispiel lasse ich ihn einen Link öffnen – auf die erste Seite mit den Ergebnissen:

Insgesamt habe ich 14 Ergebnisseiten. Die habe ich händisch abgezählt für den Loop. Alternativ hätte ich auch eine Funktion schreiben können, die erkennt, wenn es keinen Weiter-Button mehr gibt.

14 Mal wiederholt R also den folgenden Vorgang: Es ruft eine Ergebnisseite auf, speichert dann den Link zur Detailseite jedes Abgeordneten, und klickt am Ende der Seite auf den Weiter-Button, den ich hier über seinen sogenannten X-Path finde. Dafür suche ich das Element auf der Seite, das den Text „nächste Treffer“ enthält. Und das ist nur der Weiter-Button.

Wir sind immer noch im Loop. Ich schreibe auf jeder Seite die Datenin Vektoren. Die Standardherangehensweise beim Webscraping ist allerdings: Detailseite öffnen und dann downloaden. Die Details kann ich dann auf meinem lokalen Rechner extrahieren, ohne unnötigen zusätzlichen Webtraffic bei der Seite zu erzeugen. Das werde ich auch hier tun. Ich sammle ja gerade die Links zu jeder Detailseite. Allerdings auch Namen und eine Information zu den Legislaturperioden der einzelnen Abgeordneten.

5 Sekunden lasse ich das Skript hier am Ende ruhen, damit ich nicht zu viel Last auf dem Server erzeuge. Das ist allerdings schon eine sehr lange Zeitspanne.

Während das Skript läuft, kann ich weiterarbeiten. Die R-Bibliothek BeepR spielt einen Sound ab, wenn alle Dateien heruntergeladen wurden. Dann verbinde ich die einzelnen Vektoren zu einem Dataframe in R, mit dem ich dann fortfahren kann. In meinem Fall loope ich jetzt über die einzelnen Links und lade die Dateien herunter. Das hätte ich aber natürlich auch schon im Schritt oben machen können. Ich habe mich aber dagegen entschieden, weil ich erstmal alle Links bekommen wollte, und mit denen dann weiterarbeiten kann.

Am Ende stoppe ich den Seleniumbrowser, der lokal auf meinem Rechner lief.

Fertig.

Shiny statt Javascript

R-ShinyApp Titelbild

Mit Javascript wird das Internet interaktiv. Das kann auch bei Datenanalysen wichtig sein. Mit „Shiny“ klappt sowas auch in R – ganz ohne Javascriptkenntnisse.

Mehr lesen

Werkstatt: Zu Fuß durch den Münchner Innenraum

Mit Kartendaten lassen sich tolle Analysen und Anwendungen bauen. Ich bin ein großer Verfechter der Open Street Map (merkt man kaum in diesem Blog). Mit deren Hilfe habe ich auch eine etwas andere Innenraumkarte für die Münchner öffentlichen Verkehrsmittel gebaut.

Mehr lesen

Wie ich R gelernt habe

Inzwischen professionalisiert sich der Datenjournalismus. Es gibt immer noch Kollegen, die es schaffen, mit Excel Auswertungen zu machen. Das geht. Aber es geht auch anders. Mit R zum Beispiel.

Mehr lesen

Werkstatt: Wie voll sind die Münchner Bibliotheken?

Screenshot ub.uni-muenchen.de

Studenten in München haben es nicht leicht. Die Mietpreise sind der Wahnsinn, es gab großen Stress um das relativ teuere Semesterticket – und dann sind die Bibliotheken noch so voll. Das war zumindest der Anlass, weshalb die Universitätsbibliothek der LMU Ende 2016 ein neues Tool gestartet hat: Den Platzfinder. Zusammen mit einer Parkscheibe, die Studierende bekommen, wenn sie die Bibliothek betreten, ermitteln die Bibliotheksmitarbeiter, wie voll ihre Bibliothek gerade ist – und tragen das in ein Onlineformular ein (Was natürlich auch sehr fehlerbehaftet ist – aber die Daten sind das Beste, was wir haben).

Auf der Webseite der Uni-Bibliothek können Studierende dann checken, wie voll ihre „Lieblingsbib“ ist.

Für M94.5 wollte ich herausfinden, welche Bib am vollsten ist – und wie sich das im Tagesverlauf verändert.

Die Seite der LMU gibt SVGs mit Prozentwerten für die Füllung aus, die in den Balkendiagrammen angezeigt werden. Mit Python und der Bibliothek BeautifulSoup konnte ich also easy die Daten auslesen und in ein CSV speichern:

Damit das Ganze alle 15 Minuten laufen kann – in den Zeiten, in denen die Bibliotheken geöffnet haben –  habe ich zu einem Trick gegriffen. Das Pythonskript lag auf meinem Webspace, der Python vorinstalliert hat. Daneben lag ein einfaches Shell-Startskript für das Python. Dieses Skript rufe ich über über einen Cronjob auf. In meinem Fall habe ich Cronjob.de benutzt (ein Skript ist kostenlos, weitere kosten ab 99 Cent pro Monat) – es gibt Alternativen.

Dann hieß es: Warten. 1,5 Monate lang etwa. Das CSV füllte sich immer weiter, ohne, dass ich irgendwas tun musste.

Dann hieß es: Auswerten. Dafür habe ich das CSV gedownloaded und in R eingelesen.

Schon beim ersten Rumspielen hat sich gezeigt: Weihnachten ist ne blöde Zeit für den Datensatz. Im Vergleich zu den anderen Zeiten lag die Belegungsquote ziemlich weit unten. Das hieß für mich: Weihnachten raus.

Dann folgten die einzelnen Analysen. Zunächst wollte ich wissen (und natürlich auch plotten), wie groß der Unterschied zwischen Wochentag und Wochenende in den Bibliotheken ist.

Dann wollte ich wissen, wie die unterschiedlichen Wochentage sich einzeln unterscheiden. Das könnte man in ggplot mit Facets lösen. Ich wollte das ganze aber in einem Plot. Das hieß: Rumspielen.

Und dann das Highlight. Ich dachte mir, ein bisschen Bewegung schadet nicht. Deswegen wollte ich ein GIF erstellen, dass für jede Stunde des Tages für jede Bibliothek die Durchschnittsbelegung angibt. Das Skript sollte mir die einzelnen Stunden automatisch ausgeben, damit ich daraus nur noch ein GIF bauen muss. (Das würde auch direkt in R gehen, mit diesem Package)

Ich habe meinen w-Dataframe nochmal kopiert, weil ich die Rohdaten-NAs durch 0 ersetzt habe. Das wollte ich mir im Original-Datensatz nicht zerschießen.

Fertig.

Das Ergebnis gibt es hier.

Durch die weitere Nutzung der Seite stimmst Du der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen