{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cell-0",
   "metadata": {
    "editable": false,
    "tags": [
     "aufgabe"
    ]
   },
   "source": [
    "# DataScience 1 - Blatt 6\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-1",
   "metadata": {
    "editable": false,
    "tags": [
     "aufgabe"
    ]
   },
   "source": [
    "### Aufgabe (Z-Normalisierung)\n",
    "\n",
    "Den Datensatz mit den verschiedenen Sportbällen aus der Vorlesung finden\n",
    "Sie unter der URL [https://data.hsbo.de/baelle.csv](https://data.hsbo.de/baelle.csv).\n",
    "Diesen Datensatz sollen Sie im Folgenden betrachten und die enthaltenen Daten\n",
    "normalisieren.\n",
    "\n",
    "  - Laden Sie die Daten zunächst in einen DataFrame. Ermitteln Sie Mittelwert und Standardabweichung für die Attribute *Umfang* und *Gewicht*. Schreiben Sie dazu die Funktionen `smean(s)` und `sdev(s)`, die für ein Series Objekt den Mittelwert bzw.\tdie Standardabweichung berechnen.\n",
    "\n",
    "  - Definieren Sie eine Funktion `z_norm_series(s)`, die für ein Series Objekt `s` eine\n",
    "\tz-normalisierte Series zurückgibt (vgl. Foliensatz 6, Folie 27).\n",
    "\n",
    "  - Schreiben Sie eine Funktion `z_norm_df(d)`, die für einen DataFrame `d` einen\n",
    "\tDataFrame zurückgibt, bei dem jede Spalte z-normalisiert ist.\n",
    "\n",
    "Überprüfen Sie ihre Funktionen, in dem Sie sich die Ausgabe von `data.describe()`\n",
    "anschauen (wenn Sie die Daten in den DataFrame `data` geladen haben), nachdem Sie\n",
    "die Daten mit Ihrer Funktion normalisiert haben.\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hier ist Platz fuer ihre Loesung zu Aufgabe  (Z-Normalisierung):\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "cell-3",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f28c7637-4a91-4889-9fb8-11b991daf9ea",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('https://data.hsbo.de/baelle.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "85e0e2ac-d7ee-410a-b841-9e6efeaf0c5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Testdaten:\n",
    "s1 = pd.Series([1,3,5,2,4,5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4bcd015a-f09c-4eb6-9d27-339b4c1096e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def smean(s):\n",
    "    total = sum(s.values)\n",
    "    return total / len(s.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "43c34a90-0b1b-4d35-a6af-c3106060b35b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(3.3333333333333335)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "smean(s1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c25995b8-6730-47ee-ae6c-5c42399ee369",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sdev(s):\n",
    "    mean = smean(s)\n",
    "    \n",
    "    total = 0\n",
    "    for v in s.values:\n",
    "        dev = (v - mean)**2\n",
    "        total = total + dev\n",
    "        \n",
    "    return math.sqrt(total / (len(s.values) - 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a6f44c49-f3ba-44d7-97a2-934befe7720b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.632993161855452"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sdev(s1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "67f02d47-60f8-4182-b9b6-279b894e7933",
   "metadata": {},
   "outputs": [],
   "source": [
    "def z_norm_series(s):\n",
    "    return (s - smean(s)) / sdev(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6e3edc95-b404-42af-9ba3-3ba351ece357",
   "metadata": {},
   "outputs": [],
   "source": [
    "def z_norm_df(df):\n",
    "    for c in df.columns:\n",
    "        df[c] = z_norm_series(df[c])\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "e125e52b-7f35-4d9a-8c2d-1e5677e7f484",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Gewicht</th>\n",
       "      <th>Umfang</th>\n",
       "      <th>Typ</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>444.303723</td>\n",
       "      <td>70.291324</td>\n",
       "      <td>Fussball</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>424.239800</td>\n",
       "      <td>69.348473</td>\n",
       "      <td>Fussball</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>440.957231</td>\n",
       "      <td>68.281579</td>\n",
       "      <td>Fussball</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>443.638611</td>\n",
       "      <td>69.298301</td>\n",
       "      <td>Fussball</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>421.475816</td>\n",
       "      <td>70.179397</td>\n",
       "      <td>Fussball</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Gewicht     Umfang       Typ\n",
       "0  444.303723  70.291324  Fussball\n",
       "1  424.239800  69.348473  Fussball\n",
       "2  440.957231  68.281579  Fussball\n",
       "3  443.638611  69.298301  Fussball\n",
       "4  421.475816  70.179397  Fussball"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2703568d-ef5e-40d7-b2bc-2ffa149045ad",
   "metadata": {},
   "outputs": [],
   "source": [
    "daten = df[['Gewicht','Umfang']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "29bb9145-9b75-49d2-9d5b-005caa82fca6",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_1242/772145394.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df[c] = z_norm_series(df[c])\n"
     ]
    }
   ],
   "source": [
    "normalisiert = z_norm_df(daten)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a597247c-ba7d-460c-a003-ab683a58d315",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Gewicht</th>\n",
       "      <th>Umfang</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.372036</td>\n",
       "      <td>0.267862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.563240</td>\n",
       "      <td>0.170888</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.403927</td>\n",
       "      <td>0.061156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.378374</td>\n",
       "      <td>0.165728</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.589581</td>\n",
       "      <td>0.256350</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Gewicht    Umfang\n",
       "0 -0.372036  0.267862\n",
       "1 -0.563240  0.170888\n",
       "2 -0.403927  0.061156\n",
       "3 -0.378374  0.165728\n",
       "4 -0.589581  0.256350"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normalisiert.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9e5cd2fe-5236-463b-ad2d-ccd1e3b668a8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Gewicht</th>\n",
       "      <th>Umfang</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1.500000e+02</td>\n",
       "      <td>1.500000e+02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-1.533588e-15</td>\n",
       "      <td>1.657933e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.000000e+00</td>\n",
       "      <td>1.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.598158e+00</td>\n",
       "      <td>-1.965362e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-7.044373e-01</td>\n",
       "      <td>-9.143204e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-3.870644e-01</td>\n",
       "      <td>2.147741e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.059902e+00</td>\n",
       "      <td>8.261284e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.934487e+00</td>\n",
       "      <td>1.675627e+00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Gewicht        Umfang\n",
       "count  1.500000e+02  1.500000e+02\n",
       "mean  -1.533588e-15  1.657933e-15\n",
       "std    1.000000e+00  1.000000e+00\n",
       "min   -1.598158e+00 -1.965362e+00\n",
       "25%   -7.044373e-01 -9.143204e-01\n",
       "50%   -3.870644e-01  2.147741e-01\n",
       "75%    1.059902e+00  8.261284e-01\n",
       "max    1.934487e+00  1.675627e+00"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normalisiert.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-4",
   "metadata": {
    "editable": false,
    "tags": [
     "aufgabe"
    ]
   },
   "source": [
    "### Aufgabe 2 (Klassifikation)\n",
    "\n",
    "Der Datensatz enthält Umfang und Gewicht für die verschiedenen Bälle. Im Folgenden\n",
    "sollen Sie ein Klassifikationsmodell trainieren und testen, wie gut das Modell die\n",
    "Bälle unterscheiden kann.\n",
    "\n",
    " - Trainieren Sie einen Entscheidungsbaum auf 80 Prozent der Daten und ermitteln Sie den Test-Fehler\n",
    " - Probieren Sie die Daten mit kNN zu klassifizieren.\n",
    " - Verbessert sich die kNN Vorhersage, wenn Sie die Daten zu allererst normalisieren?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hier ist Platz fuer ihre Loesung zu Aufgabe  2 (Klassifikation):\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
