El objetivo de este punto es elegir un predictor individual para estimar el ingreso mensual y justificar la elección mediante la interpretación económica y la validación cruzada.
Este resultado se limita a la base analizada. Una asociación estadística, por significativa que sea, no equivale a identificar el efecto causal de experiencia, antigüedad o género sobre el ingreso.
Pregunta de investigación. ¿En qué medida la experiencia laboral, la antigüedad en la empresa y el género se relacionan individualmente con el ingreso mensual de los empleados y cuál de estas variables permite la predicción simple más precisa?
Unidad de observación. Empleado. La estructura es de corte transversal: no se siguen los mismos empleados en diferentes periodos. La regresión se plantea como una herramienta ilustrativa para comparar magnitudes salariales en perfiles de una base de recursos humanos, no para decidir remuneraciones individuales reales.
Variable respuesta. monthly_income,
cuantitativa y expresada en las unidades monetarias reportadas por el
archivo. En el documento original, su escala se presenta como pesos,
aunque la plantilla de referencia advierte que deriva de una
multiplicación por 1.000 de valores de un conjunto sintético, sin
conversión cambiaria documentada. No se interpreta como una muestra
representativa de salarios de Colombia.
Predictores simples.
years_of_experience (años de experiencia laboral
acumulada), company_tenure (años en la empresa) y
gender (variable cualitativa binaria, niveles
M y F). La elección combina dos medidas de
trayectoria laboral con una comparación descriptiva de grupos. Los
resultados son asociaciones brutas, sin controlar
simultáneamente por cargo, formación o responsabilidades.
El archivo utilizado es
dataset_03_employee_income_and_job_characteristics.xlsx,
hoja employee_income. Contiene 1470 filas
y 24 variables originales. De estas se seleccionan
cuatro para el punto 1. El documento de partida identifica la base como
adaptación del conjunto sintético IBM HR Analytics Employee
Attrition & Performance. Por ello, el análisis es académico y
no acredita condiciones del mercado laboral colombiano.
tab(data.frame(
Variable=c("monthly_income", "years_of_experience", "company_tenure", "gender"),
Rol=c("Respuesta", "Explicativa S1", "Explicativa S2", "Explicativa S3"),
Tipo=c("Cuantitativa", "Cuantitativa discreta", "Cuantitativa discreta", "Cualitativa nominal binaria"),
Unidad=c("Unidades monetarias / mes", "Años", "Años", "M / F")
), caption="Variables elegidas y escala de medición")
| Variable | Rol | Tipo | Unidad |
|---|---|---|---|
| monthly_income | Respuesta | Cuantitativa | Unidades monetarias / mes |
| years_of_experience | Explicativa S1 | Cuantitativa discreta | Años |
| company_tenure | Explicativa S2 | Cuantitativa discreta | Años |
| gender | Explicativa S3 | Cualitativa nominal binaria | M / F |
control <- data.frame(
Verificacion=c("Filas originales", "Columnas originales", "Celdas faltantes en toda la base",
"Celdas faltantes en variables seleccionadas", "Filas idénticas (todas las columnas)",
"Filas idénticas (solo variables seleccionadas)", "Ingresos no positivos",
"Experiencia negativa", "Antigüedad negativa", "Antigüedad mayor que experiencia"),
Resultado=c(nrow(original), ncol(original), sum(is.na(original)),
sum(is.na(datos)), sum(duplicated(original)), sum(duplicated(datos)),
sum(datos$monthly_income <= 0), sum(datos$years_of_experience < 0),
sum(datos$company_tenure < 0),
sum(datos$company_tenure > datos$years_of_experience))
)
tab(control, caption="Auditoría básica de integridad y coherencia")
| Verificacion | Resultado |
|---|---|
| Filas originales | 1470 |
| Columnas originales | 24 |
| Celdas faltantes en toda la base | 0 |
| Celdas faltantes en variables seleccionadas | 0 |
| Filas idénticas (todas las columnas) | 0 |
| Filas idénticas (solo variables seleccionadas) | 3 |
| Ingresos no positivos | 0 |
| Experiencia negativa | 0 |
| Antigüedad negativa | 0 |
| Antigüedad mayor que experiencia | 0 |
nombres_tukey <- c(monthly_income="Ingreso mensual", years_of_experience="Experiencia",
company_tenure="Antigüedad")
atipicos <- do.call(rbind, lapply(names(nombres_tukey), function(v) {
x <- regla_tukey(datos[[v]])
data.frame(Variable=unname(nombres_tukey[v]),
Limite_inferior=unname(x["Limite_inferior"]),
Limite_superior=unname(x["Limite_superior"]),
Casos=as.integer(x["Observaciones"]))
}))
rownames(atipicos) <- NULL
atipicos_display <- atipicos
atipicos_display$Limite_inferior <- num(atipicos$Limite_inferior,0)
atipicos_display$Limite_superior <- num(atipicos$Limite_superior,0)
tab(atipicos_display, caption="Valores señalados mediante la regla de Tukey (1,5 × RIQ)")
| Variable | Limite_inferior | Limite_superior | Casos |
|---|---|---|---|
| Ingreso mensual | -5.291.000 | 16.581.000 | 114 |
| Experiencia | -8 | 28 | 63 |
| Antigüedad | -6 | 18 | 104 |
No se eliminan ni imputan registros: 1470 observaciones forman la muestra de análisis. La auditoría distingue duplicados completos de coincidencias en las cuatro variables elegidas; dos empleados pueden compartir salario, experiencia, antigüedad y género sin tratarse del mismo registro. Los casos señalados por la regla de Tukey son candidatos para revisión, no errores demostrados. En particular, los ingresos altos pueden corresponder a cargos directivos que no se incluyen como predictor en esta etapa. El análisis principal conserva esas observaciones para no truncar artificialmente la distribución salarial.
resumen <- rbind(
resumen_num(datos$monthly_income, "Ingreso mensual"),
resumen_num(datos$years_of_experience, "Experiencia (años)"),
resumen_num(datos$company_tenure, "Antigüedad (años)")
)
resumen_display <- resumen
for (v in c("Media", "Mediana", "DE", "Minimo", "Q1", "Q3", "Maximo")) {
resumen_display[[v]] <- num(resumen_display[[v]], if (v %in% c("Media","Mediana","DE")) 1 else 0)
}
tab(resumen_display, caption="Estadísticos descriptivos de las variables cuantitativas")
| Variable | N | Media | Mediana | DE | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|---|---|
| Ingreso mensual | 1470 | 6.502.931,3 | 4.919.000,0 | 4.707.956,8 | 1.009.000 | 2.911.000 | 8.379.000 | 19.999.000 |
| Experiencia (años) | 1470 | 11,3 | 10,0 | 7,8 | 0 | 6 | 15 | 40 |
| Antigüedad (años) | 1470 | 7,0 | 5,0 | 6,1 | 0 | 3 | 9 | 40 |
freq_gender <- as.data.frame(table(datos$gender), stringsAsFactors=FALSE)
names(freq_gender) <- c("Genero", "Frecuencia")
freq_gender$Proporcion <- paste0(num(100*freq_gender$Frecuencia/sum(freq_gender$Frecuencia),1), "%")
tab(freq_gender, caption="Distribución de género")
| Genero | Frecuencia | Proporcion |
|---|---|---|
| M | 882 | 60,0% |
| F | 588 | 40,0% |
El ingreso presenta una media de $6.502.931 y una mediana de $4.919.000. La media superior a la mediana apunta a una cola de ingresos altos. La mediana se conservará como referencia predictiva por ser resistente a observaciones extremas.
ggplot(datos, aes(x=monthly_income/1e6)) +
geom_histogram(bins=35, fill="#447B9B", color="white", linewidth=0.2) +
geom_vline(xintercept=median(datos$monthly_income)/1e6, linetype="dashed", color="#B45A4C") +
labs(x="Ingreso mensual (millones)", y="Número de empleados") +
theme_minimal(base_size=12)
Histograma de ingresos mensuales (millones de unidades monetarias).
ggplot(datos, aes(x="Empleados", y=monthly_income/1e6)) +
geom_boxplot(fill="#ADC7D8", width=0.40, outlier.alpha=0.35) +
labs(x=NULL, y="Ingreso mensual (millones)") +
theme_minimal(base_size=12)
Distribución e ingresos potencialmente atípicos según la regla gráfica del boxplot.
dat_larga <- rbind(
data.frame(Indicador="Experiencia laboral", Anios=datos$years_of_experience),
data.frame(Indicador="Antigüedad empresa", Anios=datos$company_tenure)
)
ggplot(dat_larga, aes(x=Anios)) +
geom_histogram(binwidth=2, fill="#447B9B", color="white", boundary=0) +
facet_wrap(~Indicador, scales="free_y") +
labs(x="Años", y="Número de empleados") +
theme_minimal(base_size=12)
Distribuciones de experiencia y antigüedad laboral.
dat_carrera <- rbind(
data.frame(Predictor="Experiencia laboral", Anios=datos$years_of_experience,
Ingreso=datos$monthly_income/1e6),
data.frame(Predictor="Antigüedad empresa", Anios=datos$company_tenure,
Ingreso=datos$monthly_income/1e6)
)
ggplot(dat_carrera, aes(x=Anios, y=Ingreso)) +
geom_point(alpha=0.25, size=0.8, color="#32556D") +
geom_smooth(method="lm", se=TRUE, color="#B45A4C", linewidth=0.9) +
facet_wrap(~Predictor, scales="free_x") +
labs(x="Años", y="Ingreso mensual (millones)") +
theme_minimal(base_size=12)
Dispersión entre ingreso, experiencia y antigüedad; rectas estimadas por MCO.
correlaciones <- data.frame(
Predictor=c("Experiencia laboral", "Antigüedad en la empresa"),
Pearson=c(cor(datos$monthly_income, datos$years_of_experience),
cor(datos$monthly_income, datos$company_tenure)),
Spearman=c(cor(datos$monthly_income, datos$years_of_experience, method="spearman"),
cor(datos$monthly_income, datos$company_tenure, method="spearman"))
)
tab(transform(correlaciones, Pearson=num(Pearson,3), Spearman=num(Spearman,3)),
caption="Correlaciones de Pearson y Spearman con ingreso mensual")
| Predictor | Pearson | Spearman |
|---|---|---|
| Experiencia laboral | 0,773 | 0,710 |
| Antigüedad en la empresa | 0,514 | 0,464 |
La correlación lineal de Pearson entre ingreso y experiencia es 0,773, frente a 0,514 con antigüedad. Estos coeficientes describen asociación entre variables, no efectos netos de mantener constantes otras características. Una correlación elevada tampoco demuestra que la relación sea causal ni que su forma sea exactamente lineal.
resumen_genero <- do.call(rbind, lapply(levels(datos$gender), function(g) {
x <- datos$monthly_income[datos$gender==g]
data.frame(Genero=g, N=length(x), Media=mean(x), Mediana=median(x), DE=sd(x))
}))
resumen_genero$Media <- money(resumen_genero$Media)
resumen_genero$Mediana <- money(resumen_genero$Mediana)
resumen_genero$DE <- money(resumen_genero$DE)
tab(resumen_genero, caption="Comparación descriptiva de ingresos mensuales por género")
| Genero | N | Media | Mediana | DE |
|---|---|---|---|---|
| M | 882 | $6.380.508 | $4.837.500 | $4.714.857 |
| F | 588 | $6.686.566 | $5.081.500 | $4.695.609 |
ggplot(datos, aes(x=gender, y=monthly_income/1e6, fill=gender)) +
geom_boxplot(width=0.5, alpha=0.75, show.legend=FALSE) +
scale_x_discrete(labels=c(M="Hombres (M)", F="Mujeres (F)")) +
scale_fill_manual(values=c(M="#547B9A", F="#B7A0B4")) +
labs(x="Género", y="Ingreso mensual (millones)") +
theme_minimal(base_size=12)
Distribución del ingreso por género, sin controles por cargo o experiencia.
La comparación entre grupos permite describir diferencias en la distribución de ingresos. No identifica una brecha salarial ajustada porque no separa las diferencias de cargo, responsabilidad, educación, experiencia ni jornada. Tampoco acredita discriminación.
Definición y utilidad. En regresión lineal simple se estima la media condicional de una respuesta a partir de un único predictor conceptual. Cuando el predictor es binario, el coeficiente de la categoría no referencial equivale a una diferencia de medias entre grupos.
Se estiman tres especificaciones independientes mediante mínimos cuadrados ordinarios (MCO):
F y \(F_i=0\) si es
M (referencia).En S1 y S2 se contrasta \(H_0:\beta_1=0\) frente a \(H_1:\beta_1\neq0\). En S3 se contrasta \(H_0:\beta_1=0\) frente a \(H_1:\beta_1\neq0\), lo que equivale a contrastar igualdad de medias en esta especificación simple.
coef_tab <- do.call(rbind, lapply(names(modelos), function(id) {
z <- summary(modelos[[id]])$coefficients
data.frame(Modelo=unname(model_names[id]), Termino=rownames(z),
Estimacion=z[,1], EE=z[,2], Estadistico_t=z[,3], Valor_p=z[,4],
row.names=NULL, check.names=FALSE)
}))
coef_display <- coef_tab
coef_display$Estimacion <- money(coef_display$Estimacion)
coef_display$EE <- money(coef_display$EE)
coef_display$Estadistico_t <- num(coef_display$Estadistico_t,3)
coef_display$Valor_p <- p_text(coef_display$Valor_p)
tab(coef_display, caption="Coeficientes y contraste t bilateral; errores estándar clásicos de MCO")
| Modelo | Termino | Estimacion | EE | Estadistico_t | Valor_p |
|---|---|---|---|---|---|
| S1: Experiencia | (Intercept) | $1.227.935 | $137.299 | 8,944 | <0,001 |
| S1: Experiencia | years_of_experience | $467.658 | $10.021 | 46,669 | <0,001 |
| S2: Antigüedad | (Intercept) | $3.733.273 | $160.091 | 23,320 | <0,001 |
| S2: Antigüedad | company_tenure | $395.205 | $17.201 | 22,976 | <0,001 |
| S3: Género | (Intercept) | $6.380.508 | $158.499 | 40,256 | <0,001 |
| S3: Género | genderF | $306.058 | $250.608 | 1,221 | 0,222 |
ajuste_tab <- do.call(rbind, lapply(names(modelos), function(id) {
s <- summary(modelos[[id]])
data.frame(Modelo=unname(model_names[id]),
R2=num(s$r.squared,4), R2_ajustado=num(s$adj.r.squared,4),
N=nobs(modelos[[id]]), row.names=NULL)
}))
tab(ajuste_tab, caption="Bondad de ajuste dentro de la muestra")
| Modelo | R2 | R2_ajustado | N |
|---|---|---|---|
| S1: Experiencia | 0,5974 | 0,5971 | 1470 |
| S2: Antigüedad | 0,2645 | 0,2640 | 1470 |
| S3: Género | 0,0010 | 0,0003 | 1470 |
S1: Experiencia laboral. La pendiente estimada indica que cada año adicional de experiencia se asocia con una diferencia promedio de $467.658 en el ingreso mensual, en una comparación transversal sin controlar por otras características laborales.
El modelo explica el 59,74 % de la variabilidad muestral de los ingresos (\(R^2\)). El valor p del coeficiente de experiencia es <0,001; por tanto, se rechaza H0 al 5 %.
S2: Antigüedad en la empresa. Cada año adicional de antigüedad se asocia con una diferencia promedio estimada de $395.205 en el ingreso mensual, sin controlar por otras características laborales.
El modelo presenta un coeficiente de determinación de $R^2 = $ 0,2645, mientras que el valor p de la pendiente es <0,001; por tanto, se rechaza H0 al 5 %.
La pendiente no debe interpretarse como el incremento salarial que recibiría un empleado por permanecer un año adicional en la empresa, ya que el modelo identifica una asociación estadística y no un efecto causal.
S3: Género. Tomando el grupo M como
categoría de referencia, la constante representa su ingreso mensual
promedio estimado: $6.380.508.
El coeficiente correspondiente al grupo F es **\(306.058** y representa la diferencia bruta de
ingresos medios entre ambos grupos (\)F-M$).
El modelo presenta un coeficiente de determinación de $R^2 = $ 0,0010, mientras que el valor p del coeficiente de género es 0,222; por tanto, no se rechaza H0 al 5 %.
No rechazar la hipótesis de igualdad de medias no demuestra que los ingresos sean iguales entre ambos grupos. Asimismo, rechazarla no constituye evidencia suficiente para afirmar que existe discriminación salarial, puesto que el modelo no controla por otras características relevantes.
En conjunto, los tres modelos permiten identificar asociaciones estadísticas individuales con el ingreso mensual.
Definición y utilidad. La validación cruzada de cinco particiones (5-fold cross-validation) predice registros no utilizados para estimar cada ajuste. Todos los candidatos usan las mismas particiones, estratificadas por género, y la semilla 2026. El error absoluto medio (MAE) se calcula en las unidades originales de ingreso:
\[ MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i-\hat y_i|. \]
La referencia predice para cada pliegue únicamente la mediana del ingreso del entrenamiento. Así se evita calcular esa referencia con los ingresos de los registros evaluados.
validacion <- cv_summary
validacion$MAE <- money(validacion$MAE)
validacion$DE_pliegues <- money(validacion$DE_pliegues)
validacion <- rbind(validacion,
data.frame(Modelo="Referencia: mediana", MAE=money(mae_referencia),
DE_pliegues="No aplica"))
tab(validacion, caption="Errores fuera de muestra mediante 5-fold CV; DE entre pliegues orientativa")
| Modelo | MAE | DE_pliegues |
|---|---|---|
| S1: Experiencia | $2.220.214 | $131.615 |
| S2: Antigüedad | $2.962.965 | $251.298 |
| S3: Género | $3.635.559 | $266.837 |
| Referencia: mediana | $3.350.557 | No aplica |
datos_graf <- rbind(cv_summary[,c("Modelo","MAE")],
data.frame(Modelo="Referencia: mediana", MAE=mae_referencia))
ggplot(datos_graf, aes(x=reorder(Modelo,MAE), y=MAE/1e6)) +
geom_col(fill="#447B9B", width=0.65) +
coord_flip() +
labs(x=NULL, y="MAE de validación (millones de unidades monetarias)") +
theme_minimal(base_size=12)
Comparación de MAE: menor es mejor; predicciones fuera del pliegue de entrenamiento.
Selección. El mejor de los tres modelos simples es S1: Experiencia, con MAE $2.220.214. La mejora relativa frente a la referencia de mediana es 33,7 %. La elección se apoya en precisión predictiva, utilidad económica del predictor e interpretación de su coeficiente; no se basa únicamente en la significancia ni en el \(R^2\) observado dentro de la muestra.
Alcance de la comparación. Una variable puede presentar una relación estadísticamente significativa con el ingreso y, aun así, tener escaso valor predictivo para empleados no usados durante el ajuste. Esta validación interna no garantiza rendimiento en otras empresas, periodos o mercados laborales.
La exploración identifica diferencias de ingresos asociadas con trayectoria laboral y diferencias descriptivas por género, pero los tres modelos son simples y, por tanto, no controlan las demás características de los empleados. La evidencia se interpreta como asociación transversal, no causalidad.
El criterio predictivo favorece S1: Experiencia entre los tres candidatos estudiados. Este resultado constituye una línea base para la siguiente etapa del caso; no se estiman aquí regresiones múltiples, selección AIC, diagnósticos completos ni escenarios de predicción.