From 21464af51d7f427b7269789c78706c80f1ffaeb1 Mon Sep 17 00:00:00 2001
From: Peter Scheiblechner <peter.scheiblechner@hslu.ch>
Date: Wed, 8 Jan 2025 15:42:56 +0000
Subject: [PATCH] Jupyter Notebooks SW09-11

---
 notebooks/SW09/SW09_anova.ipynb               | 358 ++++++++++++++++++
 notebooks/SW10/SW10_anova_two_way.ipynb       | 309 +++++++++++++++
 .../SW11/SW11_process_optimization_doe.ipynb  | 152 ++++++++
 3 files changed, 819 insertions(+)
 create mode 100644 notebooks/SW09/SW09_anova.ipynb
 create mode 100644 notebooks/SW10/SW10_anova_two_way.ipynb
 create mode 100644 notebooks/SW11/SW11_process_optimization_doe.ipynb

diff --git a/notebooks/SW09/SW09_anova.ipynb b/notebooks/SW09/SW09_anova.ipynb
new file mode 100644
index 0000000..2ef29ca
--- /dev/null
+++ b/notebooks/SW09/SW09_anova.ipynb
@@ -0,0 +1,358 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Varianz-Analyse"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "tags": []
+   },
+   "source": [
+    "## Beispiel: Reissfestigkeit von Papier\n",
+    "\n",
+    "### Paarweise t-Tests"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pandas import DataFrame\n",
+    "import scipy.stats as st\n",
+    "import numpy as np\n",
+    "\n",
+    "rf = DataFrame({\n",
+    "    \"HC\": np.repeat([\"05%\", \"10%\", \"15%\", \"20%\"], [6, 6, 6, 6]),\n",
+    "    \"Strength\":[7, 8, 15, 11, 9, 10, 12, 17, 13, 18, 19, 15, 14, 18, 19, 17, 16, 18, 19, 25, 22, 23, 18, 20]\n",
+    "})\n",
+    "print(rf)\n",
+    "per5 = rf.loc[rf[\"HC\"]==\"05%\", \"Strength\"]\n",
+    "per10 = rf.loc[rf[\"HC\"]==\"10%\", \"Strength\"]\n",
+    "per15 = rf.loc[rf[\"HC\"]==\"15%\", \"Strength\"]\n",
+    "per20 = rf.loc[rf[\"HC\"]==\"20%\", \"Strength\"]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "st.ttest_ind(per10,per20)\n",
+    "print(st.ttest_ind(per10,per20))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Stripcharts"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib inline\n",
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.stats.outliers_influence import summary_table\n",
+    "import matplotlib.pyplot as plt\n",
+    "from scipy import stats\n",
+    "\n",
+    "rf.plot(kind=\"scatter\", x=\"HC\", y=\"Strength\")\n",
+    "\n",
+    "plt.xlabel(\"Hartholzkonzentration\")\n",
+    "plt.ylabel(\"Reissfestigkeit\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Boxplots"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "rf.boxplot(column=\"Strength\",by=\"HC\",grid=False)\n",
+    "\n",
+    "plt.xlabel(\"Hartholzkonzentration\")\n",
+    "plt.ylabel(\"Reissfestigkeit\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Koeffizienten des Gruppenmittelmodells"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"Strength~HC\",data=rf).fit()\n",
+    "fit.summary()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(fit.params)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Vertrauensintervalle"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit_pred = fit.get_prediction()\n",
+    "print(fit_pred.conf_int())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Beispiel: Meat"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Stripcharts"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib inline\n",
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.stats.outliers_influence import summary_table\n",
+    "import matplotlib.pyplot as plt\n",
+    "from scipy import stats\n",
+    "\n",
+    "meat = DataFrame({\n",
+    "    \"Treatment\": np.repeat([\"Kommerziell\",\"Vakuum\",\"Gemischt\",\"CO2\"], [3, 3, 3, 3]),\n",
+    "    \"steak_id\":[7.66, 6.98, 7.80, 5.26, 5.44, 5.80, 7.41, 7.33, 7.04, 3.51, 2.91, 3.66]\n",
+    "})\n",
+    "print(meat)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "meat.plot(kind=\"scatter\", x=\"Treatment\", y=\"steak_id\")\n",
+    "\n",
+    "plt.xlabel(\"Verpackungsmethode\")\n",
+    "plt.ylabel(\"Logarithmus Bakterienzahl\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Boxplots"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "meat.boxplot(column=\"steak_id\",by=\"Treatment\",grid=False)\n",
+    "\n",
+    "plt.xlabel(\"Verpackungsmethode\")\n",
+    "plt.ylabel(\"Logarithmus Bakterienzahl\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Paarweise t-Tests"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "kommerziell = meat.loc[meat[\"Treatment\"]==\"Kommerziell\", \"steak_id\"]\n",
+    "print(kommerziell)\n",
+    "vakuum = meat.loc[meat[\"Treatment\"]==\"Vakuum\", \"steak_id\"]\n",
+    "print(vakuum)\n",
+    "print(st.ttest_ind(kommerziell, vakuum))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Gruppenmittelmodell : Summary"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"steak_id~Treatment\",data=meat).fit()\n",
+    "fit.summary()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Gruppenmittelmodell : Parameterwerte"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(fit.params)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Die Parametrisierung wurde so gewählt, dass $\\mu=\\mu_1=3.36$, d.h. \n",
+    "$\\tau_1=0$.\n",
+    "Die behandlungsspezifischen Abweichungen sind $\\tau_2=3.90$, \n",
+    "$\\tau_3=4.12$ und $\\tau_4=2.14$. D.h. $\\mu_2=\\mu +\\tau_2 = 3.36+3.90$.\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Vertrauensintervalle für Gruppenmittelwerte"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit_pred = fit.get_prediction()\n",
+    "print(fit_pred.conf_int())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Python gibt hier direkt die Vertrauensintervalle der Gruppenmittelwerte $\\mu_i$ an und nicht die Vertrauensintervalle der behandlungsspezifischen Abweichungen."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Anova Tabelle"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"steak_id~Treatment\",data=meat).fit()\n",
+    "anova_lm(fit)\n",
+    "print(anova_lm(fit))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Der $P$-Wert von  $1\\cdot 10^{-6}$ besagt, dass ein Effekt von unterschiedlichen \n",
+    "Verpackungsmethoden signifikant auf dem 5% Niveau nachgewiesen \n",
+    "werden kann. Die Gruppenmittelwerte unterscheiden sich also signifikant. "
+   ]
+  }
+ ],
+ "metadata": {
+  "anaconda-cloud": {},
+  "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.11.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/notebooks/SW10/SW10_anova_two_way.ipynb b/notebooks/SW10/SW10_anova_two_way.ipynb
new file mode 100644
index 0000000..6b5abde
--- /dev/null
+++ b/notebooks/SW10/SW10_anova_two_way.ipynb
@@ -0,0 +1,309 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "3853e4d8-fff5-4f1f-b5ca-500883f14529",
+   "metadata": {},
+   "source": [
+    "# Beispiel Randomisiertes vollständiges Block-Design: Vaskuläre Röhrchen"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b08f775c-c14c-4592-8ada-143968aaa0f0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.graphics.factorplots import interaction_plot\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "Daten = DataFrame({\n",
+    "\"Batch\": np.tile([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"], 4),\n",
+    "\"Methode\": np.repeat([\"8500\", \"8700\", \"8900\", \"9100\"], 6),\n",
+    "\"Y\": np.array([90.3, 89.2, 98.2, 93.9, 87.4, 97.9, 92.5, \n",
+    "89.5, 90.6, 94.7, 87, 95.8, 85.5,\n",
+    " 90.8, 89.6, 86.2, 88, 93.4, 82.5, 89.5, 85.6, 87.4, \n",
+    "78.9, 90.7])\n",
+    "})\n",
+    "\n",
+    "interaction_plot(x=Daten[\"Batch\"], trace=Daten[\"Methode\"], response=Daten[\"Y\"])\n",
+    "plt.ylabel(\"Daten Y\")\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "019dd7ab-fb14-4a3f-ad06-93672195b95e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.graphics.factorplots import interaction_plot\n",
+    "from statsmodels.stats.outliers_influence import summary_table\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "from patsy.contrasts import Sum\n",
+    "\n",
+    "Daten = DataFrame({\n",
+    "\"Batch\": np.tile([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"], 4),\n",
+    "\"Methode\": np.repeat([\"8500\", \"8700\", \"8900\", \"9100\"],6),\n",
+    "\"Y\": np.array([90.3, 89.2, 98.2, 93.9, 87.4, 97.9, 92.5, 89.5, 90.6, 94.7, 87, 95.8, 85.5,\n",
+    " 90.8, 89.6, 86.2, 88, 93.4, 82.5, 89.5, 85.6, 87.4, 78.9, 90.7])\n",
+    "})\n",
+    "\n",
+    "fit = ols(\"Y ~ C(Methode, Sum)+C(Batch,Sum)\", data=Daten).fit()\n",
+    "\n",
+    "fit.params\n",
+    "print(fit.params)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f8e27feb-b475-4806-8043-44b6a5486e1a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.graphics.factorplots import interaction_plot\n",
+    "from statsmodels.stats.outliers_influence import summary_table\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "from patsy.contrasts import Sum\n",
+    "import warnings\n",
+    "warnings.filterwarnings(\"ignore\")\n",
+    "Daten = DataFrame({\n",
+    "\"Batch\": np.tile([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"], 4),\n",
+    "\"Methode\": np.repeat([\"8500\", \"8700\", \"8900\", \"9100\"],6),\n",
+    "\"Y\": np.array([90.3, 89.2, 98.2, 93.9, 87.4, 97.9, 92.5, 89.5, 90.6, 94.7, 87, 95.8, 85.5,\n",
+    " 90.8, 89.6, 86.2, 88, 93.4, 82.5, 89.5, 85.6, 87.4, 78.9, 90.7])\n",
+    "})\n",
+    "\n",
+    "fit = ols(\"Y ~ C(Methode, Sum)+C(Batch, Sum)\", data=Daten).fit()\n",
+    "\n",
+    "print(anova_lm(fit))\n",
+    "anova_lm(fit)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e64452e2-024e-4123-b337-37341c969f3f",
+   "metadata": {},
+   "source": [
+    "# Beispiel Faktorielles Experiment mit 2 Faktoren: Haftungsfestigkeit von Farben"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "03a731b4-7a8d-401b-88df-1553c3ed4eca",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.graphics.factorplots import interaction_plot\n",
+    "from statsmodels.stats.outliers_influence import summary_table\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "Farbe = DataFrame({\n",
+    "\"Grund\": np.repeat([\"A\", \"B\", \"C\"], 6),\n",
+    "\"Methode\": np.tile(np.repeat([\"Eintauchen\", \"Besprühen\"], 3), 3),\n",
+    "\"Y\": np.array([4, 4.5, 4.3, 5.4, 4.9, 5.6, 5.6, 4.9, 5.4, 5.8, 6.1, 6.3, 3.8, 3.7, 4, 5.5, 5, 5])\n",
+    "})\n",
+    "\n",
+    "interaction_plot(x=Farbe[\"Grund\"], trace=Farbe[\"Methode\"], response=Farbe[\"Y\"])\n",
+    "\n",
+    "plt.xlabel(\"Grundierungstypen\")\n",
+    "plt.ylabel(\"Mittelwerte Haltungsfestigkeit\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b7a45644-eb48-4eb2-b1a8-31aa0ee2bd65",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"Y~Grund*Methode\",data=Farbe).fit()\n",
+    "\n",
+    "anova_lm(fit)\n",
+    "print(anova_lm(fit))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3ad34426-e3fc-46cb-bb5a-5efd058c0829",
+   "metadata": {},
+   "source": [
+    "# Beispiel Faktorielles Experiment mit 2 Faktoren und (scheinbarer) Interaktion: Elritzen"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "33fda122-9629-4d47-a283-f824894876f5",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "El = DataFrame({\n",
+    "\"Konz\": np.repeat([\"A\", \"B\", \"C\",\"D\"], 6),\n",
+    "\"Temp\": np.tile(np.repeat([\"15C\", \"25C\"],3),4),\n",
+    "\"Y\": np.array([82, 46, 16, 20, 13, 7, 20, 14, 17, 6, 7, 5, 8, 6, 5, 4, 3, 5, 10, 7, 5, 6, 4, 5])\n",
+    "})\n",
+    "\n",
+    "interaction_plot(x=El[\"Konz\"], trace=El[\"Temp\"], response=El[\"Y\"],\n",
+    "legendtitle=\"Methode\")\n",
+    "\n",
+    "plt.xlabel(\"Cyanid-Konzentration\")\n",
+    "plt.ylabel(\"Mediane Experimente\")\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "db037e83-fcf2-4f15-a90c-8f143495852c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"Y~C(Konz,Sum)*C(Temp,Sum)\",data=El).fit()\n",
+    "\n",
+    "anova_lm(fit)\n",
+    "print(anova_lm(fit))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5e578718-7ac2-46dc-8bc7-d957a974e356",
+   "metadata": {},
+   "source": [
+    "# Beispiel Faktorielles Experiment mit 2 Faktoren und Interaktion: Schnecken"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "da8a5599-6029-4b06-b218-b4de05adb85c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pandas import DataFrame\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import scipy.stats as st\n",
+    "\n",
+    "from statsmodels.formula.api import ols\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "from statsmodels.graphics.factorplots import interaction_plot\n",
+    "from statsmodels.stats.outliers_influence import summary_table\n",
+    "import matplotlib.pyplot as plt\n",
+    "import warnings\n",
+    "warnings.filterwarnings(\"ignore\")\n",
+    "snails = DataFrame({\n",
+    "\"season\": np.repeat([\"spring\", \"summer\"], 9),\n",
+    "\"density\": np.tile(np.repeat([\"6\", \"12\",\"24\"],3),2),\n",
+    "\"Y\": np.array([1.17, 0.50, 1.67, 1.50, 0.83, 1.00, 0.67, 0.67, 0.75,\n",
+    "       4.00, 3.83, 3.83, 3.33, 2.58, 2.75, 2.54, 1.83, 1.63])\n",
+    "})\n",
+    "\n",
+    "fit = ols(\"Y~season*density\",data=snails).fit()\n",
+    "\n",
+    "anova_lm(fit)\n",
+    "print(anova_lm(fit))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "67961a66-6af5-403f-92c1-d32db529894f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "interaction_plot(x=snails[\"density\"], trace=snails[\"season\"],\n",
+    "response=snails[\"Y\"])\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "fb00b072-8e93-4912-a43c-fd36b8ad6ba7",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "snails_spring = snails[snails[\"season\"]==\"spring\"]\n",
+    "\n",
+    "fit_spring = ols(\"Y~density\",data=snails_spring).fit()\n",
+    "\n",
+    "anova_lm(fit_spring)\n",
+    "print(anova_lm(fit_spring))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f9dd0781-5252-45ad-bd9f-0b42ac5f450a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "snails_summer = snails[snails[\"season\"]==\"summer\"]\n",
+    "\n",
+    "fit_summer = ols(\"Y~density\",data=snails_summer).fit()\n",
+    "\n",
+    "anova_lm(fit_summer)\n",
+    "print(anova_lm(fit_summer))"
+   ]
+  }
+ ],
+ "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.11.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/SW11/SW11_process_optimization_doe.ipynb b/notebooks/SW11/SW11_process_optimization_doe.ipynb
new file mode 100644
index 0000000..58ee186
--- /dev/null
+++ b/notebooks/SW11/SW11_process_optimization_doe.ipynb
@@ -0,0 +1,152 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "27def3bf-f1c1-4f63-8aad-28ed943628f7",
+   "metadata": {},
+   "source": [
+    "# Prozessoptimierung\n",
+    "\n",
+    "## Beispiel: Jitter von CD's und Disc's"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a7b397ca-c79f-4f48-bfd0-1e5adfc4c01f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "import pandas as pd\n",
+    "from statsmodels.formula.api import ols\n",
+    "from patsy.contrasts import Treatment, Sum\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "df = pd.DataFrame({\"Aa\": np.tile(np.tile([-1, 1], 4),2),\n",
+    "                   \"Bb\": np.tile(np.repeat([-1,1], [2,2]),4),\n",
+    "                   \"Cc\": np.tile(np.repeat([-1,1], [4,4]),2)},\n",
+    "                  dtype=\"category\")\n",
+    "df[\"Yy\"] = np.array([34,26,33,21,24,23,19,18,40,29,35,22,23,22,18,18])\n",
+    "print(df)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dd5e6edc-6b5f-4248-907b-a525d8b49591",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"Yy ~ C(Aa, Sum)*C(Bb, Sum)*C(Cc, Sum)\", data=df).fit()\n",
+    "fit.params"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "cd35a7a5-5d43-4d3d-9805-b5868f6fbfd1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "df[\"Yy\"] = np.array([34,26,33,21,24,23,19,18,40,29,35,22,23,22,18,18])\n",
+    "fit = ols(\"Yy ~ C(Aa, Sum)*C(Bb, Sum)*C(Cc, Sum)\", data=df).fit()\n",
+    "anova_lm(fit)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c2b9da26-5389-4905-8680-87ffb925402c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "fit = ols(\"Yy ~ C(Aa, Sum)*C(Bb, Sum)*C(Cc, Sum)\", data=df).fit()\n",
+    "fit.params"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8037e79a-88ed-4537-a833-bad0e08ceed6",
+   "metadata": {},
+   "source": [
+    "## Beispiel: Reaktionsanalyse"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "f6e67fc2-9525-444c-936f-48446f00d636",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "import pandas as pd\n",
+    "from statsmodels.formula.api import ols\n",
+    "from patsy.contrasts import Treatment, Sum\n",
+    "from statsmodels.stats.anova import anova_lm\n",
+    "reakt = pd.DataFrame({\"x1\": np.array([120,160,120,160,140,140]),\n",
+    "                      \"x2\": np.array([50,50,70,70,60,60]),\n",
+    "                      \"y\": np.array([52,62,60,70,63,65])})\n",
+    "fit = ols(\"y~x1+x2\",data=reakt).fit()\n",
+    "fit.params"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1fdd3387-769d-4266-b7bf-1072df749fa5",
+   "metadata": {},
+   "source": [
+    "Mit kodierten Variablen:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "040b9d4a-dada-448d-8676-06f84eec81dc",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "reakt = pd.DataFrame({\"x1\": np.array([-1,1,-1,1,0,0]),\n",
+    "                      \"x2\": np.array([-1,-1,1,1,0,0]),\n",
+    "                      \"y\": np.array([52,62,60,70,63,65])})\n",
+    "fit = ols(\"y~x1+x2\",data=reakt).fit()\n",
+    "fit.params"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8120720d-47c9-421e-ba3c-f2580bb99bec",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "reakt = pd.DataFrame({\"Zeit\": np.array([80,80,100,100,90,90,76,104,90]),\n",
+    "                      \"Temp\": np.array([195,235,195,235,187,243,215,215,215]),\n",
+    "                      \"y\": np.array([78,76,72,75,74,76,77,72,80])})\n",
+    "fit = ols(\"y~Zeit+Temp+I(Temp*Temp)+I(Zeit*Zeit)+I(Zeit*Temp)\",data=reakt).fit()\n",
+    "fit.params"
+   ]
+  }
+ ],
+ "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.11.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
-- 
GitLab