ENTREGABLE 2.5 - RECURSOS HUMANOS - BAJAS

1. Conceptos Claves

2. K-means Clustering

# descargar y llamar librerías
#install.packages("tidyverse")
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6      ✔ purrr   0.3.5 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
#install.packages("foreign")
#install.packages("dplyr")
library(ggplot2)
#install.packages("psych")
library(psych)
## 
## Attaching package: 'psych'
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
#install.packages("corrplot")
library(corrplot)
## corrplot 0.92 loaded
#install.packages("jtools")
library(jtools)
#install.packages("lmtest")
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
#install.packages("car")
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:psych':
## 
##     logit
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
#install.packages("factoextra")
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#install.packages("janitor")
library(janitor)
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
#install.packages("readr")
library(readr)
#install.packages("plotrix")
library(plotrix)
## 
## Attaching package: 'plotrix'
## 
## The following object is masked from 'package:psych':
## 
##     rescale

Limpiar base de datos

#file.choose()
rh <- read.csv("/Users/anapaulatejeda/Downloads/recursos_humanos_base_limpia.csv")
# Limpiar nombre
rh1 <- clean_names(rh)
# Visualizar base de datos
summary(rh1)
##   apellidos            nombre               edad       fecha_de_nacimiento
##  Length:233         Length:233         Min.   :19.00   Length:233         
##  Class :character   Class :character   1st Qu.:23.00   Class :character   
##  Mode  :character   Mode  :character   Median :29.00   Mode  :character   
##                                        Mean   :31.08                      
##                                        3rd Qu.:37.00                      
##                                        Max.   :61.00                      
##     genero              rfc            fecha_de_alta      motivo_de_baja    
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  dias_laborados        baja              puesto          departamento      
##  Min.   :   0.00   Length:233         Length:233         Length:233        
##  1st Qu.:   6.00   Class :character   Class :character   Class :character  
##  Median :  15.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :  72.73                                                           
##  3rd Qu.:  47.00                                                           
##  Max.   :1966.00                                                           
##  no_seguro_social   salario_diario_imss factor_cred_infonavit
##  Length:233         Min.   :144.4       Length:233           
##  Class :character   1st Qu.:180.7       Class :character     
##  Mode  :character   Median :180.7       Mode  :character     
##                     Mean   :177.9                            
##                     3rd Qu.:180.7                            
##                     Max.   :500.0                            
##  n_credito_infonavit lugar_de_nacimiento     curp              calle          
##  Length:233          Length:233          Length:233         Length:233        
##  Class :character    Class :character    Class :character   Class :character  
##  Mode  :character    Mode  :character    Mode  :character   Mode  :character  
##                                                                               
##                                                                               
##                                                                               
##  numero_interno       colonia          codigo_postal       municipio        
##  Length:233         Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     estado          estado_civil       tarjeta_o_cuenta  
##  Length:233         Length:233         Length:233        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 
# Eliminar columnas que no se necesitan
rh2 <- subset(rh1,select = -c (apellidos, nombre, fecha_de_nacimiento, rfc, fecha_de_alta, baja, departamento, 
                               no_seguro_social, factor_cred_infonavit, n_credito_infonavit, lugar_de_nacimiento,
                               curp, calle, numero_interno, colonia, codigo_postal, municipio, estado, tarjeta_o_cuenta))
summary(rh2)
##       edad          genero          motivo_de_baja     dias_laborados   
##  Min.   :19.00   Length:233         Length:233         Min.   :   0.00  
##  1st Qu.:23.00   Class :character   Class :character   1st Qu.:   6.00  
##  Median :29.00   Mode  :character   Mode  :character   Median :  15.00  
##  Mean   :31.08                                         Mean   :  72.73  
##  3rd Qu.:37.00                                         3rd Qu.:  47.00  
##  Max.   :61.00                                         Max.   :1966.00  
##     puesto          salario_diario_imss estado_civil      
##  Length:233         Min.   :144.4       Length:233        
##  Class :character   1st Qu.:180.7       Class :character  
##  Mode  :character   Median :180.7       Mode  :character  
##                     Mean   :177.9                         
##                     3rd Qu.:180.7                         
##                     Max.   :500.0
# na's en la base de datos
sum(is.na(rh2))
## [1] 0
sapply(rh2, function(x) sum(is.na(x)))
##                edad              genero      motivo_de_baja      dias_laborados 
##                   0                   0                   0                   0 
##              puesto salario_diario_imss        estado_civil 
##                   0                   0                   0
# no se encuentran NA's en la base de datos 

# Convertir tipos de datos
rh2$edad <- as.numeric(rh2$edad)
rh2$genero <- as.factor(rh2$genero)
rh2$motivo_de_baja <- as.factor(rh2$motivo_de_baja)
rh2$dias_laborados <- as.numeric(rh2$dias_laborados)
rh2$puesto <- as.factor(rh2$puesto)
rh2$salario_diario_imss <- as.numeric(rh2$salario_diario_imss)
rh2$estado_civil <- as.factor(rh2$estado_civil)
summary(rh2)
##       edad             genero                motivo_de_baja dias_laborados   
##  Min.   :19.00   FEMENINO :137   ABANDONO           :  1    Min.   :   0.00  
##  1st Qu.:23.00   MASCULINO: 96   BAJA POR FALTAS    :139    1st Qu.:   6.00  
##  Median :29.00                   JUBILACION         :  1    Median :  15.00  
##  Mean   :31.08                   RENUNCIA VOLUNTARIA: 84    Mean   :  72.73  
##  3rd Qu.:37.00                   TERMINO DE CONTRATO:  8    3rd Qu.:  47.00  
##  Max.   :61.00                                              Max.   :1966.00  
##                                                                              
##                    puesto    salario_diario_imss      estado_civil
##  AYUDANTE GENERAL     :171   Min.   :144.4       divorcio   :  3  
##  COSTURERA            : 10   1st Qu.:180.7       matrimonio : 63  
##  SOLDADOR             : 10   Median :180.7       Sin Conocer:  1  
##  MONTACARGUISTA       :  5   Mean   :177.9       Soltero    :107  
##  AY. GENERAL          :  4   3rd Qu.:180.7       Unión libre: 59  
##  AUXILIAR DE EMBARQUES:  3   Max.   :500.0                        
##  (Other)              : 30

Crear clusters

Cluster 1: Edad y Número de días laborados

# Normalizar Variables
rh_edad_dias <-rh2 %>% select(salario_diario_imss, edad, dias_laborados)
rh_edad_dias_norm<-scale(rh_edad_dias[2:3]) 
plot(rh_edad_dias_norm)

# Número óptimo de clústers con "Elbow Plot"
fviz_nbclust(rh_edad_dias_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=6, linetype=2)+           
  labs(subtitle = "Elbow method")  

De acuerdo al elbow method, el numero óptimo de clusters son 6 pero al momento de visualizarlo se determinó que es una elevada cantidad de clusters y no sería tan sencillo el interpretar y nombrar tantos clusters por lo que se llegó a la conclusión que se elaborarán 5 clusters.

# Visualizar Clusters
cluster1 <-kmeans(rh_edad_dias_norm,5)
cluster1
## K-means clustering with 5 clusters of sizes 43, 4, 68, 8, 110
## 
## Cluster means:
##         edad dias_laborados
## 1  1.5856496     -0.1730602
## 2  1.0544820      6.6446440
## 3  0.2370717     -0.2593203
## 4  0.2767222      1.9190143
## 5 -0.8248684     -0.1532302
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   4   3   5   5   3   1   3   3   1   5   5   3   5   3   4   5   5   5   5   5 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   3   2   5   3   1   5   3   5   5   5   3   5   5   5   3   5   5   4   3   5 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   4   4   5   5   5   5   5   5   1   1   1   2   5   1   5   5   1   5   5   5 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   5   5   3   5   5   1   5   4   4   5   5   5   3   5   3   5   1   5   5   1 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   2   5   1   5   5   5   1   5   5   5   3   1   1   5   5   5   1   3   5   3 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   5   5   1   3   5   5   3   2   3   5   3   3   5   3   3   3   1   1   1   5 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   5   5   5   5   3   5   3   1   5   3   5   4   5   5   5   3   1   3   1   3 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   3   1   1   1   5   3   3   3   5   5   5   3   1   1   5   3   5   3   1   1 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   1   1   3   1   5   5   3   5   5   1   3   1   5   1   3   3   1   3   3   5 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   5   5   3   1   3   3   5   5   3   3   3   3   3   3   5   3   3   3   3   5 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   3   1   3   5   5   5   1   5   5   5   3   3   5   5   3   3   3   1   5   5 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 
##   3   5   5   5   5   1   3   1   5   5   5   5   5 
## 
## Within cluster sum of squares by cluster:
## [1] 11.405375 15.799166  7.976676  7.819045 14.649008
##  (between_SS / total_SS =  87.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
fviz_cluster(cluster1,data=rh_edad_dias_norm)

Interpretación: Cluster número 1 y 4 son de edades diferentes pero tienen días laborados similares, igual que el cluster 3 y 5 . Por otro lado, el cluster 2 son datos que no tienen días laborados similares pero tienen más días que los otros clusters y tiene un rango diferente de edades. Por lo que se concluye que los días laborados no tienen tanta relación con la edad.

Cluster 2: Edad y Salario Diario

# Normalizar Variables
rh_edad_sal <-rh2 %>% select(salario_diario_imss, edad, dias_laborados)
rh_edad_sal_norm<-scale(rh_edad_dias[1:2]) 
plot(rh_edad_sal_norm)

# Número óptimo de clústers con "Elbow Plot"
fviz_nbclust(rh_edad_sal_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=5, linetype=2)+           
  labs(subtitle = "Elbow method")  

Se determin’o que el n’umero ’optimo es de 5 clusters

# Visualizar Clusters
cluster2 <-kmeans(rh_edad_sal_norm,5)
cluster2
## K-means clustering with 5 clusters of sizes 1, 34, 40, 63, 95
## 
## Cluster means:
##   salario_diario_imss        edad
## 1         13.75965225  0.09524497
## 2         -0.11512539  1.83986677
## 3          0.11335568  0.74337807
## 4         -0.11750244 -0.10886552
## 5         -0.07344171 -0.90028748
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   1   4   5   5   4   2   4   4   2   5   5   4   5   4   4   5   5   5   5   5 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   4   2   5   4   2   5   3   5   5   5   4   5   5   5   4   5   5   4   4   5 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   5   4   5   5   5   5   5   5   2   2   3   2   5   2   5   5   2   5   5   5 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   5   5   3   4   4   3   5   2   4   5   5   5   3   4   3   5   3   5   5   2 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   4   4   2   5   5   5   3   5   5   5   4   3   2   5   5   4   2   4   5   4 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   5   5   3   4   5   5   3   4   3   5   4   4   5   3   4   4   2   2   2   5 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   5   5   5   5   4   5   3   2   4   3   5   2   5   4   4   4   2   4   3   3 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   4   3   2   2   5   4   3   4   5   4   5   3   2   2   5   3   5   3   3   3 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   2   2   4   2   5   4   4   5   4   2   4   2   4   3   4   3   2   3   3   5 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   5   5   4   2   3   3   5   5   4   3   3   4   3   4   5   4   4   4   4   5 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   4   2   3   5   5   5   2   4   5   5   3   4   5   5   3   3   3   2   4   4 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 
##   4   5   5   5   4   3   4   3   5   5   5   5   5 
## 
## Within cluster sum of squares by cluster:
## [1]  0.000000 13.383803  2.840067 17.829341 23.318853
##  (between_SS / total_SS =  87.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
fviz_cluster(cluster2,data=rh_edad_sal_norm)

Interpretación: Todos tienen un salario similar sin importar la edad pero en el cluster 1 (que nomás es un punto) nos indica que hay alguien que gana más que los demás colaboradores y tienen una edad relativamente joven a comparación de los demás datos.

Cluster 3: Número de días laborados y Salario Diario

# Normalizar Variables
rh_dias_sal <-rh2 %>% select(salario_diario_imss, dias_laborados, edad)
rh_dias_sal_norm<-scale(rh_dias_sal[1:2]) 
plot(rh_dias_sal_norm)

# Número óptimo de clústers con "Elbow Plot"
fviz_nbclust(rh_dias_sal_norm, kmeans, method="wss")+ 
  geom_vline(xintercept=5, linetype=2)+           
  labs(subtitle = "Elbow method")  

Se determinó que el número óptimo es de 5 clusters

# Visualizar Clusters
cluster3 <-kmeans(rh_dias_sal_norm,5)
cluster3
## K-means clustering with 5 clusters of sizes 4, 1, 10, 27, 191
## 
## Cluster means:
##   salario_diario_imss dias_laborados
## 1          -0.3962566     6.64464404
## 2          13.7596523     2.56751686
## 3          -0.3729089     1.50771810
## 4          -1.1243505     0.03652891
## 5           0.1147221    -0.23669924
## 
## Clustering vector:
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
##   2   4   4   4   4   4   4   4   4   3   4   4   5   5   3   4   4   4   4   4 
##  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
##   4   1   4   4   5   5   5   5   5   5   5   5   5   5   5   5   4   3   5   5 
##  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
##   3   3   5   5   5   5   5   5   5   5   5   1   3   5   5   5   5   5   5   4 
##  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
##   5   5   5   5   5   5   5   3   3   4   5   5   5   5   5   5   5   5   5   5 
##  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
##   1   4   4   4   4   5   5   5   5   5   5   5   5   5   5   5   4   4   5   5 
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
##   5   5   5   5   5   5   5   1   5   5   5   5   5   5   5   5   5   5   5   5 
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
##   5   5   5   5   5   5   5   5   5   5   5   3   5   5   5   5   5   5   5   5 
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 
##   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   3   5   5 
## 221 222 223 224 225 226 227 228 229 230 231 232 233 
##   5   5   5   5   5   5   5   5   5   5   5   5   5 
## 
## Within cluster sum of squares by cluster:
## [1] 7.839149 0.000000 6.408768 1.637196 3.455406
##  (between_SS / total_SS =  95.8 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
fviz_cluster(cluster3,data=rh_dias_sal_norm)

Interpretación: Los días laborados no tienen influencia en el salario porque hay datos que indican colaboradores que trabajan más días pero tienen un salario similar a los que no tienen tantos días laborados. El cluster 2 podemos observar que es el que tiene un mayor salario pero no es el que tiene una cantidad alta de días laborados como es en el cluster 1. Por lo tanto, los días laborados no tienen relación con el salrio.

Creación de segmmentos usando el cluster 2: Edad y Salario Diario

# Incluir columna que indique el cluster de cada registro
rh3 <- rh2
rh3$Clusters<-cluster2$cluster

# visualizar la máxima edad de cada cluster
rh4 <- rh3 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))

# Nombrar cada cluster 
rh3$nombres_clusters <- factor(rh3$Clusters,levels = c(1,2,3,4,5), 
                              labels=c("Excepcion", "Jubilados", "Mayores", "Adultos", "Jovenes"))

# Agrupar los datos por nombre de clusters 
library(dplyr)
rh5 <- rh3 %>% group_by(nombres_clusters) %>% summarize(edad_años=max(edad), 
                                                             salario_imss=mean(salario_diario_imss),
                                                             Count=n())

clusters<-as.data.frame(rh5)
clusters
##   nombres_clusters edad_años salario_imss Count
## 1        Excepcion        32     500.0000     1
## 2        Jubilados        61     175.2329    34
## 3          Mayores        43     180.5810    40
## 4          Adultos        36     175.1773    63
## 5          Jovenes        26     176.2086    95

Gráficos complementarios

Gráfico por nombre de cluster

ggplot(rh5,aes(x=reorder(nombres_clusters,Count),y=Count,fill=nombres_clusters)) +
  geom_bar(stat="identity")

Interpretación: Los jóvenes adultos son los que representan más número de bajas y se visualiza que el orden de número de bajas est’a en el mismo orden de edad, esto significa que despu’es de los jóvenes adultos el grupo que más representa bajas es el de los adultos y de ahí siguen los mmayores y por último los jubilados. En conclusión la edad puede ser un factor importante en el número de bajas.

Gráfico del máximo de edad de cada cluster

ggplot(rh5, aes(x=nombres_clusters,y=edad_años,fill= nombres_clusters,label=round(edad_años,digits=2))) + 
  geom_col() + 
  geom_text()

interpretación: Aquí se ve la máxima de edad de cada cluster y también muestra la razón por la que se dieron los nombres a cada cluster. Los jóvenes tienen un rango de edad de 19-26, Adultos 27-36, Mayores 37-43 y Jubilados 44-61.

Género de ex-colaboradores

library(ggplot2)
ggplot(rh3, aes(fill=genero, y=genero, x=nombres_clusters)) + 
  geom_bar(position="stack", stat="identity") 

interpretación: En la gráfica se aprecia un número alto de género masculino en todos los clusters. En Jubilados y Mayores el género Femenino es mayor que el masculino.

Motivo de baja de ex-colaboradores

ggplot(rh3, aes(factor(nombres_clusters), fill = factor(motivo_de_baja))) +
  geom_bar(position = position_dodge2(preserve = "single"))

interpretación: Se puede observar que el motivo de baja mas grande en todos los grupos de edades es la baja por faltas seguido de renuncia voluntaria. En jóvenes se puede observar que hay baja por abandono mientras que en los otros clusters no hubo ninguna baja por abandono.

Puesto de de ex-colaboradores

library(plyr)
## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
## 
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
## 
##     arrange, count, desc, failwith, id, mutate, rename, summarise,
##     summarize
## The following object is masked from 'package:purrr':
## 
##     compact
count(rh3$puesto)
##                                   x freq
## 1  ANALISTA DE NOMINAS /AUX DE R.H.    1
## 2             AUXILIAR DE EMBARQUES    3
## 3                       AY. GENERAL    4
## 4           AY.GENERAL (MATERIALES)    1
## 5                    AYUD.EMBARQUES    1
## 6             AYUDANTE DE EMBARQUES    3
## 7                  AYUDANTE DE MTTO    1
## 8              AYUDANTE DE SOLDADOR    1
## 9                  AYUDANTE GENERAL  171
## 10    AYUDANTE GENERAL DE EMBARQUES    1
## 11                           CHOFER    1
## 12                         CORTADOR    1
## 13                        COSTURERA   10
## 14                        COSTURERO    1
## 15                           DISEÑO    1
## 16             ENCARGADA DE CALIDAD    1
## 17                      FACTURACION    1
## 18             GUARDIA DE SEGURIDAD    2
## 19                INSPECTOR CALIDAD    1
## 20             INSPECTOR DE CALIDAD    2
## 21            INSPECTORA DE CALIDAD    1
## 22                         LIMPIEZA    1
## 23                        MARCADORA    1
## 24                     MATERIALISTA    2
## 25                   MONTACARGUISTA    5
## 26              PRACTICANTE DE MTTO    1
## 27                        RESIDENTE    2
## 28                Residente Yanfeng    1
## 29              SERVICIO AL CLIENTE    1
## 30                         SOLDADOR   10
proporciones <- c(176, 11, 11, 8, 26)
eti <- c("ayudante general", "ayu. soldador/soldador", "costurera", "ayu. embarque", "otros" )
pct <- round(proporciones/sum(proporciones)*100)
eti <- paste(eti, pct)
eti <- paste(eti,"%",sep="")
pie3D(proporciones,labels = eti,
    col=rainbow(length(eti)),
    main="Puestos de bajas")

interpretación: el puesto en el que más se presentan bajas es en ayudante general, seguido de ayudante soldador/soldador, costurera, etc. Una de las posibles razones por la que haya más bajas en ayudante general es porque en ese puesto se necesitan más colaboradores por lo que el número de bajas en ese puesto puede ser mayor o también puede ser el ambiente general que se crea en ese puesto, estás hipotésis se comprobarían con un análisis más profundo de RH.

Estado civil de ex-colaboradores

ggplot(rh3, aes(factor(nombres_clusters), fill = factor(estado_civil))) +
  geom_bar(position = position_dodge2(preserve = "single"))

proporciones1 <- c(107, 3, 59, 63)
etiquetas <- c("soltero", "divorcio", "union libre", "matrimonio")
pct <- round(proporciones1/sum(proporciones1)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie3D(proporciones1,labels = etiquetas,
      col=rainbow(length(etiquetas)),
      main="Estado civil de bajas")

interpretación: En el total de bajas el estado civil más común es “soltero” siendo los jóvenes los que tienen una mayor cantidad de este atributo, seguido de los adultos. Después, está el matrimonio siendo este el más presente en el grupo de adultos, seguido de los jóvenes. El divorcio no es tán común en los grupos. En conclusión se puede deducir que la mayoría de los ex-colaboradores son solteros por lo que es más fácil renunciar al no tener una extensa y/o propia familia. Ya que los solteros son la mayoría por ende los jóvenes son los más propensos en darse de baja en FORM.

3. Principales hallazgos

LS0tCnRpdGxlOiA8c3BhbiBzdHlsZT0iQ29sb3I6T3JhbmdlIj4gIkVudHJlZ2FibGUgMi41IgphdXRob3I6ICJEYW5hIFBlcmV6IC0gQTAwMjI3MDQxIgpkYXRlOiAiMTAvOC8yMDIyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgo8aW1nIHNyYz0iL1VzZXJzL2FuYXBhdWxhdGVqZWRhL0Rlc2t0b3AvU2NyZWVuIFNob3QgMjAyMi0xMC0wOCBhdCA3LjA5LjM0IFBNLnBuZyI+Cgo8c3BhbiBzdHlsZT0iQ29sb3I6T3JhbmdlIj4gKipFTlRSRUdBQkxFIDIuNSAtIFJFQ1VSU09TIEhVTUFOT1MgLSBCQUpBUyoqCgojICoqMS4gQ29uY2VwdG9zIENsYXZlcyoqCgojICoqMi4gSy1tZWFucyBDbHVzdGVyaW5nKioKYGBge3J9CiMgZGVzY2FyZ2FyIHkgbGxhbWFyIGxpYnJlcsOtYXMKI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkodGlkeXZlcnNlKQojaW5zdGFsbC5wYWNrYWdlcygiZm9yZWlnbiIpCiNpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmxpYnJhcnkoZ2dwbG90MikKI2luc3RhbGwucGFja2FnZXMoInBzeWNoIikKbGlicmFyeShwc3ljaCkKI2luc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikKbGlicmFyeShjb3JycGxvdCkKI2luc3RhbGwucGFja2FnZXMoImp0b29scyIpCmxpYnJhcnkoanRvb2xzKQojaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IikKbGlicmFyeShsbXRlc3QpCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQpsaWJyYXJ5KGNhcikKI2luc3RhbGwucGFja2FnZXMoImZhY3RvZXh0cmEiKQpsaWJyYXJ5KGZhY3RvZXh0cmEpCiNpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHIiKQpsaWJyYXJ5KHJlYWRyKQojaW5zdGFsbC5wYWNrYWdlcygicGxvdHJpeCIpCmxpYnJhcnkocGxvdHJpeCkKYGBgCgojIyAqTGltcGlhciBiYXNlIGRlIGRhdG9zKgpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKcmggPC0gcmVhZC5jc3YoIi9Vc2Vycy9hbmFwYXVsYXRlamVkYS9Eb3dubG9hZHMvcmVjdXJzb3NfaHVtYW5vc19iYXNlX2xpbXBpYS5jc3YiKQojIExpbXBpYXIgbm9tYnJlCnJoMSA8LSBjbGVhbl9uYW1lcyhyaCkKIyBWaXN1YWxpemFyIGJhc2UgZGUgZGF0b3MKc3VtbWFyeShyaDEpCiMgRWxpbWluYXIgY29sdW1uYXMgcXVlIG5vIHNlIG5lY2VzaXRhbgpyaDIgPC0gc3Vic2V0KHJoMSxzZWxlY3QgPSAtYyAoYXBlbGxpZG9zLCBub21icmUsIGZlY2hhX2RlX25hY2ltaWVudG8sIHJmYywgZmVjaGFfZGVfYWx0YSwgYmFqYSwgZGVwYXJ0YW1lbnRvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX3NlZ3Vyb19zb2NpYWwsIGZhY3Rvcl9jcmVkX2luZm9uYXZpdCwgbl9jcmVkaXRvX2luZm9uYXZpdCwgbHVnYXJfZGVfbmFjaW1pZW50bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnAsIGNhbGxlLCBudW1lcm9faW50ZXJubywgY29sb25pYSwgY29kaWdvX3Bvc3RhbCwgbXVuaWNpcGlvLCBlc3RhZG8sIHRhcmpldGFfb19jdWVudGEpKQpzdW1tYXJ5KHJoMikKCiMgbmEncyBlbiBsYSBiYXNlIGRlIGRhdG9zCnN1bShpcy5uYShyaDIpKQpzYXBwbHkocmgyLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQojIG5vIHNlIGVuY3VlbnRyYW4gTkEncyBlbiBsYSBiYXNlIGRlIGRhdG9zIAoKIyBDb252ZXJ0aXIgdGlwb3MgZGUgZGF0b3MKcmgyJGVkYWQgPC0gYXMubnVtZXJpYyhyaDIkZWRhZCkKcmgyJGdlbmVybyA8LSBhcy5mYWN0b3IocmgyJGdlbmVybykKcmgyJG1vdGl2b19kZV9iYWphIDwtIGFzLmZhY3RvcihyaDIkbW90aXZvX2RlX2JhamEpCnJoMiRkaWFzX2xhYm9yYWRvcyA8LSBhcy5udW1lcmljKHJoMiRkaWFzX2xhYm9yYWRvcykKcmgyJHB1ZXN0byA8LSBhcy5mYWN0b3IocmgyJHB1ZXN0bykKcmgyJHNhbGFyaW9fZGlhcmlvX2ltc3MgPC0gYXMubnVtZXJpYyhyaDIkc2FsYXJpb19kaWFyaW9faW1zcykKcmgyJGVzdGFkb19jaXZpbCA8LSBhcy5mYWN0b3IocmgyJGVzdGFkb19jaXZpbCkKc3VtbWFyeShyaDIpCmBgYAoKIyMgKkNyZWFyIGNsdXN0ZXJzKgojIyMgQ2x1c3RlciAxOiBFZGFkIHkgTsO6bWVybyBkZSBkw61hcyBsYWJvcmFkb3MKYGBge3J9CiMgTm9ybWFsaXphciBWYXJpYWJsZXMKcmhfZWRhZF9kaWFzIDwtcmgyICU+JSBzZWxlY3Qoc2FsYXJpb19kaWFyaW9faW1zcywgZWRhZCwgZGlhc19sYWJvcmFkb3MpCnJoX2VkYWRfZGlhc19ub3JtPC1zY2FsZShyaF9lZGFkX2RpYXNbMjozXSkgCnBsb3QocmhfZWRhZF9kaWFzX25vcm0pCiMgTsO6bWVybyDDs3B0aW1vIGRlIGNsw7pzdGVycyBjb24gIkVsYm93IFBsb3QiCmZ2aXpfbmJjbHVzdChyaF9lZGFkX2RpYXNfbm9ybSwga21lYW5zLCBtZXRob2Q9IndzcyIpKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NiwgbGluZXR5cGU9MikrICAgICAgICAgICAKICBsYWJzKHN1YnRpdGxlID0gIkVsYm93IG1ldGhvZCIpICAKYGBgCgpEZSBhY3VlcmRvIGFsIGVsYm93IG1ldGhvZCwgZWwgbnVtZXJvIMOzcHRpbW8gZGUgY2x1c3RlcnMgc29uIDYgcGVybyBhbCBtb21lbnRvIGRlIHZpc3VhbGl6YXJsbyBzZSBkZXRlcm1pbsOzIHF1ZSBlcyB1bmEgZWxldmFkYSBjYW50aWRhZCBkZSBjbHVzdGVycyB5IG5vIHNlcsOtYSB0YW4gc2VuY2lsbG8gZWwgaW50ZXJwcmV0YXIgeSBub21icmFyIHRhbnRvcyBjbHVzdGVycyBwb3IgbG8gcXVlIHNlIGxsZWfDsyBhIGxhIGNvbmNsdXNpw7NuIHF1ZSBzZSBlbGFib3JhcsOhbiA1IGNsdXN0ZXJzLgoKYGBge3J9CiMgVmlzdWFsaXphciBDbHVzdGVycwpjbHVzdGVyMSA8LWttZWFucyhyaF9lZGFkX2RpYXNfbm9ybSw1KQpjbHVzdGVyMQpmdml6X2NsdXN0ZXIoY2x1c3RlcjEsZGF0YT1yaF9lZGFkX2RpYXNfbm9ybSkKYGBgCgpJbnRlcnByZXRhY2nDs246IENsdXN0ZXIgbsO6bWVybyAxIHkgNCBzb24gZGUgZWRhZGVzIGRpZmVyZW50ZXMgcGVybyB0aWVuZW4gZMOtYXMgbGFib3JhZG9zIHNpbWlsYXJlcywgaWd1YWwgcXVlIGVsIGNsdXN0ZXIgMyB5IDUgLiBQb3Igb3RybyBsYWRvLCBlbCBjbHVzdGVyIDIgc29uIGRhdG9zIHF1ZSBubyB0aWVuZW4gZMOtYXMgbGFib3JhZG9zIHNpbWlsYXJlcyBwZXJvIHRpZW5lbiBtw6FzIGTDrWFzIHF1ZSBsb3Mgb3Ryb3MgY2x1c3RlcnMgeSB0aWVuZSB1biByYW5nbyBkaWZlcmVudGUgZGUgZWRhZGVzLiBQb3IgbG8gcXVlIHNlIGNvbmNsdXllIHF1ZSBsb3MgZMOtYXMgbGFib3JhZG9zIG5vIHRpZW5lbiB0YW50YSByZWxhY2nDs24gY29uIGxhIGVkYWQuIAoKIyMjIENsdXN0ZXIgMjogRWRhZCB5IFNhbGFyaW8gRGlhcmlvCmBgYHtyfQojIE5vcm1hbGl6YXIgVmFyaWFibGVzCnJoX2VkYWRfc2FsIDwtcmgyICU+JSBzZWxlY3Qoc2FsYXJpb19kaWFyaW9faW1zcywgZWRhZCwgZGlhc19sYWJvcmFkb3MpCnJoX2VkYWRfc2FsX25vcm08LXNjYWxlKHJoX2VkYWRfZGlhc1sxOjJdKSAKcGxvdChyaF9lZGFkX3NhbF9ub3JtKQojIE7Dum1lcm8gw7NwdGltbyBkZSBjbMO6c3RlcnMgY29uICJFbGJvdyBQbG90Igpmdml6X25iY2x1c3QocmhfZWRhZF9zYWxfbm9ybSwga21lYW5zLCBtZXRob2Q9IndzcyIpKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NSwgbGluZXR5cGU9MikrICAgICAgICAgICAKICBsYWJzKHN1YnRpdGxlID0gIkVsYm93IG1ldGhvZCIpICAKYGBgClNlIGRldGVybWluJ28gcXVlIGVsIG4ndW1lcm8gJ29wdGltbyBlcyBkZSA1IGNsdXN0ZXJzCgpgYGB7cn0KIyBWaXN1YWxpemFyIENsdXN0ZXJzCmNsdXN0ZXIyIDwta21lYW5zKHJoX2VkYWRfc2FsX25vcm0sNSkKY2x1c3RlcjIKZnZpel9jbHVzdGVyKGNsdXN0ZXIyLGRhdGE9cmhfZWRhZF9zYWxfbm9ybSkKYGBgCgpJbnRlcnByZXRhY2nDs246IFRvZG9zIHRpZW5lbiB1biBzYWxhcmlvIHNpbWlsYXIgc2luIGltcG9ydGFyIGxhIGVkYWQgcGVybyBlbiBlbCBjbHVzdGVyIDEgKHF1ZSBub23DoXMgZXMgdW4gcHVudG8pIG5vcyBpbmRpY2EgcXVlIGhheSBhbGd1aWVuIHF1ZSBnYW5hIG3DoXMgcXVlIGxvcyBkZW3DoXMgY29sYWJvcmFkb3JlcyB5IHRpZW5lbiB1bmEgZWRhZCByZWxhdGl2YW1lbnRlIGpvdmVuIGEgY29tcGFyYWNpw7NuIGRlIGxvcyBkZW3DoXMgZGF0b3MuCgojIyMgQ2x1c3RlciAzOiBOw7ptZXJvIGRlIGTDrWFzIGxhYm9yYWRvcyB5IFNhbGFyaW8gRGlhcmlvCmBgYHtyfQojIE5vcm1hbGl6YXIgVmFyaWFibGVzCnJoX2RpYXNfc2FsIDwtcmgyICU+JSBzZWxlY3Qoc2FsYXJpb19kaWFyaW9faW1zcywgZGlhc19sYWJvcmFkb3MsIGVkYWQpCnJoX2RpYXNfc2FsX25vcm08LXNjYWxlKHJoX2RpYXNfc2FsWzE6Ml0pIApwbG90KHJoX2RpYXNfc2FsX25vcm0pCiMgTsO6bWVybyDDs3B0aW1vIGRlIGNsw7pzdGVycyBjb24gIkVsYm93IFBsb3QiCmZ2aXpfbmJjbHVzdChyaF9kaWFzX3NhbF9ub3JtLCBrbWVhbnMsIG1ldGhvZD0id3NzIikrIAogIGdlb21fdmxpbmUoeGludGVyY2VwdD01LCBsaW5ldHlwZT0yKSsgICAgICAgICAgIAogIGxhYnMoc3VidGl0bGUgPSAiRWxib3cgbWV0aG9kIikgIApgYGAKU2UgZGV0ZXJtaW7DsyBxdWUgZWwgbsO6bWVybyDDs3B0aW1vIGVzIGRlIDUgY2x1c3RlcnMKYGBge3J9CiMgVmlzdWFsaXphciBDbHVzdGVycwpjbHVzdGVyMyA8LWttZWFucyhyaF9kaWFzX3NhbF9ub3JtLDUpCmNsdXN0ZXIzCmZ2aXpfY2x1c3RlcihjbHVzdGVyMyxkYXRhPXJoX2RpYXNfc2FsX25vcm0pCmBgYApJbnRlcnByZXRhY2nDs246IExvcyBkw61hcyBsYWJvcmFkb3Mgbm8gdGllbmVuIGluZmx1ZW5jaWEgZW4gZWwgc2FsYXJpbyBwb3JxdWUgaGF5IGRhdG9zIHF1ZSBpbmRpY2FuIGNvbGFib3JhZG9yZXMgcXVlIHRyYWJhamFuIG3DoXMgZMOtYXMgcGVybyB0aWVuZW4gdW4gc2FsYXJpbyBzaW1pbGFyIGEgbG9zIHF1ZSBubyB0aWVuZW4gdGFudG9zIGTDrWFzIGxhYm9yYWRvcy4gRWwgY2x1c3RlciAyIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGVzIGVsIHF1ZSB0aWVuZSB1biBtYXlvciBzYWxhcmlvIHBlcm8gbm8gZXMgZWwgcXVlIHRpZW5lIHVuYSBjYW50aWRhZCBhbHRhIGRlIGTDrWFzIGxhYm9yYWRvcyBjb21vIGVzIGVuIGVsIGNsdXN0ZXIgMS4gUG9yIGxvIHRhbnRvLCBsb3MgZMOtYXMgbGFib3JhZG9zIG5vIHRpZW5lbiByZWxhY2nDs24gY29uIGVsIHNhbHJpby4gCgojIyAqQ3JlYWNpw7NuIGRlIHNlZ21tZW50b3MgdXNhbmRvIGVsIGNsdXN0ZXIgMjogRWRhZCB5IFNhbGFyaW8gRGlhcmlvKgpgYGB7cn0KIyBJbmNsdWlyIGNvbHVtbmEgcXVlIGluZGlxdWUgZWwgY2x1c3RlciBkZSBjYWRhIHJlZ2lzdHJvCnJoMyA8LSByaDIKcmgzJENsdXN0ZXJzPC1jbHVzdGVyMiRjbHVzdGVyCgojIHZpc3VhbGl6YXIgbGEgbcOheGltYSBlZGFkIGRlIGNhZGEgY2x1c3RlcgpyaDQgPC0gcmgzICU+JSBncm91cF9ieShDbHVzdGVycykgJT4lIHN1bW1hcmlzZShlZGFkPW1heChlZGFkKSkgJT4lIGFycmFuZ2UoZGVzYyhlZGFkKSkKCiMgTm9tYnJhciBjYWRhIGNsdXN0ZXIgCnJoMyRub21icmVzX2NsdXN0ZXJzIDwtIGZhY3RvcihyaDMkQ2x1c3RlcnMsbGV2ZWxzID0gYygxLDIsMyw0LDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkV4Y2VwY2lvbiIsICJKdWJpbGFkb3MiLCAiTWF5b3JlcyIsICJBZHVsdG9zIiwgIkpvdmVuZXMiKSkKCiMgQWdydXBhciBsb3MgZGF0b3MgcG9yIG5vbWJyZSBkZSBjbHVzdGVycyAKbGlicmFyeShkcGx5cikKcmg1IDwtIHJoMyAlPiUgZ3JvdXBfYnkobm9tYnJlc19jbHVzdGVycykgJT4lIHN1bW1hcml6ZShlZGFkX2HDsW9zPW1heChlZGFkKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWxhcmlvX2ltc3M9bWVhbihzYWxhcmlvX2RpYXJpb19pbXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50PW4oKSkKCmNsdXN0ZXJzPC1hcy5kYXRhLmZyYW1lKHJoNSkKY2x1c3RlcnMKYGBgCgojIyAqR3LDoWZpY29zIGNvbXBsZW1lbnRhcmlvcyogCiMjIyBHcsOhZmljbyBwb3Igbm9tYnJlIGRlIGNsdXN0ZXIgCmBgYHtyfQpnZ3Bsb3Qocmg1LGFlcyh4PXJlb3JkZXIobm9tYnJlc19jbHVzdGVycyxDb3VudCkseT1Db3VudCxmaWxsPW5vbWJyZXNfY2x1c3RlcnMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQpgYGAKSW50ZXJwcmV0YWNpw7NuOiBMb3MgasOzdmVuZXMgYWR1bHRvcyBzb24gbG9zIHF1ZSByZXByZXNlbnRhbiBtw6FzIG7Dum1lcm8gZGUgYmFqYXMgeSBzZSB2aXN1YWxpemEgcXVlIGVsIG9yZGVuIGRlIG7Dum1lcm8gZGUgYmFqYXMgZXN0J2EgZW4gZWwgbWlzbW8gb3JkZW4gZGUgZWRhZCwgZXN0byBzaWduaWZpY2EgcXVlIGRlc3B1J2VzIGRlIGxvcyBqw7N2ZW5lcyBhZHVsdG9zIGVsIGdydXBvIHF1ZSBtw6FzIHJlcHJlc2VudGEgYmFqYXMgZXMgZWwgZGUgbG9zIGFkdWx0b3MgeSBkZSBhaMOtIHNpZ3VlbiBsb3MgbW1heW9yZXMgeSBwb3Igw7psdGltbyBsb3MganViaWxhZG9zLiBFbiBjb25jbHVzacOzbiBsYSBlZGFkIHB1ZWRlIHNlciB1biBmYWN0b3IgaW1wb3J0YW50ZSBlbiBlbCBuw7ptZXJvIGRlIGJhamFzLgoKIyMjIEdyw6FmaWNvIGRlbCBtw6F4aW1vIGRlIGVkYWQgZGUgY2FkYSBjbHVzdGVyCmBgYHtyfQpnZ3Bsb3Qocmg1LCBhZXMoeD1ub21icmVzX2NsdXN0ZXJzLHk9ZWRhZF9hw7FvcyxmaWxsPSBub21icmVzX2NsdXN0ZXJzLGxhYmVsPXJvdW5kKGVkYWRfYcOxb3MsZGlnaXRzPTIpKSkgKyAKICBnZW9tX2NvbCgpICsgCiAgZ2VvbV90ZXh0KCkKYGBgCmludGVycHJldGFjacOzbjogQXF1w60gc2UgdmUgbGEgbcOheGltYSBkZSBlZGFkIGRlIGNhZGEgY2x1c3RlciB5IHRhbWJpw6luIG11ZXN0cmEgbGEgcmF6w7NuIHBvciBsYSBxdWUgc2UgZGllcm9uIGxvcyBub21icmVzIGEgY2FkYSBjbHVzdGVyLiBMb3MgasOzdmVuZXMgdGllbmVuIHVuIHJhbmdvIGRlIGVkYWQgZGUgMTktMjYsIEFkdWx0b3MgMjctMzYsIE1heW9yZXMgMzctNDMgeSBKdWJpbGFkb3MgNDQtNjEuCgojIyMgR8OpbmVybyBkZSBleC1jb2xhYm9yYWRvcmVzCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChyaDMsIGFlcyhmaWxsPWdlbmVybywgeT1nZW5lcm8sIHg9bm9tYnJlc19jbHVzdGVycykpICsgCiAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdD0iaWRlbnRpdHkiKSAKYGBgCmludGVycHJldGFjacOzbjogRW4gbGEgZ3LDoWZpY2Egc2UgYXByZWNpYSB1biBuw7ptZXJvIGFsdG8gZGUgZ8OpbmVybyBtYXNjdWxpbm8gZW4gdG9kb3MgbG9zIGNsdXN0ZXJzLiBFbiBKdWJpbGFkb3MgeSBNYXlvcmVzIGVsIGfDqW5lcm8gRmVtZW5pbm8gZXMgbWF5b3IgcXVlIGVsIG1hc2N1bGluby4gCgojIyMgTW90aXZvIGRlIGJhamEgZGUgZXgtY29sYWJvcmFkb3JlcwpgYGB7cn0KZ2dwbG90KHJoMywgYWVzKGZhY3Rvcihub21icmVzX2NsdXN0ZXJzKSwgZmlsbCA9IGZhY3Rvcihtb3Rpdm9fZGVfYmFqYSkpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIocHJlc2VydmUgPSAic2luZ2xlIikpCmBgYAppbnRlcnByZXRhY2nDs246ICBTZSBwdWVkZSBvYnNlcnZhciBxdWUgZWwgbW90aXZvIGRlIGJhamEgbWFzIGdyYW5kZSBlbiB0b2RvcyBsb3MgZ3J1cG9zIGRlIGVkYWRlcyBlcyBsYSBiYWphIHBvciBmYWx0YXMgc2VndWlkbyBkZSByZW51bmNpYSB2b2x1bnRhcmlhLiBFbiBqw7N2ZW5lcyBzZSBwdWVkZSBvYnNlcnZhciBxdWUgaGF5IGJhamEgcG9yIGFiYW5kb25vIG1pZW50cmFzIHF1ZSBlbiBsb3Mgb3Ryb3MgY2x1c3RlcnMgbm8gaHVibyBuaW5ndW5hIGJhamEgcG9yIGFiYW5kb25vLiAKCiMjIyBQdWVzdG8gZGUgZGUgZXgtY29sYWJvcmFkb3JlcyAgCmBgYHtyfQpsaWJyYXJ5KHBseXIpCmNvdW50KHJoMyRwdWVzdG8pCnByb3BvcmNpb25lcyA8LSBjKDE3NiwgMTEsIDExLCA4LCAyNikKZXRpIDwtIGMoImF5dWRhbnRlIGdlbmVyYWwiLCAiYXl1LiBzb2xkYWRvci9zb2xkYWRvciIsICJjb3N0dXJlcmEiLCAiYXl1LiBlbWJhcnF1ZSIsICJvdHJvcyIgKQpwY3QgPC0gcm91bmQocHJvcG9yY2lvbmVzL3N1bShwcm9wb3JjaW9uZXMpKjEwMCkKZXRpIDwtIHBhc3RlKGV0aSwgcGN0KQpldGkgPC0gcGFzdGUoZXRpLCIlIixzZXA9IiIpCnBpZTNEKHByb3BvcmNpb25lcyxsYWJlbHMgPSBldGksCiAgICBjb2w9cmFpbmJvdyhsZW5ndGgoZXRpKSksCiAgICBtYWluPSJQdWVzdG9zIGRlIGJhamFzIikKYGBgCmludGVycHJldGFjacOzbjogZWwgcHVlc3RvIGVuIGVsIHF1ZSBtw6FzIHNlIHByZXNlbnRhbiBiYWphcyBlcyBlbiBheXVkYW50ZSBnZW5lcmFsLCAKc2VndWlkbyBkZSBheXVkYW50ZSBzb2xkYWRvci9zb2xkYWRvciwgY29zdHVyZXJhLCBldGMuIFVuYSBkZSBsYXMgcG9zaWJsZXMgcmF6b25lcwpwb3IgbGEgcXVlIGhheWEgbcOhcyBiYWphcyBlbiBheXVkYW50ZSBnZW5lcmFsIGVzIHBvcnF1ZSBlbiBlc2UgcHVlc3RvIHNlIG5lY2VzaXRhbgptw6FzIGNvbGFib3JhZG9yZXMgcG9yIGxvIHF1ZSBlbCBuw7ptZXJvIGRlIGJhamFzIGVuIGVzZSBwdWVzdG8gcHVlZGUgc2VyIG1heW9yIG8gdGFtYmnDqW4gcHVlZGUgc2VyIGVsIGFtYmllbnRlIGdlbmVyYWwgcXVlIHNlIGNyZWEgZW4gZXNlIHB1ZXN0bywgZXN0w6FzIGhpcG90w6lzaXMgc2UgY29tcHJvYmFyw61hbiBjb24gdW4gYW7DoWxpc2lzIG3DoXMgcHJvZnVuZG8gZGUgUkguIAoKIyMjIEVzdGFkbyBjaXZpbCBkZSBleC1jb2xhYm9yYWRvcmVzIApgYGB7cn0KZ2dwbG90KHJoMywgYWVzKGZhY3Rvcihub21icmVzX2NsdXN0ZXJzKSwgZmlsbCA9IGZhY3Rvcihlc3RhZG9fY2l2aWwpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHByZXNlcnZlID0gInNpbmdsZSIpKQoKcHJvcG9yY2lvbmVzMSA8LSBjKDEwNywgMywgNTksIDYzKQpldGlxdWV0YXMgPC0gYygic29sdGVybyIsICJkaXZvcmNpbyIsICJ1bmlvbiBsaWJyZSIsICJtYXRyaW1vbmlvIikKcGN0IDwtIHJvdW5kKHByb3BvcmNpb25lczEvc3VtKHByb3BvcmNpb25lczEpKjEwMCkKZXRpcXVldGFzIDwtIHBhc3RlKGV0aXF1ZXRhcywgcGN0KQpldGlxdWV0YXMgPC0gcGFzdGUoZXRpcXVldGFzLCIlIixzZXA9IiIpCnBpZTNEKHByb3BvcmNpb25lczEsbGFiZWxzID0gZXRpcXVldGFzLAogICAgICBjb2w9cmFpbmJvdyhsZW5ndGgoZXRpcXVldGFzKSksCiAgICAgIG1haW49IkVzdGFkbyBjaXZpbCBkZSBiYWphcyIpCmBgYAppbnRlcnByZXRhY2nDs246IEVuIGVsIHRvdGFsIGRlIGJhamFzIGVsIGVzdGFkbyBjaXZpbCBtw6FzIGNvbcO6biBlcyAic29sdGVybyIgCnNpZW5kbyBsb3MgasOzdmVuZXMgbG9zIHF1ZSB0aWVuZW4gdW5hIG1heW9yIGNhbnRpZGFkIGRlIGVzdGUgYXRyaWJ1dG8sIHNlZ3VpZG8gZGUgCmxvcyBhZHVsdG9zLiBEZXNwdcOpcywgZXN0w6EgZWwgbWF0cmltb25pbyBzaWVuZG8gZXN0ZSBlbCBtw6FzIHByZXNlbnRlIGVuIGVsIGdydXBvCmRlIGFkdWx0b3MsIHNlZ3VpZG8gZGUgbG9zIGrDs3ZlbmVzLiBFbCBkaXZvcmNpbyBubyBlcyB0w6FuIGNvbcO6biBlbiBsb3MgZ3J1cG9zLgpFbiBjb25jbHVzacOzbiBzZSBwdWVkZSBkZWR1Y2lyIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgZXgtY29sYWJvcmFkb3JlcyBzb24gc29sdGVyb3MKcG9yIGxvIHF1ZSBlcyBtw6FzIGbDoWNpbCByZW51bmNpYXIgYWwgbm8gdGVuZXIgdW5hIGV4dGVuc2EgeS9vIHByb3BpYSBmYW1pbGlhLgpZYSBxdWUgbG9zIHNvbHRlcm9zIHNvbiBsYSBtYXlvcsOtYSBwb3IgZW5kZSBsb3MgasOzdmVuZXMgc29uIGxvcyBtw6FzIHByb3BlbnNvcwplbiBkYXJzZSBkZSBiYWphIGVuIEZPUk0uIAoKIyAqKjMuIFByaW5jaXBhbGVzIGhhbGxhemdvcyoqCg==