{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bf4df686-a2d8-4c78-b3ed-61e1ce40b77d",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "# Lösungen Monte Carlo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f2060633-3907-40aa-bd09-fe426b7ef1d1",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "skip"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.stats as stats"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28f70850-ee86-4859-ac2c-06335537007e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "### Aufgabe - Arbeitszeit abschätzen\n",
    "\n",
    "*7 Punkte* \n",
    "\n",
    "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.\n",
    "\n",
    "Nach einigen gut durchdachten Überlegungen stellst du folgendes fest:\n",
    "\n",
    "- An der ersten Aufgabe sitzt du zwischen 1-5 Stunden.\n",
    "- An der zweiten Aufgabe sitzt du zwischen 2-6 Stunden.\n",
    "- Egal wie schnell du eine Aufgabe löst es gibt keine Auswirkungen auf die andere Aufgabe. (Sie sind unabhängig voneinander)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "671bfa30-579e-41ca-815a-1ce1c6d1b5da",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "Stell im folgenden fest wie hoch die Warscheinlichkeit ist das du pünktlich beim Grillfest angelangst.\n",
    "\n",
    "Gehe dabei wie folgt vor:\n",
    "\n",
    "- Nehme an das beide Aufgaben gleichmäßig Verteilt sind, und speichere die Verteilungen in den Variablen `exc1` & `exc2`.\n",
    "- Verwende eine geeignete Anzahl an samples. Speichere den gewählten Wert in der variablen `sims`.\n",
    "- Speichere die Wahrscheinlichkeit mit der du es zum Grillfest schaffst in der Variablen `chance`, mit einer genauigkeit von zwei nachkommmastellen.\n",
    "- Plotte geeignet. Beziehe auch die Variable `chance` mit ein."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "ab3623e5-5ba9-4db8-9c12-4300a4385811",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Die Wahrscheinlichkeit pünktlich beim Grillfest zu erscheinen beträgt 87%\n"
     ]
    }
   ],
   "source": [
    "rand = np.random.default_rng(42) # Use this rng!\n",
    "\n",
    "sims = 1_000\n",
    "\n",
    "exc1 = rand.uniform(1,5,sims) \n",
    "exc2 = rand.uniform(2,6,sims)\n",
    "\n",
    "duration = exc1 + exc2\n",
    "chance = float(np.round((duration <= 9).sum()/sims, decimals=2)) \n",
    "\n",
    "print(f\"Die Wahrscheinlichkeit pünktlich beim Grillfest zu erscheinen beträgt {chance:.0%}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "55066cb8-be2e-46a3-96b6-e4c2d506e636",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 43272 characters]",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 4))\n",
    "plt.hist(duration, bins=50, color='#34d8eb', edgecolor='black', alpha=1)\n",
    "plt.axvline(9, color='red', linestyle='dashed', linewidth=2, label=\"9 Stunden Grenze\")\n",
    "plt.title(f\"Monte-Carlo-Simulation: Zeitverteilung für Aufgaben\\nChance pünktlich: {chance:.0%}\", fontsize=14)\n",
    "plt.xlabel(\"Gesamtdauer (Stunden)\")\n",
    "plt.ylabel(\"Häufigkeit\")\n",
    "plt.legend()\n",
    "plt.grid(alpha=0.3)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff7e91d0-63ed-4225-bd26-680fc7e7e57f",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "### Aufgabe - Simulation einer Körpergewichtszunahme\n",
    "\n",
    "*13 Punkte* - Credit Viktoria Litza\n",
    "\n",
    "Gegeben sind die nach Altersgruppe aufgeschlüsselten Durschnittskörpergewichte (in kg) von Männern in Deutschland. (Zu finden beim [Statistischen Bundesamt](https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Gesundheit/Gesundheitszustand-Relevantes-Verhalten/Tabellen/koerpermasse-maenner.html))\n",
    "\n",
    "Nutze die Monte Carlo Methode um den mittleren Gewichtszuwachs der Bezugsgrößen zu bestimmen.\n",
    "Die mittlere Gewichtsschwankung eines Durschnittsmannes beträgt 2.5kg über den Tag verteilt. \n",
    "Finde die Wahrscheinlichkeit mit der ein Durchschnittsmann pro Woche (7 Tage) 3 kilogramm abnimmt und speichere das Ergebniss in der Variablen `gain_percent`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6135fcec-f861-4c35-8496-020681012c03",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "Beachte:\n",
    "\n",
    "- Bestimmt das arithmetische Mittel der Durchschnittsgewichte über die Altersgruppen. Speichere den Wert in `avg_weight` mit einer Präsizion von 1 Dezimalstelle.\n",
    "- Verwende eine geeignete Anzahl an samples. Speichere den gewählten Wert in der variablen `sims`.\n",
    "- Nehme an das das Durchschnittsgewicht Normal Verteilt ist und mit einer Standardabweichung von 5% zum Durschnittswert. Speichere deine Samples in der Variablen `men_normal`.\n",
    "- Nehme an das die Gewichtsschwankung pro Tag Gleich Verteilt ist. Speichere die simulierten zunahmen für eine Woche in der Liste `gain_week`.\n",
    "- Berechne die Durschnittliche Gewichtszunahme/abnahme und speichere das Ergebnis in der Variablen `duration`.\n",
    "- Plotte Angemessen. Beziehe dabei alle relevanten Werte mit ein.\n",
    "- Begründe mit einem kurzen Text dein Vorgehen und erkläre dein Ergebnis, beschreibe als letztes die Aussage deines Plottes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "09f0e383-52dc-4261-b6a1-134456c93f3b",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Given\n",
    "avg_weight_per_men = {\n",
    "    \"18 - 20\": 77.9,\n",
    "    \"20 - 25\": 80.5,\n",
    "    \"25 - 30\": 83.3,\n",
    "    \"30 - 35\": 85.6,\n",
    "    \"35 - 40\": 86.7,\n",
    "    \"40 - 45\": 88.1,\n",
    "    \"45 - 50\": 89.8,\n",
    "    \"50 - 55\": 89.0,\n",
    "    \"55 - 60\": 88.8,\n",
    "    \"60 - 65\": 87.9,\n",
    "    \"65 - 70\": 86.7,\n",
    "    \"70 - 75\": 85.3,\n",
    "    \"75+\": 81.0\n",
    "}\n",
    "\n",
    "rand = np.random.default_rng(420) # Use this rng!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "70e6b6d9-c2bf-49e9-bfd2-cf84eaf4a30e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 1. Durchschnittsgewicht berechnen\n",
    "avg_weight = round(np.mean(list(avg_weight_per_men.values())), 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "3bf54087-bbae-4494-867d-2ba29323adf7",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 2. Parameter\n",
    "sims = 1_000_000  # Anzahl der Samples\n",
    "std_dev = 0.05 * avg_weight  # Standardabweichung = 5% des Durchschnittsgewichts\n",
    "daily_gain = rand.uniform(-2.5, 2.5, (sims, 7))  # Gewichtsschwankung pro Tag (gleich verteilt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "c1e4e001-1132-4538-ab6f-1d679a04c74e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 3. Normalverteilung für Männergewichte\n",
    "men_normal = np.random.normal(avg_weight, std_dev, sims)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "0c7d2409-ba08-4752-baab-f07cdc537084",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 4. Gleichverteilung für tägliche Gewichtsschwankung (eine Woche simulieren)\n",
    "gain_week = np.sum(daily_gain, axis=1)\n",
    "gain_percent = np.mean(gain_week <= -3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "a7e664fb-6925-4f42-af94-1dfc42f6def2",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 5. Wahrscheinlichkeit berechnen, dass ein Mann 3 kg abnimmt\n",
    "success = gain_week <= -3\n",
    "gain_percent = np.sum(success) / sims # Anteil der Fälle, in denen Gewicht um ≥ 3 kg sinkt\n",
    "gain_percent = round(gain_percent, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "1599a63c-d356-4af7-b557-254925a20f34",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 6. Durchschnittliche Gewichtszunahme/-abnahme\n",
    "duration = round(np.mean(gain_week), 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "2b6fd0c8-524d-4796-a483-f0af0e065025",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 61956 characters]",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 7. Plot\n",
    "plt.figure(figsize=(8, 4))\n",
    "plt.hist(gain_week, bins=50, color='skyblue', edgecolor='black', alpha=0.7, label=\"Gewichtsveränderungen\")\n",
    "plt.axvline(-3, color='red', linestyle='dashed', linewidth=2, label=\"-3kg Grenze\")\n",
    "plt.axvline(duration, color='green', linestyle='solid', linewidth=2, label=f\"Ø Veränderung = {duration} kg\")\n",
    "plt.title(f\"Monte-Carlo-Simulation: Gewichtsveränderung pro Woche\\nChance für -3 kg Abnahme: {gain_percent:.0%}\", fontsize=14)\n",
    "plt.xlabel(\"Gewichtsveränderung (kg)\")\n",
    "plt.ylabel(\"Häufigkeit\")\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "0ee157d2-1216-4380-94d1-1c1eccc6591e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Durchschnittliches Gewicht: 85.4 kg\n",
      "Durchschnittliche Gewichtsveränderung pro Woche: -0.0 kg\n",
      "Wahrscheinlichkeit, dass ein Mann 3 kg in einer Woche abnimmt: 22%\n"
     ]
    }
   ],
   "source": [
    "# Ergebnis ausgeben\n",
    "print(f\"Durchschnittliches Gewicht: {avg_weight} kg\")\n",
    "print(f\"Durchschnittliche Gewichtsveränderung pro Woche: {duration} kg\")\n",
    "print(f\"Wahrscheinlichkeit, dass ein Mann 3 kg in einer Woche abnimmt: {gain_percent:.0%}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a546392a-32e1-44bb-8ae9-8694598c0ff6",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "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.\n",
    "\n",
    "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.\n",
    "\n",
    "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.\n",
    "\n",
    "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%."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
