Simular un modelo de clasificación para predecir si un apersona es FELIZ O NO FELIZ.
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.
library(readr) # install.package
library(dplyr)
library(caret) # Para matriz de confusion
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
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
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
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 %"
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).
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 %"
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 %"
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 %"
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 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
##