Iniciamos el proyecto

#install.packages("dplyr")
#install.packages("caret")
#install.packages("psych")
#install.packages("reshape2")

library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.2
## 
## 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(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
## Loading required package: lattice
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(ggplot2)

Haremos una análisis de una base de datos que trata sobre unas nóminas o salarios. Donde veremos qué tipo de relación hay entre las variables tienen los datos.

Salarios <- read.csv("NOMINA_2.csv", header = TRUE)

Analisamos nuestra base de datos

Dado que en nustra base de datos observamos que hay 70 trabajadores, de los cuales se especifica el sexo, el área donde se desempeñan, qué puesto tienen en el área que desempeñan, además de cómo se compone el salario que tienen, también viendo qué prestaciones tienen los trabajadores.

Dado que los datos que tenemos en nuestra base de datos, tenemos que transformar a los datos que no contienen números, si no ue hay que transformar esos datos en variabes indicadoras/dummies como se verá a continuación:

# Verificar los nombres de las columnas
print(names(Salarios))
##  [1] "Y.Salario.neto"           "EDAD"                    
##  [3] "GENERO"                   "DIAS.LABORADOS"          
##  [5] "Departamento"             "Puesto"                  
##  [7] "Salario.Diario"           "Total.percepciones.bruto"
##  [9] "Total.ISR"                "Total.IMSS.obrero"
# Crear variables dummy solo para las columnas categóricas especificadas
dummy <- dummyVars(" ~ GENERO + Departamento + Puesto", data = Salarios)

# Transformar el DataFrame original
Salarios_dummy <- predict(dummy, newdata = Salarios)

# Convertir a data.frame para mejor visualización
Salarios_dummy <- data.frame(Salarios_dummy)

# Combinar las columnas originales no categóricas con las nuevas columnas dummy
Salarios_final <- cbind(Salarios %>% select(Y.Salario.neto, EDAD, DIAS.LABORADOS, Salario.Diario, Total.percepciones.bruto, Total.ISR, Total.IMSS.obrero), Salarios_dummy)

Salarios_final
# Imprimimos los nombres de las columnas de nuestra nueva matriz 
print(names(Salarios_final))
##  [1] "Y.Salario.neto"                     "EDAD"                              
##  [3] "DIAS.LABORADOS"                     "Salario.Diario"                    
##  [5] "Total.percepciones.bruto"           "Total.ISR"                         
##  [7] "Total.IMSS.obrero"                  "GENEROFEMENINO"                    
##  [9] "GENEROMASCULINO"                    "DepartamentoADM.PINTURA"           
## [11] "DepartamentoADMINISTRACION.CDMX"    "DepartamentoADMINISTRACION.QRO"    
## [13] "DepartamentoALMACEN"                "DepartamentoALMACEN.DE.SUMINISTROS"
## [15] "DepartamentoCONTROL.DE.CALIDAD"     "DepartamentoEMPAQUE"               
## [17] "DepartamentoINGENIERIA"             "DepartamentoLACADO"                
## [19] "DepartamentoLOGISTICA"              "DepartamentoMANTENIMIENTO..GENERAL"
## [21] "DepartamentoMATRICERIA"             "DepartamentoMECANIZADO"            
## [23] "DepartamentoMECANIZADO.PINTURA"     "DepartamentoPRODUCCION"            
## [25] "DepartamentoVIGILANCIA"             "PuestoALMACENISTA"                 
## [27] "PuestoAUX.DE.CHOFER"                "PuestoAUX.DE.COMPRAS"              
## [29] "PuestoAUXILIAR.CONTABLE"            "PuestoAUXILIAR.DE.CORTE"           
## [31] "PuestoAUXILIAR.DE.LACADO"           "PuestoAUXILIAR.DE.OPERADOR"        
## [33] "PuestoAUXILIAR.GENERAL"             "PuestoCHOFER"                      
## [35] "PuestoCORTADOR"                     "PuestoINSPECTOR.DE.CALIDAD"        
## [37] "PuestoJEFE.DE.AREA"                 "PuestoLIMPIEZA"                    
## [39] "PuestoMATRICERO"                    "PuestoMECANICO"                    
## [41] "PuestoMECATRONICO"                  "PuestoMONTACARGUISTA"              
## [43] "PuestoOPERADOR"                     "PuestoPINTADOR"                    
## [45] "PuestoRECEPCIONISTA"                "PuestoREPARADOR"                   
## [47] "PuestoSUPERVISOR"                   "PuestoTENSADOR"                    
## [49] "PuestoVIGILANTE"

Proponemos el modelo lineal sin variables dummy

Ya que tenemos nuestra base de datos modificada con variables dummy podemos hacer nuestro modelo con o sin estas variables dummy para poder

# X1 será la matriz que no contenga las variables dummy que calculamos previamente. 
X1 <- model.matrix(Y.Salario.neto ~ EDAD + DIAS.LABORADOS + Salario.Diario + Total.percepciones.bruto + Total.ISR + Total.IMSS.obrero, data = Salarios_final)

# Crear el vector de respuesta Y
Y <- Salarios_final$Y.Salario.neto

# Combinar X1 y Y en un solo dataframe
dataframe1 <- as.data.frame(cbind(Y, X1))
dataframe1
# Crear la matriz de dispersión
pairs(dataframe1)

# Estadísticas que presentan las variables
describe(dataframe1)
# Obtener los nombres de las variables predictoras
nombres_variables <- colnames(X1)
# Crear el boxplot
boxplot(dataframe1[, -1],  # Selecciona todas las columnas excepto la primera (Y)
        main = "Boxplot de las variables descriptivas",
        ylab = "Valor",
        col = "lightblue", border = "blue",
        names = nombres_variables)  # Agrega etiquetas al eje x

# Obtener el número de columnas en dataframe1
num_variables <- ncol(dataframe1)
# Crear un histograma para cada variable predictora
par(mfrow = c(ceiling(num_variables / 2), 2))  # Dividir el espacio de gráficos

for (i in 2:num_variables) {  # Empezamos desde 2 para excluir la primera columna (Y)
  hist(dataframe1[, i],  # Seleccionar la columna correspondiente
       main = paste("Histograma de", nombres_variables[i - 1]),  # nombres_variables[i - 1] para compensar la columna Y
       xlab = nombres_variables[i - 1],  # nombres_variables[i - 1] para compensar la columna Y
       col = "lightblue", border = "blue")  # Opciones de color
}

# Obtener los nombres de las variables predictoras
nombres_variables <- colnames(X1)

# Crear el boxplot
boxplot(dataframe1[, -1],  # Selecciona todas las columnas excepto la primera (Y)
        main = "Boxplot de las variables descriptivas",
        ylab = "Valor",
        col = "lightblue", border = "blue",
        names = nombres_variables)  # Agrega etiquetas al eje x

# Obtener el número de columnas en dataframe1
num_variables <- ncol(dataframe1)

# Crear un histograma para cada variable descriptiva
par(mfrow = c(ceiling(num_variables / 2), 2))  # Dividir el espacio de gráficos

for (i in 2:num_variables) {  # Empezamos desde 2 para excluir la primera columna (Y)
  hist(dataframe1[, i],  # Seleccionar la columna correspondiente
       main = paste("Histograma de", nombres_variables[i - 1]),  # nombres_variables[i - 1] para compensar la columna Y
       xlab = nombres_variables[i - 1],  # nombres_variables[i - 1] para compensar la columna Y
       col = "lightblue", border = "blue")  # Opciones de color
}

# Calcular la matriz de correlación
matriz_corr <- cor(dataframe1[, -1])
## Warning in cor(dataframe1[, -1]): the standard deviation is zero
print(matriz_corr)
##                          (Intercept)      EDAD DIAS.LABORADOS Salario.Diario
## (Intercept)                        1        NA             NA             NA
## EDAD                              NA 1.0000000      0.2136312      0.2972611
## DIAS.LABORADOS                    NA 0.2136312      1.0000000      0.2808551
## Salario.Diario                    NA 0.2972611      0.2808551      1.0000000
## Total.percepciones.bruto          NA 0.3096457      0.3766981      0.9549487
## Total.ISR                         NA 0.3003160      0.3154214      0.9690909
## Total.IMSS.obrero                 NA 0.2845010      0.3443678      0.9479689
##                          Total.percepciones.bruto Total.ISR Total.IMSS.obrero
## (Intercept)                                    NA        NA                NA
## EDAD                                    0.3096457 0.3003160         0.2845010
## DIAS.LABORADOS                          0.3766981 0.3154214         0.3443678
## Salario.Diario                          0.9549487 0.9690909         0.9479689
## Total.percepciones.bruto                1.0000000 0.9897041         0.9895510
## Total.ISR                               0.9897041 1.0000000         0.9775150
## Total.IMSS.obrero                       0.9895510 0.9775150         1.0000000
# Visualizar la matriz de correlación como un mapa de calor
ggplot(data = melt(matriz_corr), aes(x = Var1, y = Var2, fill = value)) +
  geom_tile() +
  theme_minimal() +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1, 1)) +
  labs(title = "Matriz de Correlación")


# Ejemplo de prueba ANOVA para una variable categórica
anova_result <- aov(Y ~ Salarios$EDAD)
print(summary(anova_result))
##               Df    Sum Sq   Mean Sq F value Pr(>F)  
## Salarios$EDAD  1 1.931e+09 1.931e+09   5.065 0.0276 *
## Residuals     68 2.593e+10 3.813e+08                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

# Ajustar el modelo de regresión lineal múltiple
modelo1 <- lm(Y ~ X1 - 1)  # Quitamos el intercepto

# Resumen del modelo
summary(modelo1)
## 
## Call:
## lm(formula = Y ~ X1 - 1)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -22164  -1200   1302   3820  10766 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## X1(Intercept)              2868.3277  7109.0495   0.403    0.688    
## X1EDAD                      -71.0754    70.0050  -1.015    0.314    
## X1DIAS.LABORADOS             -1.1256     0.7884  -1.428    0.158    
## X1Salario.Diario            -19.8753    14.9484  -1.330    0.188    
## X1Total.percepciones.bruto    1.4480     0.3441   4.208 8.31e-05 ***
## X1Total.ISR                  -1.1972     1.5882  -0.754    0.454    
## X1Total.IMSS.obrero         -13.4742     8.1007  -1.663    0.101    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6115 on 63 degrees of freedom
## Multiple R-squared:  0.9858, Adjusted R-squared:  0.9842 
## F-statistic: 625.1 on 7 and 63 DF,  p-value: < 2.2e-16
# Intervalos de confianza para los coeficientes
confint(modelo1)
##                                    2.5 %       97.5 %
## X1(Intercept)              -1.133797e+04 1.707463e+04
## X1EDAD                     -2.109693e+02 6.881849e+01
## X1DIAS.LABORADOS           -2.701109e+00 4.498913e-01
## X1Salario.Diario           -4.974724e+01 9.996699e+00
## X1Total.percepciones.bruto  7.604268e-01 2.135616e+00
## X1Total.ISR                -4.370958e+00 1.976489e+00
## X1Total.IMSS.obrero        -2.966213e+01 2.713645e+00
# Extraer los coeficientes estimados y los p-values
coef_test <- summary(modelo1)$coef[, c("Estimate", "Pr(>|t|)")]  # Corrección del nombre "Estimate"
names(coef_test)[2] <- "p-value"
coef_test
##                               Estimate     Pr(>|t|)
## X1(Intercept)              2868.327745 6.879646e-01
## X1EDAD                      -71.075413 3.138510e-01
## X1DIAS.LABORADOS             -1.125609 1.583151e-01
## X1Salario.Diario            -19.875272 1.884468e-01
## X1Total.percepciones.bruto    1.448021 8.310954e-05
## X1Total.ISR                  -1.197234 4.537532e-01
## X1Total.IMSS.obrero         -13.474241 1.012097e-01
## attr(,"names")
##  [1] NA        "p-value" NA        NA        NA        NA        NA       
##  [8] NA        NA        NA        NA        NA        NA        NA
# ANOVA del modelo
anova(modelo1)
# Calcular la correlación entre los valores observados y los predichos
correlacion <- cor(Y, predict(modelo1))

# Obtener el R-cuadrado del modelo
R_caudrada <- summary(modelo1)$r.squared

# Imprimir la correlación y el R-cuadrado
correlacion
## [1] 0.956787
R_caudrada
## [1] 0.9858063
# Graficar los diagnósticos del modelo
par(mfrow = c(2, 2))
plot(modelo1)