1.Instalar Paquetes

library(readr)
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(cluster)
rm(list = ls())
getwd()
## [1] "C:/Users/luisa/Documents/POWER BI"

2.Cargar el conjunto de datos

# 1. Cargar el conjunto de datos
datos <- read.csv("C:\\Users\\luisa\\Documents\\R LUISA\\MODULO 5\\EncuestasForm_BaseLimpia.csv")
View(datos)

3.Seleccionar solo las variables numéricas

datos_numericos <- datos[sapply(datos, is.numeric)]
View(datos_numericos)

4.Escalar las variables numéricas

datos_escalados <- scale(datos_numericos)
View(datos_escalados)

5.Calcular las medianas de las variables numéricas escaladas

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

6.clusters que deseas

k <- 3 # Cambia este valor por el número de clusters que deseas
indices_centroides_iniciales <- sample(1:nrow(datos_escalados), k)
centroides_iniciales <- datos_escalados[indices_centroides_iniciales, ]

6.clusters que deseas

# Ejecutar k-means con los centroides iniciales
resultado_kmeans <- kmeans(datos_escalados, centers = centroides_iniciales)

print(resultado_kmeans)
## K-means clustering with 3 clusters of sizes 65, 16, 25
## 
## Cluster means:
##    Antiguedad    Salario Prestaciones Jornada_Laboral Herramientas Temperatura
## 1  0.04581365  0.3626082    0.4480907       0.4960589    0.4534784  0.08958709
## 2 -0.25138960 -1.2012483   -0.9008792      -0.1771124   -1.4441653  0.14653768
## 3  0.04177386 -0.1739824   -0.5884731      -1.1764012   -0.2547780 -0.32671056
##       Estrés Transporte Instalaciones    Rotación Dependientes
## 1  0.1524490  0.3710519     0.3370262  0.36734886  0.006750785
## 2 -0.9779247 -0.2133885    -1.1244849 -1.39741185  0.207570080
## 3  0.2295043 -0.8281663    -0.1565978 -0.06076345 -0.150396891
## 
## Clustering vector:
##   [1] 1 1 2 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 2 2 1 3 3 3 1 3 1 3 1 1 1 2 2 1 1 3 2
##  [38] 2 2 1 1 1 3 1 1 1 2 1 2 1 3 1 1 1 1 2 1 1 1 1 1 3 1 1 3 3 3 1 3 2 1 1 1 3
##  [75] 2 2 2 3 2 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 3 3 3 3 1 1 1 1 3 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 432.3773 186.5323 250.2797
##  (between_SS / total_SS =  24.7 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

7.Ajustar el modelo k-means para diferentes valores de k

set.seed(123) # Para reproducibilidad
wcss <- vector() # Inicializar vector para almacenar los valores de WCSS
max_k <- 10 # Puedes cambiar esto para probar con más clústeres si lo deseas
for (k in 1:max_k) {
  kmeans_model <- kmeans(datos_escalados, centers = k, nstart = 25)
  wcss[k] <- kmeans_model$tot.withinss
}

8.Gráficar el método de codo

par(mar = c(4, 4, 1, 1)) # Los números representan los márgenes inferior, izquierdo, superior y derecho respectivamente.
plot(1:max_k, wcss, type = "b", xlab = "Numero de Clusters", ylab = "WCSS", main = "Metodo del Codo", pch = 19, frame = FALSE)

# Establecer una semilla para la reproducibilidad
set.seed(178)

9.Realizar K-means con 4 clusters

kmeans_result <- kmeans(datos_escalados, centers = 4)
kmeans_result$centers
##   Antiguedad    Salario Prestaciones Jornada_Laboral Herramientas Temperatura
## 1 -0.1185418 -0.1440439   -0.3823495       0.1268462   -0.7164270 -0.09444148
## 2 -0.6944592  0.4815947    0.3192635       0.4023294    0.5718499 -0.17543788
## 3  1.3192318  0.2800853    0.6557833       0.2367746    0.6129511  0.46106872
## 4 -0.0896727 -1.2168413   -1.0350742      -1.3635885   -1.0612389 -0.10347417
##         Estrés Transporte Instalaciones   Rotación Dependientes
## 1 -0.915317228  0.4444735    -0.1565978 -0.1545633   0.03200666
## 2  0.596434303 -0.1252232     0.4587532  0.1709303  -0.14759068
## 3 -0.009000169  0.3251635     0.3249584  0.6218913   0.22657045
## 4 -0.009000169 -0.7795586    -1.2097463 -0.9848660  -0.02676782

10.Añadir la columna de clusters al dataframe original

datos1 <- datos
datos1$Cluster <- kmeans_result$cluster

11.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Genero)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##     Femenino Masculino
##   1 64.00000  36.00000
##   2 71.79487  28.20513
##   3 62.50000  37.50000
##   4 55.55556  44.44444

12.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Escolaridad)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##     Licenciatura      Otro Preparatoria  Primaria Secundaria
##   1    28.000000  4.000000    20.000000  4.000000  44.000000
##   2    23.076923  0.000000    25.641026  7.692308  43.589744
##   3    25.000000  8.333333    16.666667 12.500000  37.500000
##   4    11.111111  0.000000    44.444444 11.111111  33.333333

13.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Municipio)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##       Apodaca Guadalupe    Juárez Monterrey      Otro Pesquería
##   1 92.000000  4.000000  4.000000  0.000000  0.000000  0.000000
##   2 69.230769  2.564103 17.948718  2.564103  2.564103  5.128205
##   3 62.500000  8.333333  4.166667  8.333333 12.500000  4.166667
##   4 66.666667  0.000000 16.666667  0.000000 11.111111  5.555556

14.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Estado.Civil)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##        Casado Divorciado   Soltero Unión libre
##   1 28.000000   0.000000 56.000000   16.000000
##   2 23.076923   2.564103 48.717949   25.641026
##   3 45.833333   0.000000 33.333333   20.833333
##   4 61.111111   0.000000 33.333333    5.555556

15.Tabla de contingencia

contingency <- table(datos1$Cluster, datos$Puesto)

# Convertir la tabla de contingencia a porcentajes
contingency <- prop.table(contingency, margin = 1) * 100

# Mostrar la tabla de contingencia
print(contingency)
##    
##     Administrativo Ayudante general Costurera  Limpieza Mantenimiento      Otro
##   1      24.000000        28.000000 12.000000  0.000000      0.000000 28.000000
##   2      12.820513        71.794872  0.000000  0.000000      0.000000 15.384615
##   3      16.666667        12.500000 12.500000  4.166667      0.000000 33.333333
##   4      11.111111        44.444444  5.555556  5.555556      5.555556 22.222222
##    
##      Soldador Supervisor
##   1  4.000000   4.000000
##   2  0.000000   0.000000
##   3  0.000000  20.833333
##   4  5.555556   0.000000
LS0tDQp0aXRsZTogIlBFUkZJTEFETyBERSBEQVRPUyBGT1JNIg0KYXV0aG9yOiAiTHVpc2EgQmVsdHLDoW4gQTAxNTcwNjkwIg0KZGF0ZTogIjIwMjMtMTAtMTIiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiAieWV0aSINCiAgICBoaWdobGlnaHQ6ICJ0YW5nbyINCi0tLQ0KPHNwYW4gc3R5bGUgPSJjb2xvcjpibHVlOyI+KioxLkluc3RhbGFyIFBhcXVldGVzKio8L3NwYW4+DQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KCJkcGx5ciIpDQpsaWJyYXJ5KGNsdXN0ZXIpDQpgYGANCg0KYGBge3J9DQpybShsaXN0ID0gbHMoKSkNCmdldHdkKCkNCmBgYA0KDQo8c3BhbiBzdHlsZSA9ImNvbG9yOmJsdWU7Ij4qKjIuQ2FyZ2FyIGVsIGNvbmp1bnRvIGRlIGRhdG9zKio8L3NwYW4+DQpgYGB7cn0NCiMgMS4gQ2FyZ2FyIGVsIGNvbmp1bnRvIGRlIGRhdG9zDQpkYXRvcyA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxsdWlzYVxcRG9jdW1lbnRzXFxSIExVSVNBXFxNT0RVTE8gNVxcRW5jdWVzdGFzRm9ybV9CYXNlTGltcGlhLmNzdiIpDQpWaWV3KGRhdG9zKQ0KYGBgDQoNCjxzcGFuIHN0eWxlID0iY29sb3I6Ymx1ZTsiPioqMy5TZWxlY2Npb25hciBzb2xvIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyoqPC9zcGFuPg0KYGBge3J9DQpkYXRvc19udW1lcmljb3MgPC0gZGF0b3Nbc2FwcGx5KGRhdG9zLCBpcy5udW1lcmljKV0NClZpZXcoZGF0b3NfbnVtZXJpY29zKQ0KYGBgDQoNCg0KPHNwYW4gc3R5bGUgPSJjb2xvcjpibHVlOyI+Kio0LkVzY2FsYXIgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzKio8L3NwYW4+DQpgYGB7cn0NCmRhdG9zX2VzY2FsYWRvcyA8LSBzY2FsZShkYXRvc19udW1lcmljb3MpDQpWaWV3KGRhdG9zX2VzY2FsYWRvcykNCmBgYA0KDQoNCjxzcGFuIHN0eWxlID0iY29sb3I6Ymx1ZTsiPioqNS5DYWxjdWxhciBsYXMgbWVkaWFuYXMgZGUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIGVzY2FsYWRhcyoqPC9zcGFuPg0KYGBge3J9DQptZWRpYSA8LSBhcHBseShkYXRvc19lc2NhbGFkb3MsIDIsIG1lYW4pDQpWaWV3KG1lZGlhKQ0KYGBgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKSAjIFBhcmEgcmVwcm9kdWNpYmlsaWRhZA0KYGBgDQoNCjxzcGFuIHN0eWxlID0iY29sb3I6Ymx1ZTsiPioqNi5jbHVzdGVycyBxdWUgZGVzZWFzKio8L3NwYW4+DQpgYGB7cn0NCmsgPC0gMyAjIENhbWJpYSBlc3RlIHZhbG9yIHBvciBlbCBuw7ptZXJvIGRlIGNsdXN0ZXJzIHF1ZSBkZXNlYXMNCmluZGljZXNfY2VudHJvaWRlc19pbmljaWFsZXMgPC0gc2FtcGxlKDE6bnJvdyhkYXRvc19lc2NhbGFkb3MpLCBrKQ0KY2VudHJvaWRlc19pbmljaWFsZXMgPC0gZGF0b3NfZXNjYWxhZG9zW2luZGljZXNfY2VudHJvaWRlc19pbmljaWFsZXMsIF0NCmBgYA0KDQo8c3BhbiBzdHlsZSA9ImNvbG9yOmJsdWU7Ij4qKjYuY2x1c3RlcnMgcXVlIGRlc2VhcyoqPC9zcGFuPg0KYGBge3J9DQojIEVqZWN1dGFyIGstbWVhbnMgY29uIGxvcyBjZW50cm9pZGVzIGluaWNpYWxlcw0KcmVzdWx0YWRvX2ttZWFucyA8LSBrbWVhbnMoZGF0b3NfZXNjYWxhZG9zLCBjZW50ZXJzID0gY2VudHJvaWRlc19pbmljaWFsZXMpDQoNCnByaW50KHJlc3VsdGFkb19rbWVhbnMpDQpgYGANCg0KPHNwYW4gc3R5bGUgPSJjb2xvcjpibHVlOyI+Kio3LkFqdXN0YXIgZWwgbW9kZWxvIGstbWVhbnMgcGFyYSBkaWZlcmVudGVzIHZhbG9yZXMgZGUgayoqPC9zcGFuPg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpICMgUGFyYSByZXByb2R1Y2liaWxpZGFkDQp3Y3NzIDwtIHZlY3RvcigpICMgSW5pY2lhbGl6YXIgdmVjdG9yIHBhcmEgYWxtYWNlbmFyIGxvcyB2YWxvcmVzIGRlIFdDU1MNCm1heF9rIDwtIDEwICMgUHVlZGVzIGNhbWJpYXIgZXN0byBwYXJhIHByb2JhciBjb24gbcOhcyBjbMO6c3RlcmVzIHNpIGxvIGRlc2Vhcw0KZm9yIChrIGluIDE6bWF4X2spIHsNCiAga21lYW5zX21vZGVsIDwtIGttZWFucyhkYXRvc19lc2NhbGFkb3MsIGNlbnRlcnMgPSBrLCBuc3RhcnQgPSAyNSkNCiAgd2Nzc1trXSA8LSBrbWVhbnNfbW9kZWwkdG90LndpdGhpbnNzDQp9DQpgYGANCg0KPHNwYW4gc3R5bGUgPSJjb2xvcjpibHVlOyI+Kio4Lkdyw6FmaWNhciBlbCBtw6l0b2RvIGRlIGNvZG8qKjwvc3Bhbj4NCmBgYHtyfQ0KcGFyKG1hciA9IGMoNCwgNCwgMSwgMSkpICMgTG9zIG7Dum1lcm9zIHJlcHJlc2VudGFuIGxvcyBtw6FyZ2VuZXMgaW5mZXJpb3IsIGl6cXVpZXJkbywgc3VwZXJpb3IgeSBkZXJlY2hvIHJlc3BlY3RpdmFtZW50ZS4NCnBsb3QoMTptYXhfaywgd2NzcywgdHlwZSA9ICJiIiwgeGxhYiA9ICJOdW1lcm8gZGUgQ2x1c3RlcnMiLCB5bGFiID0gIldDU1MiLCBtYWluID0gIk1ldG9kbyBkZWwgQ29kbyIsIHBjaCA9IDE5LCBmcmFtZSA9IEZBTFNFKQ0KDQpgYGANCmBgYHtyfQ0KIyBFc3RhYmxlY2VyIHVuYSBzZW1pbGxhIHBhcmEgbGEgcmVwcm9kdWNpYmlsaWRhZA0Kc2V0LnNlZWQoMTc4KQ0KYGBgDQoNCg0KPHNwYW4gc3R5bGUgPSJjb2xvcjpibHVlOyI+Kio5LlJlYWxpemFyIEstbWVhbnMgY29uIDQgY2x1c3RlcnMqKjwvc3Bhbj4NCmBgYHtyfQ0Ka21lYW5zX3Jlc3VsdCA8LSBrbWVhbnMoZGF0b3NfZXNjYWxhZG9zLCBjZW50ZXJzID0gNCkNCmttZWFuc19yZXN1bHQkY2VudGVycw0KYGBgDQo8c3BhbiBzdHlsZSA9ImNvbG9yOmJsdWU7Ij4qKjEwLkHDsWFkaXIgbGEgY29sdW1uYSBkZSBjbHVzdGVycyBhbCBkYXRhZnJhbWUgb3JpZ2luYWwqKjwvc3Bhbj4NCmBgYHtyfQ0KZGF0b3MxIDwtIGRhdG9zDQpkYXRvczEkQ2x1c3RlciA8LSBrbWVhbnNfcmVzdWx0JGNsdXN0ZXINCmBgYA0KDQo8c3BhbiBzdHlsZSA9ImNvbG9yOmJsdWU7Ij4qKjExLlRhYmxhIGRlIGNvbnRpbmdlbmNpYSoqPC9zcGFuPg0KYGBge3J9DQpjb250aW5nZW5jeSA8LSB0YWJsZShkYXRvczEkQ2x1c3RlciwgZGF0b3MkR2VuZXJvKQ0KDQojIENvbnZlcnRpciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgYSBwb3JjZW50YWplcw0KY29udGluZ2VuY3kgPC0gcHJvcC50YWJsZShjb250aW5nZW5jeSwgbWFyZ2luID0gMSkgKiAxMDANCg0KIyBNb3N0cmFyIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYQ0KcHJpbnQoY29udGluZ2VuY3kpDQpgYGANCjxzcGFuIHN0eWxlID0iY29sb3I6Ymx1ZTsiPioqMTIuVGFibGEgZGUgY29udGluZ2VuY2lhKio8L3NwYW4+DQpgYGB7cn0NCmNvbnRpbmdlbmN5IDwtIHRhYmxlKGRhdG9zMSRDbHVzdGVyLCBkYXRvcyRFc2NvbGFyaWRhZCkNCg0KIyBDb252ZXJ0aXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhIGEgcG9yY2VudGFqZXMNCmNvbnRpbmdlbmN5IDwtIHByb3AudGFibGUoY29udGluZ2VuY3ksIG1hcmdpbiA9IDEpICogMTAwDQoNCiMgTW9zdHJhciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWENCnByaW50KGNvbnRpbmdlbmN5KQ0KYGBgDQo8c3BhbiBzdHlsZSA9ImNvbG9yOmJsdWU7Ij4qKjEzLlRhYmxhIGRlIGNvbnRpbmdlbmNpYSoqPC9zcGFuPg0KYGBge3J9DQpjb250aW5nZW5jeSA8LSB0YWJsZShkYXRvczEkQ2x1c3RlciwgZGF0b3MkTXVuaWNpcGlvKQ0KDQojIENvbnZlcnRpciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgYSBwb3JjZW50YWplcw0KY29udGluZ2VuY3kgPC0gcHJvcC50YWJsZShjb250aW5nZW5jeSwgbWFyZ2luID0gMSkgKiAxMDANCg0KIyBNb3N0cmFyIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYQ0KcHJpbnQoY29udGluZ2VuY3kpDQpgYGANCg0KPHNwYW4gc3R5bGUgPSJjb2xvcjpibHVlOyI+KioxNC5UYWJsYSBkZSBjb250aW5nZW5jaWEqKjwvc3Bhbj4NCmBgYHtyfQ0KY29udGluZ2VuY3kgPC0gdGFibGUoZGF0b3MxJENsdXN0ZXIsIGRhdG9zJEVzdGFkby5DaXZpbCkNCg0KIyBDb252ZXJ0aXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhIGEgcG9yY2VudGFqZXMNCmNvbnRpbmdlbmN5IDwtIHByb3AudGFibGUoY29udGluZ2VuY3ksIG1hcmdpbiA9IDEpICogMTAwDQoNCiMgTW9zdHJhciBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWENCnByaW50KGNvbnRpbmdlbmN5KQ0KYGBgDQoNCjxzcGFuIHN0eWxlID0iY29sb3I6Ymx1ZTsiPioqMTUuVGFibGEgZGUgY29udGluZ2VuY2lhKio8L3NwYW4+DQpgYGB7cn0NCmNvbnRpbmdlbmN5IDwtIHRhYmxlKGRhdG9zMSRDbHVzdGVyLCBkYXRvcyRQdWVzdG8pDQoNCiMgQ29udmVydGlyIGxhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSBhIHBvcmNlbnRhamVzDQpjb250aW5nZW5jeSA8LSBwcm9wLnRhYmxlKGNvbnRpbmdlbmN5LCBtYXJnaW4gPSAxKSAqIDEwMA0KDQojIE1vc3RyYXIgbGEgdGFibGEgZGUgY29udGluZ2VuY2lhDQpwcmludChjb250aW5nZW5jeSkNCmBgYA0KDQoNCg==