1 Introducción

se va a analizar la presencia de datos faltantes en la base de datos correspondiente al proceso de selección y seguimiento de empleados. Las variables analizadas son IQ, Psy y Perf. El objetivo es identificar el mecanismo que puede generar los datos faltantes, describir su magnitud y estructura, y realizar pruebas estadísticas para evaluar si los datos son compatibles con un mecanismo de ausencia completamente aleatoria (MCAR).

2 1. Mecanismo generador de datos faltantes

2.1 1.1 Variable Psy

La variable Psy presenta datos faltantes porque algunos aspirantes no completaron el cuestionario de bienestar psicológico debido a su extensión no se establece que la ausencia de Psy dependa de los valores observados o no observados de las variables del estudio. Por esta razón, se considera que el mecanismo es compatible con MCAR.

2.2 1.2 Variable Perf

La variable Perf corresponde al desempeño laboral evaluado después de seis meses de trabajo, por lo que solamente puede observarse para quienes ingresaron a trabajar. La empresa contrata a los aspirantes con IQ > 100, variable completamente observada. Por lo tanto, la ausencia de Perf está relacionada con una covariable observada, y el mecanismo corresponde a MAR / CDM .

2.3 Observación sobre la base de datos

En la base aparece un registro con IQ = 99 y Perf observado, lo que no coincide estrictamente con la regla de que solo se contrata a aspirantes con IQ > 100. El registro se mantiene en el análisis porque forma parte de los datos suministrados y no se cuenta con información adicional que justifique su eliminación o modificación.

3 2. Descripción de los datos faltantes

3.1 2.1 Carga de los datos

library(readxl)
library(knitr)
library(ggplot2)

Empleados <- read_excel("D:/Manuel/Downloads/Empleados.xlsx")

names(Empleados)
## [1] "Id"   "IQ"   "Psy"  "Perf"

3.2 2.2 Estructura de la base de datos

str(Empleados)
## tibble [20 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Id  : num [1:20] 1 2 3 4 5 6 7 8 9 10 ...
##  $ IQ  : num [1:20] 106 84 87 108 115 92 99 113 78 91 ...
##  $ Psy : num [1:20] 10 10 NA NA 14 12 6 14 13 3 ...
##  $ Perf: num [1:20] 15 NA NA 10 14 NA 7 12 NA NA ...

La base contiene 20 aspirantes y cuatro variables: Id, IQ, Psy y Perf. La variable IQ se encuentra completamente observada, mientras que Psy y Perf presentan datos faltantes.

3.3 2.3 Cantidad y porcentaje de datos faltantes por variable

faltantes <- data.frame(
  Variable = c("IQ", "Psy", "Perf"),
  Faltantes = c(
    sum(is.na(Empleados$IQ)),
    sum(is.na(Empleados$Psy)),
    sum(is.na(Empleados$Perf))
  )
)

faltantes$Observados <- nrow(Empleados) - faltantes$Faltantes

faltantes$Porcentaje_Faltante <- round(
  faltantes$Faltantes / nrow(Empleados) * 100,
  2
)

kable(
  faltantes,
  caption = "Cantidad y porcentaje de datos faltantes por variable"
)
Cantidad y porcentaje de datos faltantes por variable
Variable Faltantes Observados Porcentaje_Faltante
IQ 0 20 0
Psy 3 17 15
Perf 10 10 50

3.4 2.4 Gráfico de datos faltantes

ggplot(faltantes, aes(x = Variable, y = Faltantes)) +
  geom_col() +
  labs(
    title = "Cantidad de datos faltantes por variable",
    x = "Variable",
    y = "Cantidad de datos faltantes"
  ) +
  theme_minimal()

3.5 2.5 Casos completos e incompletos

Empleados$Numero_Faltantes <- rowSums(
  is.na(Empleados[, c("IQ", "Psy", "Perf")])
)

casos <- data.frame(
  Tipo = c("Casos completos", "Casos incompletos"),
  Frecuencia = c(
    sum(Empleados$Numero_Faltantes == 0),
    sum(Empleados$Numero_Faltantes > 0)
  )
)

casos$Porcentaje <- round(
  casos$Frecuencia / nrow(Empleados) * 100,
  2
)

kable(
  casos,
  caption = "Casos completos e incompletos"
)
Casos completos e incompletos
Tipo Frecuencia Porcentaje
Casos completos 9 45
Casos incompletos 11 55

3.6 2.6 Número de datos faltantes por unidad

tabla_unidad <- as.data.frame(table(Empleados$Numero_Faltantes))
names(tabla_unidad) <- c("Numero_de_Faltantes", "Frecuencia")

tabla_unidad$Porcentaje <- round(
  tabla_unidad$Frecuencia / nrow(Empleados) * 100,
  2
)

kable(
  tabla_unidad,
  caption = "Número de datos faltantes por unidad"
)
Número de datos faltantes por unidad
Numero_de_Faltantes Frecuencia Porcentaje
0 9 45
1 9 45
2 2 10

3.7 2.7 Patrones de datos faltantes

patrones <- data.frame(
  Psy = ifelse(is.na(Empleados$Psy), "Faltante", "Observado"),
  Perf = ifelse(is.na(Empleados$Perf), "Faltante", "Observado")
)

patrones_tabla <- as.data.frame(table(patrones$Psy, patrones$Perf))
names(patrones_tabla) <- c("Psy", "Perf", "Frecuencia")

patrones_tabla$Porcentaje <- round(
  patrones_tabla$Frecuencia / nrow(Empleados) * 100,
  2
)

kable(
  patrones_tabla,
  caption = "Patrones de datos faltantes en Psy y Perf"
)
Patrones de datos faltantes en Psy y Perf
Psy Perf Frecuencia Porcentaje
Faltante Faltante 2 10
Observado Faltante 8 40
Faltante Observado 1 5
Observado Observado 9 45

Se identifican cuatro patrones de datos faltantes: (1) Psy observado y Perf observado, (2) Psy observado y Perf faltante, (3) Psy faltante y Perf observado, (4) Psy faltante y Perf faltante. La estructura es multivariada (más de una variable con faltantes) y no monótona (existen casos con Psy faltante y Perf observado, y viceversa).

3.8 2.8 Porcentaje global de datos faltantes

total_faltantes <- sum(is.na(Empleados[, c("IQ", "Psy", "Perf")]))
total_observaciones <- nrow(Empleados) * 3

porcentaje_global <- round(total_faltantes / total_observaciones * 100, 2)

resultado_global <- data.frame(
  Total_Faltantes = total_faltantes,
  Total_Observaciones = total_observaciones,
  Porcentaje_Faltante = porcentaje_global
)

kable(
  resultado_global,
  caption = "Resumen global de datos faltantes"
)
Resumen global de datos faltantes
Total_Faltantes Total_Observaciones Porcentaje_Faltante
13 60 21.67

3.9 2.9 Interpretación de los datos faltantes

De los 20 aspirantes analizados, la variable IQ no presenta valores faltantes, mientras que Psy presenta 3 valores faltantes (15%) y Perf presenta 10 valores faltantes (50%). En total se identifican 13 valores faltantes de 60 observaciones posibles (21.67%). Además, existen 9 casos completos y 11 casos incompletos. Se identificaron cuatro patrones diferentes de datos faltantes, por lo que la estructura es multivariada y no monótona. Los faltantes se concentran principalmente en la variable Perf.

4 3. Verificación estadística del mecanismo de datos faltantes

Empleados$miss_Psy <- ifelse(is.na(Empleados$Psy), 1, 0)
Empleados$miss_Perf <- ifelse(is.na(Empleados$Perf), 1, 0)

kable(
  head(Empleados[, c("Id", "IQ", "miss_Psy", "miss_Perf")]),
  caption = "Indicadores binarios de datos faltantes"
)
Indicadores binarios de datos faltantes
Id IQ miss_Psy miss_Perf
1 106 0 0
2 84 0 1
3 87 1 1
4 108 1 0
5 115 0 0
6 92 0 1

4.1 3.1 Comparación de medias de IQ

4.1.1 3.1.1 Variable Psy

media_Psy <- aggregate(IQ ~ miss_Psy, data = Empleados, FUN = mean)
names(media_Psy) <- c("Psy_Faltante", "Media_IQ")
media_Psy$Psy_Faltante <- ifelse(media_Psy$Psy_Faltante == 1, "Faltante", "Observado")

kable(media_Psy, digits = 2, caption = "Media de IQ según estado de Psy")
Media de IQ según estado de Psy
Psy_Faltante Media_IQ
Observado 100.53
Faltante 97.00
prueba_media_Psy <- t.test(IQ ~ miss_Psy, data = Empleados)
prueba_media_Psy
## 
##  Welch Two Sample t-test
## 
## data:  IQ by miss_Psy
## t = 0.49909, df = 3.5979, p-value = 0.6467
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -17.00102  24.05984
## sample estimates:
## mean in group 0 mean in group 1 
##        100.5294         97.0000
p_media_Psy <- prueba_media_Psy$p.value

resultado_media_Psy <- data.frame(
  Estadistico_t = unname(prueba_media_Psy$statistic),
  Valor_p = p_media_Psy,
  Nivel_Significancia = 0.05,
  Decision = ifelse(p_media_Psy < 0.05, "Rechazar H0", "No rechazar H0")
)

kable(resultado_media_Psy, digits = 4, caption = "Prueba t para las medias de IQ según Psy")
Prueba t para las medias de IQ según Psy
Estadistico_t Valor_p Nivel_Significancia Decision
0.4991 0.6467 0.05 No rechazar H0

Conclusión: No se rechaza H0. No existe evidencia estadística suficiente para afirmar que las medias de IQ sean diferentes entre los grupos con Psy observado y Psy faltante, lo cual es compatible con MCAR para Psy.

4.1.2 3.1.2 Variable Perf

media_Perf <- aggregate(IQ ~ miss_Perf, data = Empleados, FUN = mean)
names(media_Perf) <- c("Perf_Faltante", "Media_IQ")
media_Perf$Perf_Faltante <- ifelse(media_Perf$Perf_Faltante == 1, "Faltante", "Observado")

kable(media_Perf, digits = 2, caption = "Media de IQ según estado de Perf")
Media de IQ según estado de Perf
Perf_Faltante Media_IQ
Observado 111.5
Faltante 88.5
prueba_media_Perf <- t.test(IQ ~ miss_Perf, data = Empleados)
prueba_media_Perf
## 
##  Welch Two Sample t-test
## 
## data:  IQ by miss_Perf
## t = 6.4427, df = 14.675, p-value = 1.231e-05
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  15.37614 30.62386
## sample estimates:
## mean in group 0 mean in group 1 
##           111.5            88.5
p_media_Perf <- prueba_media_Perf$p.value

resultado_media_Perf <- data.frame(
  Estadistico_t = unname(prueba_media_Perf$statistic),
  Valor_p = p_media_Perf,
  Nivel_Significancia = 0.05,
  Decision = ifelse(p_media_Perf < 0.05, "Rechazar H0", "No rechazar H0")
)

kable(resultado_media_Perf, digits = 4, caption = "Prueba t para las medias de IQ según Perf")
Prueba t para las medias de IQ según Perf
Estadistico_t Valor_p Nivel_Significancia Decision
6.4427 0 0.05 Rechazar H0

Conclusión: Se rechaza H0. Existe evidencia estadística de una diferencia entre las medias de IQ de los grupos con Perf observado y Perf faltante, lo cual es evidencia en contra de MCAR y consistente con MAR/CDM para Perf.

4.2 3.2 Comparación de varianzas de IQ

4.2.1 3.2.1 Variable Psy

varianza_Psy <- aggregate(IQ ~ miss_Psy, data = Empleados, FUN = var)
names(varianza_Psy) <- c("Psy_Faltante", "Varianza_IQ")
varianza_Psy$Psy_Faltante <- ifelse(varianza_Psy$Psy_Faltante == 1, "Faltante", "Observado")

kable(varianza_Psy, digits = 2, caption = "Varianza de IQ según estado de Psy")
Varianza de IQ según estado de Psy
Psy_Faltante Varianza_IQ
Observado 221.14
Faltante 111.00
prueba_var_Psy <- var.test(IQ ~ miss_Psy, data = Empleados)
prueba_var_Psy
## 
##  F test to compare two variances
## 
## data:  IQ by miss_Psy
## F = 1.9922, num df = 16, denom df = 2, p-value = 0.7709
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.05051929 9.33700728
## sample estimates:
## ratio of variances 
##            1.99225
p_var_Psy <- prueba_var_Psy$p.value

resultado_var_Psy <- data.frame(
  Estadistico_F = unname(prueba_var_Psy$statistic),
  Valor_p = p_var_Psy,
  Nivel_Significancia = 0.05,
  Decision = ifelse(p_var_Psy < 0.05, "Rechazar H0", "No rechazar H0")
)

kable(resultado_var_Psy, digits = 4, caption = "Prueba F para las varianzas de IQ según Psy")
Prueba F para las varianzas de IQ según Psy
Estadistico_F Valor_p Nivel_Significancia Decision
1.9922 0.7709 0.05 No rechazar H0

Conclusión: No se rechaza H0. No existe evidencia estadística suficiente para afirmar que las varianzas de IQ sean diferentes entre los grupos con Psy observado y Psy faltante, lo cual es compatible con MCAR para Psy.

4.2.2 3.2.2 Variable Perf

varianza_Perf <- aggregate(IQ ~ miss_Perf, data = Empleados, FUN = var)
names(varianza_Perf) <- c("Perf_Faltante", "Varianza_IQ")
varianza_Perf$Perf_Faltante <- ifelse(varianza_Perf$Perf_Faltante == 1, "Faltante", "Observado")

kable(varianza_Perf, digits = 2, caption = "Varianza de IQ según estado de Perf")
Varianza de IQ según estado de Perf
Perf_Faltante Varianza_IQ
Observado 94.06
Faltante 33.39
prueba_var_Perf <- var.test(IQ ~ miss_Perf, data = Empleados)
prueba_var_Perf
## 
##  F test to compare two variances
## 
## data:  IQ by miss_Perf
## F = 2.817, num df = 9, denom df = 9, p-value = 0.1389
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##   0.6996959 11.3411117
## sample estimates:
## ratio of variances 
##           2.816972
p_var_Perf <- prueba_var_Perf$p.value

resultado_var_Perf <- data.frame(
  Estadistico_F = unname(prueba_var_Perf$statistic),
  Valor_p = p_var_Perf,
  Nivel_Significancia = 0.05,
  Decision = ifelse(p_var_Perf < 0.05, "Rechazar H0", "No rechazar H0")
)

kable(resultado_var_Perf, digits = 4, caption = "Prueba F para las varianzas de IQ según Perf")
Prueba F para las varianzas de IQ según Perf
Estadistico_F Valor_p Nivel_Significancia Decision
2.817 0.1389 0.05 No rechazar H0

Conclusión: No se rechaza H0. No existe evidencia estadística suficiente para afirmar que las varianzas de IQ sean diferentes entre los grupos con Perf observado y Perf faltante.

5 4. Resumen de resultados

resumen_pruebas <- data.frame(
  Variable = c("Psy - Media", "Perf - Media", "Psy - Varianza", "Perf - Varianza"),
  Valor_p = c(
    prueba_media_Psy$p.value,
    prueba_media_Perf$p.value,
    prueba_var_Psy$p.value,
    prueba_var_Perf$p.value
  )
)

resumen_pruebas$Decision <- ifelse(
  resumen_pruebas$Valor_p < 0.05,
  "Rechazar H0",
  "No rechazar H0"
)

kable(resumen_pruebas, digits = 4, caption = "Resumen de las pruebas estadísticas")
Resumen de las pruebas estadísticas
Variable Valor_p Decision
Psy - Media 0.6467 No rechazar H0
Perf - Media 0.0000 Rechazar H0
Psy - Varianza 0.7709 No rechazar H0
Perf - Varianza 0.1389 No rechazar H0

6 5. Conclusión general

De acuerdo con el contexto del estudio, la variable Psy se considera compatible con un mecanismo MCAR, debido a que la información suministrada no establece una relación entre su ausencia y los valores de las variables observadas o no observadas. Por otra parte, Perf se considera MAR/CDM, debido a que su ausencia está relacionada con el ingreso del aspirante a la empresa, proceso que depende de IQ, una variable completamente observada.

El análisis descriptivo muestra que IQ no presenta datos faltantes, mientras que Psy y Perf sí. Las pruebas estadísticas de comparación de medias y varianzas de IQ entre grupos observados y faltantes se utilizan como evidencia complementaria (no concluyente) sobre la compatibilidad de cada variable con MCAR: no rechazar H0 es compatible con MCAR, mientras que rechazarla es evidencia en contra de MCAR y, en el caso de Perf, consistente con MAR/CDM, dado el proceso de selección descrito en el enunciado.