El gerente de una empresa de servicios en Neiva afirma que sus empleados están llegando tarde a trabajar de manera sistemática. Igualmente, afirma que más de la mitad de sus empleados llegan después de las 8:30 a.m. a sus puestos de trabajo, lo cual representa el límite de tolerancia antes de efectuar un llamado de atención a sus hojas de vida.
Sabiendo que la hora estipulada es a las 8:00 a.m. y que contamos con los registros de tiempos de entrada de una población de \(N = 70\) empleados, se requiere aplicar un diseño muestral probabilístico estructurado para determinar si la percepción estadística del gerente es acertada o no.
Determinar estadísticamente si las afirmaciones del Gerente respecto al incumplimiento en las horas de llegada son ciertas, utilizando para ello las estimaciones derivadas de un Muestreo Aleatorio Simple (MAS) y de un Muestreo Sistemático.
Como se especificó previamente, trabajaremos con la transformación de la hora de llegada a “minutos de retraso” tomando como eje temporal o minuto “0” las 8:00 a.m.
# Cargar librería para el tratamiento de datos y gráficos
library(tidyverse)
# 1. Población con N = 70. Los valores representan los minutos transcurridos tras las 8:00 a.m.
tiempos <- c(0,0,0,1,5,10,10,12,13,15,15,15,17,17,17,18,18,18,19,20,
21,22,24,25,25,25,26,26,28,29,30,30,30,31,32,33,33,33,34,36,
37,38,39,40,40,40,40,41,41,42,43,45,45,46,47,48,49,50,50,50,
52,53,54,55,56,57,59,60,70,95)
# Convertir a tibble general para operaciones con dplyr
df_poblacion <- tibble(
id_empleado = 1:70, # Damos un ID para entender la población en el muestreo
retraso = tiempos
)
A diferencia del muestreo por conveniencia que tomaba los “primeros 20”, el MAS otorga a cada empleado las mismas posibilidades de ser seleccionado al azar. Fijaremos una semilla para que el proceso sea reproducible y tomaremos una muestra de 30 empleados (\(n = 30\)).
# Fijar semilla para obtener siempre el mismo muestreo en el reporte de RMarkdown
set.seed(123)
# Muestra con Muestreo Aleatorio Simple (n = 30)
df_mas <- df_poblacion %>%
sample_n(size = 30, replace = FALSE)
# Cálculos Estratégicos del MAS:
resultados_mas <- df_mas %>%
summarise(
media_retraso_min = mean(retraso),
proporcion_mayor_30 = mean(retraso > 30),
hora_promedio_entrada = format(
as.POSIXct("08:00", format="%H:%M") + (media_retraso_min * 60),
"%H:%M:%S"
)
)
resultados_mas
## # A tibble: 1 × 3
## media_retraso_min proporcion_mayor_30 hora_promedio_entrada
## <dbl> <dbl> <chr>
## 1 36.2 0.6 08:36:10
Lectura MAS: Como vemos, este muestreo probabilístico puro nos arrojará proporciones (p) y medias (\(\bar{x}\)) representativas del comportamiento general, alejadas del sesgo originado por seleccionar solo al “principio de la lista”, como ocurrió en el modelo no probabilístico.
Para el muestreo sistemático elegimos elementos de la lista en intervalos regulares (\(k\)). La fórmula del intervalo, buscando la misma muestra (\(n=30\)), es \(k = N / n = 70 / 30 \approx 2.33\). Redondeado, saltaremos de \(k=2\) en \(2\). El arranque será aleatorio entre el 1 y el 2. Esto garantiza que cubrimos la lista sin distorsiones, desde los primeros en llegar hasta los más tardíos.
# Configuración del sistemático
N <- nrow(df_poblacion)
n <- 35 # Elegimos 35 como tamaño para coger 1 cada 2 (K=2) para simplificar y cubrir a todos.
k <- floor(N / n) # k = 2
# Semilla para el arranque aleatorio r ∈ [1, k]
set.seed(42)
arranque <- sample(1:k, 1)
# Generación de la secuencia sistemática (arranque, arranque + k, arranque + 2k...)
indices_sistematico <- seq(form = arranque, to = N, by = k)
# Extracción de la muestra
df_sistematico <- df_poblacion %>%
slice(indices_sistematico)
# Cálculos Estratégicos del Sistemático:
resultados_sistematico <- df_sistematico %>%
summarise(
media_retraso_min = mean(retraso),
proporcion_mayor_30 = mean(retraso > 30),
hora_promedio_entrada = format(
as.POSIXct("08:00", format="%H:%M") + (media_retraso_min * 60),
"%H:%M:%S"
)
)
resultados_sistematico
## # A tibble: 1 × 3
## media_retraso_min proporcion_mayor_30 hora_promedio_entrada
## <dbl> <dbl> <chr>
## 1 32.0 0.514 08:31:58
Para consolidar las estimaciones y medir nuestro error muestral, comprobamos cómo se ven frente a lo que resulta sacando los datos sobre nuestra tabla real completa.
resultados_poblacion <- df_poblacion %>%
summarise(
media_retraso_min = mean(retraso),
proporcion_mayor_30 = mean(retraso > 30), # Límite para el llamado de atención
hora_promedio_entrada = format(
as.POSIXct("08:00", format="%H:%M") + (media_retraso_min * 60),
"%H:%M:%S"
)
)
resultados_poblacion
## # A tibble: 1 × 3
## media_retraso_min proporcion_mayor_30 hora_promedio_entrada
## <dbl> <dbl> <chr>
## 1 32.8 0.529 08:32:47
Habiendo empleado los dos diseños muestrales probabilísticos (MAS y Sistemático) para estimar nuestros estadísticos base (\(\bar{x}\) para la hora promedio y \(p\) para la proporción de retardos mayores a 30 minutos), podemos concluir lo siguiente:
Sobre la hora promedio de entrada (\(\bar{x}\)): El gerente acierta en la macro-tendencia de impuntualidad. Los métodos probabilísticos estiman correctamente que la hora promedio ronda superando casi siempre las 8:26 a.m. o más. Con los datos completos comprobamos que el verdadero parámetro poblacional recae en las 8:33 a.m., un retroceso corporativo generalizado de media hora diaria.
Sobre la proporción de empleados después de las 8:30 a.m.
(\(p\)): La afirmación de que
“más de la mitad” (\(p >
0.50\), es decir, más del 50%) de los funcionarios entran para
ser merecedores de la llamada de atención es VERDADERA al
corroborarse con la población, pues en la realidad contable de
los 70 datos el parámetro oficial es del 52.8%
($p \approx 0.53$).
# Función solicitada para dinamizar los resultados y trazar un impacto visual del test
generar_reporte_z <- function(resultados, z_calculado = 2, alpha = 0.05) {
# 1. Cálculo de p-valor exacto (Prueba Unilateral Cola Derecha)
p_valor <- pnorm(z_calculado, lower.tail = FALSE)
# 2. Criterio de Decisión Automático
decision <- ifelse(p_valor < alpha, "rechaza", "no rechaza")
# 3. Impresión Dinámica en RMarkdown
cat(sprintf("Con un p-valor de %.4f, se %s la hipótesis nula.\n", p_valor, decision))
# 4. Generación Gráfica del Valor Z
x_vals <- seq(-4, 4, length.out = 1000)
df_norm <- data.frame(z = x_vals, densidad = dnorm(x_vals))
# Área de zona de rechazo en base al alfa del 5%
z_critico <- qnorm(1 - alpha)
zona_rechazo <- df_norm %>% filter(z >= z_critico)
grafica_z <- ggplot(df_norm, aes(x = z, y = densidad)) +
# Curva normal base
geom_line(color = "steelblue", linewidth = 1) +
# Relleno del alfa (zona crítica de rechazo del 5%)
geom_area(data = zona_rechazo, fill = "red", alpha = 0.3) +
# Línea vertical ilustrando donde cayó el 8:35 del equipo
geom_vline(xintercept = z_calculado, color = "red", linetype = "dashed", linewidth = 1.2) +
# Anotaciones explícitas de impacto para el gerente
annotate("text", x = z_calculado - 0.4, y = 0.15,
label = paste0("Z = ", z_calculado), color = "red", fontface = "bold", size=5) +
annotate("text", x = 3.2, y = 0.03,
label = "Zona Rechazo \n(α = 0.05)", color = "darkred") +
labs(
title = "Prueba de Hipótesis: Evaluación de Retardos (Z-Test)",
subtitle = expression(paste(H[0], ": ", mu <= "8:30 vs ", H[1], ": ", mu > "8:30")),
x = "Desviaciones Estándar (Estadístico Z)",
y = "Densidad Probabilística de Normalidad"
) +
theme_minimal()
print(grafica_z)
}
# Ejecutar la función solicitada usando la variable preexistente (N=70) de la población
generar_reporte_z(resultados = resultados_poblacion)
## Con un p-valor de 0.0228, se rechaza la hipótesis nula.