1 Objetivo

Implementar el modelo de regresión logística binaria con datos relacionados a una condición de salud de las personas para predecir anomalías de corazón y evaluar la exactitud del modelo mediante la matriz de confusión.

2 Descripción

Se cargan librerías y se descargan los datos: https://raw.githubusercontent.com/rpizarrog/Analisis-Inteligente-de-datos/main/datos/heart_2020_cleaned.csv

Los datos están relacionados con aspectos médicos y son valores numéricos de varias variables que caracterizan el estado de salud de 319,795 personas.

Se pretende construir un modelo utilizando algoritmos supervisados para resolver la tarea de clasificación binaria e identificar si una persona padece del corazón o no.

Se construyen datos de entrenamiento y validación al 80% y 20% cada uno.

Se desarrollan los modelos de:

  • Regresión Logística binaria

  • Árbol de Clasificación tipo class

  • K Means

  • SVM Lineal

  • SVM Polinomial

  • SVM Radial

Los modelo se aceptan si tienen un valor de exactitud por encima del 70%..

3 Fundamento teórico

La regresión logística ofrece solución para clasificar y para predecir valores lógicos, es decir con un valor etiquetado tal vez 0 o 1.

Para predicciones el modelo de regresión logística binaria encuentra la probabilidad de ocurrencia de un evento determinado y dicha probabilidad se hallará siempre dentro del rango.

Cuando la variable respuesta posee dos categorías, entonces se estará delante de una regresión logística binaria. En cambio, si la variable respuesta posee más de dos categorías, se usará la regresión logística multinomial [@zangjindu2020].

En este caso que se presenta y describe a continuación, se utiliza la regresión logística binomial como parte de los algoritmos supervisados de machine learning.

El modelo requiere una cantidad de variables independientes del modelo \(x_1, x_2 ... x_n\) ó \(\beta_1, \beta_2...\beta_n\).

Se debe identificar la variable dependiente \(Y\) o la variable respuesta de tipo binaria, donde cada componente de 𝑌 se distribuye mediante una distribución de Bernoulli \([ 0 | 1]\).

Se necesitan \(𝑛\) el número de observaciones.

Entonces \(𝑋 = (𝑥_1, … , 𝑥_𝑛)^T\) el conjunto de variable independientes.

Se identifica como \(\theta\) el vector de parámetros asociado al modelo, de forma que \(\theta\in R^{k+1}\) que significa que los valores del vector resultante pertenecen a cada una de las variables.

Sea \(\pi(\theta^T𝑥_𝑖)\) la probabilidad de que \(Y_i\) tome un valor igual a \(1\), entonces su modelo se puede escribir como:\[ \pi(\theta^Tx_i) = P(Y =1|X=x) = \frac{1}{1+e} \]

Si \(\theta^Tx_i\) los valores ajustados toma valores elevados y positivos, entonces … … se aproximará a 0 y, en consecuencia, el valor de la función anterior será igual a 1. En caso de que \(\theta^Tx_i\) tome valores elevados pero negativos, entonces el valor de la función será \(0\) dado que \(e ^ {\theta^Tx_i}\) tenderá a infinito. [@zangjindu2020].

El valor \(e\) como número irracional y basado en la teoría de logaritmos naturales es el valor constante que se puede obtener en lenguaje R con la función exp(1) igual a 2.7182818.

Efectuando la transformación logit a la expresión inicial, se obtiene:

\[ logit(\pi(\theta^Tx_i)) = ln(\frac{\pi(\theta^Tx_i)}{1 - \pi(\theta^Tx_i)}) \]

que significa calcular el logaritmo natural de cada valor de de \(x_i\) para determinar su probabilidad.

4 Desarrollo

4.1 Cargar librerías

library(readr)
library(dplyr)
library(caret)
library(rpart)
library(rpart.plot)
library(knitr)
library(e1071)        # Vectores de Soporte SVM
library(rpart)        # Arboles de clasificación

4.2 Cargar datos

Cargar datos de manera local.

# datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/Machine-Learning-con-R/main/datos/heart_2020_cleaned.csv")
datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/Machine-Learning-con-R/main/datos/heart_2020_cleaned.csv", encoding = "UTF-8", stringsAsFactors = TRUE)

4.3 Explorar datos

str(datos)
## 'data.frame':    319795 obs. of  18 variables:
##  $ HeartDisease    : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 2 1 1 1 1 ...
##  $ BMI             : num  16.6 20.3 26.6 24.2 23.7 ...
##  $ Smoking         : Factor w/ 2 levels "No","Yes": 2 1 2 1 1 2 1 2 1 1 ...
##  $ AlcoholDrinking : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Stroke          : Factor w/ 2 levels "No","Yes": 1 2 1 1 1 1 1 1 1 1 ...
##  $ PhysicalHealth  : num  3 0 20 0 28 6 15 5 0 0 ...
##  $ MentalHealth    : num  30 0 30 0 0 0 0 0 0 0 ...
##  $ DiffWalking     : Factor w/ 2 levels "No","Yes": 1 1 1 1 2 2 1 2 1 2 ...
##  $ Sex             : Factor w/ 2 levels "Female","Male": 1 1 2 1 1 1 1 1 1 2 ...
##  $ AgeCategory     : Factor w/ 13 levels "18-24","25-29",..: 8 13 10 12 5 12 11 13 13 10 ...
##  $ Race            : Factor w/ 6 levels "American Indian/Alaskan Native",..: 6 6 6 6 6 3 6 6 6 6 ...
##  $ Diabetic        : Factor w/ 4 levels "No","No, borderline diabetes",..: 3 1 3 1 1 1 1 3 2 1 ...
##  $ PhysicalActivity: Factor w/ 2 levels "No","Yes": 2 2 2 1 2 1 2 1 1 2 ...
##  $ GenHealth       : Factor w/ 5 levels "Excellent","Fair",..: 5 5 2 3 5 2 2 3 2 3 ...
##  $ SleepTime       : num  5 7 8 6 8 12 4 9 5 10 ...
##  $ Asthma          : Factor w/ 2 levels "No","Yes": 2 1 2 1 1 1 2 2 1 1 ...
##  $ KidneyDisease   : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 2 1 ...
##  $ SkinCancer      : Factor w/ 2 levels "No","Yes": 2 1 1 2 1 1 2 1 1 1 ...
summary(datos)
##  HeartDisease      BMI        Smoking      AlcoholDrinking Stroke      
##  No :292422   Min.   :12.02   No :187887   No :298018      No :307726  
##  Yes: 27373   1st Qu.:24.03   Yes:131908   Yes: 21777      Yes: 12069  
##               Median :27.34                                            
##               Mean   :28.33                                            
##               3rd Qu.:31.42                                            
##               Max.   :94.85                                            
##                                                                        
##  PhysicalHealth    MentalHealth    DiffWalking      Sex        
##  Min.   : 0.000   Min.   : 0.000   No :275385   Female:167805  
##  1st Qu.: 0.000   1st Qu.: 0.000   Yes: 44410   Male  :151990  
##  Median : 0.000   Median : 0.000                               
##  Mean   : 3.372   Mean   : 3.898                               
##  3rd Qu.: 2.000   3rd Qu.: 3.000                               
##  Max.   :30.000   Max.   :30.000                               
##                                                                
##       AgeCategory                                 Race       
##  65-69      : 34151   American Indian/Alaskan Native:  5202  
##  60-64      : 33686   Asian                         :  8068  
##  70-74      : 31065   Black                         : 22939  
##  55-59      : 29757   Hispanic                      : 27446  
##  50-54      : 25382   Other                         : 10928  
##  80 or older: 24153   White                         :245212  
##  (Other)    :141601                                          
##                     Diabetic      PhysicalActivity     GenHealth     
##  No                     :269653   No : 71838       Excellent: 66842  
##  No, borderline diabetes:  6781   Yes:247957       Fair     : 34677  
##  Yes                    : 40802                    Good     : 93129  
##  Yes (during pregnancy) :  2559                    Poor     : 11289  
##                                                    Very good:113858  
##                                                                      
##                                                                      
##    SleepTime      Asthma       KidneyDisease SkinCancer  
##  Min.   : 1.000   No :276923   No :308016    No :289976  
##  1st Qu.: 6.000   Yes: 42872   Yes: 11779    Yes: 29819  
##  Median : 7.000                                          
##  Mean   : 7.097                                          
##  3rd Qu.: 8.000                                          
##  Max.   :24.000                                          
## 

4.4 Limpiar datos

Crear variable llamada HeartDisease01 que se utilizará en el modelo de Regresión Logística tendrá valores 0 de para no daño y 1 para daño.

datos = mutate (datos,HeartDisease_01=if_else(HeartDisease=='Yes',1,0))

4.5 Las variables de interés

Todas las variables son de entrada o variables independientes:

  • “BMI”: Indice de masa corporal con valores entre 12.02 y 94.85.

  • “Smoking”: Si la persona es fumadora o no con valores categóritos de ‘Yes’ o ‘No’.

  • “AlcoholDrinking” : Si consume alcohol o no, con valores categóricos de ‘Yes’ o ‘No’.

  • “Stroke”: Si padece alguna anomalía cerebrovascular, apoplejia o algo similar, con valores categóricos de ‘Yes’ o ‘No’.

  • “PhysicalHealth” Estado físico en lo general con valores entre 0 y 30.

  • “MentalHealth”. Estado mental en lo general con valores entre 0 y 30.

  • “DiffWalking” . Que si se le dificulta caminar o tiene algún padecimiento al caminar, con valores categóritoc de ‘Yes’ o ‘No’.

  • “Sex”: Género de la persona, con valores de ‘Female’ y ‘Male’ para distinguir al género femenino y masculino respectivamente.

  • “AgeCategory”: Una clasificación de la edad de la persona de entre 18 y 80 años. La primera categoría con un rango de edad entre 18-24, a partir de 25 con rangos de 5 en 5 hasta la clase de 75-80 y una última categoría mayores de 80 años.

  • “Race”. Raza u origen de la persona con valores categóricos de ‘American Indian/Alaskan Native’, ’Asian’,’Black’, ’Hispanic’, ’Other’ y’White’.

  • “Diabetic”. Si padece o ha padecido de diabetes en cuatro condiciones siendo Yes y No para si o no: ‘No’, ‘borderline diabetes’ condición antes de detectarse diabetes tipo 2, ‘Yes’, y ‘Yes (during pregnancy)’ durante embarazo.

  • “PhysicalActivity” que si realiza actividad física, con valores categóricos de ‘Yes’ o ‘No’.

  • “GenHealth”: EStado general de salud de la persona con valores categóricos de ‘Excellent’, ‘Very good’, ‘Good’, ‘Fair’ y ‘Poor’ con significado en español de excelente, muy buena, buena, regular y pobre o deficiente.

  • “SleepTime”: valor numérico de las horas de sueño u horas que duerme la persona con valores en un rango entre 1 y 24.

  • “Asthma”: si padece de asma o no, con valores categóricos de ‘Yes’ o ‘No’.

  • “KidneyDisease”: si tiene algún padecimiento en los riñones, con valores categóricos de ‘Yes’ o ‘No’.

  • “SkinCancer”: si padece algún tipo de cancer de piel, con valores categóricos de ‘Yes’ o ‘No’.

La variable de interés como dependiente o variable de salida es la de daño al corazón (HeartDisease), con valores categóricos de ‘Yes’ o ‘No’.

4.6 Datos de entrenamiento y validación

Se parten los datos en en datos de entrenamiento con el 80% y datos de validación con el 20%.

set.seed(0432)
entrena <- createDataPartition(y = datos$HeartDisease, 
                               p = 0.8, 
                               list = FALSE, 
                               times = 1)
# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ]  # [renglones, columna]
# Datos validación
datos.validacion <- datos[-entrena, ]

4.6.1 Datos de entrenamiento

Se muestran los primeros 20 registros datos de entrenamiento

kable(head(datos.entrenamiento, 20), caption = "Primeros 20 registros de datos de entrenamiento")
Primeros 20 registros de datos de entrenamiento
HeartDisease BMI Smoking AlcoholDrinking Stroke PhysicalHealth MentalHealth DiffWalking Sex AgeCategory Race Diabetic PhysicalActivity GenHealth SleepTime Asthma KidneyDisease SkinCancer HeartDisease_01
1 No 16.60 Yes No No 3 30 No Female 55-59 White Yes Yes Very good 5 Yes No Yes 0
4 No 24.21 No No No 0 0 No Female 75-79 White No No Good 6 No No Yes 0
5 No 23.71 No No No 28 0 Yes Female 40-44 White No Yes Very good 8 No No No 0
6 Yes 28.87 Yes No No 6 0 Yes Female 75-79 Black No No Fair 12 No No No 1
7 No 21.63 No No No 15 0 No Female 70-74 White No Yes Fair 4 Yes No Yes 0
9 No 26.45 No No No 0 0 No Female 80 or older White No, borderline diabetes No Fair 5 No Yes No 0
11 Yes 34.30 Yes No No 30 0 Yes Male 60-64 White Yes No Poor 15 Yes No No 1
12 No 28.71 Yes No No 0 0 No Female 55-59 White No Yes Very good 5 No No No 0
13 No 28.37 Yes No No 0 0 Yes Male 75-79 White Yes Yes Very good 8 No No No 0
14 No 28.15 No No No 7 0 Yes Female 80 or older White No No Good 7 No No No 0
16 No 29.18 No No No 1 0 No Female 50-54 White No Yes Very good 6 No No No 0
17 No 26.26 No No No 5 2 No Female 70-74 White No No Very good 10 No No No 0
18 No 22.59 Yes No No 0 30 Yes Male 70-74 White No, borderline diabetes Yes Good 8 No No No 0
19 No 29.86 Yes No No 0 0 Yes Female 75-79 Black Yes No Fair 5 No Yes No 0
20 No 18.13 No No No 0 0 No Male 80 or older White No Yes Excellent 8 No No Yes 0
21 No 21.16 No No No 0 0 No Female 80 or older Black No, borderline diabetes No Good 8 No No No 0
22 No 28.90 No No No 2 5 No Female 70-74 White Yes No Very good 7 No No No 0
23 No 26.17 Yes No No 0 15 No Female 45-49 White No Yes Very good 6 No No No 0
25 No 25.75 No No No 0 0 No Female 80 or older White No Yes Very good 6 No No Yes 0
26 No 29.18 Yes No No 30 30 Yes Female 60-64 White No No Poor 6 Yes No No 0

4.6.2 Datos de validación

Se muestran los primeros 20 registros de datos de validación .

kable(head(datos.entrenamiento, 20), caption = "Primeros 20 registros de datos de entrenamiento")
Primeros 20 registros de datos de entrenamiento
HeartDisease BMI Smoking AlcoholDrinking Stroke PhysicalHealth MentalHealth DiffWalking Sex AgeCategory Race Diabetic PhysicalActivity GenHealth SleepTime Asthma KidneyDisease SkinCancer HeartDisease_01
1 No 16.60 Yes No No 3 30 No Female 55-59 White Yes Yes Very good 5 Yes No Yes 0
4 No 24.21 No No No 0 0 No Female 75-79 White No No Good 6 No No Yes 0
5 No 23.71 No No No 28 0 Yes Female 40-44 White No Yes Very good 8 No No No 0
6 Yes 28.87 Yes No No 6 0 Yes Female 75-79 Black No No Fair 12 No No No 1
7 No 21.63 No No No 15 0 No Female 70-74 White No Yes Fair 4 Yes No Yes 0
9 No 26.45 No No No 0 0 No Female 80 or older White No, borderline diabetes No Fair 5 No Yes No 0
11 Yes 34.30 Yes No No 30 0 Yes Male 60-64 White Yes No Poor 15 Yes No No 1
12 No 28.71 Yes No No 0 0 No Female 55-59 White No Yes Very good 5 No No No 0
13 No 28.37 Yes No No 0 0 Yes Male 75-79 White Yes Yes Very good 8 No No No 0
14 No 28.15 No No No 7 0 Yes Female 80 or older White No No Good 7 No No No 0
16 No 29.18 No No No 1 0 No Female 50-54 White No Yes Very good 6 No No No 0
17 No 26.26 No No No 5 2 No Female 70-74 White No No Very good 10 No No No 0
18 No 22.59 Yes No No 0 30 Yes Male 70-74 White No, borderline diabetes Yes Good 8 No No No 0
19 No 29.86 Yes No No 0 0 Yes Female 75-79 Black Yes No Fair 5 No Yes No 0
20 No 18.13 No No No 0 0 No Male 80 or older White No Yes Excellent 8 No No Yes 0
21 No 21.16 No No No 0 0 No Female 80 or older Black No, borderline diabetes No Good 8 No No No 0
22 No 28.90 No No No 2 5 No Female 70-74 White Yes No Very good 7 No No No 0
23 No 26.17 Yes No No 0 15 No Female 45-49 White No Yes Very good 6 No No No 0
25 No 25.75 No No No 0 0 No Female 80 or older White No Yes Very good 6 No No Yes 0
26 No 29.18 Yes No No 30 30 Yes Female 60-64 White No No Poor 6 Yes No No 0

4.7 Regresión Logística binomial

Se construye el modelo con los datos de entrenamiento mediante la función glm() indicando que es regresión logística binomial es decir solo dos valores.

modelo.rl = glm(data = datos.entrenamiento,formula =    HeartDisease_01 ~ BMI+Smoking+AlcoholDrinking+Stroke+PhysicalHealth+MentalHealth+DiffWalking+Sex
+AgeCategory+Race+Diabetic+PhysicalActivity+GenHealth+SleepTime+Asthma+KidneyDisease+SkinCancer, family = binomial())

4.7.1 Resumen y/o estadísticos del modelo

El resumen del modelo muestra algunos estadísticos importantes: se interpreta que la gran mayoría de las variables independiente tienen significación estadística ‘***’, presenta los coeficientes numéricos en la ecuación de regresión logística entre otras cosas.

summary(modelo.rl)
## 
## Call:
## glm(formula = HeartDisease_01 ~ BMI + Smoking + AlcoholDrinking + 
##     Stroke + PhysicalHealth + MentalHealth + DiffWalking + Sex + 
##     AgeCategory + Race + Diabetic + PhysicalActivity + GenHealth + 
##     SleepTime + Asthma + KidneyDisease + SkinCancer, family = binomial(), 
##     data = datos.entrenamiento)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.1401  -0.4108  -0.2431  -0.1283   3.5918  
## 
## Coefficients:
##                                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                     -6.3639898  0.1292832 -49.225  < 2e-16 ***
## BMI                              0.0089104  0.0012841   6.939 3.94e-12 ***
## SmokingYes                       0.3540873  0.0160830  22.016  < 2e-16 ***
## AlcoholDrinkingYes              -0.2478675  0.0375716  -6.597 4.19e-11 ***
## StrokeYes                        1.0366779  0.0254200  40.782  < 2e-16 ***
## PhysicalHealth                   0.0037674  0.0009640   3.908 9.31e-05 ***
## MentalHealth                     0.0043980  0.0009887   4.448 8.65e-06 ***
## DiffWalkingYes                   0.2232893  0.0203053  10.997  < 2e-16 ***
## SexMale                          0.7181515  0.0163128  44.024  < 2e-16 ***
## AgeCategory25-29                 0.0138149  0.1438733   0.096 0.923504    
## AgeCategory30-34                 0.4662327  0.1256941   3.709 0.000208 ***
## AgeCategory35-39                 0.6335347  0.1194707   5.303 1.14e-07 ***
## AgeCategory40-44                 1.0533049  0.1123407   9.376  < 2e-16 ***
## AgeCategory45-49                 1.3086693  0.1089529  12.011  < 2e-16 ***
## AgeCategory50-54                 1.7427067  0.1050307  16.592  < 2e-16 ***
## AgeCategory55-59                 1.9615187  0.1034636  18.959  < 2e-16 ***
## AgeCategory60-64                 2.2427590  0.1024747  21.886  < 2e-16 ***
## AgeCategory65-69                 2.4740423  0.1021978  24.208  < 2e-16 ***
## AgeCategory70-74                 2.7635458  0.1021180  27.062  < 2e-16 ***
## AgeCategory75-79                 2.9725559  0.1027188  28.939  < 2e-16 ***
## AgeCategory80 or older           3.2239303  0.1024308  31.474  < 2e-16 ***
## RaceAsian                       -0.5293299  0.0946876  -5.590 2.27e-08 ***
## RaceBlack                       -0.3106551  0.0648736  -4.789 1.68e-06 ***
## RaceHispanic                    -0.2261391  0.0661117  -3.421 0.000625 ***
## RaceOther                       -0.0301585  0.0716892  -0.421 0.673986    
## RaceWhite                       -0.0449288  0.0580290  -0.774 0.438785    
## DiabeticNo, borderline diabetes  0.1454470  0.0466970   3.115 0.001841 ** 
## DiabeticYes                      0.4737660  0.0186946  25.342  < 2e-16 ***
## DiabeticYes (during pregnancy)   0.0388203  0.1218651   0.319 0.750066    
## PhysicalActivityYes              0.0161113  0.0179665   0.897 0.369855    
## GenHealthFair                    1.5224180  0.0367879  41.384  < 2e-16 ***
## GenHealthGood                    1.0493604  0.0331385  31.666  < 2e-16 ***
## GenHealthPoor                    1.8976186  0.0458072  41.426  < 2e-16 ***
## GenHealthVery good               0.4739953  0.0340369  13.926  < 2e-16 ***
## SleepTime                       -0.0237213  0.0048578  -4.883 1.04e-06 ***
## AsthmaYes                        0.2657462  0.0215374  12.339  < 2e-16 ***
## KidneyDiseaseYes                 0.5728639  0.0273072  20.978  < 2e-16 ***
## SkinCancerYes                    0.1170982  0.0217911   5.374 7.72e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 149527  on 255836  degrees of freedom
## Residual deviance: 115941  on 255799  degrees of freedom
## AIC: 116017
## 
## Number of Fisher Scoring iterations: 7

Entonces una posible predicción sería de la siguiente manera:

\[ Y=β_0+β_1⋅(coeficiente)+β_2⋅(coeficiente)+β_3⋅(coeficiente)+...+β_n⋅(coeficiente \]

entonces …

\[ HeartDisease\text{01} = -6.3411940 +BMI⋅(coeficiente) +SmokingYes\cdot(coeficiente) + ... + SkinCancerYes\cdot(coeficiente) \]

4.7.2 Generar predicciones del modelo regresión logística

Se generan predicciones con datos de validación generando un valor numérico que deberá convertirse a valor probabilístico, condicionando que si el valor de la probabilidad de predicción está por debajo del 50% es 0 y si está por encima entonces será 1.

prediciones_rl = predict(object = modelo.rl,newdata = datos.validacion, se.fit = TRUE)

4.7.3 Probabilidad con la función logit

Se transforman los valores de las predicciones generadas a valores probabilísticos usando para ello el concepto de la función logit. \[ prob = \frac{exp(prediccion)}{(1 + exp(prediccion))} \]

prediciones_rl_prob <- exp(prediciones_rl$fit) / (1 + exp(prediciones_rl$fit))

4.7.4 Generar tabla comparativa

Se construye una tabla comparativa con los valores de interés

t_comparativa = data.frame(datos.validacion[,c('HeartDisease', 'HeartDisease_01')],prediciones_rl_prob)
t_comparativa <- t_comparativa %>%
  mutate(heartDiseasePred = if_else(prediciones_rl_prob < 0.50, 0, 1))
top20 = head(t_comparativa,20)
kable(top20,caption = 'Primeros 20 registros')
Primeros 20 registros
HeartDisease HeartDisease_01 prediciones_rl_prob heartDiseasePred
2 No 0 0.1620552 0
3 No 0 0.4181823 0
8 No 0 0.3248726 0
10 No 0 0.1415334 0
15 No 0 0.0940547 0
24 No 0 0.5179380 1
27 No 0 0.1662862 0
29 No 0 0.0198832 0
31 No 0 0.1526357 0
35 No 0 0.0806507 0
37 No 0 0.1167439 0
42 No 0 0.0332136 0
46 Yes 1 0.1918440 0
56 No 0 0.0133890 0
62 No 0 0.0404075 0
63 No 0 0.0743770 0
66 No 0 0.1606797 0
67 No 0 0.3461298 0
72 No 0 0.2353379 0
74 No 0 0.0617814 0

4.7.5 Evaluando el modelo

Una matriz de confusión es una herramienta que permite evaluación de un modelo de clasificación

Cada columna de la matriz representa el número de predicciones de cada clase, mientras que cada fila representa a las instancias en la clase real.

Uno de los beneficios de las matrices de confusión es que facilitan ver si el sistema está confundiendo las diferentes clases o resultados.

Hay que encontrar a cuantos casos se le atinaron utilizando los datos de validación y con ello encontrar el porcentaje de aciertos.

Se puede evaluar el modelo con la matriz de confusión interpretando algunos estadísticos:

Se evalúa el modelo de acuerdo a estas condiciones:

  • Accuracy o exactitud \[ accuracy = \frac{VP + FP}{n} \]

  • Precision o precisión

\[ precision = \frac{TP}{VP + FP} \]

  • Recall o recuperación \[ recall = \frac{VP}{VP + FN} \]

  • Especificity o especificidad (tasa de verdaderos negativos)

\[ especificity = \frac{VP}{VN + FP} \]

4.7.5.1 Construyendo la matriz de confusión del modelo de regresión logística

Factorizar las columnas “HeartDisease_01” & “heartDiseasePred” de la tabla comparativa

Factorizar en R significa categorizar con la función “as.factor” o “factor”

Se muestra a tabla con las columnas de interés para interpretar las predicciones.

t_comparativa$HeartDisease_01 = as.factor(t_comparativa$HeartDisease_01)
t_comparativa$heartDiseasePred = as.factor(t_comparativa$heartDiseasePred)
kable(head(t_comparativa, 20), caption = "Tabla comparativa, primeros 20 registros")
Tabla comparativa, primeros 20 registros
HeartDisease HeartDisease_01 prediciones_rl_prob heartDiseasePred
2 No 0 0.1620552 0
3 No 0 0.4181823 0
8 No 0 0.3248726 0
10 No 0 0.1415334 0
15 No 0 0.0940547 0
24 No 0 0.5179380 1
27 No 0 0.1662862 0
29 No 0 0.0198832 0
31 No 0 0.1526357 0
35 No 0 0.0806507 0
37 No 0 0.1167439 0
42 No 0 0.0332136 0
46 Yes 1 0.1918440 0
56 No 0 0.0133890 0
62 No 0 0.0404075 0
63 No 0 0.0743770 0
66 No 0 0.1606797 0
67 No 0 0.3461298 0
72 No 0 0.2353379 0
74 No 0 0.0617814 0

Creando de la matriz de confusión con la función confusionMatrix() de la librería caret con las variables de interés: “HeartDisease_01” y “heartDiseasePred”, que representan los valores reales y las predicciones respectivamente.

matrixConfusion <- confusionMatrix(t_comparativa$HeartDisease_01,t_comparativa$heartDiseasePred)
matrixConfusion
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction     0     1
##          0 57976   508
##          1  4905   569
##                                           
##                Accuracy : 0.9154          
##                  95% CI : (0.9132, 0.9175)
##     No Information Rate : 0.9832          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.1498          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.9220          
##             Specificity : 0.5283          
##          Pos Pred Value : 0.9913          
##          Neg Pred Value : 0.1039          
##              Prevalence : 0.9832          
##          Detection Rate : 0.9065          
##    Detection Prevalence : 0.9144          
##       Balanced Accuracy : 0.7252          
##                                           
##        'Positive' Class : 0               
## 

El valor estadístico de Accuracy = Exactitud igual a 0.9153 significa un valor del 91.53%; se interpreta que de cada 100 el modelo acierta en la predicción el 91.53% de las ocasiones.

Si la métrica era que debiera tener un valor por encima del 70% el modelo se acepta pero debe compararse contra otro modelo de clasificación para ver cual es más eficiente en relación tan solo en el estadístico de Exactitud.

Este valor de Accuracy = Exactitud deberá compararse contra otros modelos.

4.8 Predicciones con datos nuevos

Se crea un registro de una presona con ciertas condiciones de salud.

BMI <- 38
Smoking <- 'Yes'
AlcoholDrinking = 'Yes'
Stroke <- 'Yes'
PhysicalHealth <- 2
MentalHealth = 5
DiffWalking = 'Yes'
Sex = 'Male'
AgeCategory = '70-74'
Race = 'Black'
Diabetic <- 'Yes'
PhysicalActivity = "No"
GenHealth = "Fair"
SleepTime = 12
Asthma = "Yes"
KidneyDisease = "Yes"
SkinCancer = 'No'
persona <- data.frame(BMI,Smoking, AlcoholDrinking, Stroke, PhysicalHealth, MentalHealth, DiffWalking, Sex, AgeCategory, Race, Diabetic, PhysicalActivity, GenHealth, SleepTime, Asthma, KidneyDisease, SkinCancer)
persona
##   BMI Smoking AlcoholDrinking Stroke PhysicalHealth MentalHealth DiffWalking
## 1  38     Yes             Yes    Yes              2            5         Yes
##    Sex AgeCategory  Race Diabetic PhysicalActivity GenHealth SleepTime Asthma
## 1 Male       70-74 Black      Yes               No      Fair        12    Yes
##   KidneyDisease SkinCancer
## 1           Yes         No

Se hace la predicción con estos valores:

prediccion <- predict(object = modelo.rl, newdata = persona, se.fit = TRUE)
prediccion
## $fit
##        1 
## 1.091498 
## 
## $se.fit
## [1] 0.07017278
## 
## $residual.scale
## [1] 1
# prediccion <- prediccion$fit
# prediccion

Este valor 0.06995949 a valor probabilístico:

prob <- exp(prediccion$fit) / (1 + exp(prediccion$fit))
prob
##         1 
## 0.7486638

Tiene un valor de 0.7480466 es decir un 74.80%

Entonces en predicción es:

pred <- if_else (prob > 0.5, 1, 0)
pred
## [1] 1

Si la predicción es es 0 no tienen afección del corazón en caso se contrario si el resultado es 1 entonces la predicción implica que si tiene daño del corazón.

5 Interpretación

Para la realización del caso 5 se va a implementar el modelo de Regresión Logística Binaria con datos relacionados a una condición de salud de las personas para predecir anomalías de corazón. Con los datos que se van a utilizar están relacionados con aspectos médicos son valores numéricos de varias variables que caracterizan el estado de salud de 319,795 personas.

Al igual que en otros casos se construyen datos de entrenamiento y de validación al 80% y 20% cada uno utilizando la semilla de 0432 que son los últimos 4 dígitos de mi numero de control.

Para la regresión logística binomial se tiene que encontrar los coeficientes que nos permita generar un valor numérico de predicción que se convertirá en un valor probabilístico. Para ello se tiene que utilizar la función glm que tiene que buscar un daño en el corazón con respecto a todas las variables, lo que generara un resultado de tipo binomial que son 0 y 1

Al generar la regresión logística binomial se genera una tabla comparativa que nos muestra los primeros 20 registros con 4 columnas que son su condición inicial Si y No, la segunda columna a valor 0 y 1, la tercera columna que es la predicción y la cuarta columna con la predicción con base a ceros y 1. Lo que se busca de las columna 2 y 4 es constatar a través de una matriz de confusión que nos tiene que mostrar un estadístico llamado Accuracy, que es la efectividad dado de la suma de los verdadero positivos y los falsos positivos dividido entre n. En pocas palabras nos quiere decir que a cuantos casos se le atino evidentemente si esta con daño o sin daño.

Al tener la matriz de confusión se obtiene de que la referencia de 57976, la predicción son 508 y que de 4905 sin 569.

Nos obtiene un Accuracy de 0.9153.

6 Bibliografía