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