import pandas as pd # Libreria para tratamiento de DataFrame
import numpy as np # Libreria de algebra lineal
import matplotlib.pyplot as plt # Libreria gráfica
import seaborn as sns # Libreria Gráfica
from sklearn import metrics # Validar nuestro metodo
from sklearn.model_selection import train_test_split # Entrenar y divir la información
from sklearn.linear_model import LogisticRegression # Regresión logistica
# Lectura del dataset
diabetes = pd.read_csv("/work/Diabetes.csv")
# Primeras 5 filas del dataset
diabetes.head()
# ¿Que columnas tienen los datos?
diabetes.columns
# ¿Que tamaño tiene el dataset?
diabetes.shape
# ¿Hay datos nulos?
diabetes.info()
# Como se distribuyen las variables numéricas
diabetes.describe()
# ¿Como se comportan las variables categoricas?
diabetes.describe(include=["O"])
# Renombramos algunas columnas
diabetes = diabetes.rename(columns={"Cholesterol":"Colesterol",
"Glucose":"Glucosa",
"HDL Chol": "HDL colesterol",
"Age":"Edad",
"Gender":"Género",
"Height":"Altura",
"Weight":"Peso",
"Systolic BP":"Presión arterial alta",
"Diastolic BP": "Presión arterial baja",
"waist":"Cintura",
"hip":"Cadera"})
# Observamos el cambio de los nombres de las columnas
diabetes.columns
# Procedemos a eliminar columnas
diabetes = diabetes.drop(["Patient number",
"Chol/HDL ratio",
"BMI",
"Waist/hip ratio"], axis = 1)
# Gráficamos la variable dependiente
plt.figure(figsize=(8,5))
sns.countplot(diabetes['Diabetes'])
plt.title("Personas con o sin diabetes")
plt.xlabel("Diabetes")
plt.show()
# Edad en función del género
plt.figure(figsize=(8,5))
sns.barplot(data = diabetes, x = "Diabetes", y = "Edad",
hue = "Género", palette = "rocket", ci = None)
plt.title("Edad en función del género")
plt.xlabel("Diabetes")
plt.ylabel("Edad")
plt.show()
# Colesterol en función del género
plt.figure(figsize=(8,5))
sns.barplot(data = diabetes, x = "Diabetes", y = "Colesterol",
hue = "Género", palette = "crest", ci = None)
plt.title("Colesterol en función del género")
plt.xlabel("Diabetes")
plt.ylabel("Colesterol")
plt.show()
# Glucosa en función del género
plt.figure(figsize=(8,5))
sns.barplot(data = diabetes, x = "Diabetes", y = "Glucosa",
hue = "Género", palette = "magma", ci = None)
plt.title("Glucosa en función del género")
plt.xlabel("Diabetes")
plt.ylabel("Glucosa")
plt.show()
# HDL colesterol en función del género
plt.figure(figsize=(8,5))
sns.barplot(data = diabetes, x = "Diabetes", y = "HDL colesterol",
hue = "Género", palette = "cubehelix", ci = None)
plt.title("HDL colesterol en función del género")
plt.xlabel("Diabetes")
plt.ylabel("HDL colesterol")
plt.show()
# Peso en función del género
plt.figure(figsize=(8,5))
sns.barplot(data = diabetes, x = "Diabetes", y = "Peso",
hue = "Género", palette = "YlOrBr", ci = None)
plt.title("Peso en función del género")
plt.xlabel("Diabetes")
plt.ylabel("Peso")
plt.show()
# Creación de la variable dummy
diabetes["Diabetes"] = diabetes.Diabetes.map({"No diabetes":0,
"Diabetes":1})
diabetes["Género"] = diabetes.Género.map({"female":0,
"male":1})
# Observamos nuevamente la información de nuestras variables
diabetes.info()
# Matriz de correlación
diabetes.corr()
# Gráfica de matriz de correlación
plt.figure(figsize=(10,6))
sns.heatmap(diabetes.corr(), vmax = 0.9, square= True)
plt.title("Matriz de correlación de Pearson")
plt.show()
# Creamos nuestra varible dependiente y independientes
X = diabetes.drop(["Diabetes"],axis=1) # Varibles independientes o explicativas
Y = diabetes["Diabetes"] # Variable dependiente en este caso si tiene o no diabetes
# Dividimos nuestros datos
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size= 0.2, random_state= 0)
# Procedemos aplicar nuestro algoritmo
logreg = LogisticRegression()
logreg.fit(X_train, Y_train) # Ejecución del modelo
Y_pred = logreg.predict(X_test)
# Ejecutamos y_pred para observar los datos que se ha aplicado
Y_pred
# Creamos una matriz de confusión
cnf_matrix = metrics.confusion_matrix(Y_test, Y_pred)
cnf_matrix
# Gráficamos la matriz de confusión
class_names = [0, 1]
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(cnf_matrix), annot = True, cmap = "Blues_r", fmt = "g")
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title("Matriz de confusión", y = 1.1)
plt.ylabel("Etiqueta actual")
plt.xlabel("Etiqueta de predicción")
# Exactitud del modelo
print("Exactitud", metrics.accuracy_score(Y_test, Y_pred))