Objetivo

Simular un modelo de clasificación para predecir si un apersona es FELIZ O NO FELIZ.

Descripción

Cargar un conjunto de datos en donde que permitirá simular un modelo de clasificación que etiquete a una persona si es FELIZ O NO FELIZ.

El conjunto de datos tiene dos variables, una variable independiente llamada dinero y la variable dependiente o de etiqueta que se llama estado que contiene un valor binario: FELIZ y NO FELIZ.

La predicción de la clasificación será aleatoria.

Se genera una matriz de confusión y se evalúa conforme a sus métricas de exactitud, precisión positiva y negativa, sensibilidad y especificidad.

Desarrollo

Cargar librerías

library(readr) # install.package
library(dplyr)
library(caret) # Para matriz de confusion

Cargar datos

Utilizar los datos de la dirección “https://raw.githubusercontent.com/rpizarrog/Industrias-4.0/main/datos/dinero%20feliz%20no%20feliz.csv

datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/Industrias-4.0/main/datos/dinero%20feliz%20no%20feliz.csv")
datos
##    dinero   estado
## 1    90.0    FELIZ
## 2    30.0 NO FELIZ
## 3    70.0    FELIZ
## 4    20.0 NO FELIZ
## 5    60.0 NO FELIZ
## 6    50.0 NO FELIZ
## 7    70.0    FELIZ
## 8    20.0 NO FELIZ
## 9    70.0    FELIZ
## 10   80.0    FELIZ
## 11   90.0    FELIZ
## 12   70.0 NO FELIZ
## 13   20.0 NO FELIZ
## 14   65.9    FELIZ
## 15   33.5 NO FELIZ
## 16   20.5 NO FELIZ
## 17   49.5    FELIZ
## 18   55.0    FELIZ
## 19  100.0    FELIZ
## 20   95.0    FELIZ
## 21   70.0    FELIZ
## 22   60.0    FELIZ
## 23   50.0    FELIZ
## 24   35.0 NO FELIZ
## 25   30.0 NO FELIZ
## 26   40.0 NO FELIZ
## 27   56.5    FELIZ
## 28   60.0 NO FELIZ
## 29   49.0    FELIZ
## 30   45.0 NO FELIZ

Simular un modelo de clasificación

Se simula un modelo de clasificación “Sin nombre” de manera aleatoria para clasificar a una persona como FELIZ o NO FELIZ.

Sembrar una semilla significa que se repiten los mismos los valores en funciones aleatorias cuando se vuelve a ejecutar el código o reconstruir el documento markdown.

n <- nrow(datos) # Debe ser 30 registros
set.seed(2021)
estados <- c('FELIZ', 'NO FELIZ')
predicciones <- sample(x = estados, size = n, replace = TRUE, prob = c(0.80, 0.20))
predicciones
##  [1] "FELIZ"    "FELIZ"    "FELIZ"    "FELIZ"    "FELIZ"    "FELIZ"   
##  [7] "FELIZ"    "FELIZ"    "NO FELIZ" "NO FELIZ" "FELIZ"    "NO FELIZ"
## [13] "FELIZ"    "FELIZ"    "NO FELIZ" "FELIZ"    "FELIZ"    "NO FELIZ"
## [19] "NO FELIZ" "FELIZ"    "FELIZ"    "NO FELIZ" "FELIZ"    "FELIZ"   
## [25] "FELIZ"    "NO FELIZ" "NO FELIZ" "NO FELIZ" "NO FELIZ" "NO FELIZ"

Agregar una columna a datos que es la de predicciones

datos <- mutate(datos, predicciones = predicciones) 
datos
##    dinero   estado predicciones
## 1    90.0    FELIZ        FELIZ
## 2    30.0 NO FELIZ        FELIZ
## 3    70.0    FELIZ        FELIZ
## 4    20.0 NO FELIZ        FELIZ
## 5    60.0 NO FELIZ        FELIZ
## 6    50.0 NO FELIZ        FELIZ
## 7    70.0    FELIZ        FELIZ
## 8    20.0 NO FELIZ        FELIZ
## 9    70.0    FELIZ     NO FELIZ
## 10   80.0    FELIZ     NO FELIZ
## 11   90.0    FELIZ        FELIZ
## 12   70.0 NO FELIZ     NO FELIZ
## 13   20.0 NO FELIZ        FELIZ
## 14   65.9    FELIZ        FELIZ
## 15   33.5 NO FELIZ     NO FELIZ
## 16   20.5 NO FELIZ        FELIZ
## 17   49.5    FELIZ        FELIZ
## 18   55.0    FELIZ     NO FELIZ
## 19  100.0    FELIZ     NO FELIZ
## 20   95.0    FELIZ        FELIZ
## 21   70.0    FELIZ        FELIZ
## 22   60.0    FELIZ     NO FELIZ
## 23   50.0    FELIZ        FELIZ
## 24   35.0 NO FELIZ        FELIZ
## 25   30.0 NO FELIZ        FELIZ
## 26   40.0 NO FELIZ     NO FELIZ
## 27   56.5    FELIZ     NO FELIZ
## 28   60.0 NO FELIZ     NO FELIZ
## 29   49.0    FELIZ     NO FELIZ
## 30   45.0 NO FELIZ     NO FELIZ

Genera matriz de confusión

matriz <- table(datos$estado, datos$predicciones, dnn = c("Realidad","Predicciones") )
matriz
##           Predicciones
## Realidad   FELIZ NO FELIZ
##   FELIZ        9        7
##   NO FELIZ     9        5
  • Renglones son la realidad:

    • ¿Cuántas personas son felices?: 16

    • ¿Cuántas persona son NO FELICES?: 14

  • Las columnas son las predicciones:

    • ¿A cuántos FELIZ le atinó el modelo simulado?. a 9

    • ¿A cuántos NO FELIZ le atinó el modelo simulado? a 5

    • ¿A cuántos le atinó en total ? a 14. Exactitud

Valores

  • Positivo Negativo:

    • Positivo = FELIZ … Otros Ejemplos COVID, APROBASTE, VIVO

    • Negativo = NO FELIZ… Otros Ejemplos NO COVID, NO APROBASTE, NO VIVO

Predicción FELIZ Predicción NO FELIZ
Realidad FELIZ TP = 9 FP = 7
Realidad NO FELIZ FN = 9 TN = 5
  • VERDADEROS POSITIVOS. VP o TRUE TP igual a los casos que la realidad es positivo y el modelo acierta en positivo. TP=9

  • FALSOS POSITIVOS. FP Igual a que la realidad dice que es negativo y el modelo dice que es positivo. FP = 7

  • FALSO NEGATIVO FN O FN igual a que la realidad dice que es positivo y el modelo dice que es negativo. FN = 9

  • VERDADEROS NEGATIVOS VN o TRUE TN igual a los casos que la realidad es negativo y el modelo acierta en negativo TN = 5.

Los valores de la matriz se acceden por renglón columna [renglón, columna]

Verdaderos significa que el modelo acierta

TP <- matriz[1,1]
paste("TP", TP)
## [1] "TP 9"
TN <- matriz[2,2]
paste("TN", TN)
## [1] "TN 5"

Falsos significa que el modelo no acierta

FN <- matriz[2,1]
FN
## [1] 9
FP <- matriz[1,2]
FP
## [1] 7

Exactitud

Significa el porcentaje de aciertos positivos y negativos sobre el total de casos.

exactitud <- (TP + TN) / (TP + FP + FN + TN)
exactitud <- exactitud * 100
paste("Exactitud es de: ", round(exactitud,2),  "%")
## [1] "Exactitud es de:  46.67 %"

Otra manera usando la función diag() y sum(matriz)

accuracy <- sum(diag(matriz)) / sum(matriz)
accuracy <- accuracy * 100
paste("Exactitud es de: ", round(accuracy,4),  "%")
## [1] "Exactitud es de:  46.6667 %"

Precision o Precisión

Significa que sobre alguna etiqueta positivo o negativo en este ejemplo FELIZ O NO FELIZ si determina el valor de casos acertados es decir, sobre casos acertados dividir entre los valores de su columna.

SigniFica también que el modelo a utIlizar que porcentaje acierta con respecto a esa clase y que porcentaje no acierta sobre la misma clase. En este caso que tantos casos fueron acertados POSITIVOS (FELIZ) y que tantos casos fueron acertados NEGATIVOS (NO FELIZ).

Precision TP

Para el ejemplo se toma en cuenta los aciertos sobre POSITIVOS = FELIZ = TP

precisionTP = TP / (TP + FP)
paste("Precision TP es de: ", round(precisionTP,4),  "%")
## [1] "Precision TP es de:  0.5625 %"

Precision TN

Los aciertos sobre NEGATIVOS = NO FELIZ = TN

precisionTN = TN / (TN + FN)
paste("Precision TN es de: ", round(precisionTN,4),  "%")
## [1] "Precision TN es de:  0.3571 %"

Recall = Sensibilidad

La sensibilidad y la especificidad son dos valores que indican la capacidad de estimador para discriminar los casos positivos, de los negativos.

La métrica de sensibilidad o exhaustividad va a inforMar sobre la cantidad que el modelo de machine learning es capaz de identificar.

También se conoce como Tasa de Verdaderos Positivos (True Positive Rate) ó TP. Es la proporción de casos positivos que fueron correctamente identificadas por el modelo.

sensibilidad <- TP / (TP + FN)
paste("Sensibilidad es de: ", round(sensibilidad,4),  "%")
## [1] "Sensibilidad es de:  0.5 %"

Specificity = Specificidad

Especificidad , también conocida como la Tasa de Verdaderos Negativos, (“true negative rate”) o TN. Se trata de los casos negativos que el modelo ha clasificado correctamente. 

Expresa cuan bien puede el modelo detectar esa clase.

especificidad <- TN / (TN + FP)
paste("Especificidad es de: ", round(especificidad,4),  "%")
## [1] "Especificidad es de:  0.4167 %"

Matriz de Confusión

Matriz de confusión usando la librería caret con la función confusionMatrix().

Antes de usar la función categorizar las variables es decir hacerlos factor.

datos$estado <- as.factor(datos$estado)
datos$predicciones <- as.factor(datos$predicciones)
matriz.2 <- confusionMatrix(datos$estado, datos$predicciones)

matriz.2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction FELIZ NO FELIZ
##   FELIZ        9        7
##   NO FELIZ     9        5
##                                           
##                Accuracy : 0.4667          
##                  95% CI : (0.2834, 0.6567)
##     No Information Rate : 0.6             
##     P-Value [Acc > NIR] : 0.9519          
##                                           
##                   Kappa : -0.0811         
##                                           
##  Mcnemar's Test P-Value : 0.8026          
##                                           
##             Sensitivity : 0.5000          
##             Specificity : 0.4167          
##          Pos Pred Value : 0.5625          
##          Neg Pred Value : 0.3571          
##              Prevalence : 0.6000          
##          Detection Rate : 0.3000          
##    Detection Prevalence : 0.5333          
##       Balanced Accuracy : 0.4583          
##                                           
##        'Positive' Class : FELIZ           
##