Análisis exploratorio
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
df <- read.csv("C:\\Users\\beatr\\Desktop\\Evidencia\\EncuestasForm_BaseLimpia.csv")
df$Edad <- as.integer(sub(" años", "", df$Edad))
summary(df)
## Puesto puesto_otro Antiguedad Motivación
## Length:106 Length:106 Min. : 1.00 Length:106
## Class :character Class :character 1st Qu.: 1.00 Class :character
## Mode :character Mode :character Median : 9.00 Mode :character
## Mean :14.08
## 3rd Qu.:34.50
## Max. :36.00
## Salario Prestaciones Jornada_Laboral Herramientas
## Min. :1.000 Min. :1.000 Min. :1.00 Min. :1.000
## 1st Qu.:3.000 1st Qu.:2.000 1st Qu.:4.00 1st Qu.:3.000
## Median :4.000 Median :4.000 Median :5.00 Median :5.000
## Mean :3.792 Mean :3.274 Mean :4.16 Mean :3.877
## 3rd Qu.:5.000 3rd Qu.:5.000 3rd Qu.:5.00 3rd Qu.:5.000
## Max. :5.000 Max. :5.000 Max. :5.00 Max. :5.000
## Temperatura Estrés Transporte Instalaciones
## Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:3.000 1st Qu.:4.000 1st Qu.:4.000
## Median :3.000 Median :4.000 Median :5.000 Median :5.000
## Mean :3.123 Mean :3.679 Mean :4.009 Mean :4.311
## 3rd Qu.:5.000 3rd Qu.:5.000 3rd Qu.:5.000 3rd Qu.:5.000
## Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000
## Rotación Conflicto.Acoso Satisfacción.en.el.trabajo
## Min. :1.000 Length:106 Length:106
## 1st Qu.:3.000 Class :character Class :character
## Median :5.000 Mode :character Mode :character
## Mean :4.038
## 3rd Qu.:5.000
## Max. :5.000
## Emoción Edad Genero Estado.Civil
## Length:106 Min. :18.00 Length:106 Length:106
## Class :character 1st Qu.:25.25 Class :character Class :character
## Mode :character Median :33.50 Mode :character Mode :character
## Mean :35.62
## 3rd Qu.:45.00
## Max. :68.00
## Municipio Escolaridad Dependientes
## Length:106 Length:106 Min. :0.000
## Class :character Class :character 1st Qu.:0.000
## Mode :character Mode :character Median :1.000
## Mean :1.085
## 3rd Qu.:2.000
## Max. :3.000
str(df)
## 'data.frame': 106 obs. of 22 variables:
## $ Puesto : chr "Administrativo" "Costurera" "Ayudante general" "Ayudante general" ...
## $ puesto_otro : chr "" "" "" "" ...
## $ Antiguedad : int 9 36 4 2 1 36 36 36 36 1 ...
## $ Motivación : chr "Por el salario" "Otro" "Ubicación de la empresa" "Ubicación de la empresa" ...
## $ Salario : int 5 4 2 5 3 4 2 5 4 5 ...
## $ Prestaciones : int 4 4 1 4 1 5 3 4 1 4 ...
## $ Jornada_Laboral : int 5 5 1 5 5 5 4 5 4 5 ...
## $ Herramientas : int 5 4 1 5 5 5 4 5 1 5 ...
## $ Temperatura : int 2 3 3 4 4 2 2 4 5 1 ...
## $ Estrés : int 5 2 1 5 3 4 5 4 4 5 ...
## $ Transporte : int 4 2 4 5 1 5 1 5 5 2 ...
## $ Instalaciones : int 5 4 4 5 5 4 4 5 5 5 ...
## $ Rotación : int 4 5 1 4 3 5 3 5 5 5 ...
## $ Conflicto.Acoso : chr "No" "No" "Si" "No" ...
## $ Satisfacción.en.el.trabajo: chr "cotización ante imss, fecha de pago, comer a las 3pm" "Ninguno" "mucho trabajo, estrés" "Todo bien " ...
## $ Emoción : chr "agusto, feliz" "Bien" "cómoda, no satisfecha" "Tranquila y contenta " ...
## $ Edad : int 30 54 21 20 43 61 55 29 56 36 ...
## $ Genero : chr "Femenino" "Femenino" "Femenino" "Femenino" ...
## $ Estado.Civil : chr "Unión libre" "Casado" "Soltero" "Casado" ...
## $ Municipio : chr "Apodaca" "Apodaca" "Apodaca" "Apodaca" ...
## $ Escolaridad : chr "Licenciatura" "Primaria" "Preparatoria" "Preparatoria" ...
## $ Dependientes : int 0 0 0 0 0 2 1 0 0 2 ...
demográficos <- select(df, "Edad", "Genero", "Estado.Civil", "Municipio", "Escolaridad", "Dependientes")
summary(demográficos)
## Edad Genero Estado.Civil Municipio
## Min. :18.00 Length:106 Length:106 Length:106
## 1st Qu.:25.25 Class :character Class :character Class :character
## Median :33.50 Mode :character Mode :character Mode :character
## Mean :35.62
## 3rd Qu.:45.00
## Max. :68.00
## Escolaridad Dependientes
## Length:106 Min. :0.000
## Class :character 1st Qu.:0.000
## Mode :character Median :1.000
## Mean :1.085
## 3rd Qu.:2.000
## Max. :3.000
library (ggplot2)
ggplot(df,
aes(Genero))+geom_bar(aes(fill=Motivación), width = 0.5)

probabilidad <- c(5,4,3,2,1)
etiquetas <- c("Totalmente de acuerdo", "Medianamente de acuerdo", "Ni de acuerdo ni en desacuerdo", "Medianamente en desacuerdo", "Totalmente en desacuerdo")
pie(probabilidad, labels= etiquetas, main= "Probabilidad de continuar en FORM" )

Regresión lineal
regresion <- lm( Rotación ~ Salario + Prestaciones + Jornada_Laboral + Herramientas + Temperatura + Estrés + Transporte + Instalaciones + Conflicto.Acoso, data=df)
summary (regresion)
##
## Call:
## lm(formula = Rotación ~ Salario + Prestaciones + Jornada_Laboral +
## Herramientas + Temperatura + Estrés + Transporte + Instalaciones +
## Conflicto.Acoso, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0624 -0.6444 0.1742 0.7601 2.0695
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.155175 0.604075 3.568 0.000566 ***
## Salario 0.183708 0.094051 1.953 0.053729 .
## Prestaciones 0.299393 0.081487 3.674 0.000395 ***
## Jornada_Laboral -0.040359 0.099399 -0.406 0.685630
## Herramientas 0.137645 0.090219 1.526 0.130412
## Temperatura -0.162673 0.063386 -2.566 0.011839 *
## Estrés 0.001298 0.082590 0.016 0.987494
## Transporte 0.094415 0.077552 1.217 0.226454
## Instalaciones -0.014934 0.112110 -0.133 0.894310
## Conflicto.AcosoPrefiero no decirlo 0.264413 1.134678 0.233 0.816240
## Conflicto.AcosoSi 0.175659 0.321619 0.546 0.586230
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.089 on 95 degrees of freedom
## Multiple R-squared: 0.3447, Adjusted R-squared: 0.2758
## F-statistic: 4.998 on 10 and 95 DF, p-value: 8.232e-06
regresion <- lm( Rotación ~ Salario + Prestaciones + Temperatura , data=df)
summary (regresion)
##
## Call:
## lm(formula = Rotación ~ Salario + Prestaciones + Temperatura,
## data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.3567 -0.6312 0.2871 0.7267 1.9292
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.55741 0.38178 6.699 1.17e-09 ***
## Salario 0.23803 0.08448 2.817 0.00581 **
## Prestaciones 0.32148 0.07301 4.403 2.64e-05 ***
## Temperatura -0.15205 0.06147 -2.474 0.01503 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.08 on 102 degrees of freedom
## Multiple R-squared: 0.3079, Adjusted R-squared: 0.2876
## F-statistic: 15.13 on 3 and 102 DF, p-value: 3.241e-08
datos <- data.frame(Salario= 5, Prestaciones= 4, Temperatura= 2)
predict(regresion, datos)
## 1
## 4.72939
Segmentación de los trabajadores de FORM
datos <- read.csv("C:\\Users\\beatr\\Desktop\\Evidencia\\EncuestasForm_BaseLimpia.csv")
datos_numericos <- datos[sapply(datos, is.numeric)]
datos_escalados <- scale(datos_numericos)
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, ]
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
}
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)

set.seed(200)
kmeans_result <- kmeans(datos_escalados, centers = 4)
kmeans_result$centers
## Antiguedad Salario Prestaciones Jornada_Laboral Herramientas Temperatura
## 1 -0.41214676 -1.5910729 -1.0350742 -1.2752926 -1.77366014 0.1868622
## 2 0.48326149 -0.3608401 -0.3983419 -0.4836742 -0.45199584 -0.7119568
## 3 -0.55802788 0.0192572 -0.7618043 0.1254014 0.04949067 0.2191218
## 4 0.04285545 0.5295731 0.8179843 0.4944643 0.60830491 0.3074850
## Estrés Transporte Instalaciones Rotación Dependientes
## 1 -0.6450121 -1.4055677 -1.8008918 -1.5928283 -0.07743547
## 2 -0.1899346 -0.2348163 -0.2830433 0.4017670 0.17415564
## 3 -0.4860091 0.2347771 0.1544357 -0.9177533 -0.49198900
## 4 0.4783786 0.3107541 0.4569282 0.4972779 0.14065573
datos1 <- datos
datos1$Cluster <- kmeans_result$cluster
contingency <- table(datos1$Cluster, datos1$Salario)
contingency <- prop.table(contingency, margin = 1) * 100
print(contingency)
##
## 1 2 3 4 5
## 1 66.666667 11.111111 11.111111 11.111111 0.000000
## 2 10.344828 24.137931 6.896552 41.379310 17.241379
## 3 4.545455 9.090909 9.090909 54.545455 22.727273
## 4 2.173913 2.173913 6.521739 21.739130 67.391304
contingency2 <- table(datos1$Cluster, datos1$Prestaciones)
contingency2 <- prop.table(contingency2, margin = 1) * 100
print(contingency2)
##
## 1 2 3 4 5
## 1 66.666667 22.222222 0.000000 0.000000 11.111111
## 2 27.586207 24.137931 20.689655 10.344828 17.241379
## 3 31.818182 45.454545 9.090909 9.090909 4.545455
## 4 0.000000 0.000000 4.347826 36.956522 58.695652
contingency3 <- table(datos1$Cluster, datos1$Temperatura)
contingency3 <- prop.table(contingency3, margin = 1) * 100
print(contingency3)
##
## 1 2 3 4 5
## 1 22.222222 0.000000 22.222222 22.222222 33.333333
## 2 62.068966 6.896552 17.241379 6.896552 6.896552
## 3 22.727273 4.545455 13.636364 18.181818 40.909091
## 4 21.739130 8.695652 4.347826 13.043478 52.173913
library(rpart)
library(rpart.plot)
df_arbol <- subset(datos, select = -puesto_otro)
df_arbol$Rotación <- as.factor(df_arbol$Rotación)
df_arbol$Salario <- as.factor(df_arbol$Salario)
df_arbol$Prestaciones <- as.factor(df_arbol$Prestaciones)
df_arbol$Temperatura <- as.factor(df_arbol$Temperatura)
arbol <- rpart(formula= Rotación ~ Salario + Prestaciones + Temperatura,data=df_arbol)
arbol
## n= 106
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 106 50 5 (0.085 0.047 0.14 0.2 0.53)
## 2) Prestaciones=1,2 40 29 5 (0.17 0.12 0.22 0.2 0.27)
## 4) Salario=1,2 13 8 1 (0.38 0.15 0.077 0.38 0) *
## 5) Salario=3,4,5 27 16 5 (0.074 0.11 0.3 0.11 0.41)
## 10) Salario=3,4 20 12 3 (0.05 0.1 0.4 0.15 0.3) *
## 11) Salario=5 7 2 5 (0.14 0.14 0 0 0.71) *
## 3) Prestaciones=3,4,5 66 21 5 (0.03 0 0.091 0.2 0.68) *
rpart.plot(arbol)

prp(arbol,extra=7)
## Warning: extra=7 but the response has 5 levels (only the 2nd level is
## displayed)
