| Kriterium | Gewicht | ausgezeichnet (4) | gut (3) | akzeptabel (2) | verbesserungswürdig (1) | inakzeptabel (0) |
|---|---|---|---|---|---|---|
| Korrektheit & Funktionalität (contribution, break_even_qty, profit, evaluate) | 30% | Alle Kernfunktionen korrekt (inkl. Randfälle); evaluate liefert korrekte Statuslogik (invalid/ok/below_be) und bestimmt best_scenario korrekt. | Weitgehend korrekt; kleine Ungenauigkeiten/Randfälle; best_scenario und Status meist korrekt. | Grundfunktionalität vorhanden, aber mehrere Fehler (z. B. falsche Status in Randfällen) oder Teile unvollständig. | Läuft nur teilweise; falsche Kennzahlen/Status; wesentliche Randfälle ignoriert. | Nicht funktionsfähig oder fehlt. |
| Schnittstellen, Kommentare & Kontrollstrukturen | 20% | Sprechende Parameter & klare Rückgaben; saubere if/else- und Schleifen-Struktur; sehr gut kommentiert; konsistenter, lesbarer Stil. | Korrekte Struktur und Kommentare mit kleineren Redundanzen/Uneinheitlichkeiten. | Nachvollziehbar, aber uneinheitliche Schnittstellen/Benennungen oder knappe Kommentare. | Unstrukturierter Code, wenig/keine Kommentare; schwer lesbar. | Logik nicht nachvollziehbar; Struktur fehlt. |
| Validierungen & Fehlerbehandlung (scenario_check) | 20% | Umfassende Plausibilitätsprüfungen (Typen, Wertebereiche, Relationen) mit klaren Fehlermeldungen/Begründungen; keine stillen Fehler. | Die meisten relevanten Prüfungen vorhanden; einzelne Lücken oder wenig präzise Meldungen. | Basale Prüfungen (z. B. Nichtnegativität) vorhanden, aber wichtige Checks fehlen. | Fehlerbehandlung nur ansatzweise; unklare/fehlende Meldungen. | Keine Validierungen; Funktion bricht bei Fehlern ab. |
| Auswertung & Ergebnisdarstellung (evaluate) | 20% | Vollständige, klare Ergebnisstruktur (results_df, table_status, best_scenario) und kurze, nachvollziehbare Interpretation/Begründung der Entscheidung. | Ergebnisse überwiegend korrekt; kleine Unschärfen in Struktur oder Begründung. | Ergebnisse prinzipiell vorhanden, aber unvollständig/teils unklar (z. B. fehlende Tabelle oder unpräzise Interpretation). | Ausgabe unsystematisch; zentrale Elemente fehlen; Interpretation nicht nachvollziehbar. | Keine verwertbare Auswertung. |
| Reproduzierbarkeit (set.seed, sessionInfo) | 10% | Seed gesetzt, sessionInfo im Report; Ausführung reproduzierbar (keine absoluten, personenabhängigen Pfade). | Seed oder sessionInfo vorhanden; geringe Reibungen (z. B. Pfad-Hinweis). | Seed/Sessioninfo teils unklar oder nicht konsequent; Ergebnis ist mit Aufwand reproduzierbar. | Keine klare Reproduzierbarkeit; Seed/Sessioninfo fehlen. | Nicht reproduzierbar. |
| BONUS: price_suggestion (optional) | 0% (+1 Punkt) | Funktion vorhanden, läuft korrekt und nachvollziehbar; einfache, begründete Logik (z. B. schrittweise Suche); Grenzen/Annahmen benannt. | Funktion vorhanden und funktionsfähig; Logik im Wesentlichen plausibel, kleinere Schwächen. | Ansatz vorhanden, aber nur teilweise funktionsfähig oder ohne Begründung. | Rudimentärer, nicht belastbarer Ansatz; kaum nachvollziehbar. | Nicht vorhanden. |
Hausarbeit 1
Programmierung für Data Science
Aufgabe: Break-even & Preisgestaltung (10 Punkte)
Ziel
Sie entwickeln ein kleines R-Toolkit zur Beantwortung grundlegender betriebswirtschaftlicher Fragen: Wie hoch ist der Deckungsbeitrag, ab welcher Menge erreichen wir den Break-even, wie verändert sich der Gewinn unter einfachen Szenarien?
Teil 1 (vorgegeben): Generator
Verwenden Sie ausschließlich die folgende Funktion make_scenarios(seed), um die Eingabedaten zu erzeugen (nicht verändern):
make_scenarios <- function(seed) {
set.seed(seed)
n <- 8L # Anzahl Szenarien (fix)
# Zufallswerte (Basis-R), alles bewusst einfach gehalten:
price <- round(runif(n, min = 8, max = 20), 2)
var_cost <- round(runif(n, min = 3, max = 12), 2)
fix_cost <- round(runif(n, min = 5000, max = 20000), 0)
qty <- round(runif(n, min = 0, max = 5000), 0)
df <- data.frame(
scenario_id = 1:n,
price = price,
var_cost = var_cost,
fix_cost = fix_cost,
qty = qty,
stringsAsFactors = FALSE
)
return(df)
}Ihre Aufgabe beginnt ab Teil 2.
Teil 2: Kernfunktionen
Schreiben Sie ohne externe Pakete folgende Funktionen (mit sprechenden Parametern, Kommentaren und Fehlerbehandlung):
contribution(price, var_cost)- Rückgabe: Deckungsbeitrag je Einheit (numeric).
- Plausibilitätsprüfungen (z. B. numerisch, nicht negativ etc.).
- Rückgabe: Deckungsbeitrag je Einheit (numeric).
break_even_qty(price, var_cost, fix_cost)- Rückgabe: notwendige Stückzahl für Break-even (auf ganze Einheiten aufrunden).
- Falls
price <= var_cost: sinnvoll begründete Rückgabe (z. B.Inf).
- Rückgabe: notwendige Stückzahl für Break-even (auf ganze Einheiten aufrunden).
profit(price, var_cost, fix_cost, qty)- Rückgabe: Gewinn als numeric.
- Plausibilitätsprüfungen der Eingaben.
- Rückgabe: Gewinn als numeric.
scenario_check(price, var_cost, fix_cost, qty)- Rückgabe: Liste mit mindestens
is_valid(TRUE/FALSE) und
reason(Character, kurze Begründung im Fehlerfall).
- Beispielregeln:
price > 0,var_cost >= 0,fix_cost >= 0,qty >= 0,price > var_cost.
- Rückgabe: Liste mit mindestens
Teil 3: Auswertung über alle Szenarien
Implementieren Sie evaluate(df), die für jede Zeile von df (aus make_scenarios, vgl. Listing 1) berechnet:
- Deckungsbeitrag, Break-even-Menge, Gewinn, Status:
"invalid"(wennscenario_checkFALSE),
"ok"(wennqty >= break_even_qty),
"below_be"(sonst).
- Rückgabe: Liste mit
results_df(Originalspalten + berechnete Spalten),
table_status(Anzahl je Status),
best_scenario(Index der Zeile mit höchstem Gewinn unterstatus != "invalid"; bei Ties: kleinstescenario_id).
Verwenden Sie Basis-R (z. B. Schleifen oder apply-Varianten). Kein Tidyverse.
Zusätzliche Funktionalität (optional): Einfache Preisvorschlagsfunktion
price_suggestion(var_cost, fix_cost, target_margin, start_qty)
- Zweck: Mindestpreis vorschlagen, damit bei Zielmarge (z. B. 20 %) und Startmenge (z. B. 1000) ein Break-even plausibel erscheint.
- Sie dürfen eine einfach gehaltene Vorgehensweise nutzen (z. B. schrittweise Anhebung des Preises per Schleife).
Teil 4: Dokumentierter Ablauf
Schreiben Sie run_be(seed), die
df <- make_scenarios(seed)erzeugt,
res <- evaluate(df)ausführt,
- und dann ausgibt:
res$table_status, den Indexres$best_scenariosowie die wichtigsten Kennzahlen dieser Zeile.
Abgabe
Abgabe folgender Resultate über Teams bis zum 26.10.2025, 23:59 Uhr:
- R-Skript:
be_toolkit.R(alle Funktionen aus Teil 2–4; gut kommentiert).
- Kurz-Screencast (≤ 5 Min): Link zum Video mit Kurzerklärung der Funktionen aus Teil 2-4 und Live-Aufruf
run_be(seed=<Ihre_Matrikelnummer>)+ 1–2 Sätze, warum das best_scenario sinnvoll ist.1
Verwendung von KI-Tools (für diese Aufgabe)
- Grundsätzlich erlaubt, aber unterstützend und reflektiert.
- Zuerst selbst versuchen, dann ggf. KI als Hilfestellung.
- Übernommener Code muss vollständig verstanden und im Video erklärt werden.
- Transparenz: Größere KI-Nutzung offen kennzeichnen (1–2 Sätze).
Bewertungskriterien
