Lösungen Monte Carlo¶

Aufgabe - Arbeitszeit abschätzen¶

7 Punkte

Du befindest dich in der Situation wieder das dein Chef dich damit Beauftragt zwei wichtige Aufgaben bis zum Ende des Arbeitstages zu bearbeiten. Im Gegennsatz dazu bist du Abends auf einem Grillfest mit deinen Freunden verabredet. Dieses findet um 18 Uhr statt. Da du dich nun im zwiespalt befindest deinen Beruflichen Aufgaben nachzukommen und auf dem Grillfest zu erscheinen, fragst du dich im nächsten Schritt wie hoch die Chance ist, dass in 9 Stunden anstehende Grillfest pünktlich zu erreichen und gleichzeitig deinen Beruflichen Verpflichtungen nachzukommen.

Nach einigen gut durchdachten Überlegungen stellst du folgendes fest:

  • An der ersten Aufgabe sitzt du zwischen 1-5 Stunden.
  • An der zweiten Aufgabe sitzt du zwischen 2-6 Stunden.
  • Egal wie schnell du eine Aufgabe löst es gibt keine Auswirkungen auf die andere Aufgabe. (Sie sind unabhängig voneinander)

Stell im folgenden fest wie hoch die Warscheinlichkeit ist das du pünktlich beim Grillfest angelangst.

Gehe dabei wie folgt vor:

  • Nehme an das beide Aufgaben gleichmäßig Verteilt sind, und speichere die Verteilungen in den Variablen exc1 & exc2.
  • Verwende eine geeignete Anzahl an samples. Speichere den gewählten Wert in der variablen sims.
  • Speichere die Wahrscheinlichkeit mit der du es zum Grillfest schaffst in der Variablen chance, mit einer genauigkeit von zwei nachkommmastellen.
  • Plotte geeignet. Beziehe auch die Variable chance mit ein.
In [36]:
rand = np.random.default_rng(42) # Use this rng!

sims = 1_000

exc1 = rand.uniform(1,5,sims) 
exc2 = rand.uniform(2,6,sims)

duration = exc1 + exc2
chance = float(np.round((duration <= 9).sum()/sims, decimals=2)) 

print(f"Die Wahrscheinlichkeit pünktlich beim Grillfest zu erscheinen beträgt {chance:.0%}")
Die Wahrscheinlichkeit pünktlich beim Grillfest zu erscheinen beträgt 87%
In [39]:
plt.figure(figsize=(8, 4))
plt.hist(duration, bins=50, color='#34d8eb', edgecolor='black', alpha=1)
plt.axvline(9, color='red', linestyle='dashed', linewidth=2, label="9 Stunden Grenze")
plt.title(f"Monte-Carlo-Simulation: Zeitverteilung für Aufgaben\nChance pünktlich: {chance:.0%}", fontsize=14)
plt.xlabel("Gesamtdauer (Stunden)")
plt.ylabel("Häufigkeit")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
No description has been provided for this image

Aufgabe - Simulation einer Körpergewichtszunahme¶

13 Punkte - Credit Viktoria Litza

Gegeben sind die nach Altersgruppe aufgeschlüsselten Durschnittskörpergewichte (in kg) von Männern in Deutschland. (Zu finden beim Statistischen Bundesamt)

Nutze die Monte Carlo Methode um den mittleren Gewichtszuwachs der Bezugsgrößen zu bestimmen. Die mittlere Gewichtsschwankung eines Durschnittsmannes beträgt 2.5kg über den Tag verteilt. Finde die Wahrscheinlichkeit mit der ein Durchschnittsmann pro Woche (7 Tage) 3 kilogramm abnimmt und speichere das Ergebniss in der Variablen gain_percent.

Beachte:

  • Bestimmt das arithmetische Mittel der Durchschnittsgewichte über die Altersgruppen. Speichere den Wert in avg_weight mit einer Präsizion von 1 Dezimalstelle.
  • Verwende eine geeignete Anzahl an samples. Speichere den gewählten Wert in der variablen sims.
  • Nehme an das das Durchschnittsgewicht Normal Verteilt ist und mit einer Standardabweichung von 5% zum Durschnittswert. Speichere deine Samples in der Variablen men_normal.
  • Nehme an das die Gewichtsschwankung pro Tag Gleich Verteilt ist. Speichere die simulierten zunahmen für eine Woche in der Liste gain_week.
  • Berechne die Durschnittliche Gewichtszunahme/abnahme und speichere das Ergebnis in der Variablen duration.
  • Plotte Angemessen. Beziehe dabei alle relevanten Werte mit ein.
  • Begründe mit einem kurzen Text dein Vorgehen und erkläre dein Ergebnis, beschreibe als letztes die Aussage deines Plottes.
In [41]:
# Given
avg_weight_per_men = {
    "18 - 20": 77.9,
    "20 - 25": 80.5,
    "25 - 30": 83.3,
    "30 - 35": 85.6,
    "35 - 40": 86.7,
    "40 - 45": 88.1,
    "45 - 50": 89.8,
    "50 - 55": 89.0,
    "55 - 60": 88.8,
    "60 - 65": 87.9,
    "65 - 70": 86.7,
    "70 - 75": 85.3,
    "75+": 81.0
}

rand = np.random.default_rng(420) # Use this rng!
In [42]:
# 1. Durchschnittsgewicht berechnen
avg_weight = round(np.mean(list(avg_weight_per_men.values())), 1)
In [43]:
# 2. Parameter
sims = 1_000_000  # Anzahl der Samples
std_dev = 0.05 * avg_weight  # Standardabweichung = 5% des Durchschnittsgewichts
daily_gain = rand.uniform(-2.5, 2.5, (sims, 7))  # Gewichtsschwankung pro Tag (gleich verteilt)
In [44]:
# 3. Normalverteilung für Männergewichte
men_normal = np.random.normal(avg_weight, std_dev, sims)
In [45]:
# 4. Gleichverteilung für tägliche Gewichtsschwankung (eine Woche simulieren)
gain_week = np.sum(daily_gain, axis=1)
gain_percent = np.mean(gain_week <= -3)
In [46]:
# 5. Wahrscheinlichkeit berechnen, dass ein Mann 3 kg abnimmt
success = gain_week <= -3
gain_percent = np.sum(success) / sims # Anteil der Fälle, in denen Gewicht um ≥ 3 kg sinkt
gain_percent = round(gain_percent, 2)
In [47]:
# 6. Durchschnittliche Gewichtszunahme/-abnahme
duration = round(np.mean(gain_week), 1)
In [50]:
# 7. Plot
plt.figure(figsize=(8, 4))
plt.hist(gain_week, bins=50, color='skyblue', edgecolor='black', alpha=0.7, label="Gewichtsveränderungen")
plt.axvline(-3, color='red', linestyle='dashed', linewidth=2, label="-3kg Grenze")
plt.axvline(duration, color='green', linestyle='solid', linewidth=2, label=f"Ø Veränderung = {duration} kg")
plt.title(f"Monte-Carlo-Simulation: Gewichtsveränderung pro Woche\nChance für -3 kg Abnahme: {gain_percent:.0%}", fontsize=14)
plt.xlabel("Gewichtsveränderung (kg)")
plt.ylabel("Häufigkeit")
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image
In [49]:
# Ergebnis ausgeben
print(f"Durchschnittliches Gewicht: {avg_weight} kg")
print(f"Durchschnittliche Gewichtsveränderung pro Woche: {duration} kg")
print(f"Wahrscheinlichkeit, dass ein Mann 3 kg in einer Woche abnimmt: {gain_percent:.0%}")
Durchschnittliches Gewicht: 85.4 kg
Durchschnittliche Gewichtsveränderung pro Woche: -0.0 kg
Wahrscheinlichkeit, dass ein Mann 3 kg in einer Woche abnimmt: 22%

Um die Berechnungen auf einer stabilen Grundlage durchzuführen, berechne ich zuerst das Durchschnittsgewicht. Dafür habe ich das arithmetische Mittel berechnet – das ist einfach die Summe aller Gewichte, geteilt durch die Anzahl der Altersgruppen. Das ergibt eine repräsentative Zahl, die den Durchschnitt aller Altersgruppen widerspiegelt.

Bei der Verteilung der Gewichte in der Bevölkerung geht man hier von einer Normalverteilung aus. Das ist realistisch, weil das Gewicht der meisten Menschen um einen Durchschnittswert schwankt und dabei symmetrisch verteilt ist – mit wenigen Menschen, die deutlich leichter oder schwerer sind.

Für die täglichen Schwankungen im Gewicht gehe ich von einer gleichmäßigen Verteilung aus. Das bedeutet, dass jede mögliche Gewichtszunahme oder -abnahme innerhalb eines Bereichs (z. B. ±2,5 kg) gleich wahrscheinlich ist. Diese Annahme wird getroffen, weil keine genauen Daten über andere Schwankungsmuster vorliegen.

Der Plot zeigt die Verteilung der simulierten wöchentlichen Gewichtszunahmen/-abnahmen. Die rote Linie markiert die Grenze von -3 kg, und die grüne Linie zeigt die durchschnittliche Veränderung. Die Wahrscheinlichkeit, links von der roten Linie zu liegen, entspricht der berechneten Wahrscheinlichkeit von 22.08%.