Fallstudie 5: Das Newsvendor-Modell in der Praxis

SushiFresh-Übungen und tägliche Produktionsplanung einer französischen Bäckerei

Autor:in

Supply Chain Management – Gruppenarbeit

HinweisSteckbrief
Thema Einperiodige Bestandsplanung bei unsicherer Nachfrage für verderbliche Ware
Vorlesungsbezug Block 3 „Unsicherheits- und Risikomanagement in Supply Chains“: Newsvendor-Modell
Teil 1 Klausurvorbereitung: Aufgaben mit Stift und Papier zu einer neuen SushiFresh-Entscheidungssituation (25–30 Min.)
Teil 2 Datenbasierte Fallstudie mit realen Kassendaten einer französischen Bäckerei (Kaggle)
Gruppengröße 3–6 Personen (Teil 2)
Ergebnis Präsentation (20 Min.) + Diskussion (10 Min.), Foliensatz (PDF) und reproduzierbarer R-/Quarto-Code

1 Lernziele

Nach Bearbeitung der Übungen und der Fallstudie können Sie

  • Unter- und Überbestandskosten bestimmen und das kritische Verhältnis berechnen,
  • die optimale Menge für eine diskrete, eine normalverteilte und eine empirische Nachfrage bestimmen,
  • verschiedene Planungsregeln in einem Backtest vergleichen und
  • das Problem zensierter Nachfrage sowie den Zielkonflikt zwischen Gewinn und Lebensmittelabfall erkennen.

2 Teil 1 – Klausurvorbereitung: Poke-Bowls im Stadion und auf dem Weihnachtsmarkt

HinweisHinweise

Bearbeitungszeit ca. 25 Minuten · Hilfsmittel: nicht programmierbarer Taschenrechner · 25 Punkte

Situation A – Heimspiel. SushiFresh betreibt beim nächsten Heimspiel des SV Waldhof Mannheim einen Stand mit Poke-Bowls. Die Bowls müssen am Morgen vollständig vorbereitet werden. Verkaufspreis 12 €/Bowl, Herstellkosten 5 €/Bowl. Nicht verkaufte Bowls gibt SushiFresh am Abend für 1 €/Bowl an eine Tafel-Initiative ab (Restwert). Aus früheren Spielen schätzt SushiFresh:

Nachfrage [Bowls] 400 500 600 700
Wahrscheinlichkeit 0,1 0,3 0,4 0,2

Aufgabe 1 (5 Punkte). Bestimmen Sie die Unter- und Überbestandskosten, das kritische Verhältnis und die optimale Produktionsmenge.

\(c^u = 12 - 5 = 7\) €, \(c^o = 5 - 1 = 4\) €, also \(CR = \dfrac{7}{7 + 4} = 0{,}636\).

Verteilungsfunktion: \(F(400) = 0{,}1\); \(F(500) = 0{,}4\); \(F(600) = 0{,}8\); \(F(700) = 1{,}0\). Die kleinste Menge mit \(F(q) \geq 0{,}636\) ist $q^* = $ 600 Bowls.

Bewertung: 3 Punkte für \(c^u\), \(c^o\), CR, 2 Punkte für \(q^*\).

Aufgabe 2 (8 Punkte). Berechnen Sie den erwarteten Gewinn für die Mengen 500, 600 und 700. Bestätigt die Rechnung Ihr Ergebnis aus Aufgabe 1?

Gewinn \(= 12 \cdot \min(q, D) + 1 \cdot \max(q - D, 0) - 5 q\):

\(q\) \ \(D\) 400 (0,1) 500 (0,3) 600 (0,4) 700 (0,2) Erwartungswert
500 2.400 3.500 3.500 3.500 3.390 €
600 2.000 3.100 4.200 4.200 3.650 €
700 1.600 2.700 3.800 4.900 3.470 €

Der erwartete Gewinn ist bei 600 am höchsten. Das bestätigt das kritische Verhältnis.

Bewertung: 2 Punkte je Zeile, 2 Punkte Vergleich.

Situation B – Weihnachtsmarkt. Auf dem Heidelberger Weihnachtsmarkt ist die Tagesnachfrage normalverteilt mit \(\mu = 300\) und \(\sigma = 60\) Bowls. Verkaufspreis 8 €, Herstellkosten 3 €. Restware muss entsorgt werden (Restwert 0 €).

\(\Phi^{-1}(x)\)
\(x\) 0,600 0,625 0,650 0,700 0,750 0,800 0,833 0,900 0,950
\(z\) 0,253 0,319 0,385 0,524 0,674 0,842 0,967 1,282 1,645

Aufgabe 3 (6 Punkte). Bestimmen Sie die optimale Menge und den zugehörigen α-Servicegrad.

\(c^u = 8 - 3 = 5\) €, \(c^o = 3 - 0 = 3\) €, also \(CR = 5/8 = 0{,}625\) und \(z = 0{,}319\).

\(q^* = 300 + 0{,}319 \cdot 60 \approx\) 319 Bowls. Der α-Servicegrad entspricht dem kritischen Verhältnis: 62,5 % der Tage ohne Ausverkauf.

Bewertung: 4 Punkte Rechnung, 2 Punkte Servicegrad.

Aufgabe 4 (6 Punkte). Eine App gegen Lebensmittelverschwendung kauft Restware für 2 €/Bowl.

  1. Wie ändert sich die optimale Menge?

  2. Führt die App zu mehr oder zu weniger Lebensmittelabfall? Begründen Sie mit Ihrem Ergebnis.

  1. \(c^o = 3 - 2 = 1\) €, also \(CR = 5/6 = 0{,}833\), \(z = 0{,}967\) und \(q^* = 300 + 0{,}967 \cdot 60 \approx\) 358 Bowls.

  2. Weil Überbestand billiger wird, produziert SushiFresh mehr; die erwartete Restmenge steigt (von rund 35 auf rund 63 Bowls). Ob mehr Lebensmittel weggeworfen werden, hängt davon ab, ob die App-Kunden die Restware tatsächlich essen. Der Restwert verringert zwar die Verschwendung je Bowl, setzt aber einen Anreiz zur Überproduktion („Rebound-Effekt“).

Bewertung: a) 3 Punkte, b) 3 Punkte.

3 Teil 2 – Fallstudie: Eine französische Bäckerei

3.1 Ausgangslage

Eine familiengeführte Bäckerei in Frankreich backt jeden Morgen Baguettes, Croissants, Pains au chocolat und weitere Backwaren. Was abends übrig bleibt, kann nicht mehr regulär verkauft werden; es wird gespendet, als Tierfutter abgegeben oder günstig über eine App angeboten. Ist die Ware früh ausverkauft, gehen Umsätze verloren.

Die Backmengen legt die Inhaberin bisher nach Erfahrung fest, meist als feste Menge je Wochentag. Sie möchte wissen, ob eine datenbasierte Planung den Gewinn steigern und gleichzeitig den Abfall senken kann.

3.2 Daten

French bakery daily sales (Kaggle): https://www.kaggle.com/datasets/matthieugimbert/french-bakery-daily-sales

Die Datei Bakery sales.csv enthält rund 234.000 Kassenpositionen vom 01.01.2021 bis 30.09.2022:

Spalte Bedeutung
date, time Datum und Uhrzeit des Verkaufs
ticket_number Bonnummer
article Artikelbezeichnung (z. B. TRADITIONAL BAGUETTE, CROISSANT)
Quantity Menge (auch negative Werte, d. h. Stornos)
unit_price Stückpreis als Text, z. B. "1,20 €"
WichtigHinweise zur Datenaufbereitung
  • Bereinigen Sie unit_price (Dezimalkomma, Währungszeichen).
  • Tage, an denen die Bäckerei geschlossen ist, sind keine Nachfrage von 0.
  • Die Preise steigen 2022 (Inflation). Verwenden Sie den jeweils gültigen Preis.

3.3 Kostenannahmen

Artikel Variable Kosten 2021 [€/Stück] Variable Kosten 2022 [€/Stück] Restwert [€/Stück]
TRADITIONAL BAGUETTE 0,40 0,48 0,10 (Paniermehl, Tierfutter)
CROISSANT 0,38 0,45 0,30 (Verkauf über App zum Abend)

3.4 Aufgaben

3.4.1 Teil A – Von Kassenbons zur Nachfragezeitreihe

A1. Erzeugen Sie für die beiden Artikel der Kostentabelle eine tägliche Absatzzeitreihe und dokumentieren Sie die Bereinigungsschritte. Analysieren Sie Wochentagseffekte und prüfen Sie die Verteilung der Tagesnachfrage (Histogramm). Ist eine Segmentierung nach Wochentag sinnvoll?

3.4.2 Teil B – Newsvendor-Modell

B1. Bestimmen Sie für die TRADITIONAL BAGUETTE mit den Daten von 2021 \(c^u\), \(c^o\) und das kritische Verhältnis. Berechnen Sie die optimale Backmenge je Wochentag (a) unter Normalverteilungsannahme und (b) als empirisches Quantil.

B2. Wiederholen Sie die Rechnung für das Croissant. Warum unterscheidet sich der optimale Servicegrad so stark von dem der Baguette?

3.4.3 Teil C – Backtest

C1. Kalibrieren Sie zwei Planungsregeln mit den Daten von 2021 und testen Sie sie auf Januar bis September 2022:

  1. Erfahrungsregel: feste Menge je Wochentag = Mittelwert 2021 + 10 %,
  2. Newsvendor empirisch je Wochentag (B1b).

Vergleichen Sie realisierten Gewinn, Abfallmenge und den Anteil der Tage ohne Ausverkauf.

3.4.4 Teil D – Empfehlung und Reflexion

D1. Formulieren Sie eine praxistaugliche Empfehlung für die Inhaberin, z. B. als Tabelle »Backmenge je Wochentag«.

D2. Reflexion. Beantworten Sie in der Präsentation:

  1. Die Kassendaten zeigen Verkäufe, nicht Nachfrage. Wie erkennen Sie Ausverkaufstage (z. B. an der Uhrzeit des letzten Verkaufs), und in welche Richtung verzerrt das Ihr \(q^*\)?
  2. Welches Wissen steckt in der »Erfahrung« der Inhaberin, das das Modell nicht kennt?
  3. Gewinn oder weniger Lebensmittelabfall: Wie sollte die Bäckerei diesen Zielkonflikt entscheiden?

4 Anhang: R-Startercode

Code
library(tidyverse)
source("../R/scm_functions.R")   # newsvendor_normal()

raw <- read_csv("Bakery sales.csv")

bakery <- raw |>
  mutate(
    date       = as.Date(date),
    unit_price = parse_number(unit_price, locale = locale(decimal_mark = ",")),
    article    = str_trim(article)
  )

tagesabsatz <- bakery |>
  filter(article %in% c("TRADITIONAL BAGUETTE", "CROISSANT")) |>
  group_by(date, article) |>
  summarise(menge = sum(Quantity), preis = median(unit_price), .groups = "drop") |>
  mutate(wochentag = lubridate::wday(date, label = TRUE, week_start = 1),
         jahr      = lubridate::year(date))

# Beispiel: Newsvendor für die Baguette 2021 (alle Tage)
b21 <- tagesabsatz |> filter(article == "TRADITIONAL BAGUETTE", jahr == 2021)
newsvendor_normal(mu = mean(b21$menge), sigma = sd(b21$menge),
                  p = median(b21$preis), c = 0.40, s = 0.10)

# Empirisches Quantil je Wochentag
CR <- (median(b21$preis) - 0.40) / (median(b21$preis) - 0.10)
b21 |> group_by(wochentag) |> summarise(q_emp = quantile(menge, CR, type = 1))

# Realisierter Gewinn einer Menge q bei Nachfrage D
gewinn <- function(q, D, p, c, s) p * pmin(q, D) + s * pmax(q - D, 0) - c * q