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)