Mensa-Datensätze analysieren

Wie manche von euch vielleicht wissen, sind die Gerichte der Mensa als CSV für jede Kalenderwoche beim Studentenwerk (https://stwno.de) verfügbar. Für diese Woche (Kalenderwoche 25) heißt die URL zum Beispiel https://www.stwno.de/infomax/daten-extern/csv/UNI-R/25.csv Die nächste Kalenderwoche ist zwar schon verfügbar, aber noch mit den Daten vom letzten Jahr. Diese Mensa-Datensätze wollen wir nun analysieren.

Unser Ziel ist es, eine große Datenbank aufzubauen und die Gerichte über mehrere Jahre hinweg zu sammeln. Der aktuelle Datensatz befindet sich hier. Ein Ausschnitt davon sieht wie folgt aus:

datumtagnamestudbedgast
2019-06-28FrSalat Buffet (1,3,6,9,16,C,G,J,L)3.03.54.2
2019-06-28FrSalatmix (3)Salat RioG (3,16)ZucchinisalatG (3,16)Creme Fraiche Kräuterdressing (16,G,I)Balsamico DressingG (1,3,16,I)0.91.11.6
2019-06-28FrMilchreis- Lasagne mit Mango-Orangensauce (1,3,A,AA,C,G)2.02.83.6

Es gibt eine Spalte für das Datum, eine für den Namen des Gerichts und jeweils die verschiedenen Preise für Studenten, Angestellte und Gäste.

Zeit für ein paar Plots! Zuerst laden wir den Datensatz. Mit Python geht das ganz einfach, zum Beispiel so:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("dataset.csv")
df.datum = df.datum.astype("datetime64[ns]")
date_index = pd.DatetimeIndex(df.datum)

Eins meiner Leibgerichte sind Pommes. Also sehen wir uns doch mal an, wie oft es Pommes im letzten Jahr gab.

is_dish = df.name.str.lower().str.contains("pommes")
for d in ["fries", "twister", "waffelkartoffel"]:
    is_dish = is_dish | df.name.str.lower().str.contains(d)
months = pd.DatetimeIndex(df.datum.apply(lambda d: pd.Timestamp(f"{d.year}-{d.month}")).unique())
counts = [is_dish[(date_index.month == ts.month) & (date_index.year == ts.year)].sum() for ts in months]
plt.plot(months, counts)
Mensa-Datensätze analysieren: Graph der Häufigkeit von Pommes, Twister- und Waffle-Fries in der Mensa, Zeitraum ein Jahr.
Wann gab es Pommes das letzte Jahr?

Oder wie wäre es mit dem durchschnittlichen Preis pro Monat für ein Hauptgericht? (ohne Nachspeise)

main_dishes = df.warengruppe.str.startswith("HG")
months = pd.DatetimeIndex(df.datum.apply(lambda d: pd.Timestamp(f"{d.year}-{d.month}")).unique())
mean_price = [df[main_dishes & (date_index.month == ts.month) & (date_index.year == ts.year)].stud.mean() for ts in months]
plt.plot(months, mean_price)
Mensa-Datensätze analysieren: Graph des durchschnittlichen Preises der Hauptspeiden für Studenten. Zeitspann ein Jahr, Preise pro Monat.

Das waren ein paar wirklich grundlegende Diagramme, hier noch ein paar Ideen, was man sich anschauen könnte:

  • Wie oft wiederholen sich die Gerichte? (Monatlich oder wöchentlich?)
  • Ist die Wahrscheinlichkeit, ein bestimmtes Gericht zu bekommen an manchen Tagen höher als an anderen? (Gibt es zum Beispiel Pommes öfter an einem Montag als an einem Donnerstag?)
  • Wie groß ist der Anteil an Fisch? (Wie groß ist der Anteil an Fleisch?)
  • Welche Gerichte treten oft gemeinsam auf?
  • Und die große Frage: Kann man eventuell sogar Vorhersagen machen?

Der gesamte Code für den Datensatz zum Analysieren der Mensa-Datensätze und weitere Plots ist auf GitHub verfügbar.

Zuletzt bearbeitet am