knitr::include_url("https://form.com.mx/")
Contribuyen a la identificación de clusters, ya que K-means lo que hace es agrupar, quiere decir que esta función o algoritmo divide los datos u observaciones obtenidas en grupos con características similares. De esta manera es que se puede analizar con éxito cada Cluster, obteniendo información importante de cada variable y la similitudes entre ellas, lo que hace que sea más comprensible, ya que hace que los datos o información que no se puede procesar en información procesable. Un claro ejemplo de cómo funciona es teniendo grupos que comparten los mismos temas, imágenes con el mismo objeto o persona, etc.
Cuando se utiliza la función K-means se enfoca en agrupar datos no supervisados, esto quiere decir que K-means es un algoritmo no supervisado. En otras palabras lo que quiere decir Aprendizaje no supervisado, es referente al tipo de algoritmo o técnica que se utiliza y es importante, ya que gracias a que se define de esta manera las técnicas y algoritmos, podemos implementarlo de manera correcta en el análisis de Datos. Esto quiere decir que este termino nos da a entender que esa base de datos se ocupará el algoritmo de agrupamiento no supervisado, ya que la base cuenta con datos de entrada sin respuestas etiquetadas, es por eso la importancia para poder identificarlo.
Principalmente la distancia euclidiana es cuando se encuentra un espacio vectorial, que es igual o inferior a la variable que estamos analizando. Cuando se identifican clusters encontramos a los centroides, En la parte donde se utiliza la distancia euclidiana es cuando los centroides ya no se repiten y encuentran una posición y no cambian, por lo que se hace la relación con puntos al rededor del centroides, cada punto es una variable por lo tanto la distancia que existe entre variables es la distancia euclidiana. La cual nos ayuda a descubrir la similitud entre las variables que estamos analizando.
file.choose()
rh1<-rh %>% select(EDAD,DIAS.TRABAJADOS,SALARIO.DIARIO.IMSS)
summary(rh1)
## EDAD DIAS.TRABAJADOS SALARIO.DIARIO.IMSS
## Min. : 0.00 Min. : 0.00 Min. :151.6
## 1st Qu.:22.25 1st Qu.: 9.00 1st Qu.:180.7
## Median :30.00 Median : 19.00 Median :180.7
## Mean :30.50 Mean : 45.10 Mean :174.3
## 3rd Qu.:36.00 3rd Qu.: 39.75 3rd Qu.:180.7
## Max. :52.00 Max. :730.00 Max. :183.7
rh1_norm<-scale(rh1[2:3])
fviz_nbclust(rh1_norm, kmeans, method="wss")+ # wss method considers total within sum of square
geom_vline(xintercept=4, linetype=2)+ # optimal number of clusters is computed with the default method = "euclidean"
labs(subtitle = "Elbow method")
## Registered S3 methods overwritten by 'broom':
## method from
## tidy.glht jtools
## tidy.summary.glht jtools
rh1_cluster<-kmeans(rh1_norm,4)
rh1_cluster
## K-means clustering with 4 clusters of sizes 1, 17, 8, 52
##
## Cluster means:
## DIAS.TRABAJADOS SALARIO.DIARIO.IMSS
## 1 7.5323951 0.5246350
## 2 0.2712304 -1.8780410
## 3 0.6353722 0.4428101
## 4 -0.3312748 0.5357612
##
## Clustering vector:
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 3 2 4 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4
## [39] 4 4 4 4 4 4 4 3 4 4 3 3 3 1 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4
## [77] 4 4
##
## Within cluster sum of squares by cluster:
## [1] 0.000000 6.019937 3.270968 1.055662
## (between_SS / total_SS = 93.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Muestra que utilicemos 4 clusters para analizar y visualizar la información.
fviz_cluster(rh1_cluster,data=rh1_norm)
El primer cluster analiza la relación entre el salario diario IMSS y los días trabajados de los empleados que ya fueron dados de baja. En este caso, vemos que hay un impacto alto entre aquellos empleados que trabajaron de 2 a 8 días, pero tuvieron un salario diario bajo, mucho menor a 0 en la gráfica. Los otros dos resultados, se muestra que trabajaron menos días, pero al igual que el primer cluster explicado, tuvieron un salario muy bajo. Con estos tres, hay una correlación alta, significativa y negativa. Para el grupo de arriba, vemos que estos trabajaron un promedio de 2-3 días y tuvieron un salario diario muy alto. Podemos inferir que este grupo pertenece al área administrativa, que como vimos en análisis anteriores, son el grupo con un salario mucho más alto al resto.
rh2<-rh1
rh2$Clusters<-rh1_cluster$cluster
summary(rh2)
## EDAD DIAS.TRABAJADOS SALARIO.DIARIO.IMSS Clusters
## Min. : 0.00 Min. : 0.00 Min. :151.6 Min. :1.000
## 1st Qu.:22.25 1st Qu.: 9.00 1st Qu.:180.7 1st Qu.:3.000
## Median :30.00 Median : 19.00 Median :180.7 Median :4.000
## Mean :30.50 Mean : 45.10 Mean :174.3 Mean :3.423
## 3rd Qu.:36.00 3rd Qu.: 39.75 3rd Qu.:180.7 3rd Qu.:4.000
## Max. :52.00 Max. :730.00 Max. :183.7 Max. :4.000
rh3<-rh2 %>% group_by(Clusters) %>% summarise(SALARIO.DIARIO.IMSS=max(SALARIO.DIARIO.IMSS),DIAS.TRABAJADOS=mean(DIAS.TRABAJADOS)) %>% arrange(desc(SALARIO.DIARIO.IMSS))
summary(rh3)
## Clusters SALARIO.DIARIO.IMSS DIAS.TRABAJADOS
## Min. :1.00 Min. :151.6 Min. : 14.98
## 1st Qu.:1.75 1st Qu.:173.4 1st Qu.: 56.07
## Median :2.50 Median :180.7 Median : 86.32
## Mean :2.50 Mean :174.2 Mean :229.41
## 3rd Qu.:3.25 3rd Qu.:181.4 3rd Qu.:259.66
## Max. :4.00 Max. :183.7 Max. :730.00
rh2$Cluster_Names<-factor(rh2$Clusters,levels = c(1,2,3,4),
labels=c("Bajo", "Promedio ", "Arriba del prom", "Alto"))
summary(rh2)
## EDAD DIAS.TRABAJADOS SALARIO.DIARIO.IMSS Clusters
## Min. : 0.00 Min. : 0.00 Min. :151.6 Min. :1.000
## 1st Qu.:22.25 1st Qu.: 9.00 1st Qu.:180.7 1st Qu.:3.000
## Median :30.00 Median : 19.00 Median :180.7 Median :4.000
## Mean :30.50 Mean : 45.10 Mean :174.3 Mean :3.423
## 3rd Qu.:36.00 3rd Qu.: 39.75 3rd Qu.:180.7 3rd Qu.:4.000
## Max. :52.00 Max. :730.00 Max. :183.7 Max. :4.000
## Cluster_Names
## Bajo : 1
## Promedio :17
## Arriba del prom: 8
## Alto :52
##
##
Muchos días trabajados y poco salario
rh4 <- rh2%>% group_by(Cluster_Names) %>% summarize(DIAS.TRABAJADOS=max(DIAS.TRABAJADOS),
SALARIO.DIARIO.IMSS =mean(SALARIO.DIARIO.IMSS),
Count=n())
clusters<-as.data.frame(rh4)
clusters
## Cluster_Names DIAS.TRABAJADOS SALARIO.DIARIO.IMSS Count
## 1 Bajo 730 180.6800 1
## 2 Promedio 169 151.6100 17
## 3 Arriba del prom 251 179.6900 8
## 4 Alto 53 180.8146 52
ggplot(rh4,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")
De acuerdo a la clasificación de clusters, la gráfica anterior nos muestra el impacto y conteo de cada cluster dependiendo del grupo de baja analizado, es decir, vemos la relación entre días trabajados y salario diario, clasificando el conteo acorde a la cantidad de bajas obtenidas. En este caso, en la gráfica se muestra que aquellos que trabajaron más de 600 días y menos de 1900 días, obtuvieron un salario promedio de $500 pesos diario. Entra en la categoría de ‘bajo’, ya que sólo una persona obtuvo esta descripción. El promedio de las personas dadas de baja trabajaron más de 1900 días y obtuvieron un salario diario de $170 pesos. En la barra de ‘alto’ vemos a aquellos ex-empleados que trabajaron 421 días y tuvieron un salario diario de $150 pesos. Por último, vemos a aquellos ‘arriba del promedio’ y son aquellos que tabajaron un promedio de 455 días y tuvieron un salario diario de $180 pesos. Este último grupo es el que tuvo mayor conteo de personas, es decir, la mayoría de las bajas estuvieron laborando más de un año en FORM y tenían un salario diario de $180 pesos.
ggplot(rh4, aes(x=Cluster_Names,y=DIAS.TRABAJADOS,fill= Cluster_Names,label=round(DIAS.TRABAJADOS,digits=2))) +
geom_col() +
geom_text()
La gráfica anterior nos presenta la cantidad de días trabajados de acuerdo a la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. Con esto en mente, vemos que el promedio de los empleados juntaron un total de 1966 días trabajados, siguiéndole el grupo de ‘bajo’, los que laboraron un promedio de 628 días, luego ‘arriba del promedio’ que laboró 455 días y finalmente ‘alto’, que únicamente laboró 421 días. En todos los grupos, vemos que los empleados trabajaron por más de 1 año en FORM y ganaban un salario diario mayor a $150 pesos.
ggplot(rh4,aes(x=Cluster_Names,y=SALARIO.DIARIO.IMSS,fill= Cluster_Names,label=round(SALARIO.DIARIO.IMSS,digits=2))) +
geom_col() +
geom_text()
La gráfica anterior nos presenta la relación entre el salario diario IMSS y la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. Con esto en mente, vemos que el segmento ‘bajo’ es el que tenía un salario más alto que la mayoría. El promedio ganaba un salario diario de $170,79 pesos, ‘arriba del promedio’ ganaba $180,54 pesos y el segmento ‘alto’ gabana un promedio de $151,61 pesos de salario diario. Esto denota una variabilidad alta y podemos suponer que esto se debía de acuerdo a las responsabilidades y puestos analizados.
ggplot(rh2, aes(x=Cluster_Names, y=DIAS.TRABAJADOS, fill=Cluster_Names)) +
geom_boxplot()+
ggtitle("Dispersion of 'Días trabajados' by Clusters Names")
La gráfica anterior explica la dispersión de días trabajados de acuerdo a la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. Con esto en mente, vemos que el grupo con mayor dispersión es ‘promedio’, pues hay una variabilidad más significativa en los datos de la cantidad de días trabajados, destacando la media de días trabajados, es decir, 1000 días. En el caso de ‘bajo’, hay una dispersión baja y poco variable. Para ‘arriba del promedio’, vemos que los puntos atípicos se salen del boxplot específico, lo cual quitarlos nos puede dar mayor claridad y visibilidad de la información. Para ‘alto’ se muestra una dispersión menor a ‘promedio’ y al igual que ‘arriba del promedio’, tiene aparición de puntos atípicos.
ggplot(rh2, aes(x=Cluster_Names, y=SALARIO.DIARIO.IMSS, fill=Cluster_Names)) +
geom_boxplot()+
ggtitle("Dispersion of 'Salario_Diario' by Clusters Names")
La gráfica anterior explica la dispersión de salario diario de acuerdo a la clasificación explicada anteriormente de ‘bajo’, ‘promedio’, ‘arriba del promedio’ y ‘alto’. ‘Bajo’ muestra un salario diario de $500 pesos, ‘promedio’ muestra un salario de $180 pesos aprox y puntos atípicos que podrían insinuar un salario menor, ‘arriba del promedio’ también muestra puntos atípicos. Sin embargo, todos se mantienen al igual que el dato anterior entre $170 y $180 pesos de salario diario, Finalmente, ‘alto’ muestra un salario diario abajo del promedio de aprox. $140 pesos.
file.choose()
rhCluster2<-read.csv("C:\\Users\\danyc\\Downloads\\HR_Bajas 2.csv")
summary(rhCluster2)
## NO.DE.BAJAS APELLIDOS NOMBRE FECHA.DE.NACIMIENTO
## Min. : 5.00 Length:78 Length:78 Min. :25585
## 1st Qu.: 49.75 Class :character Class :character 1st Qu.:31751
## Median :167.50 Mode :character Mode :character Median :33797
## Mean :139.60 Mean :33611
## 3rd Qu.:212.75 3rd Qu.:36519
## Max. :238.00 Max. :44632
## EDAD GENERO FECHA.DE.ALTA MOTIVO.DE.BAJA
## Min. : 0.00 Length:78 Min. :43961 Length:78
## 1st Qu.:22.25 Class :character 1st Qu.:44567 Class :character
## Median :30.00 Mode :character Median :44726 Mode :character
## Mean :30.50 Mean :44664
## 3rd Qu.:36.00 3rd Qu.:44759
## Max. :52.00 Max. :44790
## DIAS.TRABAJADOS BAJA PUESTO DEPARTAMENTO
## Min. : 0.00 Min. :44569 Length:78 Length:78
## 1st Qu.: 9.00 1st Qu.:44613 Class :character Class :character
## Median : 19.00 Median :44741 Mode :character Mode :character
## Mean : 45.10 Mean :44709
## 3rd Qu.: 39.75 3rd Qu.:44784
## Max. :730.00 Max. :44814
## NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
## Length:78 Min. :151.6 Min. : 0.0
## Class :character 1st Qu.:180.7 1st Qu.: 0.0
## Mode :character Median :180.7 Median : 0.0
## Mean :174.3 Mean : 130.4
## 3rd Qu.:180.7 3rd Qu.: 0.0
## Max. :183.7 Max. :2795.3
## NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO CURP CALLE
## Min. :0.000e+00 Length:78 Length:78 Length:78
## 1st Qu.:0.000e+00 Class :character Class :character Class :character
## Median :0.000e+00 Mode :character Mode :character Mode :character
## Mean :1.871e+08
## 3rd Qu.:0.000e+00
## Max. :6.919e+09
## NUMERO.INTERNO COLONIA CODIGO.POSTAL MUNICIPIO
## Length:78 Length:78 Min. :25019 Length:78
## Class :character Class :character 1st Qu.:33604 Class :character
## Mode :character Mode :character Median :33604 Mode :character
## Mean :46508
## 3rd Qu.:66645
## Max. :67450
## ESTADO ESTADO.CIVIL TARJETA.CUENTA
## Length:78 Length:78 Length:78
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
str(rhCluster2)
## 'data.frame': 78 obs. of 26 variables:
## $ NO.DE.BAJAS : int 5 6 7 8 9 11 12 16 19 20 ...
## $ APELLIDOS : chr "BERNAL FLORES" "SAUCEDO GUZMAN" "MEZA LLANAS" "TORRES LARA" ...
## $ NOMBRE : chr "ERIKA ROSALINDA" "GUADALUPE" "YOANA CRISTINA" "CESAR ANTONIO" ...
## $ FECHA.DE.NACIMIENTO : int 33997 28106 34174 33491 26422 36970 32443 37872 37512 36915 ...
## $ EDAD : int 29 46 29 31 50 21 34 19 20 21 ...
## $ GENERO : chr "FEMENINO" "FEMENINO" "FEMENINO" "MASCULINO" ...
## $ FECHA.DE.ALTA : int 44518 44532 44532 44538 44551 44531 44532 44488 44541 44546 ...
## $ MOTIVO.DE.BAJA : chr "RENUNCIA VOLUNTARIA" "BAJA POR FALTAS" "BAJA POR FALTAS" "BAJA POR FALTAS" ...
## $ DIAS.TRABAJADOS : int 51 37 37 31 18 40 39 86 33 28 ...
## $ BAJA : int 44569 44569 44569 44569 44569 44571 44571 44574 44574 44574 ...
## $ PUESTO : chr "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ DEPARTAMENTO : chr "VARIOS" "VARIOS" "VARIOS" "VARIOS" ...
## $ NO.SEGURO.SOCIAL : chr "43109363747" "43937683647" "43099330201" "43099151714" ...
## $ SALARIO.DIARIO.IMSS : num 152 152 152 152 152 ...
## $ FACTOR.CRED.INFONAVIT: num 0 1320 0 0 0 ...
## $ NO.CREDITO.INFONAVIT : num 0.00 1.92e+09 0.00 0.00 0.00 ...
## $ LUGAR.DE.NACIMIENTO : chr "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
## $ CURP : chr "BEFE930128MNLRLR05" "SAGG761212MNLCZD08" "MELY930724MNLZLN01" "TOLC910910HNLRRS09" ...
## $ CALLE : chr "JULIAN VILLAGRAN" "PAPAGAYOS" "RIO AMANONAS" "PALMERA" ...
## $ NUMERO.INTERNO : chr "452" "220" "300" "104" ...
## $ COLONIA : chr "REFORMA" "GOLONDRINAS" "PUEBLO NUEVO" "MIRADOR DEL PARQUE" ...
## $ CODIGO.POSTAL : int 66640 66649 66646 67254 67114 66645 66646 66646 66645 66646 ...
## $ MUNICIPIO : chr "APODACA" "APODACA" "APODACA" "JUAREZ" ...
## $ ESTADO : chr "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
## $ ESTADO.CIVIL : chr "SOLTERO/A" "SOLTERO/A" "UNION LIBRE" "UNION LIBRE" ...
## $ TARJETA.CUENTA : chr "BANORTE" "BANORTE" "BANORTE" "BANORTE" ...
humanos5<-rhCluster2 %>% select(EDAD,DIAS.TRABAJADOS,SALARIO.DIARIO.IMSS)
summary(humanos5)
## EDAD DIAS.TRABAJADOS SALARIO.DIARIO.IMSS
## Min. : 0.00 Min. : 0.00 Min. :151.6
## 1st Qu.:22.25 1st Qu.: 9.00 1st Qu.:180.7
## Median :30.00 Median : 19.00 Median :180.7
## Mean :30.50 Mean : 45.10 Mean :174.3
## 3rd Qu.:36.00 3rd Qu.: 39.75 3rd Qu.:180.7
## Max. :52.00 Max. :730.00 Max. :183.7
rhCluster_norm<-scale(humanos5[1:2])
fviz_nbclust() helps to determine and visualize the optimal number of clusters
fviz_nbclust(rhCluster_norm, kmeans, method="wss")+ # wss method considers total within sum of square
geom_vline(xintercept=4, linetype=2)+ # optimal number of clusters is computed with the default method = "euclidean"
labs(subtitle = "Elbow method")
rh_cluster2<-kmeans(rh1_norm,4)
rh_cluster2
## K-means clustering with 4 clusters of sizes 1, 17, 8, 52
##
## Cluster means:
## DIAS.TRABAJADOS SALARIO.DIARIO.IMSS
## 1 7.5323951 0.5246350
## 2 0.2712304 -1.8780410
## 3 0.6353722 0.4428101
## 4 -0.3312748 0.5357612
##
## Clustering vector:
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 3 2 4 2 2 2 2 4 4 4 4 4 4 4 4 4 4 4 4
## [39] 4 4 4 4 4 4 4 3 4 4 3 3 3 1 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4
## [77] 4 4
##
## Within cluster sum of squares by cluster:
## [1] 0.000000 6.019937 3.270968 1.055662
## (between_SS / total_SS = 93.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(rh_cluster2,data=rhCluster_norm)
La gráfica anterior muestra 4 clusters que analizan la relación entre edad y días trabajados. El cluster verde muestra que un alto número de personas tabajaba más días que el promedio y tenía una edad similar al promedio. El punto naranja muestra que pocos usuarios trabajaban más días que el promedio y al igual que el punto anterior, tenían una edad promedio. En el caso del punto azul y el morado, ambos muestran que un mayor grupo de personas laboraba ‘2 días’, pero tenía mayor variabilidad en la edad.
humanos6<-humanos5
humanos6$Clusters<-rh_cluster2$cluster
summary(humanos6)
## EDAD DIAS.TRABAJADOS SALARIO.DIARIO.IMSS Clusters
## Min. : 0.00 Min. : 0.00 Min. :151.6 Min. :1.000
## 1st Qu.:22.25 1st Qu.: 9.00 1st Qu.:180.7 1st Qu.:3.000
## Median :30.00 Median : 19.00 Median :180.7 Median :4.000
## Mean :30.50 Mean : 45.10 Mean :174.3 Mean :3.423
## 3rd Qu.:36.00 3rd Qu.: 39.75 3rd Qu.:180.7 3rd Qu.:4.000
## Max. :52.00 Max. :730.00 Max. :183.7 Max. :4.000
lets create a dataset so we can identify some characteristics of “Edad” by cluster
humanos7<-humanos6 %>% group_by(Clusters) %>% summarise(EDAD=max(EDAD),DIAS.TRABAJADOS=mean(DIAS.TRABAJADOS)) %>% arrange(desc(EDAD))
summary(humanos7)
## Clusters EDAD DIAS.TRABAJADOS
## Min. :1.00 Min. :32.00 Min. : 14.98
## 1st Qu.:1.75 1st Qu.:41.75 1st Qu.: 56.07
## Median :2.50 Median :47.50 Median : 86.32
## Mean :2.50 Mean :44.75 Mean :229.41
## 3rd Qu.:3.25 3rd Qu.:50.50 3rd Qu.:259.66
## Max. :4.00 Max. :52.00 Max. :730.00
humanos6$Cluster_Names<-factor(humanos6$Clusters,levels = c(1,2,3,4),
labels=c("Joven", "Avanzado ", " Adulto", "Jubilado"))
summary(humanos6)
## EDAD DIAS.TRABAJADOS SALARIO.DIARIO.IMSS Clusters
## Min. : 0.00 Min. : 0.00 Min. :151.6 Min. :1.000
## 1st Qu.:22.25 1st Qu.: 9.00 1st Qu.:180.7 1st Qu.:3.000
## Median :30.00 Median : 19.00 Median :180.7 Median :4.000
## Mean :30.50 Mean : 45.10 Mean :174.3 Mean :3.423
## 3rd Qu.:36.00 3rd Qu.: 39.75 3rd Qu.:180.7 3rd Qu.:4.000
## Max. :52.00 Max. :730.00 Max. :183.7 Max. :4.000
## Cluster_Names
## Joven : 1
## Avanzado :17
## Adulto : 8
## Jubilado :52
##
##
Entre más joven más días trabajados
humanos8 <- humanos6%>% group_by(Cluster_Names) %>% summarize(EDAD=max(EDAD),
DIAS.TRABAJADOS =mean(DIAS.TRABAJADOS),
Count=n())
clusters2<-as.data.frame(humanos8)
clusters2
## Cluster_Names EDAD DIAS.TRABAJADOS Count
## 1 Joven 32 730.00000 1
## 2 Avanzado 50 69.76471 17
## 3 Adulto 45 102.87500 8
## 4 Jubilado 52 14.98077 52
ggplot(humanos8,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")
La gráfica anterior nos muestra la cantidad de días trabajados de acuerdo a la edad de los empleados. En este caso, vemos que el grupo de edad ‘joven’ tenían aprox. 31 años y representa un bajo porcentaje de los empleados. Para ‘avanzado’ son los empleados que tienen arriba de 32 años y laboraron la mayor cantidad de días (1067). Para ‘jubilado’, son las personas con un aprox. de 50 años y que laboraron durante 102 días. Finalmente, para el grupo de ‘adulto’ (el más elevado), son aquellos que laboraron un promedio de 44 días y tienen la edad de 52 años.
ggplot(humanos8, aes(x=Cluster_Names,y=DIAS.TRABAJADOS,fill= Cluster_Names,label=round(DIAS.TRABAJADOS,digits=2))) +
geom_col() +
geom_text()
La gráfica anterior nos muestra la cantidad de días trabajados de acuerdo a los días trabajados. En este caso, esto nos muestra que el grupo con mayor bajas fueron del segmento ‘adulto’ y es el que laboró en promedio un menor número de días contra ‘avanzado’ que es el segundo grupo más bajo y laboró el mayor número de días en promedio.
ggplot(humanos8,aes(x=Cluster_Names,y=EDAD,fill= Cluster_Names,label=round(EDAD,digits=2))) +
geom_col() +
geom_text()
La gráfica anterior nos muestra la edad promedio de cada uno de los grupos. Como explicamos anteriormente, se muestra que ‘adulto’ es el de empleados con mayor edad y ‘joven’ es el de personas de menor edad.
ggplot(humanos6, aes(x=Cluster_Names, y=EDAD, fill=Cluster_Names)) +
geom_boxplot()+
ggtitle("Dispersion of 'Edad' by Clusters Names")
La gráfica anterior nos muestra la dispersión de acuerdo a la edad de los empleados. En el caso de ‘adulto’, tiene una gran cantidad de puntos atípicos lo cual indica que hay datos fuera de serie. En el caso de ‘jubilado’, vemos que es el grupo con mayor dispersión, mostrando datos de edad entre 25 y 32 años.
ggplot(humanos6, aes(x=Cluster_Names, y=DIAS.TRABAJADOS, fill=Cluster_Names)) +
geom_boxplot()+
ggtitle("Dispersion of 'Dias_Trabajados' by Clusters Names")
La gráfica anterior muestra la dispersión de acuerdo a días trabajados y los grupos anterior explicados. Vemos que ‘avanzado’ es el gurpo con mayor dispersión, mostrando que el promedio de los empleados laboraron entre 550 y 1300 días. Es el grupo con mayor número de empleados que trabajaron en este periodo de tiempo. En el caso de ‘adulto’ y ‘jubilado’, son aquellos grupos que muestran una dispersión baja y una variedad de puntos atípicos, mientras que ‘joven’ destaca una baja dispersión y una media de más de 500 días trabajados.
cluster3<-read.csv("C:\\Users\\danyc\\Downloads\\HR_Bajas 2.csv")
summary(cluster3)
## NO.DE.BAJAS APELLIDOS NOMBRE FECHA.DE.NACIMIENTO
## Min. : 5.00 Length:78 Length:78 Min. :25585
## 1st Qu.: 49.75 Class :character Class :character 1st Qu.:31751
## Median :167.50 Mode :character Mode :character Median :33797
## Mean :139.60 Mean :33611
## 3rd Qu.:212.75 3rd Qu.:36519
## Max. :238.00 Max. :44632
## EDAD GENERO FECHA.DE.ALTA MOTIVO.DE.BAJA
## Min. : 0.00 Length:78 Min. :43961 Length:78
## 1st Qu.:22.25 Class :character 1st Qu.:44567 Class :character
## Median :30.00 Mode :character Median :44726 Mode :character
## Mean :30.50 Mean :44664
## 3rd Qu.:36.00 3rd Qu.:44759
## Max. :52.00 Max. :44790
## DIAS.TRABAJADOS BAJA PUESTO DEPARTAMENTO
## Min. : 0.00 Min. :44569 Length:78 Length:78
## 1st Qu.: 9.00 1st Qu.:44613 Class :character Class :character
## Median : 19.00 Median :44741 Mode :character Mode :character
## Mean : 45.10 Mean :44709
## 3rd Qu.: 39.75 3rd Qu.:44784
## Max. :730.00 Max. :44814
## NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
## Length:78 Min. :151.6 Min. : 0.0
## Class :character 1st Qu.:180.7 1st Qu.: 0.0
## Mode :character Median :180.7 Median : 0.0
## Mean :174.3 Mean : 130.4
## 3rd Qu.:180.7 3rd Qu.: 0.0
## Max. :183.7 Max. :2795.3
## NO.CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO CURP CALLE
## Min. :0.000e+00 Length:78 Length:78 Length:78
## 1st Qu.:0.000e+00 Class :character Class :character Class :character
## Median :0.000e+00 Mode :character Mode :character Mode :character
## Mean :1.871e+08
## 3rd Qu.:0.000e+00
## Max. :6.919e+09
## NUMERO.INTERNO COLONIA CODIGO.POSTAL MUNICIPIO
## Length:78 Length:78 Min. :25019 Length:78
## Class :character Class :character 1st Qu.:33604 Class :character
## Mode :character Mode :character Median :33604 Mode :character
## Mean :46508
## 3rd Qu.:66645
## Max. :67450
## ESTADO ESTADO.CIVIL TARJETA.CUENTA
## Length:78 Length:78 Length:78
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
str(cluster3)
## 'data.frame': 78 obs. of 26 variables:
## $ NO.DE.BAJAS : int 5 6 7 8 9 11 12 16 19 20 ...
## $ APELLIDOS : chr "BERNAL FLORES" "SAUCEDO GUZMAN" "MEZA LLANAS" "TORRES LARA" ...
## $ NOMBRE : chr "ERIKA ROSALINDA" "GUADALUPE" "YOANA CRISTINA" "CESAR ANTONIO" ...
## $ FECHA.DE.NACIMIENTO : int 33997 28106 34174 33491 26422 36970 32443 37872 37512 36915 ...
## $ EDAD : int 29 46 29 31 50 21 34 19 20 21 ...
## $ GENERO : chr "FEMENINO" "FEMENINO" "FEMENINO" "MASCULINO" ...
## $ FECHA.DE.ALTA : int 44518 44532 44532 44538 44551 44531 44532 44488 44541 44546 ...
## $ MOTIVO.DE.BAJA : chr "RENUNCIA VOLUNTARIA" "BAJA POR FALTAS" "BAJA POR FALTAS" "BAJA POR FALTAS" ...
## $ DIAS.TRABAJADOS : int 51 37 37 31 18 40 39 86 33 28 ...
## $ BAJA : int 44569 44569 44569 44569 44569 44571 44571 44574 44574 44574 ...
## $ PUESTO : chr "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ DEPARTAMENTO : chr "VARIOS" "VARIOS" "VARIOS" "VARIOS" ...
## $ NO.SEGURO.SOCIAL : chr "43109363747" "43937683647" "43099330201" "43099151714" ...
## $ SALARIO.DIARIO.IMSS : num 152 152 152 152 152 ...
## $ FACTOR.CRED.INFONAVIT: num 0 1320 0 0 0 ...
## $ NO.CREDITO.INFONAVIT : num 0.00 1.92e+09 0.00 0.00 0.00 ...
## $ LUGAR.DE.NACIMIENTO : chr "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
## $ CURP : chr "BEFE930128MNLRLR05" "SAGG761212MNLCZD08" "MELY930724MNLZLN01" "TOLC910910HNLRRS09" ...
## $ CALLE : chr "JULIAN VILLAGRAN" "PAPAGAYOS" "RIO AMANONAS" "PALMERA" ...
## $ NUMERO.INTERNO : chr "452" "220" "300" "104" ...
## $ COLONIA : chr "REFORMA" "GOLONDRINAS" "PUEBLO NUEVO" "MIRADOR DEL PARQUE" ...
## $ CODIGO.POSTAL : int 66640 66649 66646 67254 67114 66645 66646 66646 66645 66646 ...
## $ MUNICIPIO : chr "APODACA" "APODACA" "APODACA" "JUAREZ" ...
## $ ESTADO : chr "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" "NUEVO LEON" ...
## $ ESTADO.CIVIL : chr "SOLTERO/A" "SOLTERO/A" "UNION LIBRE" "UNION LIBRE" ...
## $ TARJETA.CUENTA : chr "BANORTE" "BANORTE" "BANORTE" "BANORTE" ...
newbd<-cluster3 %>% select(EDAD,SALARIO.DIARIO.IMSS)
summary(newbd)
## EDAD SALARIO.DIARIO.IMSS
## Min. : 0.00 Min. :151.6
## 1st Qu.:22.25 1st Qu.:180.7
## Median :30.00 Median :180.7
## Mean :30.50 Mean :174.3
## 3rd Qu.:36.00 3rd Qu.:180.7
## Max. :52.00 Max. :183.7
newbdnorm<-scale(newbd[2:1])
fviz_nbclust(newbdnorm, kmeans, method="wss")+ # wss method considers total within sum of square
geom_vline(xintercept=4, linetype=2)+ # optimal number of clusters is computed with the default method = "euclidean"
labs(subtitle = "Elbow method")
newbd2clus<-kmeans(newbdnorm,4)
newbd2clus
## K-means clustering with 4 clusters of sizes 12, 17, 26, 23
##
## Cluster means:
## SALARIO.DIARIO.IMSS EDAD
## 1 0.5317981 1.5586093
## 2 -1.8780410 -0.1112219
## 3 0.5184044 -0.8844567
## 4 0.5246350 0.2688407
##
## Clustering vector:
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 1 3 3 4 3 3 3 3 2 1 2 2 2 2 4 4 1 1 1 3 3 4 4 3 3 4
## [39] 1 3 3 4 1 3 1 4 4 3 4 4 4 4 4 4 4 3 3 1 3 3 3 4 4 3 4 4 4 1 3 4 1 4 1 3 3 3
## [77] 3 3
##
## Within cluster sum of squares by cluster:
## [1] 1.534968 15.627899 7.104697 1.698551
## (between_SS / total_SS = 83.1 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(newbd2clus,data=newbdnorm)
newbd3<-newbd
newbd3$Clusters<-newbd2clus$cluster
summary(newbd3)
## EDAD SALARIO.DIARIO.IMSS Clusters
## Min. : 0.00 Min. :151.6 Min. :1.000
## 1st Qu.:22.25 1st Qu.:180.7 1st Qu.:2.000
## Median :30.00 Median :180.7 Median :3.000
## Mean :30.50 Mean :174.3 Mean :2.769
## 3rd Qu.:36.00 3rd Qu.:180.7 3rd Qu.:4.000
## Max. :52.00 Max. :183.7 Max. :4.000
newbd4<-newbd3 %>% group_by(Clusters) %>% summarise(EDAD=max(EDAD),SALARIO.DIARIO.IMSS=mean(SALARIO.DIARIO.IMSS)) %>% arrange(desc(EDAD))
summary(newbd4)
## Clusters EDAD SALARIO.DIARIO.IMSS
## Min. :1.00 Min. :27.00 Min. :151.6
## 1st Qu.:1.75 1st Qu.:35.25 1st Qu.:173.4
## Median :2.50 Median :44.00 Median :180.6
## Mean :2.50 Mean :41.75 Mean :173.4
## 3rd Qu.:3.25 3rd Qu.:50.50 3rd Qu.:180.7
## Max. :4.00 Max. :52.00 Max. :180.8
newbd3$Cluster_Names<-factor(newbd3$Clusters,levels = c(1,2,3,4),
labels=c("Joven", "Avanzado ", " Adulto", "Jubilado"))
summary(newbd3)
## EDAD SALARIO.DIARIO.IMSS Clusters Cluster_Names
## Min. : 0.00 Min. :151.6 Min. :1.000 Joven :12
## 1st Qu.:22.25 1st Qu.:180.7 1st Qu.:2.000 Avanzado :17
## Median :30.00 Median :180.7 Median :3.000 Adulto :26
## Mean :30.50 Mean :174.3 Mean :2.769 Jubilado :23
## 3rd Qu.:36.00 3rd Qu.:180.7 3rd Qu.:4.000
## Max. :52.00 Max. :183.7 Max. :4.000
newbd5 <- newbd3%>% group_by(Cluster_Names) %>% summarize(EDAD=max(EDAD),
SALARIO.DIARIO.IMSS =mean(SALARIO.DIARIO.IMSS),
Count=n())
clusterssalario<-as.data.frame(newbd5)
clusterssalario
## Cluster_Names EDAD SALARIO.DIARIO.IMSS Count
## 1 Joven 52 180.7667 12
## 2 Avanzado 50 151.6100 17
## 3 Adulto 27 180.6046 26
## 4 Jubilado 38 180.6800 23
ggplot(newbd5,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")
ggplot(newbd5, aes(x=Cluster_Names,y=SALARIO.DIARIO.IMSS,fill= Cluster_Names,label=round(SALARIO.DIARIO.IMSS,digits=2))) +
geom_col() +
geom_text()
Aqui nos podemos dar cuenta acerca de que los sueldos no varian mucho entre edades pero es importante decir que se denota por centavos una mayoria en el sueldo de los jovenes especificamente más que en otros rangos de edades.
[ 1 ] El salario diario promedio de FORM es de $180 pesos mexicanos, es decir, $5,400 pesos mensuales. De acuerdo a datos compartidos por la INEGI, se prevé que para 2022 el salario mínimo en México sea de $5,255 pesos mensuales. Esto refleja que el salario mensual de FORM es 2% mayor al salario mínimo del país. [ 2 ] Se destacan tres razones principales de bajas de empleados: bajas por faltas, renuncia voluntaria o término de contrato. En su mayoría, hubo una baja por faltas del puesto de ayudante general y renuncia voluntaria para el mismo puesto. [ 3 ] Hubo un alto número de bajas de empleados que trabajaron más de 200 días, es decir, la mayoría de los ex-empleados estuvieron en FORM más de 1 año y tenían un salario promedio de $180 pesos. [ 4 ] Los sueldos de los empleados no varían mucho dependiendo de la edad. Sin embargo, vemos que hay mayor rotación para el grupo ‘adulto’
Zhu, A. (2022, 12 agosto). K-Means Clustering Explained Simply - Towards Data Science. Medium. Recuperado 10 de octubre de 2022, de https://towardsdatascience.com/explain-ml-in-a-simple-way-k-means-clustering-e925d019743b
Gulzar, M. (2022, 6 enero). K-Means Clustering: Concepts and Implementation in R for Data Science. Medium. Recuperado 10 de octubre de 2022, de https://towardsdatascience.com/k-means-clustering-concepts-and-implementation-in-r-for-data-science-32cae6a3ceba
Gulzar, M. (2022b, enero 6). K-Means Clustering: Concepts and Implementation in R for Data Science. Medium. Recuperado 10 de octubre de 2022, de https://towardsdatascience.com/k-means-clustering-concepts-and-implementation-in-r-for-data-science-32cae6a3ceba