Mensa-Datensätze analysieren

Wie manche 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 vom letzten Jahr.

Unser Ziel ist es, eine große Datenbank aufzubauen und die Gerichte über mehrere Jahre hinweg zu sammeln. Der aktuelle Datensatz befindet sich hier. Hier ist ein Ausschnitt:

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, für den Namen des Gerichts und 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 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)
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?

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)
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?
  • Ist die Wahrscheinlichkeit, ein bestimmtes Gericht zu bekommen an manchen Tagen höher als an anderen?
  • Wie groß ist der Anteil an Fisch?
  • Welche Gerichte treten oft gemeinsam auf?
  • Und die große Frage: Kann man eventuell sogar Vorhersagen machen?

Der gesamte Code für den Datensatz und weitere Plots ist auf GitHub verfügbar.

Zuletzt bearbeitet am