FORM

Limpieza base de datos

Análisis de datos exploratorio

rh_nueva <- read.csv("/Users/oscarcamilo/Documents/Tec MTY/ANALÍTICA PARA NEGOCIOS/RETO/ENCUESTAS/EncuestasForm_BaseLimpia.csv")

Librerías

library(dplyr)   
str(rh_nueva)
## 'data.frame':    106 obs. of  22 variables:
##  $ Puesto                    : chr  "Administrativo" "Costurera" "Ayudante general" "Ayudante general" ...
##  $ puesto_otro               : chr  "" "" "" "" ...
##  $ Antiguedad                : int  9 36 4 2 1 36 36 36 36 1 ...
##  $ Motivación                : chr  "Por el salario" "Otro" "Ubicación de la empresa" "Ubicación de la empresa" ...
##  $ Salario                   : int  5 4 2 5 3 4 2 5 4 5 ...
##  $ Prestaciones              : int  4 4 1 4 1 5 3 4 1 4 ...
##  $ Jornada_Laboral           : int  5 5 1 5 5 5 4 5 4 5 ...
##  $ Herramientas              : int  5 4 1 5 5 5 4 5 1 5 ...
##  $ Temperatura               : int  2 3 3 4 4 2 2 4 5 1 ...
##  $ Estrés                    : int  5 2 1 5 3 4 5 4 4 5 ...
##  $ Transporte                : int  4 2 4 5 1 5 1 5 5 2 ...
##  $ Instalaciones             : int  5 4 4 5 5 4 4 5 5 5 ...
##  $ Rotación                  : int  4 5 1 4 3 5 3 5 5 5 ...
##  $ Conflicto.Acoso           : chr  "No" "No" "Si" "No" ...
##  $ Satisfacción.en.el.trabajo: chr  "cotización ante imss, fecha de pago, comer a las 3pm" "Ninguno" "mucho trabajo, estrés" "Todo bien " ...
##  $ Emoción                   : chr  "agusto, feliz" "Bien" "cómoda, no satisfecha" "Tranquila y contenta " ...
##  $ Edad                      : chr  "30" "54" "21" "20" ...
##  $ Genero                    : chr  "Femenino" "Femenino" "Femenino" "Femenino" ...
##  $ Estado.Civil              : chr  "Unión libre" "Casado" "Soltero" "Casado" ...
##  $ Municipio                 : chr  "Apodaca" "Apodaca" "Apodaca" "Apodaca" ...
##  $ Escolaridad               : chr  "Licenciatura" "Primaria" "Preparatoria" "Preparatoria" ...
##  $ Dependientes              : int  0 0 0 0 0 2 1 0 0 2 ...
summary(rh_nueva$Antiguedad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    1.00    9.00   14.08   34.50   36.00
summary(rh_nueva$Edad)
##    Length     Class      Mode 
##       106 character character
sd(rh_nueva$Antiguedad)
## [1] 14.47145
sd(rh_nueva$Edad)
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm =
## na.rm): NAs introduced by coercion
## [1] NA

Tablas frecuencias - escala de satisfacción

tabla <- table(rh_nueva$Salario2)
tabla
## < table of extent 0 >
tabla <- table(rh_nueva$Prestaciones)
tabla
## 
##  1  2  3  4  5 
## 21 19 10 22 34
tabla <- table(rh_nueva$Jornada_Laboral)
tabla
## 
##  1  2  3  4  5 
##  8  6 10 19 63
tabla <- table(rh_nueva$Herramientas)
tabla
## 
##  1  2  3  4  5 
## 20  2  9 15 60
tabla <- table(rh_nueva$Temperatura)
tabla
## 
##  1  2  3  4  5 
## 35  7 12 14 38
tabla <- table(rh_nueva$Estrés)
tabla
## 
##  1  2  3  4  5 
## 13  9 20 21 43
tabla <- table(rh_nueva$Traslado)
tabla
## < table of extent 0 >
tabla <- table(rh_nueva$Instalaciones)
tabla
## 
##  1  2  3  4  5 
##  8  5  4 18 71
tabla <- table(rh_nueva$Rotación)
tabla
## 
##  1  2  3  4  5 
##  9  5 15 21 56

Tabla frecuencias - variables categoricas

tabla <- table(rh_nueva$Puesto_integrado)
tabla
## < table of extent 0 >
tabla <- table(rh_nueva$Motivación)
tabla
## 
##     Ambiente de trabajo                    Otro          Por el salario 
##                      13                      21                      19 
##            Prestaciones      Razones personales Ubicación de la empresa 
##                       2                      19                      32
tabla <- table(rh_nueva$Conflicto.Acoso)
tabla
## 
##                  No Prefiero no decirlo                  Si 
##                  89                   1                  16
tabla <- table(rh_nueva$Tipo.Emocion)
tabla
## < table of extent 0 >
tabla <- table(rh_nueva$Genero)
tabla
## 
##  Femenino Masculino 
##        69        37
tabla <- table(rh_nueva$Estado.Civil)
tabla
## 
##      Casado  Divorciado     Soltero Unión libre 
##          38           1          47          20
tabla <- table(rh_nueva$Municipio)
tabla
## 
##   Apodaca Guadalupe    Juárez Monterrey      Otro Pesquería 
##        77         4        12         3         6         4
tabla <- table(rh_nueva$Escolaridad)
tabla
## 
## Licenciatura         Otro Preparatoria     Primaria   Secundaria 
##           24            3           27            9           43
tabla <- table(rh_nueva$Dependientes)
tabla
## 
##  0  1  2  3 
## 44 24 23 15

Regresión Lineal Multiple

encuesta <- read.csv("/Users/oscarcamilo/Documents/Tec MTY/ANALÍTICA PARA NEGOCIOS/RETO/ENCUESTAS/EncuestasForm_BaseLimpia.csv")

str(encuesta)
## 'data.frame':    106 obs. of  22 variables:
##  $ Puesto                    : chr  "Administrativo" "Costurera" "Ayudante general" "Ayudante general" ...
##  $ puesto_otro               : chr  "" "" "" "" ...
##  $ Antiguedad                : int  9 36 4 2 1 36 36 36 36 1 ...
##  $ Motivación                : chr  "Por el salario" "Otro" "Ubicación de la empresa" "Ubicación de la empresa" ...
##  $ Salario                   : int  5 4 2 5 3 4 2 5 4 5 ...
##  $ Prestaciones              : int  4 4 1 4 1 5 3 4 1 4 ...
##  $ Jornada_Laboral           : int  5 5 1 5 5 5 4 5 4 5 ...
##  $ Herramientas              : int  5 4 1 5 5 5 4 5 1 5 ...
##  $ Temperatura               : int  2 3 3 4 4 2 2 4 5 1 ...
##  $ Estrés                    : int  5 2 1 5 3 4 5 4 4 5 ...
##  $ Transporte                : int  4 2 4 5 1 5 1 5 5 2 ...
##  $ Instalaciones             : int  5 4 4 5 5 4 4 5 5 5 ...
##  $ Rotación                  : int  4 5 1 4 3 5 3 5 5 5 ...
##  $ Conflicto.Acoso           : chr  "No" "No" "Si" "No" ...
##  $ Satisfacción.en.el.trabajo: chr  "cotización ante imss, fecha de pago, comer a las 3pm" "Ninguno" "mucho trabajo, estrés" "Todo bien " ...
##  $ Emoción                   : chr  "agusto, feliz" "Bien" "cómoda, no satisfecha" "Tranquila y contenta " ...
##  $ Edad                      : chr  "30" "54" "21" "20" ...
##  $ Genero                    : chr  "Femenino" "Femenino" "Femenino" "Femenino" ...
##  $ Estado.Civil              : chr  "Unión libre" "Casado" "Soltero" "Casado" ...
##  $ Municipio                 : chr  "Apodaca" "Apodaca" "Apodaca" "Apodaca" ...
##  $ Escolaridad               : chr  "Licenciatura" "Primaria" "Preparatoria" "Preparatoria" ...
##  $ Dependientes              : int  0 0 0 0 0 2 1 0 0 2 ...
encuesta$Puesto <- as.factor(encuesta$Puesto)
encuesta$Edad <- as.integer(encuesta$Edad)
## Warning: NAs introduced by coercion
encuesta$Genero <- as.factor(encuesta$Genero)
encuesta$Estado.Civil <- as.factor(encuesta$Estado.Civil)
encuesta$Municipio <- as.factor(encuesta$Municipio)
encuesta$Escolaridad <- as.factor(encuesta$Escolaridad)
str(encuesta)
## 'data.frame':    106 obs. of  22 variables:
##  $ Puesto                    : Factor w/ 8 levels "Administrativo",..: 1 3 2 2 2 2 2 1 3 2 ...
##  $ puesto_otro               : chr  "" "" "" "" ...
##  $ Antiguedad                : int  9 36 4 2 1 36 36 36 36 1 ...
##  $ Motivación                : chr  "Por el salario" "Otro" "Ubicación de la empresa" "Ubicación de la empresa" ...
##  $ Salario                   : int  5 4 2 5 3 4 2 5 4 5 ...
##  $ Prestaciones              : int  4 4 1 4 1 5 3 4 1 4 ...
##  $ Jornada_Laboral           : int  5 5 1 5 5 5 4 5 4 5 ...
##  $ Herramientas              : int  5 4 1 5 5 5 4 5 1 5 ...
##  $ Temperatura               : int  2 3 3 4 4 2 2 4 5 1 ...
##  $ Estrés                    : int  5 2 1 5 3 4 5 4 4 5 ...
##  $ Transporte                : int  4 2 4 5 1 5 1 5 5 2 ...
##  $ Instalaciones             : int  5 4 4 5 5 4 4 5 5 5 ...
##  $ Rotación                  : int  4 5 1 4 3 5 3 5 5 5 ...
##  $ Conflicto.Acoso           : chr  "No" "No" "Si" "No" ...
##  $ Satisfacción.en.el.trabajo: chr  "cotización ante imss, fecha de pago, comer a las 3pm" "Ninguno" "mucho trabajo, estrés" "Todo bien " ...
##  $ Emoción                   : chr  "agusto, feliz" "Bien" "cómoda, no satisfecha" "Tranquila y contenta " ...
##  $ Edad                      : int  30 54 21 20 43 61 55 29 56 36 ...
##  $ Genero                    : Factor w/ 2 levels "Femenino","Masculino": 1 1 1 1 1 1 1 2 1 1 ...
##  $ Estado.Civil              : Factor w/ 4 levels "Casado","Divorciado",..: 4 1 3 1 3 4 1 3 3 4 ...
##  $ Municipio                 : Factor w/ 6 levels "Apodaca","Guadalupe",..: 1 1 1 1 3 1 1 1 1 1 ...
##  $ Escolaridad               : Factor w/ 5 levels "Licenciatura",..: 1 4 3 3 5 5 5 1 5 5 ...
##  $ Dependientes              : int  0 0 0 0 0 2 1 0 0 2 ...
regresion_insatisfaccion <- lm(Rotación ~ Puesto + Antiguedad + Salario + Prestaciones + Jornada_Laboral + Herramientas + Temperatura + Estrés + Transporte + Instalaciones + Rotación + Conflicto.Acoso + Edad + Genero + Estado.Civil + Municipio + Escolaridad + Dependientes, data = encuesta)
## Warning in model.matrix.default(mt, mf, contrasts): the response appeared on
## the right-hand side and was dropped
## Warning in model.matrix.default(mt, mf, contrasts): problem with term 11 in
## model.matrix: no columns are assigned
summary(regresion_insatisfaccion)
## 
## Call:
## lm(formula = Rotación ~ Puesto + Antiguedad + Salario + Prestaciones + 
##     Jornada_Laboral + Herramientas + Temperatura + Estrés + 
##     Transporte + Instalaciones + Rotación + Conflicto.Acoso + 
##     Edad + Genero + Estado.Civil + Municipio + Escolaridad + 
##     Dependientes, data = encuesta)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.29012 -0.64373  0.04135  0.49448  2.01758 
## 
## Coefficients:
##                                     Estimate Std. Error t value Pr(>|t|)  
## (Intercept)                         1.804844   0.815519   2.213   0.0301 *
## PuestoAyudante general             -0.519078   0.526814  -0.985   0.3278  
## PuestoCosturera                     0.269387   0.679540   0.396   0.6930  
## PuestoLimpieza                     -0.320732   0.980206  -0.327   0.7445  
## PuestoMantenimiento                 0.495872   1.260599   0.393   0.6952  
## PuestoOtro                         -0.479538   0.483901  -0.991   0.3251  
## PuestoSoldador                      0.928738   1.064599   0.872   0.3859  
## PuestoSupervisor                   -0.104395   0.671675  -0.155   0.8769  
## Antiguedad                          0.006569   0.009954   0.660   0.5115  
## Salario                             0.123600   0.106579   1.160   0.2501  
## Prestaciones                        0.217988   0.092744   2.350   0.0215 *
## Jornada_Laboral                     0.030917   0.108364   0.285   0.7762  
## Herramientas                        0.149761   0.095729   1.564   0.1222  
## Temperatura                        -0.150837   0.064509  -2.338   0.0222 *
## Estrés                              0.064348   0.089079   0.722   0.4724  
## Transporte                          0.088840   0.088902   0.999   0.3210  
## Instalaciones                       0.014727   0.114430   0.129   0.8980  
## Conflicto.AcosoPrefiero no decirlo -0.180756   1.117257  -0.162   0.8719  
## Conflicto.AcosoSi                  -0.376954   0.350675  -1.075   0.2860  
## Edad                                0.016367   0.013373   1.224   0.2250  
## GeneroMasculino                    -0.221957   0.268375  -0.827   0.4110  
## Estado.CivilDivorciado             -0.451114   1.292909  -0.349   0.7282  
## Estado.CivilSoltero                 0.039064   0.326676   0.120   0.9052  
## Estado.CivilUnión libre            -0.502234   0.372325  -1.349   0.1817  
## MunicipioGuadalupe                  0.123431   0.606001   0.204   0.8392  
## MunicipioJuárez                    -0.591573   0.406681  -1.455   0.1502  
## MunicipioMonterrey                  0.521235   0.784442   0.664   0.5085  
## MunicipioOtro                       0.335439   0.583078   0.575   0.5669  
## MunicipioPesquería                 -0.676459   0.594653  -1.138   0.2591  
## EscolaridadOtro                     0.575140   0.848774   0.678   0.5002  
## EscolaridadPreparatoria            -0.346103   0.463915  -0.746   0.4581  
## EscolaridadPrimaria                 0.040090   0.615192   0.065   0.9482  
## EscolaridadSecundaria               0.392371   0.488042   0.804   0.4241  
## Dependientes                       -0.023152   0.129122  -0.179   0.8582  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9994 on 71 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.5851, Adjusted R-squared:  0.3923 
## F-statistic: 3.034 on 33 and 71 DF,  p-value: 4.598e-05

Observaciones:

  • Se hizo la regresión lineal utilizando como variable dependiente la variable de Rotación que explica si los empleados consideraban probable el seguir trabajando en FORM

  • Tenemos una R^2 de .39 y se utilizaron como variables independientes las demás variables que no eran preguntas abiertas en la encuesta

Clusters

Crear base de datos con la base limpia

df<- read.csv("/Users/oscarcamilo/Documents/Tec MTY/ANALÍTICA PARA NEGOCIOS/RETO/ENCUESTAS/EncuestasForm_BaseLimpia.csv")

Limpieza extra de base de datos para poder correr un cluster

df <- select(df, Estrés, Rotación)
df <- na.omit(df)

Determinar el número de grupos

grupos <- 4

Realizar clasificación

segmentos <- kmeans(df,grupos)

Revisar asignación de grupos

asignación <- cbind(df,cluster=segmentos$cluster)

Graficar resultados

library (ggplot2)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(segmentos,data=df,palette=c("red","blue","darkgreen","yellow"),
             ellipse.type="euclid",
             star.plot= T,
             repel=T,
             ggtheme=theme())

#6.Optimizar cantidad de grupos
library (cluster)
library (data.table)
## 
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
set.seed (123)
optimización <- clusGap(df,FUN=kmeans, nstart=1, K.max=10)
plot(optimización, xlab="Número de clusters k")

Perfilado de segmentos

1.Instalar Paquetes

library(readr)
library("dplyr")
library(cluster)
rm(list = ls())
getwd()
## [1] "/Users/oscarcamilo/Documents/Tec MTY/ANALÍTICA PARA NEGOCIOS/RETO/ENCUESTAS"

2.Cargar el conjunto de datos

# 1. Cargar el conjunto de datos
datos <- read.csv("/Users/oscarcamilo/Documents/Tec MTY/ANALÍTICA PARA NEGOCIOS/RETO/ENCUESTAS/EncuestasForm_BaseLimpia.csv")

3.Seleccionar solo las variables numéricas

datos_numericos <- datos[sapply(datos, is.numeric)]
# View(datos_numericos)

4.Escalar las variables numéricas

datos_escalados <- scale(datos_numericos)
# View(datos_escalados)

5.Calcular las medianas de las variables numéricas escaladas

media <- apply(datos_escalados, 2, mean)
# View(media)
set.seed(123) # Para reproducibilidad

6.clusters que deseas

k <- 3 # Cambia este valor por el número de clusters que deseas
indices_centroides_iniciales <- sample(1:nrow(datos_escalados), k)
centroides_iniciales <- datos_escalados[indices_centroides_iniciales, ]

6.clusters que deseas

# Ejecutar k-means con los centroides iniciales
resultado_kmeans <- kmeans(datos_escalados, centers = centroides_iniciales)

print(resultado_kmeans)
## K-means clustering with 3 clusters of sizes 65, 16, 25
## 
## Cluster means:
##    Antiguedad    Salario Prestaciones Jornada_Laboral Herramientas Temperatura
## 1  0.04581365  0.3626082    0.4480907       0.4960589    0.4534784  0.08958709
## 2 -0.25138960 -1.2012483   -0.9008792      -0.1771124   -1.4441653  0.14653768
## 3  0.04177386 -0.1739824   -0.5884731      -1.1764012   -0.2547780 -0.32671056
##       Estrés Transporte Instalaciones    Rotación Dependientes
## 1  0.1524490  0.3710519     0.3370262  0.36734886  0.006750785
## 2 -0.9779247 -0.2133885    -1.1244849 -1.39741185  0.207570080
## 3  0.2295043 -0.8281663    -0.1565978 -0.06076345 -0.150396891
## 
## Clustering vector:
##   [1] 1 1 2 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 2 2 1 3 3 3 1 3 1 3 1 1 1 2 2 1 1 3 2
##  [38] 2 2 1 1 1 3 1 1 1 2 1 2 1 3 1 1 1 1 2 1 1 1 1 1 3 1 1 3 3 3 1 3 2 1 1 1 3
##  [75] 2 2 2 3 2 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 432.3773 186.5323 250.2797
##  (between_SS / total_SS =  24.7 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

7.Ajustar el modelo k-means para diferentes valores de k

set.seed(123) # Para reproducibilidad
wcss <- vector() # Inicializar vector para almacenar los valores de WCSS
max_k <- 10 # Puedes cambiar esto para probar con más clústeres si lo deseas
for (k in 1:max_k) {
  kmeans_model <- kmeans(datos_escalados, centers = k, nstart = 25)
  wcss[k] <- kmeans_model$tot.withinss
}

8.Gráficar el método de codo

par(mar = c(4, 4, 1, 1)) # Los números representan los márgenes inferior, izquierdo, superior y derecho respectivamente.
plot(1:max_k, wcss, type = "b", xlab = "Numero de Clusters", ylab = "WCSS", main = "Metodo del Codo", pch = 19, frame = FALSE)

# Establecer una semilla para la reproducibilidad
set.seed(178)

9.Realizar K-means con 4 clusters

kmeans_result <- kmeans(datos_escalados, centers = 4)
kmeans_result$centers
##   Antiguedad    Salario Prestaciones Jornada_Laboral Herramientas Temperatura
## 1 -0.1185418 -0.1440439   -0.3823495       0.1268462   -0.7164270 -0.09444148
## 2 -0.6944592  0.4815947    0.3192635       0.4023294    0.5718499 -0.17543788
## 3  1.3192318  0.2800853    0.6557833       0.2367746    0.6129511  0.46106872
## 4 -0.0896727 -1.2168413   -1.0350742      -1.3635885   -1.0612389 -0.10347417
##         Estrés Transporte Instalaciones   Rotación Dependientes
## 1 -0.915317228  0.4444735    -0.1565978 -0.1545633   0.03200666
## 2  0.596434303 -0.1252232     0.4587532  0.1709303  -0.14759068
## 3 -0.009000169  0.3251635     0.3249584  0.6218913   0.22657045
## 4 -0.009000169 -0.7795586    -1.2097463 -0.9848660  -0.02676782

10.Añadir la columna de clusters al dataframe original

datos1 <- datos
datos1$Cluster <- kmeans_result$cluster

11.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Genero)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##     Femenino Masculino
##   1 64.00000  36.00000
##   2 71.79487  28.20513
##   3 62.50000  37.50000
##   4 55.55556  44.44444

12.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Escolaridad)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##     Licenciatura      Otro Preparatoria  Primaria Secundaria
##   1    28.000000  4.000000    20.000000  4.000000  44.000000
##   2    23.076923  0.000000    25.641026  7.692308  43.589744
##   3    25.000000  8.333333    16.666667 12.500000  37.500000
##   4    11.111111  0.000000    44.444444 11.111111  33.333333

13.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Municipio)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##       Apodaca Guadalupe    Juárez Monterrey      Otro Pesquería
##   1 92.000000  4.000000  4.000000  0.000000  0.000000  0.000000
##   2 69.230769  2.564103 17.948718  2.564103  2.564103  5.128205
##   3 62.500000  8.333333  4.166667  8.333333 12.500000  4.166667
##   4 66.666667  0.000000 16.666667  0.000000 11.111111  5.555556

14.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Estado.Civil)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##        Casado Divorciado   Soltero Unión libre
##   1 28.000000   0.000000 56.000000   16.000000
##   2 23.076923   2.564103 48.717949   25.641026
##   3 45.833333   0.000000 33.333333   20.833333
##   4 61.111111   0.000000 33.333333    5.555556

15.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Puesto)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##     Administrativo Ayudante general Costurera  Limpieza Mantenimiento      Otro
##   1      24.000000        28.000000 12.000000  0.000000      0.000000 28.000000
##   2      12.820513        71.794872  0.000000  0.000000      0.000000 15.384615
##   3      16.666667        12.500000 12.500000  4.166667      0.000000 33.333333
##   4      11.111111        44.444444  5.555556  5.555556      5.555556 22.222222
##    
##      Soldador Supervisor
##   1  4.000000   4.000000
##   2  0.000000   0.000000
##   3  0.000000  20.833333
##   4  5.555556   0.000000

Árbol de decisiones

Librerías y base de datos

library(dplyr)
library(readr)
library(readr)
library(rpart)
library(rpart.plot)

bd <- read_csv("/Users/oscarcamilo/Documents/Tec MTY/ANALÍTICA PARA NEGOCIOS/RETO/ENCUESTAS/EncuestasForm_BaseLimpia.csv")
## Rows: 106 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): Puesto, puesto_otro, Motivación, Conflicto/Acoso, Satisfacción en ...
## dbl (11): Antiguedad, Salario, Prestaciones, Jornada_Laboral, Herramientas, ...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# View(bd)

Entender base de datos

summary(bd)
##     Puesto          puesto_otro          Antiguedad     Motivación       
##  Length:106         Length:106         Min.   : 1.00   Length:106        
##  Class :character   Class :character   1st Qu.: 1.00   Class :character  
##  Mode  :character   Mode  :character   Median : 9.00   Mode  :character  
##                                        Mean   :14.08                     
##                                        3rd Qu.:34.50                     
##                                        Max.   :36.00                     
##     Salario       Prestaciones   Jornada_Laboral  Herramientas  
##  Min.   :1.000   Min.   :1.000   Min.   :1.00    Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:2.000   1st Qu.:4.00    1st Qu.:3.000  
##  Median :4.000   Median :4.000   Median :5.00    Median :5.000  
##  Mean   :3.792   Mean   :3.274   Mean   :4.16    Mean   :3.877  
##  3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.00    3rd Qu.:5.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.00    Max.   :5.000  
##   Temperatura        Estrés        Transporte    Instalaciones  
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:1.000   1st Qu.:3.000   1st Qu.:4.000   1st Qu.:4.000  
##  Median :3.000   Median :4.000   Median :5.000   Median :5.000  
##  Mean   :3.123   Mean   :3.679   Mean   :4.009   Mean   :4.311  
##  3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##     Rotación     Conflicto/Acoso    Satisfacción en el trabajo
##  Min.   :1.000   Length:106         Length:106                
##  1st Qu.:3.000   Class :character   Class :character          
##  Median :5.000   Mode  :character   Mode  :character          
##  Mean   :4.038                                                
##  3rd Qu.:5.000                                                
##  Max.   :5.000                                                
##    Emoción              Edad              Genero          Estado Civil      
##  Length:106         Length:106         Length:106         Length:106        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##   Municipio         Escolaridad         Dependientes  
##  Length:106         Length:106         Min.   :0.000  
##  Class :character   Class :character   1st Qu.:0.000  
##  Mode  :character   Mode  :character   Median :1.000  
##                                        Mean   :1.085  
##                                        3rd Qu.:2.000  
##                                        Max.   :3.000

Limpiar base de datos

# Extraer las variables de interés
db <- bd[,c("Genero", "Estado Civil", "Edad", "Rotación", "Estrés", "Motivación", "Salario", "Prestaciones", "Puesto", "Instalaciones")]

# Cambiar edades
db$Edad <- as.numeric(db$Edad)
## Warning: NAs introduced by coercion
rango_edad <-seq(18, 68, by = 10)
db$rango_edad <- cut(db$Edad, breaks = rango_edad, labels = c("18-27", "28-37", "38-47", "48-57", "58-68"), include.lowest = TRUE, right = FALSE)

# ¿Cuántos NA tengo por variable?
sapply(db, function(x) sum(is.na(x)))
##        Genero  Estado Civil          Edad      Rotación        Estrés 
##             0             0             1             0             0 
##    Motivación       Salario  Prestaciones        Puesto Instalaciones 
##             0             0             0             0             0 
##    rango_edad 
##             1
# Eliminar NA
db <- na.omit(db)

str(db)
## tibble [105 × 11] (S3: tbl_df/tbl/data.frame)
##  $ Genero       : chr [1:105] "Femenino" "Femenino" "Femenino" "Femenino" ...
##  $ Estado Civil : chr [1:105] "Unión libre" "Casado" "Soltero" "Casado" ...
##  $ Edad         : num [1:105] 30 54 21 20 43 61 55 29 56 36 ...
##  $ Rotación     : num [1:105] 4 5 1 4 3 5 3 5 5 5 ...
##  $ Estrés       : num [1:105] 5 2 1 5 3 4 5 4 4 5 ...
##  $ Motivación   : chr [1:105] "Por el salario" "Otro" "Ubicación de la empresa" "Ubicación de la empresa" ...
##  $ Salario      : num [1:105] 5 4 2 5 3 4 2 5 4 5 ...
##  $ Prestaciones : num [1:105] 4 4 1 4 1 5 3 4 1 4 ...
##  $ Puesto       : chr [1:105] "Administrativo" "Costurera" "Ayudante general" "Ayudante general" ...
##  $ Instalaciones: num [1:105] 5 4 4 5 5 4 4 5 5 5 ...
##  $ rango_edad   : Factor w/ 5 levels "18-27","28-37",..: 2 4 1 1 3 5 4 2 4 2 ...
##  - attr(*, "na.action")= 'omit' Named int 41
##   ..- attr(*, "names")= chr "41"

Crear árbol

arbol <- rpart(formula = Rotación ~ ., data=db)
arbol
## n= 105 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 105 170.914300 4.028571  
##    2) Prestaciones< 2.5 40  81.975000 3.275000  
##      4) Salario< 2.5 13  23.230770 2.461538 *
##      5) Salario>=2.5 27  46.000000 3.666667  
##       10) Motivación=Otro,Ubicación de la empresa 16  28.437500 3.187500 *
##       11) Motivación=Ambiente de trabajo,Por el salario,Razones personales 11   8.545455 4.363636 *
##    3) Prestaciones>=2.5 65  52.246150 4.492308  
##      6) Edad< 28.5 18  26.500000 3.833333 *
##      7) Edad>=28.5 47  14.936170 4.744681  
##       14) Salario< 2.5 7   5.428571 4.285714 *
##       15) Salario>=2.5 40   7.775000 4.825000 *
rpart.plot(arbol)

arbol <- rpart(formula = Rotación ~ ., data=db)
arbol
## n= 105 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 105 170.914300 4.028571  
##    2) Prestaciones< 2.5 40  81.975000 3.275000  
##      4) Salario< 2.5 13  23.230770 2.461538 *
##      5) Salario>=2.5 27  46.000000 3.666667  
##       10) Motivación=Otro,Ubicación de la empresa 16  28.437500 3.187500 *
##       11) Motivación=Ambiente de trabajo,Por el salario,Razones personales 11   8.545455 4.363636 *
##    3) Prestaciones>=2.5 65  52.246150 4.492308  
##      6) Edad< 28.5 18  26.500000 3.833333 *
##      7) Edad>=28.5 47  14.936170 4.744681  
##       14) Salario< 2.5 7   5.428571 4.285714 *
##       15) Salario>=2.5 40   7.775000 4.825000 *
rpart.plot(
  arbol,
  fallen.leaves = TRUE,
  type = 2,
  extra = 100,
  under = TRUE
  )