Analítica de Personas · Semestre otoño 2026 · Semana 3 · Referencia
p.value, la literatura internacional usa p-value, y mantener el término en inglés evita confusiones cuando los alumnos consulten fuentes en ambos idiomas.
La inferencia estadística nos permite hacer afirmaciones sobre una población a partir de una muestra. En people analytics, queremos saber si lo que observamos en los datos de InnovaCo (nuestra muestra) refleja un patrón real o podría ser producto del azar.
El enfoque frecuentista se basa en una idea central: si no hubiera efecto real (hipótesis nula), ¿qué tan probable sería observar datos como los nuestros? Esa probabilidad es el p-value.
| Paso | Qué hacer | Ejemplo |
|---|---|---|
| 1. Plantear H₀ y H₁ | H₀: no hay efecto/diferencia. H₁: sí lo hay. | H₀: la satisfacción es igual entre quienes se van y quienes se quedan |
| 2. Elegir prueba | Depende del tipo de variables y supuestos | Prueba t (dos medias, variable continua) |
| 3. Fijar α | Nivel de significancia (convencionalmente .05) | α = .05 |
| 4. Calcular estadístico | Ejecutar la prueba en R | t.test(satisfaccion ~ rotacion) |
| 5. Decidir | Si p < α, rechazamos H₀ | p = .0003 < .05 → rechazamos H₀ |
| 6. Reportar tamaño de efecto | ¿Cuán grande es la diferencia? | d de Cohen = 0.45 (mediano) |
¿Qué tipo de variables estoy comparando?
📊 Continua vs. categórica (2 grupos) → Prueba t / Mann-Whitney
📊 Continua vs. categórica (3+ grupos) → ANOVA / Kruskal-Wallis
📊 Categórica vs. categórica → Chi-cuadrado / Fisher
📊 Continua vs. continua → Correlación de Pearson / Spearman
📊 Continua pre-post (mismas personas) → t pareada / Wilcoxon signado
¿Cuándo? Comparar la media de una variable continua entre dos grupos independientes. Supone normalidad (robusta con n > 30) y varianzas similares (R usa la corrección de Welch por defecto).
# t de Student para dos muestras independientes
t.test(satisfaccion_laboral ~ rotacion, data = innovaco)
# Guardar y extraer componentes
res_t <- t.test(satisfaccion_laboral ~ rotacion, data = innovaco)
res_t$p.value # p-value
res_t$estimate # medias de cada grupo
res_t$conf.int # IC 95% de la diferencia
res_t$statistic # valor del estadístico t
# Si tuviéramos satisfacción medida antes y después de una intervención
t.test(datos$satisfaccion_post, datos$satisfaccion_pre,
paired = TRUE)
¿Cuándo? Cuando la variable no es normal (ej: escalas Likert 1-5 con distribución asimétrica, n pequeño, o variables ordinales). Compara medianas en vez de medias.
# Equivalente no paramétrico de la prueba t
wilcox.test(satisfaccion_laboral ~ rotacion, data = innovaco)
# Versión pareada (equivalente no paramétrico de t pareada)
wilcox.test(datos$post, datos$pre, paired = TRUE)
| Prueba | Tipo | Supuestos | En R | Compara |
|---|---|---|---|---|
| t de Student | Paramétrica | Normalidad, varianzas ~iguales | t.test(y ~ grupo) | Medias |
| Welch t-test | Paramétrica | Normalidad (varianzas pueden diferir) | t.test(y ~ grupo) (default en R) | Medias |
| Mann-Whitney U | No paramétrica | Independencia | wilcox.test(y ~ grupo) | Distribuciones/medianas |
¿Cuándo? Comparar la media de una variable continua entre 3+ grupos (ej: satisfacción por departamento). Supone normalidad y homogeneidad de varianzas.
# ANOVA: ¿la satisfacción difiere entre departamentos?
modelo_anova <- aov(satisfaccion_laboral ~ departamento, data = innovaco)
summary(modelo_anova)
# Comparaciones post-hoc (¿CUÁLES departamentos difieren?)
TukeyHSD(modelo_anova)
# Tamaño de efecto: eta-cuadrado (η²)
# η² = SS_between / SS_total
ss <- summary(modelo_anova)[[1]]
eta_sq <- ss["departamento", "Sum Sq"] / sum(ss[, "Sum Sq"])
eta_sq
# Equivalente no paramétrico del ANOVA
kruskal.test(satisfaccion_laboral ~ departamento, data = innovaco)
# Post-hoc no paramétrico: Dunn test (requiere paquete dunn.test)
# install.packages("dunn.test")
# dunn.test::dunn.test(innovaco$satisfaccion_laboral, innovaco$departamento)
| Prueba | Tipo | Supuestos | En R | Post-hoc |
|---|---|---|---|---|
| ANOVA | Paramétrica | Normalidad, homogeneidad de varianzas | aov(y ~ grupo) | TukeyHSD() |
| Welch ANOVA | Paramétrica | Normalidad (varianzas pueden diferir) | oneway.test(y ~ grupo) | Games-Howell |
| Kruskal-Wallis | No paramétrica | Independencia | kruskal.test(y ~ grupo) | Dunn test |
¿Cuándo? Evaluar si hay asociación entre dos variables categóricas (ej: ¿la rotación depende del departamento?).
# Tabla de contingencia
tabla <- table(innovaco$departamento, innovaco$rotacion)
tabla
# Chi-cuadrado
chi_res <- chisq.test(tabla)
chi_res
# Componentes útiles
chi_res$statistic # valor chi-cuadrado
chi_res$p.value # p-value
chi_res$expected # frecuencias esperadas bajo H₀
chi_res$residuals # residuos estandarizados
chi_res$stdres # residuos estandarizados ajustados (mejores)
chi_res$stdres te dice dónde está la asociación: valores con |z| > 2 son celdas donde hay significativamente más (positivo) o menos (negativo) casos de lo esperado. Ejemplo: un residuo de +3.2 en "Ventas × Sí" significa que Ventas tiene significativamente más rotación de la esperada.
¿Cuándo? Cuando alguna celda esperada tiene frecuencia < 5. Más precisa que chi-cuadrado con muestras pequeñas.
# Para tablas 2x2 o con celdas pequeñas
fisher.test(tabla)
# Si la tabla es grande, Fisher puede ser lento.
# Alternativa: simular el p-value
chisq.test(tabla, simulate.p.value = TRUE, B = 10000)
# Comparar proporciones entre 2 grupos
# ¿La tasa de rotación difiere entre hombres y mujeres?
tabla_genero <- table(innovaco$genero, innovaco$rotacion)
prop.test(tabla_genero)
Mide la fuerza y dirección de la relación lineal entre dos variables continuas. Rango: −1 a +1.
# Correlación entre dos variables
cor(innovaco$satisfaccion_laboral, innovaco$antiguedad_anios)
# Con test de significancia
cor.test(innovaco$satisfaccion_laboral, innovaco$antiguedad_anios)
# Matriz completa de correlaciones
vars_num <- innovaco |>
select(where(is.numeric))
mat_cor <- cor(vars_num)
round(mat_cor, 2)
¿Cuándo? Variables ordinales, relaciones no lineales, o distribuciones no normales. Mide relación monotónica (no necesariamente lineal).
# Correlación de Spearman
cor(innovaco$satisfaccion_laboral, innovaco$antiguedad_anios,
method = "spearman")
cor.test(innovaco$satisfaccion_laboral, innovaco$antiguedad_anios,
method = "spearman")
library(corrplot)
# Opciones de visualización
corrplot(mat_cor,
method = "color", # "circle", "number", "pie", "shade"
type = "upper", # solo triángulo superior
addCoef.col = "black", # mostrar números
tl.col = "black", # color de etiquetas
tl.cex = 0.8, # tamaño de etiquetas
number.cex = 0.7, # tamaño de números
order = "hclust", # agrupar variables similares
col = colorRampPalette(c("#EF4444", "white", "#16A34A"))(200))
| Tipo | Supuestos | En R | Mide |
|---|---|---|---|
| Pearson (r) | Linealidad, normalidad bivariada | cor(x, y) o cor(x, y, method = "pearson") | Relación lineal |
| Spearman (ρ) | Monotonicidad | cor(x, y, method = "spearman") | Relación monotónica |
| Kendall (τ) | Concordancia de pares | cor(x, y, method = "kendall") | Concordancia (más robusto, más conservador) |
El p-value responde "¿existe un efecto?". El tamaño de efecto responde "¿cuán grande es?". Con muestras grandes (como n = 1.200), casi cualquier diferencia es significativa, incluso diferencias triviales. Para tomar decisiones de gestión, necesitamos saber si el efecto es lo suficientemente grande como para actuar.
"La diferencia en satisfacción entre quienes se van y quienes se quedan es significativa (p = .0003)."
¿Y? ¿Es grande o pequeña? ¿Invierto $50 millones en programas de satisfacción?
"La diferencia es significativa (p = .0003) y de magnitud mediana (d = 0.45). Un empleado insatisfecho tiene casi el doble de chances de irse."
Ahora sí puedo decidir.
# Cálculo manual de d de Cohen
stats <- innovaco |>
group_by(rotacion) |>
summarise(media = mean(satisfaccion_laboral),
sd = sd(satisfaccion_laboral),
n = n())
sd_pooled <- sqrt(
((stats$n[1] - 1) * stats$sd[1]^2 +
(stats$n[2] - 1) * stats$sd[2]^2) /
(stats$n[1] + stats$n[2] - 2)
)
d_cohen <- abs(diff(stats$media)) / sd_pooled
d_cohen
# Cálculo manual
n_total <- sum(tabla)
k <- min(nrow(tabla), ncol(tabla))
v_cramer <- sqrt(chi_res$statistic / (n_total * (k - 1)))
v_cramer
La propia correlación de Pearson (r) es un tamaño de efecto. También se puede convertir t a r:
| Medida | Pequeño | Mediano | Grande | Para qué prueba |
|---|---|---|---|---|
| d de Cohen | 0.20 | 0.50 | 0.80 | Prueba t, comparación de medias |
| r | 0.10 | 0.30 | 0.50 | Correlación |
| V de Cramér | 0.10 | 0.30 | 0.50 | Chi-cuadrado |
| η² (eta-cuadrado) | 0.01 | 0.06 | 0.14 | ANOVA |
| Odds Ratio | 1.5 | 2.5 | 4.3 | Regresión logística (equivalencias aproximadas) |
# Test de Shapiro-Wilk (máx ~5.000 obs)
shapiro.test(innovaco$satisfaccion_laboral)
# Visualización: QQ-plot
qqnorm(innovaco$satisfaccion_laboral)
qqline(innovaco$satisfaccion_laboral, col = "red")
# Con ggplot2
ggplot(innovaco, aes(sample = satisfaccion_laboral)) +
stat_qq() + stat_qq_line(color = "red")
# Test de Levene (requiere paquete car)
# car::leveneTest(satisfaccion_laboral ~ rotacion, data = innovaco)
# Alternativa rápida: comparar SDs por grupo
innovaco |>
group_by(rotacion) |>
summarise(sd = sd(satisfaccion_laboral))
# Si la razón SD_mayor / SD_menor < 2, está bien
| Variable dependiente | Variable independiente | Paramétrica | No paramétrica | Tamaño de efecto |
|---|---|---|---|---|
| Continua | Categórica (2 grupos) | t.test() | wilcox.test() | d de Cohen |
| Continua | Categórica (3+ grupos) | aov() | kruskal.test() | η² |
| Categórica | Categórica | chisq.test() | fisher.test() | V de Cramér |
| Continua | Continua | cor(method="pearson") | cor(method="spearman") | r / ρ |
| Continua (pre-post) | Tiempo (2 mediciones) | t.test(paired=TRUE) | wilcox.test(paired=TRUE) | d de Cohen |