FORM

OTRA FORMA DE LIMPIAR LOS DATOS

ANÁLISIS EXPLORATORIO DE LOS DATOS

Se coloca la base de datos limpia a utilizar.

library(readxl)
BASELIMPIAFORM <- read_excel("C:\\Users\\luisa\\Documents\\R LUISA\\EVIDENCIA 2\\BASELIMPIAFORM.xlsx")
#View(BASELIMPIAFORM)

Se le llama a la librería.

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(ggplot2)
library(cluster)
library(dplyr)
library(readr)
library(rpart)
library(rpart.plot)

Medidas de Tendencia Central Var Num

#Antiguedad en meses
summary(BASELIMPIAFORM$Antiguedad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    1.00    9.00   14.08   34.50   36.00
#Antiguedad en años
summary(BASELIMPIAFORM$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   25.25   33.50   35.62   45.00   68.00

Desviación estándar

sd(BASELIMPIAFORM$Antiguedad)
## [1] 14.47145
sd(BASELIMPIAFORM$Edad)
## [1] 12.1604

Visualización de las medidas de tendencia central

# Crear un histograma para "Antigüedad"
ggplot(BASELIMPIAFORM, aes(x = Antiguedad)) +
  geom_histogram(binwidth = 1, fill = "orange", color = "black") +
  labs(title = "Antigüedad (Meses) de los empleados FORM", x = "Antigüedad", y = "Frecuencia")

# Crear un histograma para "Edad"
ggplot(BASELIMPIAFORM, aes(x = Edad)) +
  geom_histogram(binwidth = 5, fill = "orange", color = "black") +
  labs(title = "Edad (años) de los empleados FORM", x = "Edad", y = "Frecuencia")

Tablas de Frecuencia- Var Categóricas

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Puesto)
tabla
## 
##   Administrativo Ayudante general        Costurera         Limpieza 
##               17               46                7                2 
##    Mantenimiento             Otro         Soldador       Supervisor 
##                1               25                2                6
# Crear un gráfico de barras
barplot(tabla, main = "Puestos de Trabajo de los Empleados", xlab = "Puesto", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Motivación)
tabla
## 
##     Ambiente de trabajo                    Otro          Por el salario 
##                      13                      21                      19 
##            Prestaciones      Razones personales Ubicación de la empresa 
##                       2                      19                      32
# Crear un gráfico de barras
barplot(tabla, main = "Motivaciones del Empleado", xlab = "Motivación", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$`Conflicto/Acoso`)
tabla
## 
##                  No Prefiero no decirlo                  Si 
##                  89                   1                  16
# Crear un gráfico de barras
barplot(tabla, main = "¿Han sufrido algun Conflicto/Acoso en la empresa?", xlab = "`Conflicto/Acoso`", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Emoción)
tabla
## 
##                                                                                                                                  a gusto 
##                                                                                                                                        2 
##                                                                                                                                  A gusto 
##                                                                                                                                        2 
##                                                                                                                                   agusto 
##                                                                                                                                        2 
##                                                                                                                                   Agusto 
##                                                                                                                                        4 
##                                                                                                                            agusto, feliz 
##                                                                                                                                        1 
##                                                                                       agusto, gusta el ambiente de trabajo, buenos modos 
##                                                                                                                                        1 
##                                                                                                                          Al momento bien 
##                                                                                                                                        1 
##                                                                                                             Alegre, proactivo, optimista 
##                                                                                                                                        1 
##                                                                                                                            bastante bien 
##                                                                                                                                        1 
##                                                                                                                                     bien 
##                                                                                                                                       14 
##                                                                                                                                     Bien 
##                                                                                                                                       21 
##                                                                                                                              bien normal 
##                                                                                                                                        1 
##                                                                                                                            bien, a gusto 
##                                                                                                                                        1 
##                                                                                                                            Bien, a gusto 
##                                                                                                                                        1 
##                                                                                                                             Bien, agusto 
##                                                                                                                                        1 
##                                                                                                                             Bien, Agusto 
##                                                                                                                                        1 
##                                                                                                                        bien, aprendiendo 
##                                                                                                                                        1 
##                                                                                                                             Bien, comoda 
##                                                                                                                                        1 
##                                                                                                                             bien, cómoda 
##                                                                                                                                        1 
##                                                                                                                             Bien, comodo 
##                                                                                                                                        1 
##                                                                                                                           bien, le gusta 
##                                                                                                                                        1 
##                                                              Bien, pero podría mejorar en prestaciones. El bono es muy facil de perderlo 
##                                                                                                                                        1 
##                                                                                                              bien, realizada, satisfecha 
##                                                                                                                                        1 
##                                                                                                                                   comoda 
##                                                                                                                                        1 
##                                                                                                                                   Comoda 
##                                                                                                                                        4 
##                                                                                                                    cómoda, no satisfecha 
##                                                                                                                                        1 
##                                                                                                        cómoda, trabajo no tan complicado 
##                                                                                                                                        1 
##                                                                                                                                   Comodo 
##                                                                                                                                        1 
##                                                                                                        con mucho crecimiento profesional 
##                                                                                                                                        1 
##                                                                                                                                 Contenta 
##                                                                                                                                        1 
##                                                                                                                         Contenta y capaz 
##                                                                                                                                        1 
##                                                                                                                                 Contento 
##                                                                                                                                        1 
##                                                                         En ambiente laboral ciertamente cómodo con mi equipo de trabajo. 
##                                                                                                                                        1 
##                                                                                                               En crecimiento personal :) 
##                                                                                                                                        1 
##                                                                                                                                    equis 
##                                                                                                                                        1 
##                                                                                                                                  Estable 
##                                                                                                                                        1 
##                                                                                                                                    feliz 
##                                                                                                                                        2 
##                                                                                                                                    Feliz 
##                                                                                                                                        1 
##                                                                                                                 Feliz con lo que realizo 
##                                                                                                                                        1 
##                                                                                                                          Feliz y a gusto 
##                                                                                                                                        1 
##                                                                           Feliz, en paz , y em mucho crecimiento personal y profesional. 
##                                                                                                                                        1 
## Insegura, falta mucha retroalimentacion por falta de nuestros jefes directos, las renovaciones de contratos no se dan en tiempo y forma. 
##                                                                                                                                        1 
##                                                                                                           la mayor parte del tiempo bien 
##                                                                                                                                        1 
##                                                                                                                              Más o menos 
##                                                                                                                                        1 
##                                                                                                                    Me agrada lo que hago 
##                                                                                                                                        1 
##                                                                                 me sentía muy bien al principio, pero actualmente ya no. 
##                                                                                                                                        1 
##                                                                                                        me siento comodo hasta el momento 
##                                                                                                                                        1 
##                                                                                                                    muy agusto trabajando 
##                                                                                                                                        1 
##                                                                                                                                 muy bien 
##                                                                                                                                        2 
##                                                                                                    Muy comoda con menos estres que antes 
##                                                                                                                                        1 
##                                                                                                                            no satisfecho 
##                                                                                                                                        1 
##                                                                                                                                   Normal 
##                                                                                                                                        2 
##                                                                                                                                 perfecto 
##                                                                                                                                        1 
##                                                                                                             perfecto, buenas condiciones 
##                                                                                                                                        1 
##                                                                                                                                  regular 
##                                                                                                                                        1 
##                                                                                                                               Satisfecho 
##                                                                                                                                        2 
##                             siento que hay un muy buen ambiente laboral, todos trabajan como equipo aunque a ves hay pequeños deacuerdos 
##                                                                                                                                        1 
##                                                                                                                     Tranquila y contenta 
##                                                                                                                                        1 
##                                                                        Tranquila, contenta por el puesto y agradecida por el aprendizaje 
##                                                                                                                                        1 
##                                                                                                                                Tranquilo 
##                                                                                                                                        1
# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Genero)
tabla
## 
##  Femenino Masculino 
##        69        37
# Crear un gráfico de barras
barplot(tabla, main = "Género de los Empleados", xlab = "Genero", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$`Estado Civil`)
tabla
## 
##      Casado  Divorciado     Soltero Unión libre 
##          38           1          47          20
# Crear un gráfico de barras
barplot(tabla, main = "Estado Civil de los Empleados", xlab = "`Estado Civil`", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Municipio)
tabla
## 
##   Apodaca Guadalupe    Juárez Monterrey      Otro Pesquería 
##        77         4        12         3         6         4
# Crear un gráfico de barras
barplot(tabla, main = "Municipios donde Habitan los Emleados", xlab = "Municipio", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Escolaridad)
tabla
## 
## Licenciatura         Otro Preparatoria     Primaria   Secundaria 
##           24            3           27            9           43
# Crear un gráfico de barras
barplot(tabla, main = "Nivel de Escolarización de los Empleados", xlab = "Escolaridad", ylab = "Frecuencia", col = "orange")

# Crear una tabla de frecuencias
tabla <- table(BASELIMPIAFORM$Dependientes)
tabla
## 
##  0  1  2  3 
## 44 24 23 15
# Crear un gráfico de barras
barplot(tabla, main = "Número de Dependientes Económicos", xlab = "Dependientes", ylab = "Frecuencia", col = "orange")

Tablas de Frecuencia-Satisfacción

tabla <- table(BASELIMPIAFORM$Salario)
tabla
## 
##  1  2  3  4  5 
## 11 11  8 35 41
tabla <- table(BASELIMPIAFORM$Prestaciones)
tabla
## 
##  1  2  3  4  5 
## 21 19 10 22 34
tabla <- table(BASELIMPIAFORM$Jornada_Laboral)
tabla
## 
##  1  2  3  4  5 
##  8  6 10 19 63
tabla <- table(BASELIMPIAFORM$Herramientas)
tabla
## 
##  1  2  3  4  5 
## 20  2  9 15 60
tabla <- table(BASELIMPIAFORM$Temperatura)
tabla
## 
##  1  2  3  4  5 
## 35  7 12 14 38
tabla <- table(BASELIMPIAFORM$Estrés)
tabla
## 
##  1  2  3  4  5 
## 13  9 20 21 43
tabla <- table(BASELIMPIAFORM$Transporte)
tabla
## 
##  1  2  3  4  5 
## 15  9  2 14 66
tabla <- table(BASELIMPIAFORM$Instalaciones)
tabla
## 
##  1  2  3  4  5 
##  8  5  4 18 71
tabla <- table(BASELIMPIAFORM$Rotación)
tabla
## 
##  1  2  3  4  5 
##  9  5 15 21 56

Regresión Lineal Múltiple

BASELIMPIAFORM$Puesto <- as.factor(BASELIMPIAFORM$Puesto)
BASELIMPIAFORM$Edad <- as.integer(BASELIMPIAFORM$Edad)
BASELIMPIAFORM$Genero <- as.factor(BASELIMPIAFORM$Genero)
BASELIMPIAFORM$`Estado Civil` <- as.factor(BASELIMPIAFORM$`Estado Civil`)
BASELIMPIAFORM$Municipio <- as.factor(BASELIMPIAFORM$Municipio)
BASELIMPIAFORM$Escolaridad <- as.factor(BASELIMPIAFORM$Escolaridad)
View(BASELIMPIAFORM)
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 = BASELIMPIAFORM)
## 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 = BASELIMPIAFORM)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.29616 -0.62052  0.04179  0.49072  2.01971 
## 
## Coefficients:
##                                       Estimate Std. Error t value Pr(>|t|)  
## (Intercept)                           1.771775   0.799112   2.217   0.0298 *
## PuestoAyudante general               -0.516669   0.523276  -0.987   0.3268  
## PuestoCosturera                       0.285826   0.671824   0.425   0.6718  
## PuestoLimpieza                       -0.332525   0.972626  -0.342   0.7334  
## PuestoMantenimiento                   0.496362   1.252346   0.396   0.6930  
## PuestoOtro                           -0.468914   0.478818  -0.979   0.3307  
## PuestoSoldador                        0.945539   1.055455   0.896   0.3733  
## PuestoSupervisor                     -0.083012   0.661675  -0.125   0.9005  
## Antiguedad                            0.006051   0.009666   0.626   0.5333  
## Salario                               0.119638   0.104667   1.143   0.2568  
## Prestaciones                          0.216681   0.091986   2.356   0.0212 *
## Jornada_Laboral                       0.026096   0.105882   0.246   0.8060  
## Herramientas                          0.151349   0.094886   1.595   0.1151  
## Temperatura                          -0.151512   0.064029  -2.366   0.0207 *
## Estrés                                0.069472   0.086045   0.807   0.4221  
## Transporte                            0.087999   0.088254   0.997   0.3221  
## Instalaciones                         0.015803   0.113598   0.139   0.8897  
## `Conflicto/Acoso`Prefiero no decirlo -0.173756   1.109585  -0.157   0.8760  
## `Conflicto/Acoso`Si                  -0.370540   0.347417  -1.067   0.2897  
## Edad                                  0.017326   0.012709   1.363   0.1771  
## GeneroMasculino                      -0.209099   0.261519  -0.800   0.4266  
## `Estado Civil`Divorciado             -0.342920   1.207940  -0.284   0.7773  
## `Estado Civil`Soltero                 0.056058   0.317207   0.177   0.8602  
## `Estado Civil`Unión libre            -0.476305   0.354776  -1.343   0.1836  
## MunicipioGuadalupe                    0.143323   0.596658   0.240   0.8109  
## MunicipioJuárez                      -0.591303   0.404018  -1.464   0.1477  
## MunicipioMonterrey                    0.529007   0.778676   0.679   0.4991  
## MunicipioOtro                         0.266456   0.507965   0.525   0.6015  
## MunicipioPesquería                   -0.689758   0.588317  -1.172   0.2449  
## EscolaridadOtro                       0.586581   0.841953   0.697   0.4882  
## EscolaridadPreparatoria              -0.341526   0.460508  -0.742   0.4607  
## EscolaridadPrimaria                   0.056646   0.607501   0.093   0.9260  
## EscolaridadSecundaria                 0.394320   0.484784   0.813   0.4187  
## Dependientes                         -0.029480   0.125708  -0.235   0.8153  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9928 on 72 degrees of freedom
## Multiple R-squared:  0.587,  Adjusted R-squared:  0.3977 
## F-statistic: 3.101 on 33 and 72 DF,  p-value: 3.127e-05

Observaciones de la regresión Lineal

La regresión Lineal se hizo la regresión lineal utilizando como variable dependiente la variable de Rotación, con el objetivo de explicar si los empleados consideran probable seguir trabajando en FORM.

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

Método 1- SEGMENTACIÓN DE LOS DATOS/CLUSTERS

Limpieza extra de base de datos para poder correr un cluster

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

Se debe determinar el número de clusters y asginar a los grupos

grupos <- 4
segmentos <- kmeans(BASELIMPIAFORM,grupos)

Se debe realizar una asignación de grupos

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

Se crea una visualización de datos mediante un gráfico

library (ggplot2)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(segmentos,data=BASELIMPIAFORM,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(BASELIMPIAFORM,FUN=kmeans, nstart=1, K.max=10)
plot(optimización, xlab="Número de clusters k")

Método 2- PERFILADO DE SEGMENTOS/CLUSTERS

rm(list = ls())
getwd()
## [1] "C:/Users/luisa/Documents/R LUISA/EVIDENCIA 2"
library(readxl)
BASELIMPIAFORM <- read_excel("C:\\Users\\luisa\\Documents\\R LUISA\\EVIDENCIA 2\\BASELIMPIAFORM.xlsx")
#View(BASELIMPIAFORM)

# Seleccionar las columnas numéricas de BASELIMPIAFORM y almacenarlas en datos_numericos
datos_numericos <- BASELIMPIAFORM[sapply(BASELIMPIAFORM, is.numeric)]

# View(datos_numericos)

Escalar las variables numéricas

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

Calcular las medianas de las variables numéricas escaladas

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

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, ]


# 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         Edad Dependientes
## 1  0.1524490  0.3710519     0.3370262  0.36734886  0.005728939  0.006750785
## 2 -0.9779247 -0.2133885    -1.1244849 -1.39741185 -0.313323737  0.207570080
## 3  0.2295043 -0.8281663    -0.1565978 -0.06076345  0.185631950 -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] 500.5013 198.3966 272.8571
##  (between_SS / total_SS =  22.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

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
}

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)

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.5807662 -0.6829375  -0.45964588      -0.4135247   -0.4343081 -0.44284509
## 2 -0.6797783  0.3870086   0.03848613       0.3077267    0.3534262 -0.22329552
## 3  0.6678854  0.5157127   0.87347752       0.4317614    0.5298353  0.74602847
## 4 -0.3334477 -1.0920974  -1.14243027      -1.1869967   -1.5243127  0.02556421
##       Estrés  Transporte Instalaciones   Rotación       Edad Dependientes
## 1 -0.5718708  0.07328684    -0.1565978  0.1893696  0.3895726    0.5062559
## 2  0.3317205  0.04109209     0.3882955 -0.1597744 -0.6072619   -0.3380120
## 3  0.2560048  0.33743816     0.3817994  0.6363666  0.6584478    0.1927920
## 4 -0.5456353 -1.05573909    -1.8918372 -1.2671342 -0.1677008   -0.3054399

Añadir la columna de clusters al dataframe original

datos1 <- BASELIMPIAFORM
datos1$Cluster <- kmeans_result$cluster

11.Tabla de contingencia

contingency <- table(datos1$Cluster, BASELIMPIAFORM$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 84.00000  16.00000
##   2 59.52381  40.47619
##   3 59.25926  40.74074
##   4 58.33333  41.66667

12.Tabla de contingencia

contingency <- table(datos1$Cluster, BASELIMPIAFORM$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    20.000000  4.000000    28.000000  4.000000  44.000000
##   2    33.333333  0.000000    28.571429  4.761905  33.333333
##   3    14.814815  7.407407    11.111111 14.814815  51.851852
##   4     8.333333  0.000000    41.666667 16.666667  33.333333

13.Tabla de contingencia

contingency <- table(datos1$Cluster, BASELIMPIAFORM$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 84.000000  4.000000  4.000000  4.000000  4.000000  0.000000
##   2 71.428571  2.380952 16.666667  2.380952  2.380952  4.761905
##   3 62.962963  7.407407  7.407407  3.703704 11.111111  7.407407
##   4 75.000000  0.000000 16.666667  0.000000  8.333333  0.000000

14.Tabla de contingencia

contingency <- table(datos1$Cluster, BASELIMPIAFORM$`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 44.000000   0.000000 36.000000   20.000000
##   2 11.904762   2.380952 61.904762   23.809524
##   3 59.259259   0.000000 22.222222   18.518519
##   4 50.000000   0.000000 50.000000    0.000000

15.Tabla de contingencia

contingency <- table(datos1$Cluster, BASELIMPIAFORM$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      20.000000        28.000000 12.000000  0.000000      0.000000 20.000000
##   2      19.047619        57.142857  0.000000  0.000000      0.000000 23.809524
##   3      11.111111        33.333333 11.111111  3.703704      0.000000 29.629630
##   4       8.333333        50.000000  8.333333  8.333333      8.333333 16.666667
##    
##      Soldador Supervisor
##   1  8.000000  12.000000
##   2  0.000000   0.000000
##   3  0.000000  11.111111
##   4  0.000000   0.000000

ÁRBOL DE DECISIONES

Lo primero es entender la base de datos

summary(BASELIMPIAFORM)
##     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         Min.   :18.00   Length:106         Length:106        
##  Class :character   1st Qu.:25.25   Class :character   Class :character  
##  Mode  :character   Median :33.50   Mode  :character   Mode  :character  
##                     Mean   :35.62                                        
##                     3rd Qu.:45.00                                        
##                     Max.   :68.00                                        
##   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

Se debe de limpiar la base de datos

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


# Cambiar edades
db$Edad <- as.numeric(db$Edad)
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             0             0             0 
##    Motivación       Salario  Prestaciones        Puesto Instalaciones 
##             0             0             0             0             0 
##    rango_edad 
##             0
# Eliminar NA
db <- na.omit(db)

str(db)
## tibble [106 × 11] (S3: tbl_df/tbl/data.frame)
##  $ Genero       : chr [1:106] "Femenino" "Femenino" "Femenino" "Femenino" ...
##  $ Estado Civil : chr [1:106] "Unión libre" "Casado" "Soltero" "Casado" ...
##  $ Edad         : num [1:106] 30 54 21 20 43 61 55 29 56 36 ...
##  $ Rotación     : num [1:106] 4 5 1 4 3 5 3 5 5 5 ...
##  $ Estrés       : num [1:106] 5 2 1 5 3 4 5 4 4 5 ...
##  $ Motivación   : chr [1:106] "Por el salario" "Otro" "Ubicación de la empresa" "Ubicación de la empresa" ...
##  $ Salario      : num [1:106] 5 4 2 5 3 4 2 5 4 5 ...
##  $ Prestaciones : num [1:106] 4 4 1 4 1 5 3 4 1 4 ...
##  $ Puesto       : chr [1:106] "Administrativo" "Costurera" "Ayudante general" "Ayudante general" ...
##  $ Instalaciones: num [1:106] 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 ...

Crear árbol de decisión

arbol <- rpart(formula = Rotación ~ ., data=db)
arbol
## n= 106 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 106 171.849100 4.037736  
##    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 66  52.500000 4.500000  
##      6) Edad< 28.5 18  26.500000 3.833333 *
##      7) Edad>=28.5 48  15.000000 4.750000  
##       14) Salario< 2.5 7   5.428571 4.285714 *
##       15) Salario>=2.5 41   7.804878 4.829268 *
rpart.plot(arbol)

Otra forma de hacer el árbol de decisión

arbol <- rpart(formula = Rotación ~ ., data=db)
arbol
## n= 106 
## 
## node), split, n, deviance, yval
##       * denotes terminal node
## 
##  1) root 106 171.849100 4.037736  
##    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 66  52.500000 4.500000  
##      6) Edad< 28.5 18  26.500000 3.833333 *
##      7) Edad>=28.5 48  15.000000 4.750000  
##       14) Salario< 2.5 7   5.428571 4.285714 *
##       15) Salario>=2.5 41   7.804878 4.829268 *
rpart.plot(
  arbol,
  fallen.leaves = TRUE,
  type = 2,
  extra = 100,
  under = TRUE
  )

LS0tDQp0aXRsZTogIkV2aWRlbmNpYSBkZSBBbsOhbGlzaXMgZGUgZGF0b3MgcGFyYSBGT1JNIg0KYXV0aG9yOiAiTHVpc2EgQmVsdHLDoW4gQTAxNTcwNjkwIg0KZGF0ZTogIjIwMjMtMTAtMzAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiAicGFwZXIiDQogICAgaGlnaGxpZ2h0OiAidGFuZ28iDQotLS0NCg0KIVtdKEM6XFxVc2Vyc1xcbHVpc2FcXERvY3VtZW50c1xcUiBMVUlTQVxcRVZJREVOQ0lBIDJcXExPR09JTUFHTy5wbmcpDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyBmb250LXNpemU6IDg4cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyI+Rk9STTwvc3Bhbj4NCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZSI+ICoqT1RSQSBGT1JNQSBERSBMSU1QSUFSIExPUyBEQVRPUyoqDQohW10oQzpcXFVzZXJzXFxsdWlzYVxcRG9jdW1lbnRzXFxSIExVSVNBXFxFVklERU5DSUEgMlxcMS5QTkcpDQohW10oQzpcXFVzZXJzXFxsdWlzYVxcRG9jdW1lbnRzXFxSIExVSVNBXFxFVklERU5DSUEgMlxcMi5QTkcpDQohW10oQzpcXFVzZXJzXFxsdWlzYVxcRG9jdW1lbnRzXFxSIExVSVNBXFxFVklERU5DSUEgMlxcMy5QTkcpDQoNCiMgPHNwYW4gc3R5bGUgPSJjb2xvcjpvcmFuZ2UiPiAqKkFOw4FMSVNJUyBFWFBMT1JBVE9SSU8gREUgTE9TIERBVE9TKiogDQogU2UgY29sb2NhIGxhIGJhc2UgZGUgZGF0b3MgbGltcGlhIGEgdXRpbGl6YXIuDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KQkFTRUxJTVBJQUZPUk0gPC0gcmVhZF9leGNlbCgiQzpcXFVzZXJzXFxsdWlzYVxcRG9jdW1lbnRzXFxSIExVSVNBXFxFVklERU5DSUEgMlxcQkFTRUxJTVBJQUZPUk0ueGxzeCIpDQojVmlldyhCQVNFTElNUElBRk9STSkNCmBgYA0KDQpTZSBsZSBsbGFtYSBhIGxhIGxpYnJlcsOtYS4NCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2x1c3RlcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShycGFydCkNCmxpYnJhcnkocnBhcnQucGxvdCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZSI+ICoqTWVkaWRhcyBkZSBUZW5kZW5jaWEgQ2VudHJhbCBWYXIgTnVtKioNCmBgYHtyfQ0KI0FudGlndWVkYWQgZW4gbWVzZXMNCnN1bW1hcnkoQkFTRUxJTVBJQUZPUk0kQW50aWd1ZWRhZCkNCg0KI0FudGlndWVkYWQgZW4gYcOxb3MNCnN1bW1hcnkoQkFTRUxJTVBJQUZPUk0kRWRhZCkNCmBgYA0KRGVzdmlhY2nDs24gZXN0w6FuZGFyDQpgYGB7cn0NCnNkKEJBU0VMSU1QSUFGT1JNJEFudGlndWVkYWQpDQpzZChCQVNFTElNUElBRk9STSRFZGFkKQ0KYGBgDQpWaXN1YWxpemFjacOzbiBkZSBsYXMgbWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbA0KYGBge3J9DQojIENyZWFyIHVuIGhpc3RvZ3JhbWEgcGFyYSAiQW50aWfDvGVkYWQiDQpnZ3Bsb3QoQkFTRUxJTVBJQUZPUk0sIGFlcyh4ID0gQW50aWd1ZWRhZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gIm9yYW5nZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkFudGlnw7xlZGFkIChNZXNlcykgZGUgbG9zIGVtcGxlYWRvcyBGT1JNIiwgeCA9ICJBbnRpZ8O8ZWRhZCIsIHkgPSAiRnJlY3VlbmNpYSIpDQoNCiMgQ3JlYXIgdW4gaGlzdG9ncmFtYSBwYXJhICJFZGFkIg0KZ2dwbG90KEJBU0VMSU1QSUFGT1JNLCBhZXMoeCA9IEVkYWQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSwgZmlsbCA9ICJvcmFuZ2UiLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh0aXRsZSA9ICJFZGFkIChhw7FvcykgZGUgbG9zIGVtcGxlYWRvcyBGT1JNIiwgeCA9ICJFZGFkIiwgeSA9ICJGcmVjdWVuY2lhIikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZSI+ICoqVGFibGFzIGRlIEZyZWN1ZW5jaWEtIFZhciBDYXRlZ8OzcmljYXMqKg0KYGBge3J9DQojIENyZWFyIHVuYSB0YWJsYSBkZSBmcmVjdWVuY2lhcw0KdGFibGEgPC0gdGFibGUoQkFTRUxJTVBJQUZPUk0kUHVlc3RvKQ0KdGFibGENCg0KIyBDcmVhciB1biBncsOhZmljbyBkZSBiYXJyYXMNCmJhcnBsb3QodGFibGEsIG1haW4gPSAiUHVlc3RvcyBkZSBUcmFiYWpvIGRlIGxvcyBFbXBsZWFkb3MiLCB4bGFiID0gIlB1ZXN0byIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIGNvbCA9ICJvcmFuZ2UiKQ0KDQoNCiMgQ3JlYXIgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRNb3RpdmFjacOzbikNCnRhYmxhDQoNCiMgQ3JlYXIgdW4gZ3LDoWZpY28gZGUgYmFycmFzDQpiYXJwbG90KHRhYmxhLCBtYWluID0gIk1vdGl2YWNpb25lcyBkZWwgRW1wbGVhZG8iLCB4bGFiID0gIk1vdGl2YWNpw7NuIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgY29sID0gIm9yYW5nZSIpDQoNCg0KIyBDcmVhciB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJGBDb25mbGljdG8vQWNvc29gKQ0KdGFibGENCg0KIyBDcmVhciB1biBncsOhZmljbyBkZSBiYXJyYXMNCmJhcnBsb3QodGFibGEsIG1haW4gPSAiwr9IYW4gc3VmcmlkbyBhbGd1biBDb25mbGljdG8vQWNvc28gZW4gbGEgZW1wcmVzYT8iLCB4bGFiID0gImBDb25mbGljdG8vQWNvc29gIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgY29sID0gIm9yYW5nZSIpDQoNCiMgQ3JlYXIgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRFbW9jacOzbikNCnRhYmxhDQoNCiMgQ3JlYXIgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRHZW5lcm8pDQp0YWJsYQ0KDQojIENyZWFyIHVuIGdyw6FmaWNvIGRlIGJhcnJhcw0KYmFycGxvdCh0YWJsYSwgbWFpbiA9ICJHw6luZXJvIGRlIGxvcyBFbXBsZWFkb3MiLCB4bGFiID0gIkdlbmVybyIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIGNvbCA9ICJvcmFuZ2UiKQ0KDQojIENyZWFyIHVuYSB0YWJsYSBkZSBmcmVjdWVuY2lhcw0KdGFibGEgPC0gdGFibGUoQkFTRUxJTVBJQUZPUk0kYEVzdGFkbyBDaXZpbGApDQp0YWJsYQ0KDQojIENyZWFyIHVuIGdyw6FmaWNvIGRlIGJhcnJhcw0KYmFycGxvdCh0YWJsYSwgbWFpbiA9ICJFc3RhZG8gQ2l2aWwgZGUgbG9zIEVtcGxlYWRvcyIsIHhsYWIgPSAiYEVzdGFkbyBDaXZpbGAiLCB5bGFiID0gIkZyZWN1ZW5jaWEiLCBjb2wgPSAib3JhbmdlIikNCg0KIyBDcmVhciB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJE11bmljaXBpbykNCnRhYmxhDQoNCiMgQ3JlYXIgdW4gZ3LDoWZpY28gZGUgYmFycmFzDQpiYXJwbG90KHRhYmxhLCBtYWluID0gIk11bmljaXBpb3MgZG9uZGUgSGFiaXRhbiBsb3MgRW1sZWFkb3MiLCB4bGFiID0gIk11bmljaXBpbyIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIGNvbCA9ICJvcmFuZ2UiKQ0KDQojIENyZWFyIHVuYSB0YWJsYSBkZSBmcmVjdWVuY2lhcw0KdGFibGEgPC0gdGFibGUoQkFTRUxJTVBJQUZPUk0kRXNjb2xhcmlkYWQpDQp0YWJsYQ0KDQojIENyZWFyIHVuIGdyw6FmaWNvIGRlIGJhcnJhcw0KYmFycGxvdCh0YWJsYSwgbWFpbiA9ICJOaXZlbCBkZSBFc2NvbGFyaXphY2nDs24gZGUgbG9zIEVtcGxlYWRvcyIsIHhsYWIgPSAiRXNjb2xhcmlkYWQiLCB5bGFiID0gIkZyZWN1ZW5jaWEiLCBjb2wgPSAib3JhbmdlIikNCg0KIyBDcmVhciB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYXMNCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJERlcGVuZGllbnRlcykNCnRhYmxhDQoNCiMgQ3JlYXIgdW4gZ3LDoWZpY28gZGUgYmFycmFzDQpiYXJwbG90KHRhYmxhLCBtYWluID0gIk7Dum1lcm8gZGUgRGVwZW5kaWVudGVzIEVjb27Ds21pY29zIiwgeGxhYiA9ICJEZXBlbmRpZW50ZXMiLCB5bGFiID0gIkZyZWN1ZW5jaWEiLCBjb2wgPSAib3JhbmdlIikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZSI+ICoqVGFibGFzIGRlIEZyZWN1ZW5jaWEtU2F0aXNmYWNjacOzbioqDQpgYGB7cn0NCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJFNhbGFyaW8pDQp0YWJsYQ0KDQoNCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJFByZXN0YWNpb25lcykNCnRhYmxhDQoNCg0KdGFibGEgPC0gdGFibGUoQkFTRUxJTVBJQUZPUk0kSm9ybmFkYV9MYWJvcmFsKQ0KdGFibGENCg0KDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRIZXJyYW1pZW50YXMpDQp0YWJsYQ0KDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRUZW1wZXJhdHVyYSkNCnRhYmxhDQoNCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJEVzdHLDqXMpDQp0YWJsYQ0KDQoNCnRhYmxhIDwtIHRhYmxlKEJBU0VMSU1QSUFGT1JNJFRyYW5zcG9ydGUpDQp0YWJsYQ0KDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRJbnN0YWxhY2lvbmVzKQ0KdGFibGENCg0KDQp0YWJsYSA8LSB0YWJsZShCQVNFTElNUElBRk9STSRSb3RhY2nDs24pDQp0YWJsYQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6b3JhbmdlIj4gKipSZWdyZXNpw7NuIExpbmVhbCBNw7psdGlwbGUqKg0KYGBge3J9DQpCQVNFTElNUElBRk9STSRQdWVzdG8gPC0gYXMuZmFjdG9yKEJBU0VMSU1QSUFGT1JNJFB1ZXN0bykNCkJBU0VMSU1QSUFGT1JNJEVkYWQgPC0gYXMuaW50ZWdlcihCQVNFTElNUElBRk9STSRFZGFkKQ0KQkFTRUxJTVBJQUZPUk0kR2VuZXJvIDwtIGFzLmZhY3RvcihCQVNFTElNUElBRk9STSRHZW5lcm8pDQpCQVNFTElNUElBRk9STSRgRXN0YWRvIENpdmlsYCA8LSBhcy5mYWN0b3IoQkFTRUxJTVBJQUZPUk0kYEVzdGFkbyBDaXZpbGApDQpCQVNFTElNUElBRk9STSRNdW5pY2lwaW8gPC0gYXMuZmFjdG9yKEJBU0VMSU1QSUFGT1JNJE11bmljaXBpbykNCkJBU0VMSU1QSUFGT1JNJEVzY29sYXJpZGFkIDwtIGFzLmZhY3RvcihCQVNFTElNUElBRk9STSRFc2NvbGFyaWRhZCkNClZpZXcoQkFTRUxJTVBJQUZPUk0pDQpgYGANCg0KYGBge3J9DQpSZWdyZXNpb25fSW5zYXRpc2ZhY2Npb24gPC0gbG0oUm90YWNpw7NuIH4gUHVlc3RvICsgQW50aWd1ZWRhZCArIFNhbGFyaW8gKyBQcmVzdGFjaW9uZXMgKyBKb3JuYWRhX0xhYm9yYWwgKyBIZXJyYW1pZW50YXMgKyBUZW1wZXJhdHVyYSArIEVzdHLDqXMgKyBUcmFuc3BvcnRlICsgSW5zdGFsYWNpb25lcyArIFJvdGFjacOzbiArIGBDb25mbGljdG8vQWNvc29gKyBFZGFkICsgR2VuZXJvICsgYEVzdGFkbyBDaXZpbGAgKyBNdW5pY2lwaW8gKyBFc2NvbGFyaWRhZCArIERlcGVuZGllbnRlcywgZGF0YSA9IEJBU0VMSU1QSUFGT1JNKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShSZWdyZXNpb25fSW5zYXRpc2ZhY2Npb24pDQpgYGANCioqT2JzZXJ2YWNpb25lcyBkZSBsYSByZWdyZXNpw7NuIExpbmVhbCoqIA0KDQpMYSByZWdyZXNpw7NuIExpbmVhbCBzZSBoaXpvIGxhIHJlZ3Jlc2nDs24gbGluZWFsIHV0aWxpemFuZG8gY29tbyB2YXJpYWJsZSBkZXBlbmRpZW50ZSBsYSB2YXJpYWJsZSBkZSBSb3RhY2nDs24sIGNvbiBlbCBvYmpldGl2byBkZSBleHBsaWNhciBzaSBsb3MgZW1wbGVhZG9zIGNvbnNpZGVyYW4gcHJvYmFibGUgIHNlZ3VpciB0cmFiYWphbmRvIGVuIEZPUk0uDQoNClNlIG9idHV2byAgdW5hIFJeMiBkZSAwLjM5IHkgc2UgdXRpbGl6YXJvbiBjb21vIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBsYXMgZGVtw6FzIHZhcmlhYmxlcyBxdWUgbm8gZXJhbiBwcmVndW50YXMgYWJpZXJ0YXMgZW4gbGEgZW5jdWVzdGEuDQoNCiMgPHNwYW4gc3R5bGUgPSJjb2xvcjpvcmFuZ2UiPiAqKk3DqXRvZG8gMS0gU0VHTUVOVEFDScOTTiBERSBMT1MgREFUT1MvQ0xVU1RFUlMqKiANCkxpbXBpZXphIGV4dHJhIGRlIGJhc2UgZGUgZGF0b3MgcGFyYSBwb2RlciBjb3JyZXIgdW4gY2x1c3Rlcg0KYGBge3J9DQpCQVNFTElNUElBRk9STSA8LSBzZWxlY3QoQkFTRUxJTVBJQUZPUk0sRXN0csOpcyxSb3RhY2nDs24pDQpCQVNFTElNUElBRk9STTwtIG5hLm9taXQoQkFTRUxJTVBJQUZPUk0pDQpgYGANCg0KU2UgZGViZSBkZXRlcm1pbmFyIGVsIG7Dum1lcm8gZGUgY2x1c3RlcnMgeSBhc2dpbmFyIGEgbG9zIGdydXBvcw0KYGBge3J9DQpncnVwb3MgPC0gNA0Kc2VnbWVudG9zIDwtIGttZWFucyhCQVNFTElNUElBRk9STSxncnVwb3MpDQpgYGANCg0KU2UgZGViZSByZWFsaXphciB1bmEgYXNpZ25hY2nDs24gZGUgZ3J1cG9zDQpgYGB7cn0NCmFzaWduYWNpw7NuIDwtIGNiaW5kKEJBU0VMSU1QSUFGT1JNLGNsdXN0ZXI9c2VnbWVudG9zJGNsdXN0ZXIpDQpgYGANCg0KU2UgY3JlYSB1bmEgdmlzdWFsaXphY2nDs24gZGUgZGF0b3MgbWVkaWFudGUgdW4gZ3LDoWZpY28NCmBgYHtyfQ0KbGlicmFyeSAoZ2dwbG90MikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmZ2aXpfY2x1c3RlcihzZWdtZW50b3MsZGF0YT1CQVNFTElNUElBRk9STSxwYWxldHRlPWMoInJlZCIsImJsdWUiLCJkYXJrZ3JlZW4iLCJ5ZWxsb3ciKSwNCiAgICAgICAgICAgICBlbGxpcHNlLnR5cGU9ImV1Y2xpZCIsDQogICAgICAgICAgICAgc3Rhci5wbG90PSBULA0KICAgICAgICAgICAgIHJlcGVsPVQsDQogICAgICAgICAgICAgZ2d0aGVtZT10aGVtZSgpKQ0KIzYuT3B0aW1pemFyIGNhbnRpZGFkIGRlIGdydXBvcw0KbGlicmFyeSAoY2x1c3RlcikNCmxpYnJhcnkgKGRhdGEudGFibGUpDQpzZXQuc2VlZCAoMTIzKQ0Kb3B0aW1pemFjacOzbiA8LSBjbHVzR2FwKEJBU0VMSU1QSUFGT1JNLEZVTj1rbWVhbnMsIG5zdGFydD0xLCBLLm1heD0xMCkNCnBsb3Qob3B0aW1pemFjacOzbiwgeGxhYj0iTsO6bWVybyBkZSBjbHVzdGVyc8KgayIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZSI+ICoqTcOpdG9kbyAyLSBQRVJGSUxBRE8gREUgU0VHTUVOVE9TL0NMVVNURVJTKiogDQoNCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpnZXR3ZCgpDQpgYGANCg0KYGBge3J9DQoNCmxpYnJhcnkocmVhZHhsKQ0KQkFTRUxJTVBJQUZPUk0gPC0gcmVhZF9leGNlbCgiQzpcXFVzZXJzXFxsdWlzYVxcRG9jdW1lbnRzXFxSIExVSVNBXFxFVklERU5DSUEgMlxcQkFTRUxJTVBJQUZPUk0ueGxzeCIpDQojVmlldyhCQVNFTElNUElBRk9STSkNCg0KIyBTZWxlY2Npb25hciBsYXMgY29sdW1uYXMgbnVtw6lyaWNhcyBkZSBCQVNFTElNUElBRk9STSB5IGFsbWFjZW5hcmxhcyBlbiBkYXRvc19udW1lcmljb3MNCmRhdG9zX251bWVyaWNvcyA8LSBCQVNFTElNUElBRk9STVtzYXBwbHkoQkFTRUxJTVBJQUZPUk0sIGlzLm51bWVyaWMpXQ0KDQojIFZpZXcoZGF0b3NfbnVtZXJpY29zKQ0KYGBgDQoNCkVzY2FsYXIgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzDQpgYGB7cn0NCmRhdG9zX2VzY2FsYWRvcyA8LSBzY2FsZShkYXRvc19udW1lcmljb3MpDQojIFZpZXcoZGF0b3NfZXNjYWxhZG9zKQ0KYGBgDQoNCkNhbGN1bGFyIGxhcyBtZWRpYW5hcyBkZSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMgZXNjYWxhZGFzDQpgYGB7cn0NCm1lZGlhIDwtIGFwcGx5KGRhdG9zX2VzY2FsYWRvcywgMiwgbWVhbikNCiMgVmlldyhtZWRpYSkNCmBgYA0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykgIyBQYXJhIHJlcHJvZHVjaWJpbGlkYWQNCmBgYA0KDQoNCmNsdXN0ZXJzIHF1ZSBkZXNlYXMNCmBgYHtyfQ0KayA8LSAzICMgQ2FtYmlhIGVzdGUgdmFsb3IgcG9yIGVsIG7Dum1lcm8gZGUgY2x1c3RlcnMgcXVlIGRlc2Vhcw0KaW5kaWNlc19jZW50cm9pZGVzX2luaWNpYWxlcyA8LSBzYW1wbGUoMTpucm93KGRhdG9zX2VzY2FsYWRvcyksIGspDQpjZW50cm9pZGVzX2luaWNpYWxlcyA8LSBkYXRvc19lc2NhbGFkb3NbaW5kaWNlc19jZW50cm9pZGVzX2luaWNpYWxlcywgXQ0KDQoNCiMgRWplY3V0YXIgay1tZWFucyBjb24gbG9zIGNlbnRyb2lkZXMgaW5pY2lhbGVzDQpyZXN1bHRhZG9fa21lYW5zIDwtIGttZWFucyhkYXRvc19lc2NhbGFkb3MsIGNlbnRlcnMgPSBjZW50cm9pZGVzX2luaWNpYWxlcykNCg0KcHJpbnQocmVzdWx0YWRvX2ttZWFucykNCmBgYA0KQWp1c3RhciBlbCBtb2RlbG8gay1tZWFucyBwYXJhIGRpZmVyZW50ZXMgdmFsb3JlcyBkZSBrDQpgYGB7cn0NCnNldC5zZWVkKDEyMykgIyBQYXJhIHJlcHJvZHVjaWJpbGlkYWQNCndjc3MgPC0gdmVjdG9yKCkgIyBJbmljaWFsaXphciB2ZWN0b3IgcGFyYSBhbG1hY2VuYXIgbG9zIHZhbG9yZXMgZGUgV0NTUw0KbWF4X2sgPC0gMTAgIyBQdWVkZXMgY2FtYmlhciBlc3RvIHBhcmEgcHJvYmFyIGNvbiBtw6FzIGNsw7pzdGVyZXMgc2kgbG8gZGVzZWFzDQpmb3IgKGsgaW4gMTptYXhfaykgew0KICBrbWVhbnNfbW9kZWwgPC0ga21lYW5zKGRhdG9zX2VzY2FsYWRvcywgY2VudGVycyA9IGssIG5zdGFydCA9IDI1KQ0KICB3Y3NzW2tdIDwtIGttZWFuc19tb2RlbCR0b3Qud2l0aGluc3MNCn0NCmBgYA0KDQpHcsOhZmljYXIgZWwgbcOpdG9kbyBkZSBjb2RvDQpgYGB7cn0NCnBhcihtYXIgPSBjKDQsIDQsIDEsIDEpKSAjIExvcyBuw7ptZXJvcyByZXByZXNlbnRhbiBsb3MgbcOhcmdlbmVzIGluZmVyaW9yLCBpenF1aWVyZG8sIHN1cGVyaW9yIHkgZGVyZWNobyByZXNwZWN0aXZhbWVudGUuDQpwbG90KDE6bWF4X2ssIHdjc3MsIHR5cGUgPSAiYiIsIHhsYWIgPSAiTnVtZXJvIGRlIENsdXN0ZXJzIiwgeWxhYiA9ICJXQ1NTIiwgbWFpbiA9ICJNZXRvZG8gZGVsIENvZG8iLCBwY2ggPSAxOSwgZnJhbWUgPSBGQUxTRSkNCg0KDQojIEVzdGFibGVjZXIgdW5hIHNlbWlsbGEgcGFyYSBsYSByZXByb2R1Y2liaWxpZGFkDQpzZXQuc2VlZCgxNzgpDQpgYGANClJlYWxpemFyIEstbWVhbnMgY29uIDQgY2x1c3RlcnMNCmBgYHtyfQ0Ka21lYW5zX3Jlc3VsdCA8LSBrbWVhbnMoZGF0b3NfZXNjYWxhZG9zLCBjZW50ZXJzID0gNCkNCmttZWFuc19yZXN1bHQkY2VudGVycw0KYGBgDQpBw7FhZGlyIGxhIGNvbHVtbmEgZGUgY2x1c3RlcnMgYWwgZGF0YWZyYW1lIG9yaWdpbmFsDQpgYGB7cn0NCmRhdG9zMSA8LSBCQVNFTElNUElBRk9STQ0KZGF0b3MxJENsdXN0ZXIgPC0ga21lYW5zX3Jlc3VsdCRjbHVzdGVyDQpgYGANCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpvcmFuZ2U7Ij4qKjExLlRhYmxhIGRlIGNvbnRpbmdlbmNpYSoqPC9zcGFuPg0KYGBge3J9DQpjb250aW5nZW5jeSA8LSB0YWJsZShkYXRvczEkQ2x1c3RlciwgQkFTRUxJTVBJQUZPUk0kR2VuZXJvKQ0KDQojIENvbnZlcnRpciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgYSBwb3JjZW50YWplcw0KY29udGluZ2VuY3kgPC0gcHJvcC50YWJsZShjb250aW5nZW5jeSwgbWFyZ2luID0gMSkgKiAxMDANCg0KIyBNb3N0cmFyIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYQ0KcHJpbnQoY29udGluZ2VuY3kpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjpvcmFuZ2U7Ij4qKjEyLlRhYmxhIGRlIGNvbnRpbmdlbmNpYSoqPC9zcGFuPg0KYGBge3J9DQpjb250aW5nZW5jeSA8LSB0YWJsZShkYXRvczEkQ2x1c3RlciwgQkFTRUxJTVBJQUZPUk0kRXNjb2xhcmlkYWQpDQoNCiMgQ29udmVydGlyIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSBhIHBvcmNlbnRhamVzDQpjb250aW5nZW5jeSA8LSBwcm9wLnRhYmxlKGNvbnRpbmdlbmN5LCBtYXJnaW4gPSAxKSAqIDEwMA0KDQojIE1vc3RyYXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhDQpwcmludChjb250aW5nZW5jeSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZTsiPioqMTMuVGFibGEgZGUgY29udGluZ2VuY2lhKio8L3NwYW4+DQpgYGB7cn0NCmNvbnRpbmdlbmN5IDwtIHRhYmxlKGRhdG9zMSRDbHVzdGVyLCBCQVNFTElNUElBRk9STSRNdW5pY2lwaW8pDQoNCiMgQ29udmVydGlyIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSBhIHBvcmNlbnRhamVzDQpjb250aW5nZW5jeSA8LSBwcm9wLnRhYmxlKGNvbnRpbmdlbmN5LCBtYXJnaW4gPSAxKSAqIDEwMA0KDQojIE1vc3RyYXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhDQpwcmludChjb250aW5nZW5jeSkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZTsiPioqMTQuVGFibGEgZGUgY29udGluZ2VuY2lhKio8L3NwYW4+DQpgYGB7cn0NCmNvbnRpbmdlbmN5IDwtIHRhYmxlKGRhdG9zMSRDbHVzdGVyLCBCQVNFTElNUElBRk9STSRgRXN0YWRvIENpdmlsYCkNCg0KIyBDb252ZXJ0aXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhIGEgcG9yY2VudGFqZXMNCmNvbnRpbmdlbmN5IDwtIHByb3AudGFibGUoY29udGluZ2VuY3ksIG1hcmdpbiA9IDEpICogMTAwDQoNCiMgTW9zdHJhciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWENCnByaW50KGNvbnRpbmdlbmN5KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6b3JhbmdlOyI+KioxNS5UYWJsYSBkZSBjb250aW5nZW5jaWEqKjwvc3Bhbj4NCmBgYHtyfQ0KY29udGluZ2VuY3kgPC0gdGFibGUoZGF0b3MxJENsdXN0ZXIsIEJBU0VMSU1QSUFGT1JNJFB1ZXN0bykNCg0KIyBDb252ZXJ0aXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhIGEgcG9yY2VudGFqZXMNCmNvbnRpbmdlbmN5IDwtIHByb3AudGFibGUoY29udGluZ2VuY3ksIG1hcmdpbiA9IDEpICogMTAwDQoNCiMgTW9zdHJhciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWENCnByaW50KGNvbnRpbmdlbmN5KQ0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOm9yYW5nZSI+ICoqw4FSQk9MIERFIERFQ0lTSU9ORVMqKg0KDQpMbyBwcmltZXJvIGVzIGVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3MNCmBgYHtyfQ0Kc3VtbWFyeShCQVNFTElNUElBRk9STSkNCmBgYA0KU2UgZGViZSBkZSBsaW1waWFyIGxhIGJhc2UgZGUgZGF0b3MgDQpgYGB7cn0NCiMgRXh0cmFlciBsYXMgdmFyaWFibGVzIGRlIGludGVyw6lzDQpkYiA8LSBCQVNFTElNUElBRk9STVssIGMoIkdlbmVybyIsICJFc3RhZG8gQ2l2aWwiLCAiRWRhZCIsICJSb3RhY2nDs24iLCAiRXN0csOpcyIsICJNb3RpdmFjacOzbiIsICJTYWxhcmlvIiwgIlByZXN0YWNpb25lcyIsICJQdWVzdG8iLCAiSW5zdGFsYWNpb25lcyIpXQ0KDQoNCiMgQ2FtYmlhciBlZGFkZXMNCmRiJEVkYWQgPC0gYXMubnVtZXJpYyhkYiRFZGFkKQ0KcmFuZ29fZWRhZCA8LXNlcSgxOCwgNjgsIGJ5ID0gMTApDQpkYiRyYW5nb19lZGFkIDwtIGN1dChkYiRFZGFkLCBicmVha3MgPSByYW5nb19lZGFkLCBsYWJlbHMgPSBjKCIxOC0yNyIsICIyOC0zNyIsICIzOC00NyIsICI0OC01NyIsICI1OC02OCIpLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUsIHJpZ2h0ID0gRkFMU0UpDQoNCiMgwr9DdcOhbnRvcyBOQSB0ZW5nbyBwb3IgdmFyaWFibGU/DQpzYXBwbHkoZGIsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpDQoNCiMgRWxpbWluYXIgTkENCmRiIDwtIG5hLm9taXQoZGIpDQoNCnN0cihkYikNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6b3JhbmdlOyI+KipDcmVhciDDoXJib2wgZGUgZGVjaXNpw7NuKio8L3NwYW4+DQpgYGB7cn0NCmFyYm9sIDwtIHJwYXJ0KGZvcm11bGEgPSBSb3RhY2nDs24gfiAuLCBkYXRhPWRiKQ0KYXJib2wNCnJwYXJ0LnBsb3QoYXJib2wpDQpgYGANCg0KT3RyYSBmb3JtYSBkZSBoYWNlciBlbCDDoXJib2wgZGUgZGVjaXNpw7NuDQpgYGB7cn0NCmFyYm9sIDwtIHJwYXJ0KGZvcm11bGEgPSBSb3RhY2nDs24gfiAuLCBkYXRhPWRiKQ0KYXJib2wNCnJwYXJ0LnBsb3QoDQogIGFyYm9sLA0KICBmYWxsZW4ubGVhdmVzID0gVFJVRSwNCiAgdHlwZSA9IDIsDQogIGV4dHJhID0gMTAwLA0KICB1bmRlciA9IFRSVUUNCiAgKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0K