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.

Desarrollo

Cargar librerías


Cargar librerías


library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(caret) # Para matriz de confusion
## Loading required package: lattice
## Loading required package: ggplot2

Cargar datos

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 eleatoria 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 rgistros
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)
matriz
##           
##            FELIZ NO FELIZ
##   FELIZ        9        7
##   NO FELIZ     9        5
  • Renglones son la realidad:

    • ¿Cuántas personas son felices?: 10

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

  • Las columnas son las predicciones:

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

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

    • ¿A cuántos le atinó en total ? a11. 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 = 5 FN = 5
Realidad NO FELIZ FP = 3 TN = 6
  • VERDADEROS POSITIVOS. VP o TRUE TP igual a los casos que la realidad es positivo y el modelo acierta en positivo. TP=5

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

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

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

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

Verdaderos:

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

Falsos:

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


Exactitud

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,2),  "%")
## [1] "Exactitud es de:  46.67 %"

Precision o Precisión

precision = TP / (TP + FP)
paste("Precision es de: ", round(precision,2),  "%")
## [1] "Precision es de:  0.5 %"

Recall = Sensibilidad

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

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           
##