library(foreign)
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(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(corrplot)
## corrplot 0.92 loaded
library(jtools)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
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
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
bd1 <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\FORM - Recursos Humanos - BAJAS BUENA.csv")
bajas <- clean_names(bd1)
summary(bajas)
## apellidos nombre fecha_de_nacimiento edad
## Length:236 Length:236 Length:236 Min. :19.00
## Class :character Class :character Class :character 1st Qu.:23.00
## Mode :character Mode :character Mode :character Median :29.00
## Mean :31.08
## 3rd Qu.:37.00
## Max. :61.00
## NA's :3
## genero rfc fecha_de_alta motivo_de_baja
## Length:236 Length:236 Length:236 Length:236
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## no_dias baja puesto departamento
## Min. : 0.00 Length:236 Length:236 Length:236
## 1st Qu.: 9.00 Class :character Class :character Class :character
## Median : 19.00 Mode :character Mode :character Mode :character
## Mean : 79.76
## 3rd Qu.: 49.00
## Max. :1966.00
## NA's :23
## no_seguro_social salario_diario_imss factor_cred_infonavit
## Length:236 Min. :144.4 Length:236
## Class :character 1st Qu.:180.7 Class :character
## Mode :character Median :180.7 Mode :character
## Mean :178.0
## 3rd Qu.:180.7
## Max. :500.0
##
## n_credito_infonavit lugar_de_nacimiento curp calle
## Length:236 Length:236 Length:236 Length:236
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## numero_interno colonia codigo_postal municipio
## Length:236 Length:236 Length:236 Length:236
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## estado estado_civil tarjeta_cuenta
## Length:236 Length:236 Length:236
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
#Técnica 1:
#Borrar columnas.
bajas <- subset(bajas, 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_cuenta))
#Técnica 2:
#Reemplezar NAs con el promedio en la columna de "Edad", "Salario Diario" y "Número de días".
bajas$edad[is.na(bajas$edad)]<-mean(bajas$edad, na.rm = TRUE)
bajas$salario_diario_imss[is.na(bajas$salario_diario_imss)]<-mean(bajas$salario_diario_imss, na.rm = TRUE)
bajas$no_dias[is.na(bajas$no_dias)]<-mean(bajas$no_dias, na.rm = TRUE)
summary (bajas)
## edad genero motivo_de_baja no_dias
## Min. :19.00 Length:236 Length:236 Min. : 0.00
## 1st Qu.:23.00 Class :character Class :character 1st Qu.: 9.00
## Median :29.00 Mode :character Mode :character Median : 24.00
## Mean :31.08 Mean : 79.76
## 3rd Qu.:37.00 3rd Qu.: 79.76
## Max. :61.00 Max. :1966.00
## puesto salario_diario_imss estado_civil
## Length:236 Min. :144.4 Length:236
## Class :character 1st Qu.:180.7 Class :character
## Mode :character Median :180.7 Mode :character
## Mean :178.0
## 3rd Qu.:180.7
## Max. :500.0
#Técnica 3:
#Convertir las variables como factor o número
bajas$edad<-as.numeric(bajas$edad)
bajas$genero<-as.factor(bajas$genero)
bajas$motivo_de_baja<-as.factor(bajas$motivo_de_baja)
bajas$no_dias<-as.numeric(bajas$no_dias)
bajas$puesto<-as.factor(bajas$puesto)
bajas$salario_diario_imss<-as.numeric(bajas$salario_diario_imss)
bajas$estado_civil<-as.factor(bajas$estado_civil)
summary (bajas)
## edad genero motivo_de_baja no_dias
## Min. :19.00 FEMENINO :139 ABANDONO : 1 Min. : 0.00
## 1st Qu.:23.00 MASCULINO: 97 BAJA POR FALTAS :141 1st Qu.: 9.00
## Median :29.00 JUBILACION : 1 Median : 24.00
## Mean :31.08 RENUNCIA VOLUNTARIA: 85 Mean : 79.76
## 3rd Qu.:37.00 TERMINO DE CONTRATO: 8 3rd Qu.: 79.76
## Max. :61.00 Max. :1966.00
##
## puesto salario_diario_imss estado_civil
## AYUDANTE GENERAL :179 Min. :144.4 CASADO : 64
## COSTURERA : 11 1st Qu.:180.7 DIVORCIADO : 3
## SOLDADOR : 11 Median :180.7 SOLTERO :108
## AYUDANTE DE EMBARQUES: 7 Mean :178.0 UNION LIBRE: 61
## MONTACARGUISTA : 5 3rd Qu.:180.7
## INSPECTOR CALIDAD : 4 Max. :500.0
## (Other) : 19
#Exportar base de datos limpia
write.csv(bajas, file="bajas_bd_limpia.csv", row.names = FALSE)
edad<-bajas %>% select(genero,estado_civil,motivo_de_baja, puesto, salario_diario_imss,no_dias, edad)
#Normalizar variables
edad_norm<-scale(edad[6:7])
#Función fviz para la visualización de un Elbow Plot y así determinar el número de clusters.
fviz_nbclust(edad_norm, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method")
## Registered S3 methods overwritten by 'broom':
## method from
## tidy.glht jtools
## tidy.summary.glht jtools
Con esta gráfica podemos visualizar que el número óptimo de clústers son 4 (optimización).
#Visualizar clusters
edad_cluster<-kmeans(edad_norm,4)
edad_cluster
## K-means clustering with 4 clusters of sizes 108, 4, 45, 79
##
## Cluster means:
## no_dias edad
## 1 -0.16123563 -0.8436899
## 2 6.69236023 1.0613529
## 3 -0.10238449 1.5986678
## 4 -0.06011001 0.1890259
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 4 4 1 1 4 3 4 4 3 1 1 4 1 4 4 1 1 1 1 1
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 4 2 1 4 3 1 4 1 1 1 4 1 1 1 4 1 1 4 4 1
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 1 4 1 1 1 1 1 1 3 3 3 2 1 3 1 1 3 1 1 1
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 1 1 4 1 1 3 1 3 4 1 1 1 4 1 4 1 3 1 1 3
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 2 4 3 1 1 1 3 1 1 1 4 3 3 1 1 1 4 3 4 1
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 4 1 1 3 4 1 1 4 2 4 1 4 4 1 4 4 4 3 3 3
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 1 1 1 1 1 4 1 4 3 1 4 1 3 1 4 4 4 3 4 3
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 4 4 3 3 3 1 4 4 4 4 1 1 1 4 3 3 1 4 1 4
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 3 3 3 3 4 3 1 1 4 1 1 3 4 3 1 3 4 4 3 4
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 4 1 1 1 4 3 4 4 1 1 4 4 4 4 4 4 4 1 4 4
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 4 4 1 4 3 4 1 1 1 3 1 1 1 4 4 1 1 4 4 4
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
## 3 1 1 4 1 1 1 1 3 4 3 1 1 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 16.47707 16.07044 21.67511 33.84920
## (between_SS / total_SS = 81.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
#Visualizar resultados:
fviz_cluster(edad_cluster,data=edad_norm)
Los más jóvenes son los que menos días de trabajo laboran. Así como que los que más días laborales tienen, son los adultos desde los 27 años hasta los 61.
edad_salario <-bajas %>% select(genero,estado_civil,motivo_de_baja, puesto, no_dias, salario_diario_imss, edad)
#Normalizar variables
edad_salario_norm<-scale(edad_salario[6:7])
#Función fviz para la visualización de un Elbow Plot y así determinar el número de clusters.
fviz_nbclust(edad_salario_norm, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method")
Con esta gráfica podemos visualizar que el número óptimo de clústers son 4 (optimización).
#Visualizar clusters:
edad_salario_cluster<-kmeans(edad_salario_norm,4)
edad_salario_cluster
## K-means clustering with 4 clusters of sizes 1, 106, 47, 82
##
## Cluster means:
## salario_diario_imss edad
## 1 13.84560348 0.09627292
## 2 -0.08355516 -0.85551942
## 3 -0.05258548 1.63906906
## 4 -0.03069803 0.16527488
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 4 2 2 4 3 4 4 3 2 2 4 2 4 4 2 2 2 2 2
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 4 3 2 4 3 2 4 2 2 2 4 2 2 2 4 2 2 4 4 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 2 4 2 2 2 2 2 2 3 3 3 3 2 3 2 2 3 2 2 2
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 4 4 4 3 2 3 4 2 2 2 4 2 4 2 3 2 2 3
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 2 2 3 2 2 2 3 2 2 2 4 3 3 2 2 4 4 3 4 2
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 4 2 2 3 4 2 2 4 2 4 2 4 4 2 4 4 4 3 3 3
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 2 2 2 2 2 4 2 4 3 4 4 2 3 2 4 4 4 3 4 3
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 4 4 3 3 3 2 4 4 4 4 2 2 2 4 3 3 2 4 2 4
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 3 3 3 3 4 3 2 2 4 2 2 3 4 3 2 3 4 4 3 4
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 4 2 2 2 4 3 4 4 2 2 4 4 4 4 4 4 4 2 4 4
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 4 4 2 4 3 4 2 2 2 3 2 2 2 4 4 2 2 4 4 4
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
## 3 2 2 4 2 2 2 4 3 4 3 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 0.00000 29.24335 19.71590 22.29302
## (between_SS / total_SS = 84.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
#Visualizar resultados:
fviz_cluster(edad_salario_cluster,data=edad_salario_norm)
La edad no tiene mucha influencia en el salario. Pues los colaboradores que se han dado de baja tienen un salario muy similar independientemente de su edad.
dias_salario <-bajas %>% select(genero,estado_civil,motivo_de_baja, puesto, edad, no_dias, salario_diario_imss)
#Normalizar variables:
dias_salario_norm<-scale(dias_salario[6:7])
#Función fviz para la visualización de un Elbow Plot y así determinar el número de clusters.
fviz_nbclust(dias_salario_norm, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method")
Con esta gráfica podemos visualizar que el número óptimo de clústers son 4 (optimización).
#Visualizar clusters:
dias_salario_cluster<-kmeans(dias_salario_norm,4)
dias_salario_cluster
## K-means clustering with 4 clusters of sizes 158, 5, 43, 30
##
## Cluster means:
## no_dias salario_diario_imss
## 1 -0.2914687 0.11550041
## 2 5.8670410 2.44889716
## 3 0.2568332 0.08119347
## 4 0.1891008 -1.13282901
##
## 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 1 1 4 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 2 4 4 1 1 1 1 1 1 1 1 1 1 1 1 4 3 1 1
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 3 3 1 1 1 1 1 1 1 1 1 2 3 1 1 1 1 1 1 4
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 1 1 1 1 1 1 1 4 3 4 1 1 1 1 1 1 1 1 1 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 2 4 4 4 4 3 1 1 1 1 1 1 1 1 1 1 1 4 4 3
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 3 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 1 3 1 1 1 1 1 1 1 1 1 1 4 3 3 3 3 1 1 1
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 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 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 3 3 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1
## 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
## 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 0.9925715 183.9930875 12.7855972 11.9101814
## (between_SS / total_SS = 55.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
#Visualizar resultados:
fviz_cluster(dias_salario_cluster,data=dias_salario_norm)
promedio_dias <- mean(bajas$no_dias)
promedio_dias
## [1] 79.76056
En este clúster podemos observar que por más antigüedad o días que labores en FORM, no hay mucha posibilidad de crecimiento laboral (económicamente hablando), pues según el cluster realizado, no influyen los días laborados con el salario diario.
#Decidimos usar el Cluster 2 para generar la clasificación de variables y poder comparar con datos cualitativos.
#Añadir a la base de datos la columna de Clusters y su clasificación:
bajas1<-bajas
bajas1$Clusters<-edad_salario_cluster$cluster
#Identificamos la clasificación de las distintas edades de los colaboradores.
bajas2<-bajas1 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))
bajas1$Cluster_Names<-factor(bajas1$Clusters,levels = c(1,2,3,4),
labels=c("Outlier", "Joven", "Avanzada", "Adulta"))
bajas3 <- bajas1 %>% group_by(Cluster_Names) %>% summarize(edad_años=max(edad),
salario_imss=mean(salario_diario_imss),
Count=n())
clusters<-as.data.frame(bajas3)
clusters
## Cluster_Names edad_años salario_imss Count
## 1 Outlier 32 500.0000 1
## 2 Joven 28 176.0192 106
## 3 Avanzada 61 176.7396 47
## 4 Adulta 39 177.2487 82
#Se realizó una gráfica para analizar el número de registros por cada segmento:
ggplot(bajas3,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")
Los colaboradores que más bajas han presentado según la gráfica anterior son jóvenes, seguido por los adultos y después los colaboradores de edad avanzada.
#Visualizar la edad por cada segmento:
ggplot(bajas3, aes(x=Cluster_Names,y=edad_años,fill= Cluster_Names,label=round(edad_años,digits=2))) +
geom_col() +
geom_text()
Visualización de los máximos de cada segmento: Jóvenes (hasta los 28), Avanzada (Hasta los 61), Adulta (Hasta los 40) y el Outlier de 32.
ggplot(bajas1, aes(factor(Cluster_Names), fill = factor(genero))) +
geom_bar(position = position_dodge2(preserve = "single"))
Este gráfico nos dice que de cada segmento, hay más mujeres que se han dado de baja.
ggplot(bajas1, aes(factor(Cluster_Names), fill = factor(estado_civil))) +
geom_bar(position = position_dodge2(preserve = "single"))
Podemos visualizar que de de los jóvenes, la mayoría eran solteros, de los adultos había la misma cantidad de casados, soleros y en unión libre y en avanzados eran más solteros y casados. Más sin embargo, hay muy pocos colaboradores que se han dado de baja divorciados.
ggplot(bajas1, aes(factor(Cluster_Names), fill = factor(motivo_de_baja))) +
geom_bar(position = position_dodge2(preserve = "single"))
Podemos observar que en el segmento de colaboradores jovenes, adultos y de edad avanzada, la mayor parte se ha dado de baja por faltas, siguiendo así por renuncia voluntaria.
table(bajas1$puesto)
##
## ANALISTA DE NOMINAS /AUX DE R.H. AYUDANTE DE EMBARQUES
## 1 7
## AYUDANTE DE MTTO AYUDANTE DE SOLDADOR
## 1 1
## AYUDANTE GENERAL CHOFER
## 179 1
## CORTADOR COSTURERA
## 1 11
## DISEÑO ENCARGADA DE CALIDAD
## 1 1
## FACTURACION GUARDIA DE SEGURIDAD
## 1 2
## INSPECTOR CALIDAD LIMPIEZA
## 4 1
## MARCADORA MATERIALISTA
## 1 2
## MONTACARGUISTA PRACTICANTE DE MTTO
## 5 1
## RESIDENTE SERVICIO AL CLIENTE
## 3 1
## SOLDADOR
## 11
proporciones <- c(23, 179, 11, 11, 7, 5)
etiquetas <- c("Otros","Ayudante General", "Costurera", "Soldador", "Ayudante Embarques", "Montacarguista")
pct <- round(proporciones/sum(proporciones)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie(proporciones,labels = etiquetas,
col=rainbow(length(etiquetas)),
main="Puesto de los Ex-Colaboradores")
La mayor parte de los ex-colaboradores de Form eran Ayudantes generales (76%).