import pandas as pd
import numpy as np
# Visualisierungen
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
plt.style.use('Solarize_Light2')
from IPython.core.pylabtools import figsize
figsize(10, 8)
# Interface zum System
import os
os.chdir('D:\Data\Projects\Klassifikation\Diabetes')
# Anzeige
pd.set_option('display.float_format', lambda x: '%.3f' % x)
df = pd.read_csv('diabetes.csv')
print(df.shape)
df.head()
df.dtypes
missing = pd.DataFrame(df.isnull().sum()).rename(columns = {0: 'total'})
missing['percent'] = missing['total'] / len(df)*100
missing.sort_values('percent', ascending = False).head()
df.describe()
Bei Glucose, BloodPressure, SkinThickness, Insulin, BMI und DiabetesPedigreeFunction gibt es viele Werte, die 0 sind, die nicht sein können. Diese werden ersetzt mit dem Mittelwert des fehlenden Featues der Frauen aus der gleichen Altersgruppe.
df.isin(['0']).sum(axis=0)
df.loc[df.Glucose == 0]
df['Glucose'] = df['Glucose'].replace({0: df['Glucose'].median()})
df['BloodPressure'] = df['BloodPressure'].replace({0: df['BloodPressure'].median()})
df['SkinThickness'] = df['SkinThickness'].replace({0: df['SkinThickness'].median()})
df['Insulin'] = df['Insulin'].replace({0: df['Insulin'].median()})
df['BMI'] = df['BMI'].replace({0: df['BMI'].median()})
df.describe()
ax = sns.countplot(x="Outcome", data=df, palette="Set3")
Der Datensatz ist unausgeglichen, es gibt viel mehr Frauen ohne Diabetes.
Dies muss später beim Erstellen der Train und Test Datensätze, beim Modeling und bei der Auswahl der Metrik berücksichtigt werden.
plt.hist(df.Age);
df.groupby('Age')['BloodPressure'].mean().plot()
df.hist(figsize=(10,8));
df.plot(kind= 'box' , subplots=True, layout=(3,3), sharex=False, sharey=False, figsize=(14,14));
plt.figure(figsize=(12, 12))
for i, j in enumerate(df.columns[:-1]):
plt.subplot(4, 2, i + 1)
sns.kdeplot(df[j], color = 'green')
plt.title('Distribution of %s' % j)
plt.tight_layout()
# Density Plots der Features in Abhängigkeit der Zielvariablen
plt.figure(figsize=(12, 12))
# Plot the distribution of each variable colored
# by the relation to the median grade
# mit zwei Variablen durch Spalten iter
# i zählt einfach nur mit enumerate, j greift auf Spaltentitel zu
for i, j in enumerate(df.columns[:-1]):
#Gundgrid ist 3x2, füge nach und nach ein Bild hinzu
plt.subplot(4, 2, i + 1)
# alle Reihen, die ein above oder below haben, auswählen
diabetes = df[df['Outcome'] == 1]
no_diabetes = df[df['Outcome'] == 0]
# von diesen Reihen die Spalten zeichnen
sns.kdeplot(diabetes[j], label = 'Diabetes', color = 'red')
sns.kdeplot(no_diabetes[j], label = 'No Diabetes', color = 'green')
# für den Titel die jeweilige Spaltenüberschrift nehmen
plt.legend(); plt.title('Distribution of %s' % j)
plt.tight_layout()
import itertools
columns=df.columns[:8]
plt.subplots(figsize=(18,15))
length=len(columns)
for i,j in itertools.zip_longest(columns,range(length)):
plt.subplot((length/2),3,j+1)
plt.subplots_adjust(wspace=0.2,hspace=0.5)
df[i].hist(bins=20,edgecolor='black')
plt.title(i)
plt.show()
sns.pairplot(df, hue = 'Outcome', vars = df.columns[:8], diag_kind = 'kde');
df.corr()['Outcome'].sort_values(ascending=False)
plt.figure(figsize=(15, 12))
sns.heatmap(df.corr(), annot = True, cmap= 'viridis');