Análisis descriptivo
head(datos)
## nivel_satisfaccion ultima_evaluacion numero_proyectos
## 1 0.89 0.50 2
## 2 0.86 0.82 4
## 3 0.43 0.47 2
## 4 0.77 0.98 5
## 5 0.87 0.57 4
## 6 0.91 0.93 3
## promedio_horas_mensuales antiguedad accidente abandona promocionado
## 1 238 4 No No No
## 2 274 2 Sí No No
## 3 135 3 No Sí No
## 4 259 6 No Sí No
## 5 231 4 No No No
## 6 238 2 No No No
## departamento salario
## 1 otro bajo
## 2 ventas bajo
## 3 ventas bajo
## 4 otro bajo
## 5 técnico medio
## 6 otro bajo
m1 <- datos[datos$abandona == "Sí", 1]; m1
## [1] 0.43 0.77 0.09 0.56 0.91 0.45 0.40 0.38 0.42 0.11 0.10 0.11 0.09 0.54
## [15] 0.42 0.75 0.09 0.74 0.37 0.45 0.37 0.10 0.39 0.37 0.83
m2 <- datos[datos$abandona == "No", 1]; m2
## [1] 0.89 0.86 0.87 0.91 0.52 0.70 0.78 0.45 0.81 0.62 0.91 0.79 0.83 0.77
## [15] 0.74 0.59 0.60 0.33 0.89 0.99 0.30 0.73 0.48 0.88 0.96 0.36 0.72 0.87
## [29] 0.83 0.75 0.69 0.48 0.63 0.85 0.74 0.92 0.34 0.84 0.82 0.96 0.53 0.65
## [43] 0.83 0.64 0.48 0.74 0.67 0.79 0.65 0.99 0.50 0.51 0.69 0.89 0.81 0.90
## [57] 0.73 0.86 0.67 0.66 0.66 0.49 0.39 0.82 0.60 0.62 0.56 0.60 0.84 0.76
## [71] 0.81 0.89 0.66 0.52 0.91
M<- aggregate(cbind(nivel_satisfaccion,numero_proyectos) ~ abandona, datos, mean)
M
## abandona nivel_satisfaccion numero_proyectos
## 1 No 0.7109333 3.72
## 2 Sí 0.4096000 3.92
ggplot(datos, aes(nivel_satisfaccion, numero_proyectos, col = abandona)) + geom_point() +geom_point(x = 0.9, y = 3, col = "black", pch = 4)

ggplot(datos, aes(nivel_satisfaccion,salario, col = abandona)) + geom_point()

Modelos predictivos
modelo.t <- lda(abandona ~ nivel_satisfaccion + numero_proyectos +salario, data = datos, method = "t")
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3090 0.6919 0.7615 0.7341 0.8366 0.9119
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.1241 0.6182 0.6913 0.6632 0.7858 0.8997
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.05351 0.58916 0.66034 0.63700 0.76680 0.89705
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.02366 0.58557 0.64642 0.62610 0.76070 0.89621
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.01056 0.58413 0.64188 0.62126 0.75795 0.89585
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.004738 0.581310 0.641053 0.618992 0.756608 0.895645
(predict(modelo.t, newdata = data.frame(nivel_satisfaccion = 0.9, numero_proyectos = 3, salario= "medio"))$class)
## [1] No
## Levels: No Sí
modelo.m <- lda(abandona ~ nivel_satisfaccion + numero_proyectos +salario, data = datos, method = "moment")
(predict(modelo.m, newdata = data.frame(nivel_satisfaccion = 0.9, numero_proyectos = 3, salario= "medio"))$class)
## [1] No
## Levels: No Sí
modelo <- lda(abandona ~ nivel_satisfaccion + numero_proyectos +salario, data = datos, method = "mle")
modelo
## Call:
## lda(abandona ~ nivel_satisfaccion + numero_proyectos + salario,
## data = datos, method = "mle")
##
## Prior probabilities of groups:
## No Sí
## 0.75 0.25
##
## Group means:
## nivel_satisfaccion numero_proyectos salariobajo salariomedio
## No 0.7109333 3.72 0.56 0.3733333
## Sí 0.4096000 3.92 0.48 0.5200000
##
## Coefficients of linear discriminants:
## LD1
## nivel_satisfaccion -5.2072074
## numero_proyectos -0.1092346
## salariobajo 0.4781575
## salariomedio 0.6110452
(predict(modelo, newdata = data.frame(nivel_satisfaccion = 0.9, numero_proyectos = 3, salario= "medio"))$class)
## [1] No
## Levels: No Sí
modelo.mve <- lda(abandona ~ nivel_satisfaccion + numero_proyectos +salario, data = datos, method = "mve")
(predict(modelo.mve, newdata = data.frame(nivel_satisfaccion = 0.9, numero_proyectos = 3, salario= "medio"))$class)
## [1] Sí
## Levels: No Sí
Validación y entrenamiento de los modelos
table(datos$abandona)
##
## No Sí
## 75 25
train.c <- sample(1:nrow(datos), nrow(datos)*0.7)
datos.train <- datos[train.c, ]
datos.test <- datos[-train.c, ]
table(datos.train$abandona)
##
## No Sí
## 48 22
table(datos.test$abandona)
##
## No Sí
## 27 3
train1 <- naiveBayes(abandona ~ nivel_satisfaccion + numero_proyectos +salario, data = datos)
train1
##
## Naive Bayes Classifier for Discrete Predictors
##
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
##
## A-priori probabilities:
## Y
## No Sí
## 0.75 0.25
##
## Conditional probabilities:
## nivel_satisfaccion
## Y [,1] [,2]
## No 0.7109333 0.1713868
## Sí 0.4096000 0.2507735
##
## numero_proyectos
## Y [,1] [,2]
## No 3.72 0.8938226
## Sí 3.92 1.8466185
##
## salario
## Y alto bajo medio
## No 0.06666667 0.56000000 0.37333333
## Sí 0.00000000 0.48000000 0.52000000
prediccion <- predict(train1, datos.test)
prop.table(table(prediccion))
## prediccion
## No Sí
## 0.8333333 0.1666667
clusplot(datos.test, prediccion, color=TRUE, shade=TRUE,
labels=4, lines=1,
main="Naive Bayes classification")

mean(datos.test$abandona == prediccion)
## [1] 0.9333333
table(prediccion, datos.test$abandona)
##
## prediccion No Sí
## No 25 0
## Sí 2 3
predict(train1, datos.test, type="raw")
## No Sí
## [1,] 0.727303955 0.272696045
## [2,] 0.965124615 0.034875385
## [3,] 0.968276768 0.031723232
## [4,] 0.960937615 0.039062385
## [5,] 0.935770707 0.064229293
## [6,] 0.064179014 0.935820986
## [7,] 0.215051970 0.784948030
## [8,] 0.028622937 0.971377063
## [9,] 0.722514135 0.277485865
## [10,] 0.968671983 0.031328017
## [11,] 0.966802531 0.033197469
## [12,] 0.959473123 0.040526877
## [13,] 0.970691547 0.029308453
## [14,] 0.799530144 0.200469856
## [15,] 0.944643469 0.055356531
## [16,] 0.938036404 0.061963596
## [17,] 0.002445752 0.997554248
## [18,] 0.285346327 0.714653673
## [19,] 0.692587406 0.307412594
## [20,] 0.969163936 0.030836064
## [21,] 0.968276768 0.031723232
## [22,] 0.913063614 0.086936386
## [23,] 0.971955135 0.028044865
## [24,] 0.911811852 0.088188148
## [25,] 0.940767123 0.059232877
## [26,] 0.931694451 0.068305549
## [27,] 0.852193026 0.147806974
## [28,] 0.925675004 0.074324996
## [29,] 0.999471895 0.000528105
## [30,] 0.893474128 0.106525872
arbol <- rpart(abandona ~ nivel_satisfaccion + numero_proyectos +salario, data = datos)
printcp(arbol)
##
## Classification tree:
## rpart(formula = abandona ~ nivel_satisfaccion + numero_proyectos +
## salario, data = datos)
##
## Variables actually used in tree construction:
## [1] nivel_satisfaccion
##
## Root node error: 25/100 = 0.25
##
## n= 100
##
## CP nsplit rel error xerror xstd
## 1 0.48 0 1.00 1.00 0.17321
## 2 0.01 1 0.52 0.52 0.13452
plotcp(arbol)

arbol.class <- predict(arbol, datos.test, type = "class")
mean(datos.test$abandona == arbol.class)
## [1] 0.9333333
table(arbol.class, datos.test$abandona)
##
## arbol.class No Sí
## No 25 0
## Sí 2 3
forest <- randomForest(abandona ~ ., data = datos)
forest.class <- predict(forest, datos.test, type = "class")
mean(datos.test$abandona == forest.class)
## [1] 1
table(forest.class, datos.test$abandona)
##
## forest.class No Sí
## No 27 0
## Sí 0 3