1. K - means Clustering
K-means es un método de agrupamiento, que tiene como objetivo la
partición de un conjunto de observaciones en k grupos en el que cada
observación pertenece al grupo cuyo valor medio es más cercano. De esta
manera es que se puede analizar cada Cluster, obteniendo información
importante de cada variable y las similitudes entre ellas. Un claro
ejemplo de cómo funciona es usar clustering para comprimir imágenes con
pérdida de información y/o comprender qué hace a los clientes diferentes
para poder ofrecerles los productos y servicios que necesiten.
2. Unsupervised Learning
El “Unsupervised Learning” utiliza algoritmos de aprendizaje automático
para analizar y agrupar conjuntos de datos sin etiquetar. Estos
algoritmos descubren patrones ocultos o agrupaciones de datos sin
necesidad de intervención humana. No se asignan etiquetas al algoritmo
de aprendizaje, dejándolo solo para encontrar la estructura en su
entrada. El Unsupervised Learning puede ser un objetivo en sí mismo
(descubrir patrones ocultos en los datos) o un medio para lograr un fin
(aprendizaje de funciones).
3. Distancia Euclidiana / Euclidean Distance
La distancia euclidiana se define como la distancia entre dos puntos. La
distancia euclidiana entre dos puntos en el espacio euclidiano se define
como la longitud del segmento de línea entre dos puntos. La herramienta
Distancia euclidiana se utiliza con frecuencia como una herramienta
independiente para aplicaciones, como encontrar el hospital más cercano
para un vuelo de emergencia en helicóptero. Alternativamente, esta
herramienta se puede usar al crear un mapa de idoneidad, cuando se
necesitan datos que representan la distancia desde un objeto
determinado.
Descargar librerías
library(foreign)
library(dplyr) # data manipulation
library(ggplot2) # data visualization
#install.packages("psych")
library(psych) # functions for multivariate analysis
library(corrplot) # correlation plots
library(jtools) # presentation of regression analysis
library(lmtest) # diagnostic checks - linear regression analysis
library(car) # diagnostic checks - linear regression analysis
library(factoextra) # provides functions to extract and visualize the output of exploratory multivariate data analyses
#install.packages("ggfortify")
library(ggfortify) # data visualization tools for statistical analysis resultsSe importa la base de datos de BAJAS ya limpia.
#file.choose()
bajas<-read.csv("/Users/elenavela/bajas_final.csv")
summary(bajas)## nombre edad genero alta
## Length:233 Min. :18.00 Length:233 Length:233
## Class :character 1st Qu.:23.00 Class :character Class :character
## Mode :character Median :29.00 Mode :character Mode :character
## Mean :30.77
## 3rd Qu.:37.00
## Max. :61.00
## motivo_baja duracion puesto salario_diario
## Length:233 Min. : 0.00 Length:233 Min. :144.4
## Class :character 1st Qu.: 9.00 Class :character 1st Qu.:180.7
## Mode :character Median : 20.50 Mode :character Median :180.7
## Mean : 75.59 Mean :177.9
## 3rd Qu.: 47.00 3rd Qu.:180.7
## Max. :1966.00 Max. :500.0
## estado e.civil.
## Length:233 Length:233
## Class :character Class :character
## Mode :character Mode :character
##
##
##
¿Cuántos NA tengo por variables?
sapply(bajas,function(x) sum(is.na(x)))## nombre edad genero alta motivo_baja
## 0 0 0 0 0
## duracion puesto salario_diario estado e.civil.
## 0 0 0 0 0
bajas_new<-bajas
bajas_new<-subset(bajas_new,select = -c(genero,alta,motivo_baja,puesto,estado,nombre))
summary(bajas_new)## edad duracion salario_diario e.civil.
## Min. :18.00 Min. : 0.00 Min. :144.4 Length:233
## 1st Qu.:23.00 1st Qu.: 9.00 1st Qu.:180.7 Class :character
## Median :29.00 Median : 20.50 Median :180.7 Mode :character
## Mean :30.77 Mean : 75.59 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.: 47.00 3rd Qu.:180.7
## Max. :61.00 Max. :1966.00 Max. :500.0
Se toman en cuenta la edad y la duración dentro de la empresa.
bajas_edaddur_norm<-scale(bajas_new[1:2]) fviz_nbclust(bajas_edaddur_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
Se toman en cuenta, primeramente, solo 4 clusters.
edad_cluster1<-kmeans(bajas_edaddur_norm,4)
edad_cluster1## K-means clustering with 4 clusters of sizes 44, 4, 77, 108
##
## Cluster means:
## edad duracion
## 1 1.6018961 -0.08724706
## 2 1.0813717 6.65505218
## 3 0.2101465 -0.10444505
## 4 -0.8425018 -0.13647287
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 3 3 4 4 3 1 3 3 1 4 4 3 4 3 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
## 3 2 4 3 1 4 3 4 4 4 3 4 4 4 3 4 4 3 3 4
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 4 3 4 4 4 4 4 4 1 1 1 2 4 1 4 4 1 4 4 4
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 4 4 3 4 4 1 4 1 4 4 4 4 3 4 3 4 3 4 4 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 2 3 1 4 4 4 1 4 4 4 3 1 1 4 4 3 1 3 4 3
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 4 4 1 3 4 4 3 2 3 4 3 3 4 3 3 3 1 1 1 4
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 4 4 4 4 3 4 3 1 4 3 4 1 4 3 4 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 4 3 3 3 4 4 4 3 1 1 4 3 4 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 4 4 3 4 4 1 3 1 4 1 3 3 1 3 3 4
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 4 4 3 1 3 3 4 4 3 3 3 3 3 3 4 3 3 3 3 4
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 3 1 3 4 4 4 1 4 4 4 3 3 4 4 3 3 3 1 4 4
## 221 222 223 224 225 226 227 228 229 230 231 232 233
## 3 4 4 4 3 1 3 1 4 4 4 4 4
##
## Within cluster sum of squares by cluster:
## [1] 20.68423 15.74846 31.40781 18.16981
## (between_SS / total_SS = 81.5 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(edad_cluster1,data=bajas_edaddur_norm)Al observar vemos cuatro clusters que toman en cuenta la edad y la
duración:
1. El rojo (será llamado “Senior”) es un cluster que observamos que son
personas de edad mediana-alta y que durán relativamente poco tiempo,
entran dentro del 25% con menor duración.
2. El verde (“Expert”) es el cluster que más se aparta de los demás; son
personas con un mayor rango de edad pero que se alejan de los más
jóvenes, y que han durado mucho má tiempo. Se encuentran en el 50%
superior del tiempo de duración.
3. El azul (“junior”) resulta el cluster intermedio de los de menor
duración. Son personas en un rango de edad medio que también son parte
del 25% inferior que más han durado.
4. El morado (“beginner”) es el segmento más joven y que de las personas
(en general) menos han durado. Se puede considerar que los jóvenes son
los que menos duran en Form a partir de este cluster.
bajas_new2<-bajas_new
bajas_new2$Clusters<-edad_cluster1$cluster
bajas_new3<-bajas_new2 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))
bajas_new2$Cluster_Names<-factor(bajas_new2$Clusters,levels = c(1,2,3,4),
labels=c("Senior", "Expert", "Junior", "Beginner"))bajas_new4 <- bajas_new2 %>% group_by(Cluster_Names) %>% summarize(edad_años=max(edad),
duracion=mean(duracion),
Count=n())clusters<-as.data.frame(bajas_new4)
clusters## Cluster_Names edad_años duracion Count
## 1 Senior 57 56.78409 44
## 2 Expert 61 1509.75000 4
## 3 Junior 39 53.07792 77
## 4 Beginner 27 46.17593 108
A partir de la tabla, observamos las edades máximas encontradas en cada clúster. Conocemos que la persona con mayor edad en los expert tiene 61, en senior tiene 57, en junior tiene 39 y en beginnner 27.
Igualmente, vemos la duración máxima que ha durado alguien de cada cluster, comparamos el máximo del mayor, expert, que han sido más de 1,500 días, con el máximo del menor, beginner, que han sido 46 días.
ggplot(bajas_new4,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")Existe una mayor cantidad de “beginners”.
ggplot(bajas_new4, aes(x=Cluster_Names,y=edad_años,fill= Cluster_Names,label=round(edad_años,digits=2))) +
geom_col() +
geom_text()Comparamos la edad máxima en cada clúster (descrito anteriormente).
ggplot(bajas_new4,aes(x=Cluster_Names,y=duracion,fill= Cluster_Names,label=round(duracion,digits=2))) +
geom_col() +
geom_text()Comparamos los días máximos en cada clúster (descrito anteriormente).
Debido a quee una gráfica anterior indicaba la posibilidad de tener otro clúster que describa a otro grupo, hacemos lo mismo con 5 segmentos, en vez de 4.
bajas_edaddur_norm2<-scale(bajas_new[1:2]) fviz_nbclust(bajas_edaddur_norm2, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method") edad_cluster2<-kmeans(bajas_edaddur_norm,5)
edad_cluster2## K-means clustering with 5 clusters of sizes 42, 4, 71, 8, 108
##
## Cluster means:
## edad duracion
## 1 1.5984349 -0.1859579
## 2 1.0813717 6.6550522
## 3 0.2360562 -0.2410113
## 4 0.2818274 1.9125942
## 5 -0.8377255 -0.1573975
##
## 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 3 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 3 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 3 1 3 1 5 5 5 5 5
##
## Within cluster sum of squares by cluster:
## [1] 10.710205 15.748462 8.791395 7.972209 13.731016
## (between_SS / total_SS = 87.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(edad_cluster2,data=bajas_edaddur_norm2)Comparando esta gráfica de 5 segmentos contra la anteriormente vista
de 4. En esta observamos que separa un segmento que deja un “espacio”
que antes no existía; separa y crea un segmento que han durado aprox un
10% más de tieempo que las tres menores, y que se encuentra en rangos de
edad parecidos. A continuación se comparan los clusters:
1. El rojo (llamado “Senior”): es el nuevo, el cual tiene de baja a
mediana duración y un rango de edad mediana. Después de los que han
durado mucho, ellos van después.
El verde superior (llamado “Expert”): es el cluster que más se aparta de los demás; son personas con un mayor rango de edad pero que se alejan de los más jóvenes, y que han durado mucho má tiempo. Se encuentran en el 50% superior del tiempo de duración.
El verde inferior (llamado “Junior”) son personas adultas que han durado poco tiempo en la empresa, parte del 17% inferior de duración.
El morado (llamado “Middle”): al hacer el nuevo clúster nos damos cuenta de que existe un grupo de personas de mediana edad que duran muy poco, aún más poco que los jóvenes. Investigar estado civil.
El azul (llamado “Beginner”): son las personas más jóvenes y que también han durado poco tiempo. Se quedan aproximadamente por el 10% inferior.
bajas_new6<-bajas_new
bajas_new6$Clusters<-edad_cluster2$cluster
bajas_new7<-bajas_new6 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))
bajas_new6$Cluster_Names<-factor(bajas_new6$Clusters,levels = c(1,2,3,4,5),
labels=c("Senior", "Expert", "Junior", "Middle","Beginner"))Al analizar el estado civil de los 5 clústers, llegamos a las
siguientes conclusiones:
1. Del segmento “Senior”, el 75% son solteros. Este es el nuevo clúster
descubierto.
2. El 55% de las personas en el cluster “Middle” (menor duración) son
solteras, el 26% viven en unión libre, y un 19% que viven en
matrimonio.
3. De los expertos, el 75% son solteros.
Importar base de datos
rh_bajas <-read.csv("/Users/elenavela/bajas_final.csv") ¿Cuántos NA tengo por variables?
sapply(rh_bajas,function(x) sum(is.na(x)))## nombre edad genero alta motivo_baja
## 0 0 0 0 0
## duracion puesto salario_diario estado e.civil.
## 0 0 0 0 0
Base de datos con valores CUANTITATIVOS
rh_bajas2<-rh_bajas
rh_bajas2<-subset(rh_bajas2,select = -c(genero,alta,motivo_baja,puesto,estado,nombre))
summary(rh_bajas2)## edad duracion salario_diario e.civil.
## Min. :18.00 Min. : 0.00 Min. :144.4 Length:233
## 1st Qu.:23.00 1st Qu.: 9.00 1st Qu.:180.7 Class :character
## Median :29.00 Median : 20.50 Median :180.7 Mode :character
## Mean :30.77 Mean : 75.59 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.: 47.00 3rd Qu.:180.7
## Max. :61.00 Max. :1966.00 Max. :500.0
Normalizando las variables
bajas_duracion_norm<-scale(rh_bajas2[2:3]) Elbow Plot
fviz_nbclust(bajas_duracion_norm, kmeans, method="wss")+
geom_vline(xintercept=5, linetype=2)+
labs(subtitle = "Elbow method") Visualización información de clusters
duracion_cluster1<-kmeans(bajas_duracion_norm,5)
duracion_cluster1## K-means clustering with 5 clusters of sizes 191, 10, 4, 27, 1
##
## Cluster means:
## duracion salario_diario
## 1 -0.23462767 0.1147221
## 2 1.49983327 -0.3729089
## 3 6.65505218 -0.3962566
## 4 0.02340506 -1.1243505
## 5 2.56340604 13.7596523
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 5 4 4 4 4 4 4 4 4 2 4 4 1 1 2 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 3 4 4 1 1 1 1 1 1 1 1 1 1 1 1 4 2 1 1
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 2 2 1 1 1 1 1 1 1 1 1 3 2 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 2 2 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
## 3 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 4 4 1 1
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 1 1 1 1 1 1 1 3 1 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 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 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 1 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1
## 221 222 223 224 225 226 227 228 229 230 231 232 233
## 1 1 1 1 1 1 1 1 1 1 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 3.281687 6.437305 7.884909 1.648877 0.000000
## (between_SS / total_SS = 95.9 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Visualización clustering resultados
fviz_cluster(duracion_cluster1,data=bajas_duracion_norm)Al observar vemos 5 clusters que toman en cuenta la duración y el salario:
Primero vemos nuestro cluster 1 (será llamado “Rehenes”) es un cluster que observamos que son personas que solo entran y salen muy pronto de la empresa (141 días) y tienen un salario diario que es arriba del promedio, alrededor de $180 pesos.
El cluster 2 (“Duraderos”) son los colaboradores que tienen una duración regular, pero que aun así no se encuentran satisfechos por lo que se salen de la empresa al rededor después de 1 año y medio (646 días) y su salario es de $169.
Como cluster 3 tenemos a los colaboradores que son leales a la empresa (“Fieles”) es el segmento donde ya tienen más de 4-5 años trabajando y cuentan con un salario de $168 pesos.
El cluster 4 (“Costosos”) es el cluster que nos cuesta a la empresa porque se invierte en capacitaciones para ellos y terminan saliendo de la empresa; son personas con un poco mas de duración pero no la suficiente (197 días) y su salario es de $151 por debajo promedio.
Por último tenemos el cluster 5 (“Extra”) que tuvo duración corto plazo con un salario muy alto ($500 pesos).
Nombrar a los clusters
rh_bajas3<-rh_bajas2
rh_bajas3$Clusters<-duracion_cluster1$cluster
rh_bajas4<-rh_bajas3 %>% group_by(Clusters) %>% summarise(duracion=max(duracion)) %>% arrange(desc(duracion))
rh_bajas3$Cluster_Names<-factor(rh_bajas3$Clusters,levels = c(1,2,3,4,5),
labels=c("Rehenes", "Duraderos","Fieles", "Costosos","Extra"))Engrupar los clusters por nombre de clusters y resumir columnas
rh_bajas5<- rh_bajas3 %>% group_by(Cluster_Names) %>% summarize(duracion_dias=max(duracion),
salario_diario=mean(salario_diario),
Count=n())Formato tabla para información de los clusters
clusters<-as.data.frame(rh_bajas5)
clusters## Cluster_Names duracion_dias salario_diario Count
## 1 Rehenes 141 180.6130 191
## 2 Duraderos 646 169.1990 10
## 3 Fieles 1966 168.6525 4
## 4 Costosos 197 151.6100 27
## 5 Extra 628 500.0000 1
Gráfica con el numero de observaciones por nombres de clusters
ggplot(rh_bajas5,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")ggplot(rh_bajas5, aes(x=Cluster_Names,y=duracion_dias,fill= Cluster_Names,label=round(duracion_dias,digits=2))) +
geom_col() +
geom_text()ggplot(rh_bajas5,aes(x=Cluster_Names,y=salario_diario,fill= Cluster_Names,label=round(salario_diario,digits=2))) +
geom_col() +
geom_text()Estás ultimas gráficas nos muestran lo que se describió anteriorimente sobre que duración y salario tiene cada cluster y para concluir se mostrara cuantos colaboradores tiene cada cluster:
Total 233 * “Rehenes” tiene el segmento con más colaboradores y tiene un total de 191. En porcentaje se puede decir que es el 81.97% total de bajas.
“Costosos” esta en segundo lugar teniendo 27 colaboradores (11.57%).
“Duraderos” tercer lugar con un total de 10 colaboradores (4.29%).
“Fieles” cuarto lugar con 4 colaboradores (1.71%).
Por último esta el “Extra” que fue solo un colaborador que se encuentra fuera de lo normal (0.43%).
Importar base de datos
bdr <-read.csv("/Users/elenavela/bajas_final.csv") Analizar la estructura de la base de datos
str(bdr) ## 'data.frame': 233 obs. of 10 variables:
## $ nombre : chr "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
## $ edad : int 32 36 23 21 29 46 29 31 50 19 ...
## $ genero : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ alta : chr "09/03/20" "09/11/21" "10/11/21" "10/11/21" ...
## $ motivo_baja : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ duracion : num 628 60 59 59 51 37 37 31 18 224 ...
## $ puesto : chr "DISENO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ salario_diario: num 500 152 152 152 152 ...
## $ estado : chr "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
## $ e.civil. : chr "Soltero" "Union libre" "Matrimonio" "Soltero" ...
Cuantos Na´s hay por variable
sapply(bdr,function(x) sum(is.na(x)))## nombre edad genero alta motivo_baja
## 0 0 0 0 0
## duracion puesto salario_diario estado e.civil.
## 0 0 0 0 0
Dejamos únicamente las variables cuantitativas
bdr2 <- bdr
bdr2<-subset(bdr2,select = -c(genero,alta,motivo_baja,puesto,estado,nombre,duracion))
summary(bdr2)## edad salario_diario e.civil.
## Min. :18.00 Min. :144.4 Length:233
## 1st Qu.:23.00 1st Qu.:180.7 Class :character
## Median :29.00 Median :180.7 Mode :character
## Mean :30.77 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.:180.7
## Max. :61.00 Max. :500.0
Normalización de variables
bdr3 <- scale(bdr2[1:2]) Elbow plot
fviz_nbclust(bdr3, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method") Visualización de clusters
bdr4<-kmeans(bdr3,4)
bdr4## K-means clustering with 4 clusters of sizes 1, 38, 76, 118
##
## Cluster means:
## edad salario_diario
## 1 0.1270769 13.759652253
## 2 1.7696042 -0.090629543
## 3 0.3483430 -0.003448058
## 4 -0.7953060 -0.085200655
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 3 4 4 4 2 4 3 2 4 4 3 4 3 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
## 3 2 4 3 2 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 4 3 4 4 4 4 4 4 2 2 3 2 4 2 4 4 2 4 4 4
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 4 4 3 4 4 3 4 2 4 4 4 4 3 4 3 4 3 4 4 2
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 4 4 2 4 4 4 3 4 4 4 3 3 2 4 4 4 2 3 4 3
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 4 4 3 3 4 4 3 4 3 4 3 3 4 3 3 3 2 2 2 4
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 4 4 4 4 3 4 3 2 4 3 4 2 4 4 4 3 2 3 2 3
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 3 3 2 2 4 3 3 3 4 4 4 3 2 2 4 3 4 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 3 2 4 4 3 4 4 2 3 2 4 2 3 3 2 3 3 4
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 4 4 3 2 3 3 4 4 3 3 3 3 3 3 4 3 4 3 3 4
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 3 2 3 4 4 4 2 4 4 4 3 3 4 4 3 3 3 2 4 4
## 221 222 223 224 225 226 227 228 229 230 231 232 233
## 3 4 4 4 4 2 3 2 4 4 4 4 4
##
## Within cluster sum of squares by cluster:
## [1] 0.00000 14.98451 20.97488 34.67145
## (between_SS / total_SS = 84.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(bdr4,data=bdr3)Vemos que el número óptimo de klusters para las variables edad y salario diario son 4 según el método de Elbow.
Como dato disparado y posible warning vemos que hay un trabajador con un salario diario de 500 pesos lo que podría resultar como un error, sin embargo los otros 3 grupos varían bastante en edad más no en salario pues el rango es muy cercano.
Alto El dato es único en el conteo con un trabajador de 32 años que tiene un salario diario de 500 pesos y es soltero. Su punto en el mapeo es único (color rojo).
Verde Es el cluster con el registro de personas con mayor edad y cuentan con el salario diario más alto 183.68.
Azul Es el cluster con el registro de personas con edad promedio y salario de 180.68.
Morado Es el cluster con mayor registro de personas con edad jóven y salario de 182.68.
Nombrar a los clusters
bdr5<-bdr2
bdr5$Cluster <- bdr4$cluster
bdr6<-bdr5 %>% group_by(Cluster) %>% summarize(salario_diario=max(salario_diario)) %>% arrange(desc(salario_diario))
bdr5$Cluster_Names<-factor(bdr5$Cluster,levels = c(1,2,3,4),
labels=c("Alto", "Medio","Bajo", "Regular"))Agrupar clusters
bdr7<- bdr5 %>% group_by(Cluster_Names) %>% summarize(salario_diario=max(salario_diario),
edad=mean(edad),
Count=n())Tabla
clusters<-as.data.frame(bdr7)
clusters## Cluster_Names salario_diario edad Count
## 1 Alto 500.00 32.00000 1
## 2 Medio 183.68 47.92105 38
## 3 Bajo 180.68 34.14474 76
## 4 Regular 182.68 23.05932 118
Gráficas
ggplot(bdr7,aes(x= reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")ggplot(bdr7, aes(x=Cluster_Names,y=edad,fill= Cluster_Names,label=round(edad,digits=2))) +
geom_col() +
geom_text()ggplot(bdr7,aes(x=Cluster_Names,y=salario_diario,fill= Cluster_Names,label=round(salario_diario,digits=2))) +
geom_col() +
geom_text()En la segunda gráfica el clúster azul es el que tiene mayor frecuencia con un promedio de edad de 48 años.
El cluster alto en la segunda grafica englobó en 22 años el count, sin embargo hay trabajadores con menor edad. Dicho cluster es el que tiene menos trabajadores dentro de Form.
En cuanto al salario en la tercera gráfica, el dato más alto es el que anteriormente se había mencionado como un dato único ($500) y vemos el comportamiento que se generaba en el mapeo de clusters donde los demás tienen una diferencia mínima siendo los resultados 182.68, 180.68 y 183.68.