From 1dd196931dc788e02edda0be4bf6fffa85130cab Mon Sep 17 00:00:00 2001 From: nicole Date: Fri, 7 Jun 2024 13:44:29 +0200 Subject: [PATCH 1/2] add dataset preparation, clustering and PCA, hypothesis tests --- Data Cleaning_05_04_2024.ipynb | 22424 ------------------------------- 1 file changed, 22424 deletions(-) delete mode 100644 Data Cleaning_05_04_2024.ipynb diff --git a/Data Cleaning_05_04_2024.ipynb b/Data Cleaning_05_04_2024.ipynb deleted file mode 100644 index 2eb416f..0000000 --- a/Data Cleaning_05_04_2024.ipynb +++ /dev/null @@ -1,22424 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "e18a679f", - "metadata": {}, - "source": [ - "## Import Python libraries" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4922164f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import ydata_profiling\n", - "#from pandas_profiling import ProfileReport\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "72caaa8b", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [] - }, - { - "cell_type": "markdown", - "id": "dfe3a57a", - "metadata": {}, - "source": [ - "## Load Data (Breast Cancer Dataset)\n", - "### Sample code number: Unique identifier for each tissue sample.\n", - "### Clump Thickness: Assessment of the thickness of tumor cell clusters (1 - 10).\n", - "Uniformity of Cell Size: Uniformity in the size of tumor cells (1 - 10).\n", - "Uniformity of Cell Shape: Uniformity in the shape of tumor cells (1 - 10).\n", - "Marginal Adhesion: Degree of adhesion of tumor cells to surrounding tissue (1 - 10).\n", - "Single Epithelial Cell Size: Size of individual tumor cells (1 - 10).\n", - "Bare Nuclei: Presence of nuclei without surrounding cytoplasm (1 - 10).\n", - "Bland Chromatin: Assessment of chromatin structure in tumor cells (1 - 10).\n", - "Normal Nucleoli: Presence of normal-looking nucleoli in tumor cells (1 - 10).\n", - "Mitoses: Frequency of mitotic cell divisions (1 - 10).\n", - "Class: Classification of tumor type (2 for benign, 4 for malignant)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "bd9a55aa", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: './breast-cancer-wisconsin.data'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[5], line 5\u001b[0m\n\u001b[1;32m 1\u001b[0m url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m./breast-cancer-wisconsin.data\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 2\u001b[0m columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSample code number\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClump Thickness\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUniformity of Cell Size\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUniformity of Cell Shape\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 3\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMarginal Adhesion\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSingle Epithelial Cell Size\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBare Nuclei\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBland Chromatin\u001b[39m\u001b[38;5;124m'\u001b[39m, \n\u001b[1;32m 4\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNormal Nucleoli\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMitoses\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m----> 5\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(url, names\u001b[38;5;241m=\u001b[39mcolumns)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/io/parsers/readers.py:912\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 899\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 900\u001b[0m dialect,\n\u001b[1;32m 901\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 908\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 909\u001b[0m )\n\u001b[1;32m 910\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 912\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/io/parsers/readers.py:577\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 574\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 576\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 577\u001b[0m parser \u001b[38;5;241m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 579\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 580\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n", - "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1407\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1406\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1407\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_engine(f, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1661\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1659\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[1;32m 1660\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m get_handle(\n\u001b[1;32m 1662\u001b[0m f,\n\u001b[1;32m 1663\u001b[0m mode,\n\u001b[1;32m 1664\u001b[0m encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1665\u001b[0m compression\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompression\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1666\u001b[0m memory_map\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmemory_map\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m),\n\u001b[1;32m 1667\u001b[0m is_text\u001b[38;5;241m=\u001b[39mis_text,\n\u001b[1;32m 1668\u001b[0m errors\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding_errors\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstrict\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 1669\u001b[0m storage_options\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstorage_options\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1670\u001b[0m )\n\u001b[1;32m 1671\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1672\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n", - "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/io/common.py:859\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 854\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 855\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 856\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 857\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 858\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 859\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(\n\u001b[1;32m 860\u001b[0m handle,\n\u001b[1;32m 861\u001b[0m ioargs\u001b[38;5;241m.\u001b[39mmode,\n\u001b[1;32m 862\u001b[0m encoding\u001b[38;5;241m=\u001b[39mioargs\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[1;32m 863\u001b[0m errors\u001b[38;5;241m=\u001b[39merrors,\n\u001b[1;32m 864\u001b[0m newline\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 865\u001b[0m )\n\u001b[1;32m 866\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 867\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 868\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: './breast-cancer-wisconsin.data'" - ] - } - ], - "source": [ - "url = \"./breast-cancer-wisconsin.data\"\n", - "columns = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',\n", - " 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', \n", - " 'Normal Nucleoli', 'Mitoses', 'Class']\n", - "df = pd.read_csv(url, names=columns)" - ] - }, - { - "cell_type": "markdown", - "id": "3be5a2e3", - "metadata": {}, - "source": [ - "## Show data" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "28791c54", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Sample code numberClump ThicknessUniformity of Cell SizeUniformity of Cell ShapeMarginal AdhesionSingle Epithelial Cell SizeBare NucleiBland ChromatinNormal NucleoliMitosesClass
010000255111213112
1100294554457103212
210154253111223112
310162776881343712
410170234113213112
\n", - "
" - ], - "text/plain": [ - " Sample code number Clump Thickness Uniformity of Cell Size \\\n", - "0 1000025 5 1 \n", - "1 1002945 5 4 \n", - "2 1015425 3 1 \n", - "3 1016277 6 8 \n", - "4 1017023 4 1 \n", - "\n", - " Uniformity of Cell Shape Marginal Adhesion Single Epithelial Cell Size \\\n", - "0 1 1 2 \n", - "1 4 5 7 \n", - "2 1 1 2 \n", - "3 8 1 3 \n", - "4 1 3 2 \n", - "\n", - " Bare Nuclei Bland Chromatin Normal Nucleoli Mitoses Class \n", - "0 1 3 1 1 2 \n", - "1 10 3 2 1 2 \n", - "2 2 3 1 1 2 \n", - "3 4 3 7 1 2 \n", - "4 1 3 1 1 2 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "90314305", - "metadata": {}, - "source": [ - "## Generate Report with ydata_profiling" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "2053a002", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: ipywidgets in /home/mahehsma/anaconda3/lib/python3.11/site-packages (8.0.4)\n", - "Requirement already satisfied: ipykernel>=4.5.1 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipywidgets) (6.25.0)\n", - "Requirement already satisfied: ipython>=6.1.0 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipywidgets) (8.15.0)\n", - "Requirement already satisfied: traitlets>=4.3.1 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipywidgets) (5.7.1)\n", - "Requirement already satisfied: widgetsnbextension~=4.0 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipywidgets) (4.0.5)\n", - "Requirement already satisfied: jupyterlab-widgets~=3.0 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipywidgets) (3.0.5)\n", - "Requirement already satisfied: comm>=0.1.1 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.2)\n", - "Requirement already satisfied: debugpy>=1.6.5 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.6.7)\n", - "Requirement already satisfied: jupyter-client>=6.1.12 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (7.4.9)\n", - "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.3.0)\n", - "Requirement already satisfied: matplotlib-inline>=0.1 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (0.1.6)\n", - "Requirement already satisfied: nest-asyncio in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (1.5.6)\n", - "Requirement already satisfied: packaging in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (23.1)\n", - "Requirement already satisfied: psutil in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (5.9.0)\n", - "Requirement already satisfied: pyzmq>=20 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (23.2.0)\n", - "Requirement already satisfied: tornado>=6.1 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.3.2)\n", - "Requirement already satisfied: backcall in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.2.0)\n", - "Requirement already satisfied: decorator in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (5.1.1)\n", - "Requirement already satisfied: jedi>=0.16 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.18.1)\n", - "Requirement already satisfied: pickleshare in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.7.5)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (3.0.36)\n", - "Requirement already satisfied: pygments>=2.4.0 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (2.15.1)\n", - "Requirement already satisfied: stack-data in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.2.0)\n", - "Requirement already satisfied: pexpect>4.3 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (4.8.0)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets) (0.8.3)\n", - "Requirement already satisfied: entrypoints in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (0.4)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (2.8.2)\n", - "Requirement already satisfied: platformdirs>=2.5 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel>=4.5.1->ipywidgets) (3.10.0)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets) (0.7.0)\n", - "Requirement already satisfied: wcwidth in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython>=6.1.0->ipywidgets) (0.2.5)\n", - "Requirement already satisfied: executing in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets) (0.8.3)\n", - "Requirement already satisfied: asttokens in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets) (2.0.5)\n", - "Requirement already satisfied: pure-eval in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets) (0.2.2)\n", - "Requirement already satisfied: six>=1.5 in /home/mahehsma/anaconda3/lib/python3.11/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets) (1.16.0)\n" - ] - }, - { - "ename": "NameError", - "evalue": "name 'df' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[10], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m get_ipython()\u001b[38;5;241m.\u001b[39msystem(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpip install ipywidgets\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mydata_profiling\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ProfileReport\n\u001b[0;32m----> 4\u001b[0m profile \u001b[38;5;241m=\u001b[39m ProfileReport(df, title\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mProfiling Report\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 6\u001b[0m profile\u001b[38;5;241m.\u001b[39mto_notebook_iframe()\n", - "\u001b[0;31mNameError\u001b[0m: name 'df' is not defined" - ] - } - ], - "source": [ - "!pip install ipywidgets\n", - "from ydata_profiling import ProfileReport\n", - "\n", - "profile = ProfileReport(df, title=\"Profiling Report\")\n", - "\n", - "profile.to_notebook_iframe()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "b642b1f3-4720-4028-805f-2a8e88958f41", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting ucimlrepo\n", - " Obtaining dependency information for ucimlrepo from https://files.pythonhosted.org/packages/22/47/9350b2eeeaef8c0fd3ec3505c8a0481b576845b3df0d71c76f989c23d3c6/ucimlrepo-0.0.6-py3-none-any.whl.metadata\n", - " Downloading ucimlrepo-0.0.6-py3-none-any.whl.metadata (5.3 kB)\n", - "Downloading ucimlrepo-0.0.6-py3-none-any.whl (8.0 kB)\n", - "Installing collected packages: ucimlrepo\n", - "Successfully installed ucimlrepo-0.0.6\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], - "source": [ - "pip install ucimlrepo" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "cf67e63c-778b-4bb0-b48b-d50bc5fd2cba", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'uci_id': 45, 'name': 'Heart Disease', 'repository_url': 'https://archive.ics.uci.edu/dataset/45/heart+disease', 'data_url': 'https://archive.ics.uci.edu/static/public/45/data.csv', 'abstract': '4 databases: Cleveland, Hungary, Switzerland, and the VA Long Beach', 'area': 'Health and Medicine', 'tasks': ['Classification'], 'characteristics': ['Multivariate'], 'num_instances': 303, 'num_features': 13, 'feature_types': ['Categorical', 'Integer', 'Real'], 'demographics': ['Age', 'Sex'], 'target_col': ['num'], 'index_col': None, 'has_missing_values': 'yes', 'missing_values_symbol': 'NaN', 'year_of_dataset_creation': 1989, 'last_updated': 'Fri Nov 03 2023', 'dataset_doi': '10.24432/C52P4X', 'creators': ['Andras Janosi', 'William Steinbrunn', 'Matthias Pfisterer', 'Robert Detrano'], 'intro_paper': {'title': 'International application of a new probability algorithm for the diagnosis of coronary artery disease.', 'authors': 'R. Detrano, A. Jánosi, W. Steinbrunn, M. Pfisterer, J. Schmid, S. Sandhu, K. Guppy, S. Lee, V. Froelicher', 'published_in': 'American Journal of Cardiology', 'year': 1989, 'url': 'https://www.semanticscholar.org/paper/a7d714f8f87bfc41351eb5ae1e5472f0ebbe0574', 'doi': None}, 'additional_info': {'summary': 'This database contains 76 attributes, but all published experiments refer to using a subset of 14 of them. In particular, the Cleveland database is the only one that has been used by ML researchers to date. The \"goal\" field refers to the presence of heart disease in the patient. It is integer valued from 0 (no presence) to 4. Experiments with the Cleveland database have concentrated on simply attempting to distinguish presence (values 1,2,3,4) from absence (value 0). \\n \\nThe names and social security numbers of the patients were recently removed from the database, replaced with dummy values.\\n\\nOne file has been \"processed\", that one containing the Cleveland database. All four unprocessed files also exist in this directory.\\n\\nTo see Test Costs (donated by Peter Turney), please see the folder \"Costs\" ', 'purpose': None, 'funded_by': None, 'instances_represent': None, 'recommended_data_splits': None, 'sensitive_data': None, 'preprocessing_description': None, 'variable_info': 'Only 14 attributes used:\\r\\n 1. #3 (age) \\r\\n 2. #4 (sex) \\r\\n 3. #9 (cp) \\r\\n 4. #10 (trestbps) \\r\\n 5. #12 (chol) \\r\\n 6. #16 (fbs) \\r\\n 7. #19 (restecg) \\r\\n 8. #32 (thalach) \\r\\n 9. #38 (exang) \\r\\n 10. #40 (oldpeak) \\r\\n 11. #41 (slope) \\r\\n 12. #44 (ca) \\r\\n 13. #51 (thal) \\r\\n 14. #58 (num) (the predicted attribute)\\r\\n\\r\\nComplete attribute documentation:\\r\\n 1 id: patient identification number\\r\\n 2 ccf: social security number (I replaced this with a dummy value of 0)\\r\\n 3 age: age in years\\r\\n 4 sex: sex (1 = male; 0 = female)\\r\\n 5 painloc: chest pain location (1 = substernal; 0 = otherwise)\\r\\n 6 painexer (1 = provoked by exertion; 0 = otherwise)\\r\\n 7 relrest (1 = relieved after rest; 0 = otherwise)\\r\\n 8 pncaden (sum of 5, 6, and 7)\\r\\n 9 cp: chest pain type\\r\\n -- Value 1: typical angina\\r\\n -- Value 2: atypical angina\\r\\n -- Value 3: non-anginal pain\\r\\n -- Value 4: asymptomatic\\r\\n 10 trestbps: resting blood pressure (in mm Hg on admission to the hospital)\\r\\n 11 htn\\r\\n 12 chol: serum cholestoral in mg/dl\\r\\n 13 smoke: I believe this is 1 = yes; 0 = no (is or is not a smoker)\\r\\n 14 cigs (cigarettes per day)\\r\\n 15 years (number of years as a smoker)\\r\\n 16 fbs: (fasting blood sugar > 120 mg/dl) (1 = true; 0 = false)\\r\\n 17 dm (1 = history of diabetes; 0 = no such history)\\r\\n 18 famhist: family history of coronary artery disease (1 = yes; 0 = no)\\r\\n 19 restecg: resting electrocardiographic results\\r\\n -- Value 0: normal\\r\\n -- Value 1: having ST-T wave abnormality (T wave inversions and/or ST elevation or depression of > 0.05 mV)\\r\\n -- Value 2: showing probable or definite left ventricular hypertrophy by Estes\\' criteria\\r\\n 20 ekgmo (month of exercise ECG reading)\\r\\n 21 ekgday(day of exercise ECG reading)\\r\\n 22 ekgyr (year of exercise ECG reading)\\r\\n 23 dig (digitalis used furing exercise ECG: 1 = yes; 0 = no)\\r\\n 24 prop (Beta blocker used during exercise ECG: 1 = yes; 0 = no)\\r\\n 25 nitr (nitrates used during exercise ECG: 1 = yes; 0 = no)\\r\\n 26 pro (calcium channel blocker used during exercise ECG: 1 = yes; 0 = no)\\r\\n 27 diuretic (diuretic used used during exercise ECG: 1 = yes; 0 = no)\\r\\n 28 proto: exercise protocol\\r\\n 1 = Bruce \\r\\n 2 = Kottus\\r\\n 3 = McHenry\\r\\n 4 = fast Balke\\r\\n 5 = Balke\\r\\n 6 = Noughton \\r\\n 7 = bike 150 kpa min/min (Not sure if \"kpa min/min\" is what was written!)\\r\\n 8 = bike 125 kpa min/min \\r\\n 9 = bike 100 kpa min/min\\r\\n 10 = bike 75 kpa min/min\\r\\n 11 = bike 50 kpa min/min\\r\\n 12 = arm ergometer\\r\\n 29 thaldur: duration of exercise test in minutes\\r\\n 30 thaltime: time when ST measure depression was noted\\r\\n 31 met: mets achieved\\r\\n 32 thalach: maximum heart rate achieved\\r\\n 33 thalrest: resting heart rate\\r\\n 34 tpeakbps: peak exercise blood pressure (first of 2 parts)\\r\\n 35 tpeakbpd: peak exercise blood pressure (second of 2 parts)\\r\\n 36 dummy\\r\\n 37 trestbpd: resting blood pressure\\r\\n 38 exang: exercise induced angina (1 = yes; 0 = no)\\r\\n 39 xhypo: (1 = yes; 0 = no)\\r\\n 40 oldpeak = ST depression induced by exercise relative to rest\\r\\n 41 slope: the slope of the peak exercise ST segment\\r\\n -- Value 1: upsloping\\r\\n -- Value 2: flat\\r\\n -- Value 3: downsloping\\r\\n 42 rldv5: height at rest\\r\\n 43 rldv5e: height at peak exercise\\r\\n 44 ca: number of major vessels (0-3) colored by flourosopy\\r\\n 45 restckm: irrelevant\\r\\n 46 exerckm: irrelevant\\r\\n 47 restef: rest raidonuclid (sp?) ejection fraction\\r\\n 48 restwm: rest wall (sp?) motion abnormality\\r\\n 0 = none\\r\\n 1 = mild or moderate\\r\\n 2 = moderate or severe\\r\\n 3 = akinesis or dyskmem (sp?)\\r\\n 49 exeref: exercise radinalid (sp?) ejection fraction\\r\\n 50 exerwm: exercise wall (sp?) motion \\r\\n 51 thal: 3 = normal; 6 = fixed defect; 7 = reversable defect\\r\\n 52 thalsev: not used\\r\\n 53 thalpul: not used\\r\\n 54 earlobe: not used\\r\\n 55 cmo: month of cardiac cath (sp?) (perhaps \"call\")\\r\\n 56 cday: day of cardiac cath (sp?)\\r\\n 57 cyr: year of cardiac cath (sp?)\\r\\n 58 num: diagnosis of heart disease (angiographic disease status)\\r\\n -- Value 0: < 50% diameter narrowing\\r\\n -- Value 1: > 50% diameter narrowing\\r\\n (in any major vessel: attributes 59 through 68 are vessels)\\r\\n 59 lmt\\r\\n 60 ladprox\\r\\n 61 laddist\\r\\n 62 diag\\r\\n 63 cxmain\\r\\n 64 ramus\\r\\n 65 om1\\r\\n 66 om2\\r\\n 67 rcaprox\\r\\n 68 rcadist\\r\\n 69 lvx1: not used\\r\\n 70 lvx2: not used\\r\\n 71 lvx3: not used\\r\\n 72 lvx4: not used\\r\\n 73 lvf: not used\\r\\n 74 cathef: not used\\r\\n 75 junk: not used\\r\\n 76 name: last name of patient (I replaced this with the dummy string \"name\")', 'citation': None}}\n", - " name role type demographic \\\n", - "0 age Feature Integer Age \n", - "1 sex Feature Categorical Sex \n", - "2 cp Feature Categorical None \n", - "3 trestbps Feature Integer None \n", - "4 chol Feature Integer None \n", - "5 fbs Feature Categorical None \n", - "6 restecg Feature Categorical None \n", - "7 thalach Feature Integer None \n", - "8 exang Feature Categorical None \n", - "9 oldpeak Feature Integer None \n", - "10 slope Feature Categorical None \n", - "11 ca Feature Integer None \n", - "12 thal Feature Categorical None \n", - "13 num Target Integer None \n", - "\n", - " description units missing_values \n", - "0 None years no \n", - "1 None None no \n", - "2 None None no \n", - "3 resting blood pressure (on admission to the ho... mm Hg no \n", - "4 serum cholestoral mg/dl no \n", - "5 fasting blood sugar > 120 mg/dl None no \n", - "6 None None no \n", - "7 maximum heart rate achieved None no \n", - "8 exercise induced angina None no \n", - "9 ST depression induced by exercise relative to ... None no \n", - "10 None None no \n", - "11 number of major vessels (0-3) colored by flour... None yes \n", - "12 None None yes \n", - "13 diagnosis of heart disease None no \n" - ] - } - ], - "source": [ - "from ucimlrepo import fetch_ucirepo \n", - " \n", - "# fetch dataset \n", - "heart_disease = fetch_ucirepo(id=45) \n", - " \n", - "# data (as pandas dataframes) \n", - "X = heart_disease.data.features \n", - "y = heart_disease.data.targets \n", - " \n", - "# metadata \n", - "print(heart_disease.metadata) \n", - " \n", - "# variable information \n", - "print(heart_disease.variables) " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "b885f94c-e6b6-41d9-a484-57dc5ba98ac6", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "e3de4992aeec499aa299d79cde4a73ec", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Summarize dataset: 0%| | 0/5 [00:00" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "profile = ProfileReport(X, title=\"heart disease data report\")\n", - "\n", - "profile.to_notebook_iframe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a7b29ede-9e6e-4a0b-8803-827a579c2715", - "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.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 27bc641b2b9efaa3c317521691ec1a9047ce646b Mon Sep 17 00:00:00 2001 From: nicole Date: Fri, 7 Jun 2024 13:54:37 +0200 Subject: [PATCH 2/2] add codeprojekt nicole --- codeprojekt_nicole.ipynb | 989 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 989 insertions(+) create mode 100644 codeprojekt_nicole.ipynb diff --git a/codeprojekt_nicole.ipynb b/codeprojekt_nicole.ipynb new file mode 100644 index 0000000..8892a9c --- /dev/null +++ b/codeprojekt_nicole.ipynb @@ -0,0 +1,989 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "ffe86c63-5718-4c71-a3a3-94672d34e676", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# import libraries\n", + "from ucimlrepo import fetch_ucirepo\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "markdown", + "id": "d1b8dc0f-8e8b-485a-9147-cf694f832357", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Explorative Datenanalyse\n", + "Deskriptive Statistik: Berechnung von Mittelwerten, Mediane, Standardabweichungen und anderen Kenngrößen für die verschiedenen Merkmale. \n", + "Visualisierung: Nutzung von Histogrammen, Boxplots und Scatterplots, um die Verteilung und Beziehungen der Merkmale zu analysieren. \n", + "Korrelation: Untersuchung der Korrelation zwischen den Merkmalen und dem Outcome." + ] + }, + { + "cell_type": "markdown", + "id": "282a1c63-e28c-4d81-b1dc-1d971e9a4c12", + "metadata": {}, + "source": [ + "### Dataset preparation" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "130b7fb5-7f85-4393-a741-05246920ce63", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 303 entries, 0 to 302\n", + "Data columns (total 14 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 age 303 non-null int64 \n", + " 1 sex 303 non-null int64 \n", + " 2 cp 303 non-null int64 \n", + " 3 trestbps 303 non-null int64 \n", + " 4 chol 303 non-null int64 \n", + " 5 fbs 303 non-null int64 \n", + " 6 restecg 303 non-null int64 \n", + " 7 thalach 303 non-null int64 \n", + " 8 exang 303 non-null int64 \n", + " 9 oldpeak 303 non-null float64\n", + " 10 slope 303 non-null int64 \n", + " 11 ca 299 non-null float64\n", + " 12 thal 301 non-null float64\n", + " 13 healthy 303 non-null int64 \n", + "dtypes: float64(3), int64(11)\n", + "memory usage: 33.3 KB\n" + ] + } + ], + "source": [ + "# fetch dataset \n", + "heart_disease = fetch_ucirepo(id=45)\n", + "\n", + "# features\n", + "x = heart_disease.data.features \n", + "\n", + "# target variable\n", + "y = heart_disease.data.targets \n", + "\n", + "# complete dataframe\n", + "heart_df = pd.concat([x, y], axis=1).rename(columns={'num':'healthy'})\n", + "\n", + "# replace values for target variable: 0=sick, 1=healthy\n", + "heart_df['healthy'] = heart_df['healthy'].replace({0: 1, 1: 0, 2: 0, 3: 0, 4: 0})\n", + "\n", + "# view summary of dataset\n", + "heart_df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0780f01d-771b-4443-86b2-0e2aa8ef464f", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of rows with NaN values to be removed: 6\n", + "Total number of rows: 303\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
agesexcptrestbpscholfbsrestecgthalachexangoldpeakslopecathalhealthy
063111452331215002.330.06.01
167141602860210811.523.03.00
267141202290212912.622.07.00
337131302500018703.530.03.01
441021302040217201.410.03.01
.............................................
29757041402410012310.220.07.00
29845111102640013201.220.07.00
29968141441931014103.422.07.00
30057141301310011511.221.07.00
30157021302360217400.021.03.00
\n", + "

297 rows × 14 columns

\n", + "
" + ], + "text/plain": [ + " age sex cp trestbps chol fbs restecg thalach exang oldpeak \\\n", + "0 63 1 1 145 233 1 2 150 0 2.3 \n", + "1 67 1 4 160 286 0 2 108 1 1.5 \n", + "2 67 1 4 120 229 0 2 129 1 2.6 \n", + "3 37 1 3 130 250 0 0 187 0 3.5 \n", + "4 41 0 2 130 204 0 2 172 0 1.4 \n", + ".. ... ... .. ... ... ... ... ... ... ... \n", + "297 57 0 4 140 241 0 0 123 1 0.2 \n", + "298 45 1 1 110 264 0 0 132 0 1.2 \n", + "299 68 1 4 144 193 1 0 141 0 3.4 \n", + "300 57 1 4 130 131 0 0 115 1 1.2 \n", + "301 57 0 2 130 236 0 2 174 0 0.0 \n", + "\n", + " slope ca thal healthy \n", + "0 3 0.0 6.0 1 \n", + "1 2 3.0 3.0 0 \n", + "2 2 2.0 7.0 0 \n", + "3 3 0.0 3.0 1 \n", + "4 1 0.0 3.0 1 \n", + ".. ... ... ... ... \n", + "297 2 0.0 7.0 0 \n", + "298 2 0.0 7.0 0 \n", + "299 2 2.0 7.0 0 \n", + "300 2 1.0 7.0 0 \n", + "301 2 1.0 3.0 0 \n", + "\n", + "[297 rows x 14 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# data cleaning\n", + "rows_with_nan = heart_df.isna().any(axis=1).sum()\n", + "print(f\"Number of rows with NaN values to be removed: {rows_with_nan}\")\n", + "total_rows = heart_df.shape[0]\n", + "print(f\"Total number of rows: {total_rows}\")\n", + "\n", + "# remove rows with NaN values\n", + "heart_df = heart_df.dropna()\n", + "\n", + "heart_df" + ] + }, + { + "cell_type": "markdown", + "id": "15d04b9c-2803-43e8-98a0-118dda07536f", + "metadata": {}, + "source": [ + "### Clustering and PCA\n", + "Um zu analysieren, ob ähnliche Merkmale auch zur gleichen Diagnose führen, wird zuerst ein k-Means Clustering angewandt." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "76dc9ce9-8e81-4a50-ad4d-557576a58a92", + "metadata": {}, + "outputs": [], + "source": [ + "# prepare data for clustering\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "# split data into featrues (x) and targets (y)\n", + "X = heart_df.iloc[:, :-1]\n", + "y = heart_df.iloc[:, -1]\n", + "\n", + "# scale data (MinMax probieren)\n", + "scaler = StandardScaler() \n", + "X_scaled = scaler.fit_transform (X)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b56af950-7a58-43b5-8a83-1fd95b0c7220", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
KMeans(n_clusters=2, n_init='auto', random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "KMeans(n_clusters=2, n_init='auto', random_state=42)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# k-means clustering\n", + "from sklearn.cluster import KMeans\n", + "from sklearn.metrics import confusion_matrix\n", + "\n", + "# prepare model\n", + "kmeans = KMeans(n_clusters=2, random_state=42, n_init='auto')\n", + "kmeans.fit(X_scaled)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "4dfc00f7-a2b6-4408-b48d-c24a9c32f74d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "79.12% der Datensätze wurden mithilfe von KMeans richtig einem Cluster zugeordnet\n" + ] + } + ], + "source": [ + "# calculate percentage of data points correctly assigned to each cluster\n", + "cluster1 = kmeans.labels_ == 0\n", + "cluster2 = kmeans.labels_ == 1\n", + "\n", + "perc_cluster1 = np.round(np.mean(cluster1 == y) * 100, decimals=2)\n", + "perc_cluster2 = np.round(np.mean(cluster2 == y) * 100, decimals=2)\n", + "\n", + "# choose cluster with higher correspondence\n", + "if perc_cluster1 > perc_cluster2:\n", + " km_healthy = cluster1\n", + " max_perc = perc_cluster1\n", + "else:\n", + " km_healthy = cluster2\n", + " max_perc = perc_cluster2\n", + "\n", + "print(f\"{max_perc}% der Datensätze wurden mithilfe von KMeans richtig einem Cluster zugeordnet\")\n", + "\n", + "# hier vlt noch irgendwie diskutieren ob das ein smart way ist um das auszuwerten, anscheinend gibt's dafür andere Metriken" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "d5edbc93-22e2-4086-aa77-ec7a76765048", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Proportion of variance explained by each principal component:\n", + "[0.23695056 0.12349486 0.0960383 0.0851614 0.07638123 0.06720242\n", + " 0.06493755 0.05994447 0.05268635 0.04368496 0.03486402 0.03140469\n", + " 0.02724919]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAIhCAYAAACsQmneAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqSUlEQVR4nO3deXiMV//H8c9kj5CQiESEiKUktS9tUdRe1VZXVGsp2kd1sXRBS4NW0UV1Q/VpKVW0Dy1FW6EtVapFQindUC3yIEhsQTLn94cnUyOTyCQzJub3fl3XXFfmO2fOfM99z9zzzT1nzliMMUYAAACAl/LxdAIAAACAO1HwAgAAwKtR8AIAAMCrUfACAADAq1HwAgAAwKtR8AIAAMCrUfACAADAq1HwAgAAwKtR8AIAAMCrUfCi0GbNmiWLxWK7+Pn5KTY2Vvfff7/27dvn6fSK7Oeff9aYMWO0Z8+ePLf17dtXVatWvew5OePIkSPq0aOHKlSoIIvFottuuy1Pm0OHDikgIEA9evTIt5/MzEyVKlVKt956q0vyGjNmjCwWi0v68qSLn/cXX7755hu3P7aj56Y77+sKFotFY8aMKbDNN998I4vFov/85z9uzcUVxy53Hwtyt4U7n0+S8+P47LPPdMsttygqKkoBAQEKDw9Xu3btNHfuXJ07d859if4/8eGHH2rKlCmeTuP/BT9PJ4Arz8yZM1W7dm2dPn1aa9as0YQJE7R69Wr99NNPCgkJ8XR6Tvv55581duxY3XDDDXneCEaPHq3Bgwd7JrFCeu655/TJJ5/ovffeU/Xq1RUeHp6nTWRkpG699VZ9+umnOnr0qMqVK5enzfz583X69Gn179/fJXkNGDBAN954o0v6Kglyn/cXS0xM9EA2l9alSxetX79eFStW9HQqJUZxjl3uPhY0atRI69evLzHPJ2OM+vXrp1mzZummm27S5MmTVblyZWVkZOjrr7/WoEGDdPjw4RJ/fCzpPvzwQ23btk1DhgzxdCpej4IXTqtTp46aNGkiSWrTpo1ycnL03HPP6dNPP9W9997r8D6nTp1SqVKlLmeal3Tu3LlLnoGsXr36Zcqm6LZt26bq1avnu+1z9e/fXwsXLtTcuXP1yCOP5Ln9vffeU1RUlLp06VKsfHL3dWxsrGJjY4vVV0ly4fP+ShAZGanIyEhPp1GiFOfY5e5jQWhoqK677jq3PoYzXnrpJc2aNUtjx47Vs88+a3fbLbfcoqeeekq///67h7IDnMeUBhRb7kH6zz//lHT+I7PSpUvrp59+UseOHVWmTBm1a9dO0vmP3wcNGqRKlSopICBA1apV0zPPPKMzZ87Y9WmxWPTII4/o7bff1lVXXaXAwEAlJiZq/vz5eR5/27Zt6tq1q8qVK6egoCA1aNBA77//vl2b3I8L58yZo8cff1yVKlVSYGCg/v3vf+vuu++WdP4NMPcjz1mzZtnGcvFZ36ysLI0cOVLx8fEKCAhQpUqV9PDDD+vYsWN27apWraqbb75ZX3zxhRo1aqTg4GDVrl1b7733XqG266W21Z49e2SxWLRy5Urt2LHjkh+xd+rUSbGxsZo5c2ae23bs2KENGzaod+/e8vPzU3Jysrp27arY2FgFBQWpRo0a+te//qXDhw/b3S932sLmzZt11113qVy5crbCwNGUhgULFqhjx46qWLGigoODlZCQoBEjRujkyZN27XKfQ7///rtuuukmlS5dWpUrV9bjjz+e57ly5swZjRs3TgkJCQoKClJERITatGmjdevW2doYYzR16lQ1aNBAwcHBKleunO666y7t2rWrUPuiMObPny+LxaI333zTLp6UlCRfX18lJydL+me/vfjiixo/fryqVKmioKAgNWnSRKtWrbrk4xR23zia0nDDDTeoTp06+vHHH9WyZUuVKlVK1apV08SJE2W1Wu3un5mZqSeeeMLueT5kyJA8+yozM1MPPPCAIiIiVLp0ad1444369ddfndl0ysrK0rBhwxQdHa3g4GC1bt1aKSkpttvnzJkji8Wi9evX57nvuHHj5O/vr/379zv1mJJzxy5Hx4Lc49ScOXOUkJCgUqVKqX79+lq6dGmex9q5c6fuueceRUVFKTAwUFWqVFHv3r1tz2dHUxpy89m+fbvatWunkJAQRUZG6pFHHtGpU6fs+n/rrbfUqlUrVahQQSEhIapbt65efPHFIk07OHfunCZNmqTatWtr9OjRDttER0fr+uuvt1139tg+c+ZM1apVS8HBwWrSpIm+//57GWP00ksvKT4+XqVLl1bbtm3zFNW5z+Fvv/1W1113nYKDg1WpUiWNHj1aOTk5dm2dzakw+/G3335Tz549VaFCBQUGBiohIUFvvfWWXZvcfTlv3jw988wziomJUWhoqNq3b69ffvnFbizLli3Tn3/+aTflJte0adNUv359lS5dWmXKlFHt2rX19NNPO9wfKAQDFNLMmTONJPPjjz/axV977TUjycyYMcMYY0yfPn2Mv7+/qVq1qpkwYYJZtWqV+fLLL83p06dNvXr1TEhIiHn55ZfNihUrzOjRo42fn5+56aab7PqUZCpXrmwSExPNvHnzzJIlS8yNN95oJJmPP/7Y1m7nzp2mTJkypnr16mb27Nlm2bJl5p577jGSzKRJk2ztvv76ayPJVKpUydx1111myZIlZunSpSYtLc288MILRpJ56623zPr168369evNwYMHbWOJi4uz9WO1Wk2nTp2Mn5+fGT16tFmxYoV5+eWXTUhIiGnYsKHJysqytY2LizOxsbEmMTHRzJ4923z55Zfm7rvvNpLM6tWrC9zWhdlWWVlZZv369aZhw4amWrVqttwzMjLy7XfUqFFGkklNTbWLP/nkk0aS2bFjhzHGmGnTppkJEyaYJUuWmNWrV5v333/f1K9f39SqVcucPXvWdr+kpCQjycTFxZnhw4eb5ORk8+mnn9rddqHnnnvOvPrqq2bZsmXmm2++MdOnTzfx8fGmTZs2du369OljAgICTEJCgnn55ZfNypUrzbPPPmssFosZO3asrd25c+dMmzZtjJ+fn3niiSfM8uXLzZIlS8zTTz9t5s2bZ2v3wAMPGH9/f/P444+bL774wnz44Yemdu3aJioqyqSlpRW4L3Kf999//705d+6c3SU7O9uu7cCBA01AQIDtNbJq1Srj4+NjRo0aZWuze/du2/P7+uuvNwsXLjQff/yxadq0qfH39zfr1q3L89i7d++2xQq7bxzdt3Xr1iYiIsLUrFnTTJ8+3SQnJ5tBgwYZSeb999+3tTt58qRp0KCBKV++vJk8ebJZuXKlee2110xYWJhp27atsVqtxpjzr4c2bdqYwMBAM378eLNixQqTlJRkqlWrZiSZpKSkArdt7uuycuXKpmvXruazzz4zH3zwgalRo4YJDQ01f/zxhzHGmDNnzpjo6Ghz77332t3/3LlzJiYmxtx9990FPk5xj125t114LDDm/HGqatWq5pprrjEfffSRWb58ubnhhhuMn5+fLXdjjElNTTWlS5c2VatWNdOnTzerVq0yH3zwgenWrZvJzMy02xZff/217X65r4MqVarYtu+YMWOMn5+fufnmm+1yGTp0qJk2bZr54osvzFdffWVeffVVU758eXP//ffbtXM0joutW7fOSDLDhw8vsF0uZ4/tcXFxpnnz5mbRokXmk08+MVdddZUJDw83Q4cONV27djVLly41c+fONVFRUaZevXq255sx/zyHY2JizOuvv26+/PJL89hjjxlJ5uGHHy5yToXZj9u3bzdhYWGmbt26Zvbs2WbFihXm8ccfNz4+PmbMmDG2drn7smrVqubee+81y5YtM/PmzTNVqlQxNWvWtB03tm/fblq0aGGio6Ntx+/169cbY4yZN2+ekWQeffRRs2LFCrNy5Uozffp089hjjxVqnyAvCl4U2sVv/MePHzdLly41kZGRpkyZMrbCoU+fPkaSee+99+zuP336dCPJfPTRR3bxSZMmGUlmxYoVtpgkExwcbFeMZGdnm9q1a5saNWrYYj169DCBgYFm7969dn127tzZlCpVyhw7dswY888BqFWrVnnG9fHHH+d5o8l18ZvDF198YSSZF1980a7dggUL7N44jTlf8AYFBZk///zTFjt9+rQJDw83//rXv/I81oWc2VatW7c2V199dYH95dq1a5exWCx2B81z586Z6Oho06JFC4f3sVqt5ty5c+bPP/80kszixYttt+UWtc8++2ye+zkqeB31u3r1aiPJbNmyxXZb7nPo4vHfdNNNplatWrbrs2fPNpLMO++8k+/jrF+/3kgyr7zyil38r7/+MsHBweapp57K977G/PO8d3Tx9fW1a5uVlWUaNmxo4uPjzc8//2yioqJM69at7Qrj3II3JibGnD592hbPzMw04eHhpn379nke+8Ki9UIF7Zv8Cl5JZsOGDXb9JCYmmk6dOtmuT5gwwfj4+OQpEP/zn/8YSWb58uXGGGM+//xzI8m89tprdu3Gjx/vVMHbqFEju6Jmz549xt/f3wwYMMAWS0pKMgEBAea///2vLZb7urvUP5DFPXbl3uao4I2KirIVrcYYk5aWZnx8fMyECRNssbZt25qyZcva/pEuaFtcXPAWtH3Xrl3rsK+cnBxz7tw5M3v2bOPr62uOHDlS4DguNn/+fCPJTJ8+vcB2uZw9tkdHR5sTJ07YYp9++qmRZBo0aGD3PJgyZYqRZLZu3WqL5T6HL3yuG3P+n1ofHx/b8dbZnAqzHzt16mRiY2PznFR45JFHTFBQkG075+7Liwvrjz76yEiyFbXGGNOlSxeH++ORRx4xZcuWzRNH0TGlAU677rrr5O/vrzJlyujmm29WdHS0Pv/8c0VFRdm1u/POO+2uf/XVVwoJCdFdd91lF+/bt68k5fk4t127dnZ9+vr6qnv37vr999/1999/2/ps166dKleunKfPU6dO5fkI9OKcnPXVV1/Z5Zzr7rvvVkhISJ4xNGjQQFWqVLFdDwoK0lVXXWX7CLWgx3FmWxVWfHy82rRpo7lz5+rs2bOSpM8//1xpaWnq16+frd3Bgwc1cOBAVa5cWX5+fvL391dcXJyk89MfLlbY7bpr1y717NlT0dHR8vX1lb+/v1q3bu2wX4vFoltuucUuVq9ePbtt9/nnnysoKMgu94stXbpUFotF9913n7Kzs22X6Oho1a9fv9Dfip89e7Z+/PFHu8uGDRvs2gQGBuqjjz5Senq6GjVqJGOM5s2bJ19f3zz93XHHHQoKCrJdL1OmjG655RatWbMmz0ezF3J231wsOjpa11xzjV3s4u26dOlS1alTRw0aNLDbZp06dbL72P3rr7+WpDzzX3v27HnJPC5uf+FHuXFxcWrevLmtf0l66KGHJEnvvPOOLfbmm2+qbt26atWqVaEep6jHroK0adNGZcqUsV2PiopShQoVbNvz1KlTWr16tbp161bkOdX5bd8Lt09KSopuvfVWRURE2F5bvXv3Vk5OjtNTTJzl7PGqTZs2dl8STEhIkCR17tzZ7nmQG7/4eFmmTJk8q8n07NlTVqtVa9asKXJOBe3HrKwsrVq1SrfffrtKlSpl97q46aablJWVpe+//96uz4tzrFevnsPxOHLNNdfo2LFjuueee7R48eI8U5bgPL60BqfNnj1bCQkJ8vPzU1RUlMNvgZcqVUqhoaF2sfT0dEVHR+eZ11mhQgX5+fkpPT3dLh4dHZ2n39xYenq6YmNjlZ6e7vDxY2JibO0uVNxvrKenp8vPzy/PG5fFYlF0dHSex4uIiMjTR2BgoE6fPn3Jx3FmWzmjf//+uvfee7VkyRLdddddmjlzpkqXLq1u3bpJkqxWqzp27Kj9+/dr9OjRqlu3rkJCQmS1WnXdddc5zL0w2/XEiRNq2bKlgoKC9Pzzz+uqq65SqVKl9Ndff+mOO+7I02+pUqXsCkLp/LbLysqyXT906JBiYmLk45P//+7//e9/ZYzJU9Tkqlat2iVzl86/+RbmS2s1atRQy5YttWzZMj300EP5bpv8nt9nz57ViRMnFBYWluf2ouybixXmOfnf//5Xv//+u/z9/R32kfvmm/t6uLhPR2MrSH7bYsuWLbbrUVFR6t69u95++22NGDFC27dv17fffqu333670I9T1GNXQS61PY8ePaqcnJwif4GzoO2bexzYu3evWrZsqVq1aum1115T1apVFRQUpB9++EEPP/xwoZ4XF8r9J3337t2Fau/s8erilWQCAgIKjF/4mpfk8LV88TZxNqdL7cf09HRlZ2frjTfe0BtvvJGnraQ8RenFfQYGBkpSofZHr169lJ2drXfeeUd33nmnrFarmjZtqueff14dOnS45P2RFwUvnFaYN35Hqx9ERERow4YNMsbY3X7w4EFlZ2erfPnydu3T0tLy9JEbyz2QRERE6MCBA3na5X6B5eI+i7subEREhLKzs3Xo0CG7otcYo7S0NDVt2rRY/V/4OM5sK2fccccdKleunN577z21bt1aS5cuVe/evVW6dGlJ578EuGXLFs2aNUt9+vSx3a+gb2QXZrt+9dVX2r9/v7755hvbWV1Jeb7s54zIyEitXbtWVqs136K3fPnyslgs+vbbb21vOBdyFCuOf//731q2bJmuueYavfnmm+revbuuvfbaPO3ye34HBATY9sXFirJviqJ8+fIKDg7O9wuWuc+/3NdDenq63Zu7o7EVJL9tcXHBMHjwYM2ZM0eLFy/WF198obJly15ydZILFfXYVRzh4eHy9fW1fSrlrIK2b27s008/1cmTJ7Vo0SLb2X5JSk1NLdJjNmnSROHh4Vq8eLEmTJhwyW3izuOVI//973/zxBy9N7gyp3LlysnX11e9evXSww8/7LBNfHy8U31eyv3336/7779fJ0+e1Jo1a5SUlKSbb75Zv/76q91+RuEwpQGXTbt27XTixAl9+umndvHZs2fbbr/QqlWr7A5sOTk5WrBggapXr247W9KuXTtbIXVxn6VKlSrUMj/O/Nedm+MHH3xgF1+4cKFOnjyZZwxF5ey2ckZQUJB69uypFStWaNKkSTp37pzdlIDcN4eLC0FnzqQ54o5+O3furKysLNuqGo7cfPPNMsZo3759atKkSZ5L3bp1i/z4F/vpp5/02GOPqXfv3vr2229Vr149de/eXUePHs3TdtGiRXZnro4fP67PPvtMLVu2dDgFQnLf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DgAAACgupwverl27ymKxuCMXAAAAwOWcLnjHjBnjhjQA4PKamHLY0ynYjGhY3tMpAIBXK/Qc3lOnTunhhx9WpUqVVKFCBfXs2VOHD5ecNwwAAADAkUIXvElJSZo1a5a6dOmiHj16KDk5WQ899JA7cwMAAACKrdBTGhYtWqR3331XPXr0kCTdd999atGihXJycuTr6+u2BAEAAIDiKHTB+9dff6lly5a269dcc438/Py0f/9+Va5c2S3JAQDOY84xABRdoac05OTkKCAgwC7m5+en7OxslycFAAAAuEqhz/AaY9S3b18FBgbaYllZWRo4cKDdWryLFi1ybYYAAABAMRS64O3Tp0+e2H333efSZAAAAABXK3TBO3PmTHfmAQAAALhFoefwAgAAAFciCl4AAAB4NQpeAAAAeDUKXgAAAHi1Qn9pDQCAwuKHMgCUJJzhBQAAgFej4AUAAIBXo+AFAACAV6PgBQAAgFej4AUAAIBXo+AFAACAV6PgBQAAgFej4AUAAIBXo+AFAACAV6PgBQAAgFej4AUAAIBXo+AFAACAV6PgBQAAgFfz83QCAAB42sSUw55OwWZEw/KeTgHwOh4/wzt16lTFx8crKChIjRs31rfffltg+9WrV6tx48YKCgpStWrVNH36dLvbZ82aJYvFkueSlZXlzmEAAACghPJowbtgwQINGTJEzzzzjFJSUtSyZUt17txZe/fuddh+9+7duummm9SyZUulpKTo6aef1mOPPaaFCxfatQsNDdWBAwfsLkFBQZdjSAAAAChhPDqlYfLkyerfv78GDBggSZoyZYq+/PJLTZs2TRMmTMjTfvr06apSpYqmTJkiSUpISNDGjRv18ssv684777S1s1gsio6OvixjAAAAQMnmsYL37Nmz2rRpk0aMGGEX79ixo9atW+fwPuvXr1fHjh3tYp06ddK7776rc+fOyd/fX5J04sQJxcXFKScnRw0aNNBzzz2nhg0b5pvLmTNndObMGdv1zMxMSVJ2drays7MlST4+PvLx8ZHVapXVarW1zY3n5OTIGHPJuK+vrywWi61fm/+1sRirfdji4zju4ysZYx+3WM63zzduleWCXIzFIuUXlwock8WaY5+jxWIXKzB3N4ypMPvJ9ph2Y/1f7vnF3TQmSXlytFgs8vX1tcVzH7vA/WTxuSxjuvD56ufnJ2OMcnL+6cfy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gO3y008/eTqlfB09elQtWrSQv7+/Pv/8c/3888965ZVXSuyvM/7444922zb3h3nuvvtuD2fm2KRJkzR9+nS9+eab2rFjh1588UW99NJLeuONNzydWr4GDBig5ORkzZkzRz/99JM6duyo9u3ba9++fZ5O7ZLvDy+++KImT56sN998Uz/++KOio6PVoUMHHT9+/DJnet6l8j158qRatGihiRMnXubMHCso31OnTmnz5s0aPXq0Nm/erEWLFunXX3/Vrbfe6oFMz7vU9r3qqqv05ptv6qefftLatWtVtWpVdezYUYcOHbrMmbqBgVeRZD755BNPp+GUgwcPGklm9erVnk6l0MqVK2f+/e9/ezqNfB0/ftzUrFnTJCcnm9atW5vBgwd7OqV8JSUlmfr163s6jUIbPny4uf766z2dRpENHjzYVK9e3VitVk+n4lCXLl1Mv3797GJ33HGHue+++zyUUcFOnTplfH19zdKlS+3i9evXN88884yHsnLs4vcHq9VqoqOjzcSJE22xrKwsExYWZqZPn+6BDO0V9H62e/duI8mkpKRc1pwKUpj33x9++MFIMn/++eflSaoAhck3IyPDSDIrV668PEm5EWd44XEZGRmSpPDwcA9ncmk5OTmaP3++Tp48qWbNmnk6nXw9/PDD6tKli9q3b+/pVArlt99+U0xMjOLj49WjRw/t2rXL0ynla8mSJWrSpInuvvtuVahQQQ0bNtQ777zj6bQK5ezZs/rggw/Ur18/WSwWT6fj0PXXX69Vq1bp119/lSRt2bJFa9eu1U033eThzBzLzs5WTk6OgoKC7OLBwcEl/hc+d+/erbS0NHXs2NEWCwwMVOvWrbVu3ToPZua9MjIyZLFYSuwnQhc6e/asZsyYobCwMNWvX9/T6RSbR39pDTDGaNiwYbr++utVp04dT6eTr59++knNmjVTVlaWSpcurU8++USJiYmeTsuh+fPna/PmzSVmDuGlXHvttZo9e7auuuoq/fe//9Xzzz+v5s2ba/v27YqIiPB0enns2rVL06ZN07Bhw/T000/rhx9+0GOPPabAwED17t3b0+kV6NNPP9WxY8fUt29fT6eSr+HDhysjI0O1a9eWr6+vcnJyNH78eN1zzz2eTs2hMmXKqFmzZnruueeUkJCgqKgozZs3Txs2bFDNmjU9nV6B0tLSJElRUVF28aioKP35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61W2bFlFRETo5ptv1h9//FHocRtj1LdvX9WsWVPffvutunTpourVq6tBgwZKSkrS4sWLbW1/+ukntW3bVsHBwYqIiNCDDz6oEydO5Mn3hRdeUFRUlMqWLauxY8cqOztbTz75pMLDwxUbG6v33nvPdp/cKRfz589X8+bNFRQUpKuvvlrffPONXZ6rV6/WNddco8DAQFWsWFEjRoxQdna27fYbbrhBjz32mJ566imFh4crOjpaY8aMsesjIyNDDz74oG1btm3bVlu2bLHdnrv958yZo6pVqyosLEw9evTQ8ePHbeNbvXq1XnvtNdsnAnv27Cn0tgZwZaHgBeD1goODbWdypfMf+X/00UdauHBhgfNhX3nlFTVp0kQpKSkaNGiQHnroIe3cuVOSdOLECbVu3Vr79+/XkiVLtGXLFj311FOyWq359rdq1Srt2LFDX3/9tebNm6dPPvlEY8eOtd1+8uRJDRs2TD/++KNWrVolHx8f3X777QX2eaHU1FRt375djz/+uHx88h7ey5YtK0k6deqUbrzxRpUrV04//vijPv74Y61cuVKPPPKIXfuvvvpK+/fv15o1azR58mSNGTNGN998s8qVK6cNGzZo4MCBGjhwoP766y+7+z355JN6/PHHlZKSoubNm+vWW29Venq6JGnfvn266aab1LRpU23ZskXTpk3Tu+++q+eff96uj/fff18hISHasGGDXnzxRY0bN07JycmSzhf2Xbp0UVpampYvX65NmzapUaNGateunY4cOWLr448//tCnn36qpUuXaunSpVq9erUmTpwoSXrttdfUrFkzPfDAAzpw4IAOHDigypUrF2o7A7gCGQDwIn369DFdu3a1Xd+wYYOJiIgw3bp1M8YYk5SUZPz9/c3Bgwft7te6dWszePBg2/W4uDhz33332a5brVZToUIFM23aNGOMMW+//bYpU6aMSU9Pd5hHUlKSqV+/vl1e4eHh5uTJk7bYtGnTTOnSpU1OTo7DPg4ePGgkmZ9++skYY8zu3buNJJOSkuKw/YIFC4wks3nzZoe355oxY4YpV66cOXHihC22bNky4+PjY9LS0mz5xsXF2eVWq1Yt07JlS9v17OxsExISYubNm2eX38SJE21tzp07Z2JjY82kSZOMMcY8/fTTplatWsZqtdravPXWW3bboXXr1ub666+3y7lp06Zm+PDhxhhjVq1aZUJDQ01WVpZdm+rVq5u3337bGHN++5cqVcpkZmbabn/yySfNtddea7t+8T4H4L04wwvA6yxdulSlS5dWUFCQmjVrplatWumNN96w3R4XF6fIyMhL9lOvXj3b3xaLRdHR0Tp48KCk82dTGzZsqPDw8ELnVb9+fZUqVcp2vVmzZjpx4oTtDOkff/yhnj17qlq1agoNDVV8fLwkae/evYXq3xhjy7UgO3bsUP369RUSEmKLtWjRQlarVb/88ostdvXVV9udKY6KilLdunVt1319fRUREWHbJheOK5efn5+aNGmiHTt22B67WbNmdjm2aNFCJ06c0N9//22LXbjtJalixYq2x9m0aZNOnDihiIgIlS5d2nbZvXu33RSQqlWr2s3LvrAPAP+/+Hk6AQBwtTZt2mjatGny9/dXTEyM/P397W6/sNAryMX3s1gstukFwcHBrklW/xSot9xyiypXrqx33nlHMTExslqtqlOnjt0834JcddVVks4XlQUtiWaMybcovjDuaPwFbZOC5Pbr6LEdFeoFPY7ValXFihXzzA2W/pm2cak+APz/whleAF4nJCRENWrUUFxcXJ6ix1Xq1aun1NRUuzmjl7JlyxadPn3adv37779X6dKlFRsbq/T0dO3YsUOjRo1Su3btlJCQoKNHjzqVU4MGDZSYmKhXXnnFYWF37NgxSVJiYqJSU1Ptlmr77rvv5OPjYyuai+P777+3/Z2dna1Nmzapdu3atsdet26drciVpHXr1qlMmTKqVKlSofpv1KiR0tLS5Ofnpxo1athdypcvX+g8AwIClJOTU+j2AK5cFLwAUAT33HOPoqOjddttt+m7777Trl27tHDhQq1fvz7f+5w9e1b9+/fXzz//rM8//1xJSUl65JFH5OPjo3LlyikiIkIzZszQ77//rq+++krDhg1zKieLxaKZM2fq119/VatWrbR8+XLt2rVLW7du1fjx49W1a1dJ0r333qugoCD16dNH27Zt09dff61HH31UvXr1UlRUVLG2iyS99dZb+uSTT7Rz5049/PDDOnr0qPr16ydJGjRokP766y89+uij2rlzpxYvXqykpCQNGzbM4RftHGnfvr2aNWum2267TV9++aX27NmjdevWadSoUU6tNVy1alVt2LBBe/bs0eHDhzn7C3gxCl4AKIKAgACtWLFCFSpU0E033aS6detq4sSJ8vX1zfc+7dq1U82aNdWqVSt169ZNt9xyi225LR8fH82fP1+bNm1SnTp1NHToUL300ktO53XNNddo48aNql69uh544AElJCTo1ltv1fbt2zVlyhRJUqlSpfTll1/qyJEjatq0qe666y61a9dOb775ZlE2RR4TJ07UpEmTVL9+fX377bdavHix7cxrpUqVtHz5cv3www+qX7++Bg4cqP79+2vUqFGF7t9isWj58uVq1aqV+vXrp6uuuko9evTQnj17nCrYn3jiCfn6+ioxMVGRkZGFnisN4MpjMRd+rgQAcIu+ffvq2LFjtvWAvdGePXsUHx+vlJQUl/+sMgAUB2d4AQAA4NUoeAEAAODVmNIAAAAAr8YZXgAAAHg1Cl4AAAB4NQpeAAAAeDUKXgAAAHg1Cl4AAAB4NQpeAAAAeDUKXgAAAHg1Cl4AAAB4tf8Dt8DLb/ShgMIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# apply PCA\n", + "pca = PCA()\n", + "pca.fit(X_scaled)\n", + "\n", + "print(f\"Proportion of variance explained by each principal component:\\n{pca.explained_variance_ratio_}\")\n", + "\n", + "# Plot the proportion of variance explained\n", + "plt.figure(figsize=(8, 6))\n", + "plt.bar(range(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, color='skyblue')\n", + "plt.xlabel('Principal Component')\n", + "plt.ylabel('Proportion of Variance Explained')\n", + "plt.title('Proportion of Variance Explained by Principal Components')\n", + "plt.xticks(range(1, len(pca.explained_variance_ratio_) + 1))\n", + "plt.grid(axis='y', linestyle='--', alpha=0.7)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "c3d40f19-8299-44ab-bb8a-326fdd2008c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Contributions of features to the first principal component:\n", + " Feature Contribution\n", + "9 oldpeak 0.397006\n", + "10 slope 0.352024\n", + "12 thal 0.346208\n", + "8 exang 0.333140\n", + "11 ca 0.306420\n", + "2 cp 0.286212\n", + "0 age 0.285868\n", + "3 trestbps 0.167841\n", + "6 restecg 0.145938\n", + "1 sex 0.116802\n", + "4 chol 0.083504\n", + "5 fbs 0.076094\n", + "7 thalach -0.392706\n" + ] + } + ], + "source": [ + "# get the loadings or weights of features in the first principal component\n", + "first_pc_loadings = pca.components_[0]\n", + "\n", + "# create a DataFrame to display the contributions of features to the first principal component\n", + "pc_loadings_df = pd.DataFrame({\"Feature\": X.columns, \"Contribution\": first_pc_loadings})\n", + "pc_loadings_df = pc_loadings_df.sort_values(by=\"Contribution\", ascending=False)\n", + "\n", + "print(\"Contributions of features to the first principal component:\")\n", + "print(pc_loadings_df)" + ] + }, + { + "cell_type": "markdown", + "id": "b68452ef-aa60-4b2f-aec4-4762f9136360", + "metadata": {}, + "source": [ + "#### Interpretation:\n", + "Die \"Proportion of Variance Explained by Principal Components\" gibt an, wie viel der gesamten Varianz in den Daten durch jede einzelne Hauptkomponente erklärt wird.\n", + "Hauptkomponenten mit einer höheren Proportion der erklärten Varianz tragen mehr zur Erklärung der Variation in den Daten bei und sind daher wichtiger.\n", + "Eine höhere Proportion der erklärten Varianz in einer bestimmten Hauptkomponente kann darauf hinweisen, dass diese Hauptkomponente wichtige Informationen über die Variation in den Merkmalen oder Beobachtungen enthält, die mit den zugrunde liegenden Mustern oder Gruppierungen in den Herzdaten zusammenhängen könnten. Dabei ist wichtig zu erwähnen, dass die Ergebnisse nicht in direktem Zusammenhang mit der goal-Variable stehen, sondern lediglich auf Muster in den Daten hinweisen.\n", + "\n", + "Merkmale, die hohe Contributions zu der ersten Hauptkomponente haben, tragen wesentlich zur Variation in den Daten bei. Diese Merkmale haben möglicherweise eine starke Korrelation mit der ersten Hauptkomponente und könnten daher wichtigere Informationen über die zugrunde liegenden Muster oder Strukturen in den Daten liefern, als jene mit einer geringen Contribution." + ] + }, + { + "cell_type": "markdown", + "id": "e8dcc395-b548-4dde-bd46-67a962af6f03", + "metadata": {}, + "source": [ + "### Cholesterinwerte im Vergleich Frauen/Männer" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "ed81d87f-a0b0-4dbb-88f6-471423ce3151", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAIhCAYAAABUopIpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGzklEQVR4nO3deXQUVf7+8afI1tkTAiSEfZd9FQZEAwYIqywqI7jAwHdkDDAgIIooiwsoM4MwoDgisiOjIyiDBgirgwGNLIqgqOwoIcoWliRAcn9/8KOPbVi6s9BQvF/n9DnpW7erPlWdNA+3b1VZxhgjAAAAwAaKebsAAAAAoLAQbgEAAGAbhFsAAADYBuEWAAAAtkG4BQAAgG0QbgEAAGAbhFsAAADYBuEWAAAAtkG4BQAAgG0QboFbyNdff60//elPqlSpkhwOh0JCQtSoUSNNmjRJx48fd/arWLGiOnfuXGjb3b9/vyzL0pw5cwptnb+VkpKicePG6eTJk0Wy/r59+6pixYpFsu6itGjRIk2ZMsXbZRSaVq1aqU6dOgVaR3Z2tl5//XXFxcUpKipKfn5+ioqKUqtWrfSvf/1Lp0+fLqRq88eyLA0aNOi6/ebMmSPLsrR///4iqePy+r/88svr9n3jjTeK7G8b8AbCLXCLmDlzpho3bqzU1FQ99dRTWrFihZYuXaoHH3xQb775pvr37+/tEvMtJSVF48ePL7Jw+/zzz2vp0qVFsu6iZLdwW1C//PKLWrRooWHDhqlGjRp66623tHbtWs2aNUv16tXTyJEjlZiY6O0ybzmEW9iNr7cLAHB9mzZt0hNPPKG2bdvqww8/VEBAgHNZ27ZtNXz4cK1YscKLFd6czp07p6CgIFWpUsXbpXjkct1w9cgjj2jHjh1avXq17rnnHpdl3bp109ixY5WUlOSl6gDcLBi5BW4BEyZMkGVZeuutt1yC7WX+/v6677778rSvWLFCjRo1UmBgoO644w698847efp888036tq1qyIjI+VwONSgQQPNnTvXrbp++OEH9e7dW6VKlVJAQIBq1qyp119/3aVPbm6uXnrpJdWoUUOBgYGKiIhQvXr1NHXqVEnSuHHj9NRTT0mSKlWqJMuyZFmW1q9f71zHv//9bzVv3lzBwcEKCQlRQkKCtm3b5rKdvn37KiQkRDt27FC7du0UGhqq+Ph457LfT0u4/PXx/PnzVbNmTQUFBal+/fpavny5s8/OnTtlWZbef/99Z9uWLVtkWZZq167tsr777rtPjRs3dmkrSN2tWrXSxx9/rAMHDjiPiWVZztedP39eL730ku644w4FBASoZMmS+tOf/qRffvnlqu/X77f5448/qmPHjgoJCVG5cuU0fPhwZWdnu/QdP368mjVrpuLFiyssLEyNGjXSrFmzZIzJs95FixapefPmCgkJUUhIiBo0aKBZs2bl6Zeamqq7775bQUFBqly5sl555RXl5uZes+bU1FStWrVKjz/+eJ5ge1lUVJQeeeQRlzZ3j9PatWvVqlUrRUVFKTAwUOXLl9f999+vc+fOOftkZ2frhRdeUM2aNeVwOBQVFaXWrVsrJSUlTy3X+r26ltWrVys+Pl5hYWEKCgrSXXfdpTVr1uTp991336lXr16Kjo5WQECAypcvr8ceeyzP+3f69Gk98cQTKlGihKKiotSjRw/9/PPPzuUVK1bUzp07tWHDBufv2K04hQdwYQDc1C5evGiCgoJMs2bN3H5NhQoVTNmyZU2tWrXMvHnzzMqVK82DDz5oJJkNGzY4+3333XcmNDTUVKlSxcybN898/PHHplevXkaSefXVV5399u3bZySZ2bNnO9t27txpwsPDTd26dc28efPMqlWrzPDhw02xYsXMuHHjnP0mTpxofHx8zNixY82aNWvMihUrzJQpU5x9Dh06ZAYPHmwkmSVLlphNmzaZTZs2mVOnThljjHn55ZeNZVmmX79+Zvny5WbJkiWmefPmJjg42OzcudO5nT59+hg/Pz9TsWJFM3HiRLNmzRqzcuVK57IKFSq4HCNJpmLFiqZp06bmvffeM5988olp1aqV8fX1NXv27HH2K126tHn88cedz1955RUTGBhoJJmffvrJGGPMhQsXTFhYmBk5cqSzX0Hr3rlzp7nrrrtMTEyM85hs2rTJGGNMTk6Oad++vQkODjbjx483ycnJ5u233zZlypQxtWrVMufOnbvm70efPn2Mv7+/qVmzpvn73/9uVq9ebcaMGWMsyzLjx4936du3b18za9Ysk5ycbJKTk82LL75oAgMD8/R7/vnnjSTTo0cP8/7775tVq1aZyZMnm+eff97ZJy4uzkRFRZlq1aqZN9980yQnJ5vExEQjycydO/eaNb/88stGkvM9dYe7x2nfvn3G4XCYtm3bmg8//NCsX7/eLFy40Dz66KPmxIkTxphL73Hr1q2Nr6+vGTFihPnkk0/MsmXLzLPPPmveffdd5zbd/b2aPXu2kWT27dvnbJs/f76xLMt069bNLFmyxPz3v/81nTt3Nj4+Pmb16tXOftu3bzchISGmYsWK5s033zRr1qwxCxYsMD179jQZGRku669cubIZPHiwWblypXn77bdNZGSkad26tXNdW7duNZUrVzYNGzZ0/o5t3brV7WMM3IwIt8BNLi0tzUgyDz30kNuvqVChgnE4HObAgQPOtszMTFO8eHEzYMAAZ9tDDz1kAgICzMGDB11e36FDBxMUFGROnjxpjLlyuE1ISDBly5Z1htDLBg0aZBwOhzl+/LgxxpjOnTubBg0aXLPev/3tb3n+oTfGmIMHDxpfX18zePBgl/bTp0+bmJgY07NnT2dbnz59jCTzzjvv5Fn/1cJtdHS0MwwYc+lYFytWzEycONHZ9sgjj5jKlSs7n7dp08b8+c9/NpGRkc5A9tlnnxlJZtWqVYVad6dOnfLUbYwx7777rpFkPvjgA5f21NRUI8m88cYbeV7z++Mhybz33nsu7R07djQ1atS46utycnLMhQsXzAsvvGCioqJMbm6uMcaYvXv3Gh8fH/Pwww9fc7txcXFGkvn8889d2mvVqmUSEhKu+dq//OUvRpL57rvvXNpzc3PNhQsXnI+LFy86l7l7nP7zn/8YSWb79u1X3f68efOMJDNz5sxr1unu79Xvw+3Zs2dN8eLFTZcuXVzWl5OTY+rXr2+aNm3qbLv33ntNRESESU9Pv2odl9efmJjo0j5p0iQjyRw5csTZVrt2bRMXF3fN/QJuJUxLAGyqQYMGKl++vPO5w+FQ9erVdeDAAWfb2rVrFR8fr3Llyrm8tm/fvjp37pw2bdp0xXVnZWVpzZo16t69u4KCgnTx4kXno2PHjsrKytLmzZslSU2bNtVXX32lxMRErVy5UhkZGW7vw8qVK3Xx4kU99thjLttwOByKi4tzmbpw2f333+/2+lu3bq3Q0FDn8+joaJUqVcrlGMXHx2vv3r3at2+fsrKytHHjRrVv316tW7dWcnKypEtfJQcEBKhly5Y3pO7ly5crIiJCXbp0cVl/gwYNFBMTc8X1/55lWerSpYtLW7169Vz2Xbr0O9KmTRuFh4fLx8dHfn5+GjNmjI4dO6b09HRJUnJysnJycjRw4MDrbjcmJkZNmza97nbd9dFHH8nPz8/5CA8Pdy5z9zg1aNBA/v7+evzxxzV37lzt3bs3z3aSkpLkcDjUr1+/69bkzu/V76WkpOj48ePq06ePS625ublq3769UlNTdfbsWZ07d04bNmxQz549VbJkyevW8vvpSvXq1ZOkfB9v4FbACWXATa5EiRIKCgrSvn37PHpdVFRUnraAgABlZmY6nx87dkylS5fO0y82Nta5/EqOHTumixcvatq0aZo2bdoV+/z666+SpFGjRik4OFgLFizQm2++KR8fH91zzz169dVX1aRJk2vuw9GjRyVJd9555xWXFyvm+v/zoKAghYWFXXOdv+XOMWrTpo2kSwG2UqVKunDhgu69914dPXpUL774onPZXXfdpcDAwBtS99GjR3Xy5En5+/tfcfnlY38tQUFBcjgcLm0BAQHKyspyPv/iiy/Url07tWrVSjNnzlTZsmXl7++vDz/8UC+//LLzOF2ev1q2bNnrbtedY34ll/+jduDAAdWoUcPZ3qpVK6Wmpkq6ND943bp1zmXuHqcqVapo9erVmjRpkgYOHKizZ8+qcuXK+utf/6ohQ4Y49zE2NjbPe1dY+3j5d+aBBx64ap/jx4+rWLFiysnJcetYX6mWy3P2r3e8gVsZ4Ra4yfn4+Cg+Pl5JSUk6fPiw2/+ouSMqKkpHjhzJ0375hJMSJUpc8XWRkZHy8fHRo48+etXRukqVKkmSfH19NWzYMA0bNkwnT57U6tWr9eyzzyohIUGHDh265lUBLm//P//5jypUqHDd/fntCVeFpWzZsqpevbpWr16tihUrqkmTJoqIiFB8fLwSExP1+eefa/PmzRo/fvwNq/vyyUFXu0LGb0cNC2Lx4sXy8/PT8uXLXYLwhx9+6NLv8gji4cOH83wLUFjatm2rZ599VsuWLVO7du2c7REREc7/JP0+yHlynO6++27dfffdysnJ0Zdffqlp06Zp6NChio6O1kMPPaSSJUtq48aNys3NdSvgeury78y0adP0hz/84Yp9oqOjlZOTIx8fHx0+fLjQawDsgnAL3AJGjRqlTz75RH/+85/10Ucf5RmJunDhglasWJHna+briY+P19KlS/Xzzz87R2slad68eQoKCrrqP7JBQUFq3bq1tm3bpnr16l11ZOz3IiIi9MADD+inn37S0KFDtX//ftWqVeuqo0kJCQny9fXVnj17PPravrC1adNG7733nsqVK6dOnTpJkqpXr67y5ctrzJgxunDhgnOEVyq8uq822te5c2ctXrxYOTk5atasWb7Xfz2WZcnX11c+Pj7OtszMTM2fP9+lX7t27eTj46MZM2aoefPmRVJLkyZN1K5dO82cOVN//OMfdffdd1/3Nfk5Tj4+PmrWrJnuuOMOLVy4UFu3btVDDz2kDh066N1339WcOXPcmprgqbvuuksRERHatWvXdW8CERcXp/fff18vv/zyVf8D6gl3Rs6BWwnhFrgFNG/eXDNmzFBiYqIaN26sJ554QrVr19aFCxe0bds2vfXWW6pTp47H4Xbs2LFavny5WrdurTFjxqh48eJauHChPv74Y02aNMll/uLvTZ06VS1bttTdd9+tJ554QhUrVtTp06f1448/6r///a/Wrl0rSerSpYvq1KmjJk2aqGTJkjpw4ICmTJmiChUqqFq1apKkunXrOtfZp08f+fn5qUaNGqpYsaJeeOEFjR49Wnv37lX79u0VGRmpo0eP6osvvlBwcLDLiGlRiY+P1xtvvKFff/3V5aYK8fHxmj17tiIjI10uA1ZYddetW1dLlizRjBkz1LhxYxUrVkxNmjTRQw89pIULF6pjx44aMmSImjZtKj8/Px0+fFjr1q1T165d1b179wLvd6dOnTR58mT17t1bjz/+uI4dO6a///3veS5HV7FiRT377LN68cUXlZmZqV69eik8PFy7du3Sr7/+Wmjv0YIFC5SQkKA2bdqob9++SkhIUKlSpZSRkaGvv/5aq1evdpne4e5xevPNN7V27Vp16tRJ5cuXV1ZWlvOyeZf/09KrVy/Nnj1bf/nLX7R79261bt1aubm5+vzzz1WzZk099NBDBdq3kJAQTZs2TX369NHx48f1wAMPqFSpUvrll1/01Vdf6ZdfftGMGTMkSZMnT1bLli3VrFkzPfPMM6pataqOHj2qZcuW6V//+pfHI/d169bV4sWL9e9//1uVK1eWw+Fw/k0CtyRvn9EGwH3bt283ffr0MeXLlzf+/v4mODjYNGzY0IwZM8blzOkKFSqYTp065Xl9XFxcnrOid+zYYbp06WLCw8ONv7+/qV+/vstVEYy58tUSLrf369fPlClTxvj5+ZmSJUuaFi1amJdeesnZ5x//+Idp0aKFKVGihPH39zfl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ddezZcsWpaenq3Hjxs62nJwcffrpp5o+fbp2794t6dLobOnSpZ190tPTnaO5MTExOn/+vE6cOOEyepuenq4WLVpcddsBAQEKCAi4bo0AAAC4tXgcbrt16ybLsmSMcWm/3GZZllq2bKkPP/wwz3SB34qPj9eOHTtc2v70pz/pjjvu0NNPP63KlSsrJiZGycnJatiwoSTp/Pnz2rBhg1599VVJUuPGjeXn56fk5GTnpciOHDmib775RpMmTfJ01wAAAHCL83haQnJysu68804lJyc7v9ZPTk5W06ZNtXz5cn366ac6duyYRowYcc31hIaGqk6dOi6P4OBgRUVFqU6dOs5r3k6YMEFLly7VN998o759+yooKEi9e/eWJIWHh6t///4aPny41qxZo23btumRRx5R3bp185ygBgAAAPvzeOR2yJAheuutt1y+9o+Pj5fD4dDjjz+unTt3asqUKerXr1+Bixs5cqQyMzOVmJioEydOqFmzZlq1apVCQ0OdfV577TX5+vqqZ8+eyszMVHx8vObMmSMfH58Cbx8AAAC3Fsv8fn7BdQQGBio1NVV16tRxad+xY4eaNm2qzMxMHThwQDVr1tS5c+cKtdiikpGRofDwcJ06dUphYWHeLgcAgFtCZmamOnToIElKSkpSYGCglyuCnbmb1zyeltC4cWM99dRT+uWXX5xtv/zyi0aOHKk777xTkvTDDz+obNmy+SgbAAAAyD+PpyXMmjVLXbt2VdmyZVWuXDlZlqWDBw+qcuXK+uijjyRduuvY888/X+jFAgAAANficbitUaOGvv32W61cuVLff/+9jDG644471LZtWxUrdmkguFu3boVdJwAAAHBdHodb6dJlv9q3b6/27dsXdj0AAABAvuUr3H7xxRdav3690tPTlZub67Js8uTJhVIYAAAA4CmPw+2ECRP03HPPqUaNGoqOjna5ze31bosLAAAAFCWPw+3UqVP1zjvvqG/fvkVQDgAAAJB/Hl8KrFixYrrrrruKohYAAACgQDwOt08++aRef/31oqgFAAAAKBCPpyWMGDFCnTp1UpUqVVSrVi35+fm5LF+yZEmhFQcAAAB4wuNwO3jwYK1bt06tW7dWVFQUJ5EBAADgpuFxuJ03b54++OADderUqSjqAQAAAPLN4zm3xYsXV5UqVYqiFgAAAKBAPA6348aN09ixY3Xu3Lmi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WkiSGjduLD8/P5c+R44c0TfffOPsAwAAgNuHx5cCmzt3rt5++23dd999zrb69eurTJkySkxM1Msvv+z2up599ll16NBB5cqV0+nTp7V48WKtX79eK1askGVZGjp0qCZMmKBq1aqpWrVqmjBhgoKCgtS7d29JUnh4uPr376/hw4crKipKxYsX14gRI1S3bl3n1RMAAABw+/A43B4/flx33HFHnvY77rhDx48f92hdR48e1aOPPqojR44oPDxc9erV04oVK9S2bVtJ0siRI5WZmanExETnTRxWrVrlvMatJL322mvy9fVVz549nTdxmDNnDte4BQAAuA15HG7r16+v6dOn65///KdL+/Tp01W/fn2P1jVr1qxrLrcsS+PGjdO4ceOu2sfhcGjatGmaNm2aR9sGAACA/XgcbidNmqROnTpp9erVat68uSzLUkpKig4dOqRPPvmkKGoEAAAA3OLxCWVxcXH6/vvv1b17d508eVLHjx9Xjx49tHv3bt19991FUSMAAADgFo9HbqVLdwHz5MQxAAAA4EbIV7g9efKkvvjiC6Wnp+e5tu1jjz1WKIUBAAAAnvI43P73v//Vww8/rLNnzyo0NNTlTmCWZRFuAQAA4DUez7kdPny4+vXrp9OnT+vkyZM6ceKE8+HppcAAAACAwuRxuP3pp5/017/+VUFBQUVRDwAAAJBvHofbhIQEffnll0VRCwAAAFAgbs25XbZsmfPnTp066amnntKuXbtUt25d+fn5ufT97W15AQAAgBvJrXDbrVu3PG0vvPBCnjbLspSTk1PgogAAAID8cCvc/v5yXwAAAMDNyOM5twAAAMDNyu1wu3btWtWqVUsZGRl5lp06dUq1a9fWp59+WqjFAQAAAJ5wO9xOmTJFf/7znxUWFpZnWXh4uAYMGKDXXnutUIsDAAAAPOF2uP3qq6/Uvn37qy5v166dtmzZUihFAQAAAPnhdrg9evRonst+/Zavr69++eWXQikKAAAAyA+3w22ZMmW0Y8eOqy7/+uuvVbp06UIpCgAAAMgPt8Ntx44dNWbMGGVlZeVZlpmZqbFjx6pz586FWhwAAADgCbeucytJzz33nJYsWaLq1atr0KBBqlGjhizL0rfffqvXX39dOTk5Gj16dFHWCgAAAFyT2+E2OjpaKSkpeuKJJzRq1CgZYyRduitZQkKC3njjDUVHRxdZ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LCtdurRnOwaIcAsUuf/9739q0aKFEhMTnW3XOrmiVq1aCggI0MGDBxUXF3cjSgRwmymqz5ljx47p22+/1b/+9S/dfffdkqSNGzde8zWNGjXSBx98oIoVK8rXl1iCguO3CChiVatW1bx587Ry5UpVqlRJ8+fPV2pqqipVqnTF/qGhoRoxYoSefPJJ5ebmqmXLlsrIyFBKSopCQkLUp0+fG7wHAOymqD5nIiMjFRUVpbfeekulS5fWwYMH9cwzz1zzNQMHDtTMmTPVq1cvPfXUUypRooR+/PFHLV68WDNnzpSPj0++asHti3ALFLG//OUv2r59u/74xz/Ksiz16tVLiYmJzkuFXcmLL76oUqVKaeLEidq7d68iIiLUqFEjPfvsszewcgB2VhSfM8WKFdPixYv117/+VXXq1FGNGjX0z3/+U61atbrqa2JjY/XZZ5/p6aefVkJCgrKzs1WhQgW1b99exYpxUSd4zjLGGG8XAQAAABQG/ksEAAAA2yDcAgAAwDYItwAAALANwi0AAABsg3ALAAAA2yDcAgAAwDYItwAAALANwi0AAABsg3ALADbRqlUrDR069Jp9LMvShx9+WGjbLOz1AUBBEW4BoJCkpaVpyJAhqlq1qhwOh6Kjo9WyZUu9+eabOnfunLfL84r169fLsiydPHnS26UAuE34ersAALCDvXv36q677lJERIQmTJigunXr6uLFi/r+++/1zjvvKDY2Vvfdd5+3ywQA22PkFgAKQWJionx9ffXll1+qZ8+eqlmzpurWrav7779fH3/8sbp06SJJOnXqlB5//HGVKlVKYWFhuvfee/XVV1851/PVV1+pdevWCg0NVVhYmBo3bqwvv/zSufyzzz5TXFycgoKCFBkZqYSEBJ04ccK5PDc3VyNHjlTx4sUVExOjcePGXbPun376SX/84x8VGRmpqKgode3aVfv373fp884776h27doKCAhQ6dKlNWjQIJflv/76q7p3766goCBVq1ZNy5YtkyTt379frVu3liRFRkbKsiz17dvX00MLAB4h3AJAAR07dkyrVq3SwIEDFRwcfMU+lmXJGKNOnTopLS1Nn3zyibZs2aJGjRopPj5ex48flyQ9/PDDKlu2rFJTU7VlyxY988wz8vPzkyRt375d8fHxql27tjZt2qSNGzeqS5cuysnJcW5n7ty5Cg4O1ueff65JkybphRdeUHJy8hVrOnfunFq3bq2QkBB9+umn2rhxo0JCQtS+fXudP39ekjRjxgwNHDhQjz/+uHbs2KFly5apatWqLusZP368evbsqa+//lodO3bUww8/rOPHj6tcuXL64IMPJEm7d+/WkSNHNHXq1IIdbAC4HgMAKJDNmzcbSWbJkiUu7VFRUSY4ONgEBwebkSNHmjVr1piwsDCTlZXl0q9KlSrmX//6lzHGmNDQUDNnzpwrbqdXr17mrrvuumodcXFxpmXLli5td955p3n66aedzyWZpUuXGmOMmTVrlqlRo4bJzc11Ls/OzjaBgYFm5cqVxhhjYmNjzejRo6+6TUnmueeecz4/c+aMsSzLJCUlGWOMWbdunZFkTpw4cdV1AEBhYs4tABQSy7Jcnn/xxRfKzc3Vww8/rOzsbG3ZskVnzpxRVFSUS7/MzEzt2bNHkjRs2DD93//9n+bPn682bdrowQcfVJUqVSRdGrl98MEHr1lDvXr1XJ6XLl1a6enpV+y7ZcsW/fjjjwoNDXVpz8rK0p49e5Senq6ff/5Z8fHxbm8zODhYoaGhV90mABQ1wi0AFFDVqlVlWZa+++47l/bKlStLkgIDAyVdmg9bunRprV+/Ps86IiIiJEnjxo1T79699fHHHyspKUljx47V4sWL1b17d+d6ruXyFIbLLMtSbm7uFfvm5uaqcePGWrhwYZ5lJUuWVLFi7s1c82SbAFDUmHMLAAUUFRWltm3bavr06Tp79uxV+zVq1EhpaWny9fVV1apVXR4lSpRw9qtevbqefPJJrVq1Sj169NDs2bMlXRohXbNmTaHV3ahRI/3www8qVapUnnrCw8MVGhqqihUrFmib/v7+kuQyLxgAihLhFgAKwRtvvKGLFy+qSZMm+ve//61vv/1Wu3fv1oIFC/Tdd9/Jx8dHbdq0UfPmzdWtWzetXLlS+/fvV0pKip577jl9+eWXyszM1KBBg7R+/XodOHBAn332mVJTU1WzZk1J0qhRo5SamqrExER9/fXX+u677zRjxgz9+uuv+ar54YcfVokSJdS1a1f973//0759+7RhwwYNGTJEhw8flnRpJPkf//iH/vnPf+qHH37Q1q1bNW3aNLe3UaFCBVmWpeXLl+uXX37RmTNn8lUrALiLcAsAhaBKlSratm2b2rRpo1GjRql+/fpq0qSJpk2bphEjRujFF1+UZVn65JNPdM8996hfv36qXr26HnroIe3fv1/R0dHy8fHRsWPH9Nhjj6l69erq2bOnOnTooPHjx0u6NKK7atUqffXVV2ratKmaN2+ujz76SL6++ZthFhQUpE8//VTly5dXjx49VLNmTfXr10+ZmZkKCwuTJPXp00dTpkzRG2+8odq1a6tz58764Ycf3N5GmTJlNH78eD3zzDOKjo7OcxkxAChsljHGeLsIAAAAoDAwcgsAAADbINwCAADANgi3AAAAsA3CLQAAAGyDcAsAAADbINwCAADANgi3AAAAsA3CLQAAAGyDcAsAAADbINwCAADANgi3AAAAsI3/Byt7h7OTZrxhAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "heart_df['sex'] = heart_df['sex'].replace({0: 'female', 1: 'male'})\n", + "plt.figure(figsize=(8, 6))\n", + "sns.boxplot(x='sex', y='chol', data=heart_df)\n", + "plt.title('Cholesterinwerte nach Geschlecht')\n", + "plt.xlabel('Geschlecht')\n", + "plt.ylabel('Cholesterin in mg/dl')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "3617a148-3ae4-4eb9-99d1-c7a6aa78bd17", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Geschlecht Untere_Grenze Obere_Grenze\n", + "0 Männer 234.288517 246.199046\n", + "1 Frauen 249.044612 275.413721\n" + ] + } + ], + "source": [ + "# Konfidenzintervall (95%) für Cholesterin Level jeweils für Männer und Frauen\n", + "from scipy import stats\n", + "\n", + "# Filtern nach Geschlecht und Berechnen des Konfidenzintervalls\n", + "conf_level = 0.95\n", + "chol_men = heart_df.loc[heart_df['sex'] == 'male', 'chol']\n", + "chol_women = heart_df.loc[heart_df['sex'] == 'female', 'chol']\n", + "conf_int_men = stats.t.interval(conf_level, len(chol_men) - 1, loc=chol_men.mean(), scale=stats.sem(chol_men))\n", + "conf_int_women = stats.t.interval(conf_level, len(chol_women) - 1, loc=chol_women.mean(), scale=stats.sem(chol_women))\n", + "\n", + "result_table_men_vs_women = pd.DataFrame({\n", + " 'Geschlecht': ['Männer', 'Frauen'],\n", + " 'Untere_Grenze': [conf_int_men[0], conf_int_women[0]],\n", + " 'Obere_Grenze': [conf_int_men[1], conf_int_women[1]]\n", + "})\n", + "\n", + "print(result_table_men_vs_women)" + ] + }, + { + "cell_type": "markdown", + "id": "1b4ad40f-dd3b-4309-a5f3-a085d042c1eb", + "metadata": {}, + "source": [ + "### Cholesterin im Vergleich zur Erkrankung" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "60f42093-3616-4e2b-8557-56794af3f25b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n" + ] + }, + { + "data": { + "image/png": "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qq9zPc6dO6c777xTP//8s7755pt8/48uBrTLF64o7I8JUsm9366037vvvlvBwcGaOnWq8vLyNG3atCLvY9myZerUqZMWLFjg0J6ZmXld9Xp6emrdunXq0aOHunbtqlWrVikgIMC+/dJze+liORf/2HItAgMD7QH+UkV5vwJwDoIUAKeYMmWKPv/8cz3wwAP66KOP8k1HOnfunFatWpVv2tPVdOnSRYmJifrjjz/so1CS9O6778rb27vQX4q9vb3VuXNn7dy5U02aNCny9KjKlSvrrrvu0u+//66JEyfq119/VWRkZKF/6e7Ro4fc3d31888/W55GdSMJCQlRz5499d577+n8+fOqUKGCRowYYd9eHOepY8eOio2N1fvvv6+HHnrI3r5ixYqrPve2225T5cqVtWfPHss3jI2KipK/v78WLlyoe+65p8TCyejRo/XVV18pKSnJPkXtUkFBQbLZbNq1a5dD+0cffVQi9VyPadOmydfXV48++qjOnDlT4OqGBTEMI9+qn7t27dKmTZssLWRTkObNm2v9+vXq2rWrOnXqpOTkZFWvXl2S7Ctm7tq1y2HU9JNPPrnm1+vYsaM+//xzHT9+3B7k8/Ly9M9//vPaDwJAiSJIAXCKdu3aacGCBRo7dqxatmyphx56SA0bNtS5c+e0c+dOvfnmm2rUqJHlIDVjxgx9+umn6ty5s55++mlVqVJFy5cv12effabY2NgrTn2aN2+e2rdvr9tvv10PPfSQateurczMTP3000/65JNPtHbtWklSv3791KhRI7Vq1UrVqlXTb7/9pldeeUW1atVSRESEJKlx48b2fY4YMUIeHh6qX7++ateurWeffVZTp07VL7/8op49eyogIEBHjx7Vli1bVKlSpUKXhr7RjB49Wp999pnefvtt9ejRw+EX3+I4Tz179tRtt92mmJgYZWRkqGXLltq0aZPeffddSfmnB17Kx8dHr732mkaMGKETJ07orrvusq8S99133+nPP//MNwpy6XNffvll3X///erataseeOABBQUF6aefftJ3332n+fPnX8PZcvTSSy9p6dKlGj9+vCpVquSwhLefn58iIyNlGIaGDRumd955RzfffLOaNm2qLVu2KCEh4bpf/6L9+/cXuHx4aGio5ZHmCRMmyMfHR//zP/+j06dP69VXX71qCO3bt6+ee+45zZgxQx07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56pDhw7OLgsAUEq++uorde7cOV/7iBEjFB8fX/oFAWUAQQoAAAAALOIaKQAAAACwiCAFAAAAABYRpAAAAADAIoIUAAAAAFhEkAIAAAAAiwhSAAAAAGARQQoAAAAALCJIAQAAAIBFBCkAQJlkGIb+/e9/O7sMAEA5RZACALiUkSNHyjAMGYYhDw8PBQUFqVu3bnrnnXeUl5dn73fkyBH16tXLiZUCAMozghQAwOX07NlTR44c0a+//qqkpCR17txZEyZMUN++fXX+/HlJUnBwsDw9PZ1cKQCgvCJIAQBcjqenp4KDg1WzZk21aNFCTz31lD766CMlJSUpPj5eUv6pfU888YTq1asnb29v3XTTTZo+fbrOnTvnsN9Zs2apevXq8vX11f33368nn3xSzZo1s28fOXKkBg4cqH/84x+qUaOGAgMDNW7cOIf9nDx5UsOHD1dAQIC8vb3Vq1cv7d+/3779t99+U79+/RQQEKBKlSqpYcOG+vzzz+3b9+zZo969e8vHx0dBQUG67777dPz48eI9gQCAEkeQAgCUCXfccYeaNm2qlStXFrjd19dX8fHx2rNnj+bNm6e33npLc+fOtW9fvny5nn/+eb344ovavn27wsPDtWDBgnz7WbdunX7++WetW7dOS5YsUXx8vD28SRfC1rZt2/Txxx9r06ZNMk1TvXv3toetcePGKScnR19//bV2796tF198UT4+PpIuTEfs2LGjmjVrpm3btmnVqlU6evSohgwZUoxnCgBQGgzTNE1nFwEAwEUjR47UqVOnClxI4p577tGuXbu0Z88eGYahxMREDRw4sMD9vPTSS3r//fe1bds2SdKtt96qVq1aaf78+fY+7du31+nTp/Xtt9/aX/urr77Szz//LDc3N0nSkCFDVKFCBa1YsUL79+9XvXr1tHHjRkVFRUmS0tLSFBYWpiVLluhvf/ubmjRpojvvvFMzZszIV9PTTz+t//znP/riiy/sbYcPH1ZYWJj27dunevXqXcspAwA4ASNSAIAywzRNGYZR4LZ//etfat++vYKDg+Xj46Pp06fr4MGD9u379u1TmzZtHJ5z+deS1LBhQ3uIkqQaNWro2LFjkqS9e/fK3d1dbdu2tW8PDAxU/fr1tXfvXknSI488olmzZum2227TjBkztGvXLnvf7du3a926dfLx8bE/brnlFknSzz//bPV0AACciCAFACgz9u7dqzp16uRr37x5s+655x716tVLn376qXbu3KmpU6fq7NmzDv0uD2EFTcrw8PDI95yLqwUWNonj0oB3//3365dfftF9992n3bt3q1WrVnrttdckSXl5eerXr5++/fZbh8f+/fvVoUOHIp4FAIArIEgBAMqEtWvXavfu3brzzjvzbdu4caNq1aqlqVOnqlWrVoqIiNBvv/3m0Kd+/frasmWLQ9vFaX9FFRkZqfPnz+s///mPvS0tLU0//vijGjRoYG8LCwvTgw8+qJUrVyomJkZvvfWWJKlFixb64YcfVLt2bdWtW9fhUalSJUu1AACciyAFAHA5OTk5Sk1N1e+//64dO3Zo9uzZGjBggPr27avhw4fn61+3bl0dPHhQK1as0M8//6xXX31ViYmJDn3Gjx+vRYsWacmSJdq/f79mzZqlXbt2FTpVsCAREREaMGCAHnjgAW3YsEHfffedhg0bppo1a2rAgAGSpIkTJ+qLL77QgQMHtGPHDq1du9YessaNG6cTJ07o3nvv1ZYtW/TLL7/oyy+/1KhRo5Sbm3sdZwwAUNoIUgAAl7Nq1SrVqFFDtWvXVs+ePbVu3Tq9+uqr+uijjxyuX7powIABevTRR/Xwww+rWbNmSklJ0fTp0x36DB06VFOmTNHkyZPVokULHThwQCNHjpTNZrNU2+LFi9WyZUv17dtX7dq1k2ma+vzzz+1TAnNzczVu3Dg1aNBAPXv2VP369fXGG29IkkJCQrRx40bl5uaqR48eatSokSZMmCB/f39VqMBHMgCUJazaBwAot7p166bg4GAtXbrU2aUAAMoYd2cXAABAafjrr7+0cOFC9ejRQ25ubnrvvfe0evVqJScnO7s0AEAZxIgUAKBcyMrKUr9+/bRjxw7l5OSofv36mjZtmgYPHuzs0gAAZRBBCgAAAAAs4spWAAAAALCIIAUAAAAAFhGkAAAAAMAighQAAAAAWESQAgAAAACLCFIAAAAAYBFBCgAAAAAsIkgBAAAAgEX/H44aZc4cfJArAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Boxplot gruppiert nach Diagnose\n", + "plt.figure(figsize=(10, 6))\n", + "sns.boxplot(x='healthy', y='chol', data=heart_df)\n", + "plt.title('Cholesterin im Vergleich zur Erkrankung')\n", + "plt.xlabel('Diagnose')\n", + "plt.ylabel('Cholesterin in mg/dl')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "7bef4e62-968e-4a2f-9948-063fac1e7a88", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Diagnose Untere_Grenze Obere_Grenze\n", + "0 Gesund 234.397652 250.882836\n", + "1 Krank 243.175250 259.774391\n" + ] + } + ], + "source": [ + "# Filtern nach healthy und Berechnen des Konfidenzintervalls\n", + "conf_level = 0.95\n", + "chol_healthy = heart_df.loc[heart_df['healthy'] == 1, 'chol']\n", + "chol_sick = heart_df.loc[heart_df['healthy'] == 0, 'chol']\n", + "conf_int_healthy = stats.t.interval(conf_level, len(chol_healthy) - 1, loc=chol_healthy.mean(), scale=stats.sem(chol_healthy))\n", + "conf_int_sick = stats.t.interval(conf_level, len(chol_sick) - 1, loc=chol_sick.mean(), scale=stats.sem(chol_sick))\n", + "\n", + "result_table_healthy_vs_sick = pd.DataFrame({\n", + " 'Diagnose': ['Gesund', 'Krank'],\n", + " 'Untere_Grenze': [conf_int_healthy[0], conf_int_sick[0]],\n", + " 'Obere_Grenze': [conf_int_healthy[1], conf_int_sick[1]]\n", + "})\n", + "\n", + "print(result_table_healthy_vs_sick)" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "2aa2b03a-1da6-4846-be5d-1070fa1ae43e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "t-Statistik: 1.4829209163941466\n", + "p-Wert: 0.06957083510218263\n", + "Der p-Wert ist größer als oder gleich 0.05, daher wird die Nullhypothese nicht abgelehnt.\n", + "Es gibt keine signifikanten Hinweise darauf, dass der Cholesterinwert bei kranken Personen höher ist als bei gesunden Personen.\n" + ] + } + ], + "source": [ + "# t-Test\n", + "# Nullhypothese (HO) = Cholesterinwert bei Kranken ist gleich oder kleiner wie bei Gesunden\n", + "# Alternativhypothese (H1) Cholesterinwert bei Kranken ist höher als bei Gesunden\n", + "\n", + "from scipy.stats import ttest_ind\n", + "\n", + "# Daten für gesunde und kranke Personen\n", + "chol_healthy = heart_df.loc[heart_df['healthy'] == 1, 'chol']\n", + "chol_sick = heart_df.loc[heart_df['healthy'] == 0, 'chol']\n", + "\n", + "# Durchführung des t-Tests\n", + "t_statistic, p_value = ttest_ind(chol_sick, chol_healthy, alternative='greater')\n", + "\n", + "# Ausgabe der Ergebnisse\n", + "print(\"t-Statistik:\", t_statistic)\n", + "print(\"p-Wert:\", p_value)\n", + "\n", + "# Überprüfung der Nullhypothese\n", + "if p_value < 0.05:\n", + " print(\"Der p-Wert ist kleiner als 0.05, daher wird die Nullhypothese abgelehnt.\")\n", + " print(\"Es gibt signifikante Hinweise darauf, dass der Cholesterinwert bei kranken Personen höher ist als bei gesunden Personen.\")\n", + "else:\n", + " print(\"Der p-Wert ist größer als oder gleich 0.05, daher wird die Nullhypothese nicht abgelehnt.\")\n", + " print(\"Es gibt keine signifikanten Hinweise darauf, dass der Cholesterinwert bei kranken Personen höher ist als bei gesunden Personen.\")" + ] + }, + { + "cell_type": "markdown", + "id": "c3852db8-3787-4ddf-aed7-80396f7a89ac", + "metadata": {}, + "source": [ + "### Systolischer Ruheblutdruck" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "f063878c-5866-4a19-b065-a41d3e26e290", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/Users/nicole/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n" + ] + }, + { + "data": { + "image/png": "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M9PWfvHiRX377bcO53X05161alVVqlRJs2bNylUI5yUqKkqbNm2Sj4+PHnroIR05csThTADyx6Ge28TERI0ePVqffPKJwsPD1aBBA9WpU0d+fn46f/681q1bp3feeUdRUVEaM2aMunfv7urcAAqJSpUq6YUXXtC///1vXbhwQR06dLCNwZwwYYJiYmIUFxeX63XJycnq2rWr/vGPfyg1NVVjxoyRr6+vRowYYTvmgw8+UPv27dW2bVv17t1b5cqV0/nz53XgwAHt3r1bX3zxhcM5Fy1apGLFiql169a22RJq1659wxvBbuT111/X8uXL1aRJE40cOVLR0dG6cOGCVqxYoSFDhuiee+6xO97Ly0uffvqpnn76af3f//2f5s6dqyeeeOKG569fv76qVaumYcOG6erVqypdurQWL16szZs353l8cHCwnnvuOSUkJKhq1apatmyZPvroIz333HOqUKGCJOnxxx/XJ598og4dOmjgwIFq0KCBvLy8dPr0aa1bt04PP/ywunbtaurn8GdWq1Xbtm2zPT9z5ozee+89paSk/O3qbk899ZQ++OADPfnkk/rHP/6hc+fOaeLEiQoICLA7zt/fX1FRUfr666/VsmVLBQUFKSQkRBUrVtQbb7yhdu3aqXXr1ho6dKhycnL09ttvq0SJEjp//rxDnyE8PFytWrXS+PHjVbp0aUVFRWnt2rVatGhRrmP/85//qHPnzrr//vs1ePBgVahQQQkJCVq5cmWuX6Kka8MgNmzYoLZt29rGX7t7ZTmgSDMcEBoaagwdOtT45ZdfbnjM5cuXjQULFhgNGjQw/v3vfztyWgBFhNVqNd5//30jJibGKF68uOHt7W1UqVLFePnll42LFy/aHbtu3TpDkjFv3jzjxRdfNEJDQw0fHx/joYceMnbu3Jnr3D///LMRGxtrlClTxvDy8jLCw8ONFi1aGDNmzLAdM3v2bEOSsWPHjlyvHzNmjCHJ2LVrl9G5c2ejZMmShr+/v/HEE08Yv//+u92xTZs2NZo2bWrXJskYM2aMXdupU6eMvn37GuHh4YaXl5cRERFhxMbG2s53/TN+8cUXdj+jF1980fDw8DA++uijm/48Dx8+bLRp08YICAgwQkNDjQEDBhhLly41JBnr1q2zy3vvvfca69evN2JiYgwfHx+jbNmyxsiRI40rV67YnfPKlSvGO++8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27AYhmG4O4S7paWlKTAwUKmpqYy/hctkZGTY5nVevny5/Pz83JwIAAqG6xpuJUfrtQItvwsAAAAUJhS3AAAAKDIobgEAAFBkOHRDWbdu3RQfH6+AgIC/vWls0aJFTgkGAAAAmOVQcRsYGGhb8SswMNClgQAAAID8cqi4nT17dp7PAQAAgMIkX2Nur169qjVr1uiDDz7QxYsXJUm//fabLl265NRwAAAAgBmmF3E4efKk2rVrp4SEBGVlZal169by9/fXxIkTlZmZqRkzZrgiJwAAAPC3TPfcDhw4UDExMUpJSbGbrLlr165au3atU8MBAAAAZpjuud28ebN++OEHeXt727VHRUXpzJkzTgsGAAAAmGW659ZqtSonJydX++nTp+Xv7++UUAAAAEB+mC5uW7durSlTpti2LRaLLl26pDFjxqhDhw7OzAYAAACYYnpYwuTJk9W8eXPVqFFDmZmZiouL05EjRxQSEqJPP/3UFRkBAAAAh5gubiMiIrRnzx59+umn2r17t6xWq/r166cePXrY3WAGAAAA3Gqmi1tJ8vPzU9++fdW3b19n5wEAAADyLV/F7aFDhzRt2jQdOHBAFotF99xzj1544QXdc889zs4HAAAAOMz0DWVffvmlatasqV27dql27dqqVauWdu/erejoaH3xxReuyAgAAAA4xHTP7fDhwzVixAi9/vrrdu1jxozRyy+/rMcee8xp4QAAAAAzTPfcJiUlqWfPnrnan3zySSUlJTklFAAAAJAfpovbZs2aadOmTbnaN2/erIceesgpoQAAAID8cGhYwjfffGN73qVLF7388svatWuX7r//fknStm3b9MUXX2jcuHGuSQkAAAA4wGIYhvF3B3l4ONbBa7FY8lyat7BLS0tTYGCgUlNTFRAQ4O44KKIyMjLUvn17SdLy5cuZFxrAbY/rGm4lR+s1h3purVar04IBAAAArmJ6zC0AAABQWFHcAgAAoMiguAUAAECRQXELAACAIoPiFgAAAEWG6eV309LS8my3WCzy8fGRt7d3gUMBAAAA+WG6uC1VqpQsFssN95cvX169e/fWmDFjHJ4fFwAAAHAG08VtfHy8Xn31VfXu3VsNGjSQYRjasWOH5syZo9dee01//PGH3nnnHfn4+GjkyJGuyAwAAADkyXRxO2fOHL377ruKjY21tXXp0kXR0dH64IMPtHbt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bgEAAOA2DhW3x48fd3UOAAAAoMBMj7kFAAAACivTU4H93apks2bNyncYAAAAoCBMF7cpKSl221euXNG+fft04cIFtWjRwmnBAAAAALNMF7eLFy/O1Wa1WtW/f3/dfffdTgkFAAAA5IdTxtx6eHho8ODBuWZVAAAAAG4lp91QduzYMV29etVZpwMAAABMMz0sYciQIXbbhmEoMTFRS5cuVa9evZwWDAAAADDLdHH7008/2W17eHgoNDRU77777t/OpAAAAAC4kunidt26dTfcd+bMGZUrV65AgQAAAID8csqY26SkJA0YMECVK1d2xukAAACAfHG4uL1w4YJ69Oih0NBQRURE6L333pPVatXo0aN19913a9u2bSzgAAAAALdyeFjCyJEjtXHjRvXq1UsrVqzQ4MGDtWLFCmVmZmr58uVq2rSpK3MCAAAAf8vh4nbp0qWaPXu2WrVqpf79+6ty5cqqWrWqpkyZ4sJ4AAAAgOMcHpbw22+/qUaNGpKku+++W76+vnr66addFgwAAAAwy+Hi1mq1ysvLy7bt6empEiVKuCQUAAAAkB8OD0swDEO9e/eWj4+PJCkzM1PPPvtsrgJ30aJFzk0IAAAAOMjh4vavq489+eSTTg8DAAAAFITDxe3s2bNdmQMAAAAoMKcs4gAAAAAUBhS3AAAAKDIobgEAAFBkUNwCAACgyDBV3F65ckV9+vTR//73P1flAQAAAPLNVHHr5eWlxYsXuyoLAAAAUCCmhyV07dpVS5YscUEUAAAAoGAcnuf2usqVK+uNN97Qli1bVK9evVwrlL344otOCwcAAACYYbq4/fjjj1WqVCnt2rVLu3btsttnsVgobgEAAOA2povb48ePuyIHAAAAUGD5ngosOztbhw4d0tWrV52ZBwAAAMg308Xt5cuX1a9fPxUvXlz33nuvEhISJF0bazthwgSnBwQAAAAcZbq4HTFihH7++WetX79evr6+tvZWrVrps88+c2o4AAAAwAzTY26XLFmizz77TPfff78sFoutvUaNGjp27JhTwwEAAABmmO65/eOPP1SmTJlc7enp6XbFLgAAAHCrmS5u69evr6VLl9q2rxe0H330kR544AHnJQMAAABMMj0sYfz48WrXrp3279+vq1evaurUqfr111+1detWbdiwwRUZAQAAAIeY7rlt1KiRfvjhB12+fFmVKlXS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cqWqVq2qp59+Wj179lRQUJDdMb/99pvKly8vq9VqLjFQxDHtHICihusaChvTPbdlypTRhg0bbIs35KVs2bI6fvx4gYIBAAAAZpkubmfOnPm3x1gsFkVFReUrEFCU+fj4aMyYMfLx8XF3FABwCq5rKGwcHpawfft2nT9/Xu3bt7e1zZ07V2PGjFF6eroeeeQRTZs2jb/cAAAAcBuH5+saO3as9u7da9v+5Zdf1K9fP7Vq1UqvvPKKvv32W40fP94lIQEAAABHONxzW7ZsWX377beKiYmRJL366qvasGGDNm/eLEn64osvNGbMGO3fv991aQEAAICbcLjnNiUlRWFhYbbtDRs2qF27drbt+vXr69SpU85NBwAAAJjgcHEbFhZmmwEhOztbu3fvtpsx4eLFi/Ly8nJ+QuAO0Lt3bz3yyCPujgGgCDMMQ//85z8VFBQki8WiPXv2uCXHiRMn3Pr+KPocni2hXbt2euWVV/T2229ryZIlKl68uB566CHb/r1796pSpUouCQkAAApmxYoVio+P1/r163X33XcrJCTE3ZEAl3C4uH3zzTfVrVs3NW3aVCVLltScOXPk7e1t2z9r1iy1adPGJSEBAEDBHDt2TGXLllWjRo3cHQVwKYeHJYSGhmrTpk1KSUlRSkqKunbtarf/+g1lQFHXrFkzDRgwQIMGDVLp0qUVFhamDz/8UOnp6erTp4/8/f1VqVIlLV++XJKUk5Ojfv366a677pKfn5+qVaumqVOn3vQ9DMPQxIkTdffdd8vPz0+1a9fWl19+eSs+HoAiqHfv3howYIASEhJksVhUsWLFv73OrF+/XhaLRStXrlTdunXl5+enFi1aKDk5WcuXL1f16tUVEBCgJ554QpcvX7a9bsWKFWrcuLFKlSql4OBgderUSceOHbtpvv3796tDhw4qWbKkwsLC9NRTT+ns2bMu+3mgaHO4uL0uMDBQnp6eudqDgoLsenKBomzOnDkKCQnRjz/+qAEDBui5557TY489pkaNGmn37t1q27atnnrqKV2+fFlWq1Xly5fX559/rv3792v06NEaOXKkPv/88xue/7XXXtPs2bP1/vvv69dff9XgwYP15JNPasOGDbfwUwIoKqZOnarXX39d5cuXV2Jionbs2OHwdWbs2LGaPn26tmzZolOnTik2NlZTpkzRggULtHTpUq1evVrTpk2zHZ+enq4hQ4Zox44dWrt2rTw8PNS1a1dZrdY8syUmJqpp06aqU6eOdu7cqRUrVuj3339XbGysS38mKMIMAKY0bdrUaNy4sW376tWrRokSJYynnnrK1paYmGhIMrZu3ZrnOfr37288+uijtu1evXoZDz/8sGEYhnHp0iXD19fX2LJli91r+vXrZzzxxBNO/CQA7iSTJ082oqKiDMNw7Dqzbt06Q5KxZs0a2/7x48cbkoxjx47Z2p555hmjbdu2N3zf5ORkQ5Lxyy+/GIZhGMePHzckGT/99JNhGIYxatQoo02bNnavOXXqlCHJOHToUL4/L+5cppffBSDVqlXL9tzT01PBwcGKjo62tV2fNi85OVmSNGPGDH388cc6efKkMjIylJ2drTp16uR57v379yszM1OtW7e2a8/OzlbdunWd/EkA3InMXGf+fL0LCwtT8eLFdffdd9u1/fjjj7btY8eOadSoUdq2bZvOnj1r67FNSEhQzZo1c2XZtWuX1q1bp5IlS+bad+zYMVWtWjV/HxJ3LIpbIB/+Ou2dxWKxa7NYLJIkq9Wqzz//XIMHD9a7776rBx54QP7+/vr3v/+t7du353nu6/8jWLp0qcqVK2e3j+WtATiDmevMX69teV3//jzkoHPnzoqMjNRHH32kiIgIWa1W1axZU9nZ2TfM0rlzZ7399tu59pUtW9bcBwNEcQu43KZNm9SoUSP179/f1nazmytq1KghHx8fJSQkqGnTprciIoA7jKuuM+fOndOBAwf0wQcf2KYLvb6S6Y3cd999+uqrr1SxYkUVK0ZZgoLjbxHgYpUrV9bcuXO1cuVK3XXXXZo3b5527Nihu+66K8/j/f39NWzYMA0ePFhWq1WNGzdWWlqatmzZopIlS6pXr163+BMAKGpcdZ0pXbq0goOD9eGHH6ps2bJKSEjQK6+8ctPXPP/88/roo4/0xBNP6KWXXlJISIiOHj2qhQsX6qOPPsrzJnbgZihuARd79tlntWfPHnXv3l0Wi0VPPPGE+vfvb5sqLC9vvPGGypQpo/Hjx+t///ufSpUqpfvuu08jR468hckBFGWuuM54eHho4cKFevHFF1WzZk1Vq1ZN7733npo1a3bD10REROiHH37Qyy+/rLZt2yorK0tRUVFq166dPDxMT+oEyGIYhuHuEAAAAIAz8CsRAAAAigyKWwAAABQZFLcAAAAoMihuAQAAUGRQ3AIAAKDIoLgFAABAkUFxCwAAgCKD4hYAAABFBsUtABQRzZo106BBg256jMVi0ZIlS5z2ns4+HwAUFMUtADhJUlKSBg4cqMqVK8vX11dhYWFq3LixZsyYocuXL7s7nlusX79eFotFFy5ccHcUAHeIYu4OAABFwf/+9z89+OCDKlWqlN566y1FR0fr6tWrOnz4sGbNmqWIiAh16dLF3TEBoMij5xYAnKB///4qVqyYdu7cqdjYWFWvXl3R0dF69NFHtXTpUnXu3FmSlJqaqn/+858qU6aMAgIC1KJFC/3888+28/z8889q3ry5/P39FRAQoHr16mnnzp22/T/88IOaNm2q4sWLq3Tp0mrbtq1SUlJs+61Wq4YPH66goCCFh4dr7NixN8195swZde/eXaVLl1ZwcLAefvhhnThxwu6YWbNm6d5775WPj4/Kli2rF154wW7/2bNn1bVrVxUvXlxVqlTRN998I0k6ceKEmjdvLkkqXbq0LBaLevfubfZHCwCmUNwCQAGdO3dOq1at0vPPP68SJUrkeYzFYpFhGOrYsaOSkpK0bNky7dq1S/fdd59atmyp8+fPS5J69Oih8uXLa8eOHdq1a5deeeUVeXl5SZL27Nmjli1b6t5779XWrVu1efNmde7cWTk5Obb3mTNnjkqUKKHt27dr4sSJev3117V69eo8M12+fFnNmzdXyZIltXHjRm3evFklS5ZUu3btlJ2dLUl6//339fzzz+uf//ynfvnlF33zzTeqXLmy3XnGjRun2NhY7d27Vx06dFCPHj10/vx5RUZG6quvvpIkHTp0SImJiZo6dWrBftgA8HcMAECBbNu2zZBkLFq0yK49ODjYKFGihFGiRAlj+PDhxtq1a42AgAAjMzPT7rhKlSoZH3zwgWEYhuHv72/Ex8fn+T5PPPGE8eCDD94wR9OmTY3GjRvbtdWvX994+eWXbduSjMWLFxuGYRgzZ840qlWrZlitVtv+rKwsw8/Pz1i5cqVhGIYRERFhvPrqqzd8T0nGa6+9Ztu+dOmSYbFYjOXLlxuGYRjr1q0zJBkpKSk3PAcAOBNjbgHASSwWi932jz/+KKvVqh49eigrK0u7du3SpUuXFBwcbHdcRkaGjh07JkkaMmSInn76ac2bN0+tWrXSY489pkqVKkm61nP72GOP3TRDrVq17LbLli2r5OTkPI/dtWuXjh49Kn9/f7v2zMxMHTt2TMnJyfrtt9/UsmVLh9+zRIkS8vf3v+F7AoCrUdwCQAFVrlxZFotFBw8etGu/++67JUl+fn6Sro2HLVu2rNavX5/rHKVKlZIkjR07VnFxcVq6dKmWL1+uMWPGaOHCheratavtPDdzfQjDdRaLRVarNc9jrVar6tWrp08++STXvtDQUHl4ODZyzcx7AoCrMeYWAAooODhYrVu31vTp05Wenn7D4+677z4lJSWpWLFiqly5st0jJCTEdlzVqlU1ePBgrVq1St26ddPs2bMlXeshXbt2rdNy33fffTpy5IjKlCmTK09gYKD8/f1VsWLFAr2nt7e3JNmNCwYAV6K4BQAn+O9//6urV68qJiZGn332mQ4cOKBDhw5p/vz5OnjwoDw9PdWqVSs98MADeuSRR7Ry5UqdOHFCW7Zs0WuvvaadO3cqIyNDL7zwgtavX6+TJ0/qhx9+0I4dO1S9enVJ0ogRI7Rjxw71799fe/fu1cGDB/X+++/r7Nmz+crco0cPhYSE6OGHH9amTZt0/PhxbdiwQQMHDtTp06clXetJfvfdd/Xee+/pyJEj2r17t6ZNm+bwe0RFRclisei7777TH3/8oUuXLuUrKwA4iuIWAJygUqVK+umnn9SqVSuNGDFCtWvXVkxMjKZNm6Zhw4bpjTfekMVi0bJly9SkSRP17dtXVatW1eOPP64TJ04oLCxMnp6eOnfunHr27KmqVasqNjZW7du317hx4yRd69FdtWqVfv75ZzVo0EAPPPCAvv76axUrlr8RZsWLF9fGjRtVoUIFdevWTdWrV1ffvn2VkZGhgIAASVKvXr00ZcoU/fe//9W9996rTp066ciRIw6/R7ly5TRu3Di98sorCgsLyzWNGAA4m8UwDMPdIQAAAABnoOcWAAAARQbFLQAAAIoMilsAAAAUGRS3AAAAKDIobgEAAFBkUNwCAACgyKC4BQAAQJFBcQsAAIAig+IWAAAARQbFLQAAAIoMilsAAAAUGf8fJ8JGhzCxllsAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8, 6))\n", + "sns.boxplot(x='sex', y='trestbps', data=heart_df)\n", + "plt.title('Überblick über Blutdruck')\n", + "plt.xlabel('Geschlecht')\n", + "plt.ylabel('Systolischer Ruheblutdruck (in mmHg bei Aufnahme ins Krankenhaus)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "f20c6b80-bac5-489e-98e1-b5f2d9d90615", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Diagnose Untere_Grenze Obere_Grenze\n", + "0 Gesund 126.751354 131.748646\n", + "1 Krank 131.420542 137.716148\n" + ] + } + ], + "source": [ + "# Filtern nach goal und Berechnen des Konfidenzintervalls\n", + "conf_level = 0.95\n", + "blutdruck_gesund = heart_df.loc[heart_df['healthy'] == 1, 'trestbps']\n", + "blutdruck_krank = heart_df.loc[heart_df['healthy'] == 0, 'trestbps']\n", + "conf_int_gesund = stats.t.interval(conf_level, len(blutdruck_gesund) - 1, loc=blutdruck_gesund.mean(), scale=stats.sem(blutdruck_gesund))\n", + "conf_int_krank = stats.t.interval(conf_level, len(blutdruck_krank) - 1, loc=blutdruck_krank.mean(), scale=stats.sem(blutdruck_krank))\n", + "\n", + "# Erstellen der Tabelle\n", + "result_table_blutdruck = pd.DataFrame({\n", + " 'Diagnose': ['Gesund', 'Krank'],\n", + " 'Untere_Grenze': [conf_int_gesund[0], conf_int_krank[0]],\n", + " 'Obere_Grenze': [conf_int_gesund[1], conf_int_krank[1]]\n", + "})\n", + "\n", + "# Anzeige der Tabelle\n", + "print(result_table_blutdruck)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "bc919e7f-2b7b-41c1-a5b3-a97d61baa6ca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "t-Statistik: 2.647004396805282\n", + "p-Wert: 0.004274134464297464\n", + "Der p-Wert ist kleiner als 0.05, daher wird die Nullhypothese abgelehnt.\n", + "Es gibt signifikante Hinweise darauf, dass der Blutdruck bei kranken Personen höher ist als bei gesunden Personen.\n" + ] + } + ], + "source": [ + "# t-Test\n", + "# H0 Kranke haben einen niedrigeren oder gleichen Blutdruck wie Gesunde\n", + "# H1 Kranke haben einen höheren BLutdruck als Gesunde\n", + "\n", + "# Daten für gesunde und kranke Personen\n", + "blutdruck_healthy = heart_df.loc[heart_df['healthy'] == 1, 'trestbps']\n", + "blutdruck_sick = heart_df.loc[heart_df['healthy'] == 0, 'trestbps']\n", + "\n", + "# Durchführung des t-Tests\n", + "t_statistic, p_value = ttest_ind(blutdruck_sick, blutdruck_healthy, alternative='greater')\n", + "\n", + "print(\"t-Statistik:\", t_statistic)\n", + "print(\"p-Wert:\", p_value)\n", + "\n", + "# Überprüfung Nullhypothese\n", + "if p_value < 0.05:\n", + " print(\"Der p-Wert ist kleiner als 0.05, daher wird die Nullhypothese abgelehnt.\")\n", + " print(\"Es gibt signifikante Hinweise darauf, dass der Blutdruck bei kranken Personen höher ist als bei gesunden Personen.\")\n", + "else:\n", + " print(\"Der p-Wert ist größer als oder gleich 0.05, daher wird die Nullhypothese nicht abgelehnt.\")\n", + " print(\"Es gibt keine signifikanten Hinweise darauf, dass der Blutdruck bei kranken Personen höher ist als bei gesunden Personen.\")" + ] + }, + { + "cell_type": "markdown", + "id": "4a055d25-1c55-4a3f-a201-4ea252cac4dd", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Weitere Dinge die wir machen könnten\n", + "- Korrelationsanalyse\n", + "- logistische Regression, KNN, Entscheidungsbäume\n", + "- ROC/AUC Kurve plotten für Modelle\n", + "\n", + "\n", + "\n", + "- Classification:\n", + "- SVMs\n", + "- Decision Trees\n", + "- K-Nearest Neighbor\n", + "- Random Forest\n", + "\n", + "Dimensionality Reduction\n", + "- PCA\n", + "\n", + "Regression:\n", + "- lineare \n", + "- logistische\n", + "\n", + "Clustering:\n", + "- hierarchisch -> bäume\n", + "- K-means clustering\n", + "\n", + "Statistik:\n", + "- Hypothesen" + ] + } + ], + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}