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()
Patient numberint64
Cholesterolint64
0
1
193
1
2
146
2
3
217
3
4
226
4
5
164
# ¿Que columnas tienen los datos?
diabetes.columns
# ¿Que tamaño tiene el dataset?
diabetes.shape
# ¿Hay datos nulos?
diabetes.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 390 entries, 0 to 389
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Patient number 390 non-null int64
1 Cholesterol 390 non-null int64
2 Glucose 390 non-null int64
3 HDL Chol 390 non-null int64
4 Chol/HDL ratio 390 non-null float64
5 Age 390 non-null int64
6 Gender 390 non-null object
7 Height 390 non-null int64
8 Weight 390 non-null int64
9 BMI 390 non-null float64
10 Systolic BP 390 non-null int64
11 Diastolic BP 390 non-null int64
12 waist 390 non-null int64
13 hip 390 non-null int64
14 Waist/hip ratio 390 non-null float64
15 Diabetes 390 non-null object
dtypes: float64(3), int64(11), object(2)
memory usage: 48.9+ KB
# Como se distribuyen las variables numéricas
diabetes.describe()
Patient numberfloat64
Cholesterolfloat64
count
390
390
mean
195.5
207.2307692
std
112.7275477
44.66600505
min
1
78
25%
98.25
179
50%
195.5
203
75%
292.75
229
max
390
443
# ¿Como se comportan las variables categoricas?
diabetes.describe(include=["O"])
Genderobject
Diabetesobject
count
390
390
unique
2
2
top
female
No diabetes
freq
228
330
# 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()
/shared-libs/python3.9/py/lib/python3.9/site-packages/seaborn/_decorators.py:36: FutureWarning: Pass the following variable as a keyword arg: x. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
warnings.warn(
# 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()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 390 entries, 0 to 389
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Colesterol 390 non-null int64
1 Glucosa 390 non-null int64
2 HDL colesterol 390 non-null int64
3 Edad 390 non-null int64
4 Género 390 non-null int64
5 Altura 390 non-null int64
6 Peso 390 non-null int64
7 Presión arterial alta 390 non-null int64
8 Presión arterial baja 390 non-null int64
9 Cintura 390 non-null int64
10 Cadera 390 non-null int64
11 Diabetes 390 non-null int64
dtypes: int64(12)
memory usage: 36.7 KB
# Matriz de correlación
diabetes.corr()
Colesterolfloat64
-0.06360077256193461 - 1.0
Glucosafloat64
-0.1583019646515296 - 1.0
Colesterol
1
0.1581020776
Glucosa
0.1581020776
1
HDL colesterol
0.1931617034
-0.1583019647
Edad
0.2473334696
0.2943919666
Género
-0.03013853326
0.09337232878
Altura
-0.06360077256
0.0980517988
Peso
0.06235862851
0.190357864
Presión arterial alta
0.2077414443
0.1627771636
Presión arterial baja
0.1662413033
0.02026227033
Cintura
0.1340378194
0.2223355527
# 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)
/shared-libs/python3.9/py/lib/python3.9/site-packages/sklearn/linear_model/_logistic.py:814: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(
# 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))
Exactitud 0.9102564102564102