El presente análisis tiene como objetivo cuantificar y modelar la relación económica entre los años de experiencia laboral de un trabajador y su salario mensual (en miles de pesos colombianos). Comprender cómo cada año adicional de experiencia influye en la remuneración es fundamental para la gestión del talento humano, la negociación salarial y la planeación de políticas de compensación en las organizaciones.
Se plantean las siguientes hipótesis estadísticas:
Hipótesis Nula (H₀): No existe una relación lineal significativa entre los años de experiencia y el salario. Es decir, \(\beta_1 = 0\).
Hipótesis Alternativa (H₁): Existe una relación lineal positiva y significativa entre los años de experiencia y el salario. Es decir, \(\beta_1 \neq 0\).
Desde una perspectiva económica, se espera que a mayor número de años de experiencia, mayor sea el salario del trabajador, dado que la experiencia acumulada incrementa la productividad y el valor de mercado del empleado.
# Fijar semilla para reproducibilidad
set.seed(2024)
n <- 150 # Número de observaciones
# Variable Independiente: años de experiencia (de 0 a 30 años)
experiencia <- round(runif(n, min = 0, max = 30), 1)
# Variable Dependiente: salario mensual (miles de COP)
# Relación lineal real: salario = 1800 + 120 * experiencia + ruido
salario <- 1800 + 120 * experiencia + rnorm(n, mean = 0, sd = 350)
# Añadir algunos valores atípicos realistas (empleados con salarios excepcionalmente altos)
salario[c(5, 42, 118)] <- salario[c(5, 42, 118)] + c(2500, 1800, 3000)
# Agregar variables adicionales para el modelo múltiple
nivel_educativo <- sample(1:4, n, replace = TRUE,
prob = c(0.15, 0.35, 0.35, 0.15))
# 1=Bachiller, 2=Técnico, 3=Universitario, 4=Posgrado
horas_semanales <- round(rnorm(n, mean = 45, sd = 7))
horas_semanales <- pmax(pmin(horas_semanales, 70), 30) # Entre 30 y 70 horas
num_capacitaciones <- rpois(n, lambda = 3)
# Ajustar salario según educación (más realista)
salario <- salario + nivel_educativo * 200 + num_capacitaciones * 50
salario <- round(pmax(salario, 900), 0) # Mínimo 900 mil COP
# Construir data frame
dt <- data.frame(
salario = salario,
experiencia = experiencia,
nivel_educativo = nivel_educativo,
horas_semanales = horas_semanales,
num_capacitaciones = num_capacitaciones
)
# Definición de variables principales
x <- dt$experiencia
y <- dt$salario
# Vista previa
head(dt, 10)experiencia (Eje X)| Atributo | Detalle |
|---|---|
| Nombre | experiencia |
| Descripción | Años de experiencia laboral acumulada del trabajador |
| Unidad | Años (valor continuo de 0 a 30) |
| Rol estadístico | Variable Independiente / Predictora / Exógena |
| Justificación | La experiencia es el factor “causa”: a mayor trayectoria laboral, mayor dominio técnico y mayor valor en el mercado laboral, lo que se traduce en mayor remuneración |
salario (Eje Y)| Atributo | Detalle |
|---|---|
| Nombre | salario |
| Descripción | Salario mensual del trabajador |
| Unidad | Miles de pesos colombianos (miles COP) |
| Rol estadístico | Variable Dependiente / Respuesta / Endógena |
| Justificación | El salario es el “efecto” que se desea predecir y explicar en función de la experiencia acumulada |
| Variable | Descripción | Escala |
|---|---|---|
nivel_educativo |
Nivel de formación (1=Bachiller, 2=Técnico, 3=Universitario, 4=Posgrado) | Ordinal (1–4) |
horas_semanales |
Horas de trabajo por semana | Continua (30–70) |
num_capacitaciones |
Número de capacitaciones recibidas | Discreta (≥ 0) |
## salario experiencia nivel_educativo horas_semanales
## Min. :1500 Min. : 0.00 Min. :1.00 Min. :30.00
## 1st Qu.:3419 1st Qu.: 7.50 1st Qu.:2.00 1st Qu.:41.00
## Median :4337 Median :14.65 Median :3.00 Median :45.00
## Mean :4308 Mean :14.69 Mean :2.64 Mean :45.55
## 3rd Qu.:5230 3rd Qu.:21.57 3rd Qu.:3.00 3rd Qu.:50.00
## Max. :7793 Max. :29.90 Max. :4.00 Max. :66.00
## num_capacitaciones
## Min. :0.000
## 1st Qu.:2.000
## Median :3.000
## Mean :2.867
## 3rd Qu.:4.000
## Max. :8.000
par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
boxplot(x,
main = "Distribución: Experiencia (X)",
col = "#AED6F1",
ylab = "Años",
border = "#1A5276")
boxplot(y,
main = "Distribución: Salario (Y)",
col = "#A9DFBF",
ylab = "Miles de COP",
border = "#1E8449")Interpretación: Los puntos fuera de los bigotes representan valores atípicos (outliers): trabajadores con salarios excepcionalmente altos respecto a su nivel de experiencia (directivos, especialistas con habilidades únicas, etc.). Se conservan porque reflejan la realidad del mercado laboral.
library(ggplot2)
ggplot(dt, aes(x = experiencia, y = salario)) +
geom_point(color = "#2C3E50", size = 2.5, alpha = 0.6) +
geom_smooth(method = "lm", color = "#E74C3C", se = TRUE, linewidth = 1.2) +
labs(
title = "Relación entre Experiencia Laboral y Salario Mensual",
subtitle = "Línea de regresión OLS con intervalo de confianza al 95%",
x = "Años de Experiencia (X)",
y = "Salario Mensual — miles COP (Y)"
) +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray50"))Interpretación: La nube de puntos presenta una tendencia ascendente clara de izquierda a derecha, evidenciando una correlación positiva: a más años de experiencia, mayor salario mensual. La banda gris alrededor de la recta representa el intervalo de confianza al 95%.
## === Prueba de Shapiro-Wilk ===
## Variable X (experiencia):
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.94765, p-value = 2.099e-05
##
## Variable Y (salario):
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.98881, p-value = 0.2749
Criterio de decisión:
- p-value > 0.05 → No se rechaza H₀ → los datos siguen distribución normal → usar Pearson.
- p-value ≤ 0.05 → Se rechaza H₀ → los datos no son normales → usar Spearman o Kendall.
##
## Pearson's product-moment correlation
##
## data: x and y
## t = 23.591, df = 148, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8495286 0.9182524
## sample estimates:
## cor
## 0.888785
Interpretación: El coeficiente de Pearson (\(r\)) mide la fuerza y dirección de la relación lineal entre experiencia y salario. Un valor positivo y significativo (p < 0.05) confirma que la relación existe y tiene sentido económico.
##
## Spearman's rank correlation rho
##
## data: x and y
## S = 51213, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.9089505
Interpretación: Spearman trabaja con los rangos de los datos, siendo robusto ante los valores atípicos detectados en el boxplot. Si su valor es similar al de Pearson, confirma que la relación es robusta y no está distorsionada por los outliers.
##
## Kendall's rank correlation tau
##
## data: x and y
## z = 13.774, p-value < 2.2e-16
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## 0.7598056
Interpretación: Kendall cuenta pares concordantes y discordantes. Es el más robusto de los tres y refuerza la conclusión cuando coincide con los anteriores.
tabla_cor <- data.frame(
Método = c("Pearson (r)", "Spearman (ρ)", "Kendall (τ)"),
Coeficiente = round(c(pearson$estimate,
spearman$estimate,
kendall$estimate), 4),
P_valor = formatC(c(pearson$p.value,
spearman$p.value,
kendall$p.value),
format = "e", digits = 3),
Interpretacion = c(
ifelse(abs(pearson$estimate) > 0.7, "Fuerte",
ifelse(abs(pearson$estimate) > 0.4, "Moderada", "Débil")),
ifelse(abs(spearman$estimate) > 0.7, "Fuerte",
ifelse(abs(spearman$estimate) > 0.4, "Moderada", "Débil")),
ifelse(abs(kendall$estimate) > 0.7, "Fuerte",
ifelse(abs(kendall$estimate) > 0.4, "Moderada", "Débil"))
),
Significativo = ifelse(
c(pearson$p.value, spearman$p.value, kendall$p.value) < 0.05,
"Sí ✓", "No ✗")
)
knitr::kable(tabla_cor,
caption = "Resumen comparativo de métodos de correlación",
align = "c")| Método | Coeficiente | P_valor | Interpretacion | Significativo | |
|---|---|---|---|---|---|
| cor | Pearson (r) | 0.8888 | 5.250e-52 | Fuerte | Sí ✓ |
| rho | Spearman (ρ) | 0.9090 | 4.191e-58 | Fuerte | Sí ✓ |
| tau | Kendall (τ) | 0.7598 | 3.649e-43 | Fuerte | Sí ✓ |
Conclusión de correlación: La consistencia entre los tres métodos confirma que la relación entre experiencia laboral y salario es positiva, estadísticamente significativa (p < 0.05) y robusta. Todos los coeficientes apuntan en la misma dirección, lo que justifica construir un modelo de regresión.
##
## Call:
## lm(formula = salario ~ experiencia, data = dt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1167.60 -312.99 -60.08 289.24 3006.36
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2609.815 84.024 31.06 <2e-16 ***
## experiencia 115.565 4.899 23.59 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 531.1 on 148 degrees of freedom
## Multiple R-squared: 0.7899, Adjusted R-squared: 0.7885
## F-statistic: 556.6 on 1 and 148 DF, p-value: < 2.2e-16
La ecuación ajustada del modelo es:
\[\hat{Y} = \hat{\beta}_0 + \hat{\beta}_1 \cdot X\]
\[\widehat{salario} = \hat{\beta}_0 + \hat{\beta}_1 \cdot experiencia\]
b0 <- round(coef(modelo_simple)[1], 2)
b1 <- round(coef(modelo_simple)[2], 2)
cat(sprintf("Ecuación ajustada:\n\n salario = %.2f + %.2f × experiencia\n\n", b0, b1))## Ecuación ajustada:
##
## salario = 2609.82 + 115.57 × experiencia
## Interpretación:
cat(sprintf(" β₀ = %.2f → Salario estimado para un trabajador sin experiencia (0 años): $%.2f miles COP\n", b0, b0))## β₀ = 2609.82 → Salario estimado para un trabajador sin experiencia (0 años): $2609.82 miles COP
cat(sprintf(" β₁ = %.2f → Por cada año adicional de experiencia, el salario aumenta en promedio $%.2f miles COP\n", b1, b1))## β₁ = 115.57 → Por cada año adicional de experiencia, el salario aumenta en promedio $115.57 miles COP
Interpretación de parámetros:
- β₀ (Intercepto): Salario base estimado para un trabajador recién ingresado al mercado laboral (0 años de experiencia).
- β₁ (Pendiente): Incremento salarial promedio por cada año adicional de experiencia. Este es el parámetro más relevante del modelo.
# Intervalos de confianza al 95% para los coeficientes
cat("Intervalos de confianza al 95% para los coeficientes:\n")## Intervalos de confianza al 95% para los coeficientes:
## 2.5 % 97.5 %
## (Intercept) 2443.773 2775.8578
## experiencia 105.885 125.2455
##
## Tabla ANOVA del modelo:
r2 <- summary(modelo_simple)$r.squared
r2_adj <- summary(modelo_simple)$adj.r.squared
fstat <- summary(modelo_simple)$fstatistic
cat(sprintf("\nR² = %.4f → El modelo explica el %.2f%% de la variabilidad del salario.\n",
r2, r2 * 100))##
## R² = 0.7899 → El modelo explica el 78.99% de la variabilidad del salario.
## R² ajustado = 0.7885
## Estadístico F = 556.56 (p < 0.05 indica modelo globalmente significativo)
Interpretación del R²: El porcentaje de variabilidad del salario explicado por la experiencia. El valor restante corresponde a factores no capturados por el modelo simple (educación, sector económico, habilidades específicas, etc.).
Para que las estimaciones del modelo sean óptimas, lineales e insesgadas (MELI/BLUE), deben cumplirse los cinco supuestos de Gauss-Markov.
plot(modelo_simple, which = 1,
main = "Supuesto 1 — Linealidad: Residuos vs Valores Ajustados",
col = "#2C3E50", pch = 16, cex = 0.7)
abline(h = 0, col = "red", lty = 2, lwd = 1.5)Criterio: Si la línea de suavizado roja es aproximadamente horizontal y sin patrones curvos alrededor de cero, el supuesto de linealidad se cumple. Un patrón en forma de “U” o curva indicaría una relación no lineal.
## === Prueba de Durbin-Watson ===
##
## Durbin-Watson test
##
## data: modelo_simple
## DW = 2.0324, p-value = 0.5815
## alternative hypothesis: true autocorrelation is greater than 0
##
## Estadístico DW = 2.0324
if (dw$statistic > 1.5 & dw$statistic < 2.5) {
cat("→ DW ≈ 2: No hay evidencia de autocorrelación. Supuesto CUMPLIDO ✓\n")
} else {
cat("→ DW se aleja de 2: posible autocorrelación. Supuesto en REVISIÓN ✗\n")
}## → DW ≈ 2: No hay evidencia de autocorrelación. Supuesto CUMPLIDO ✓
Criterio:
- DW ≈ 2 y p-value > 0.05 → No hay autocorrelación → supuesto cumplido ✓
- DW < 1.5 → Autocorrelación positiva
- DW > 2.5 → Autocorrelación negativa
## === Prueba de Breusch-Pagan ===
##
## studentized Breusch-Pagan test
##
## data: modelo_simple
## BP = 0.67647, df = 1, p-value = 0.4108
##
## p-value = 0.4108
if (bp$p.value > 0.05) {
cat("→ p > 0.05: La varianza de los errores es CONSTANTE (homocedasticidad). Supuesto CUMPLIDO ✓\n")
} else {
cat("→ p ≤ 0.05: Existe heterocedasticidad (varianza no constante). Supuesto NO CUMPLIDO ✗\n")
}## → p > 0.05: La varianza de los errores es CONSTANTE (homocedasticidad). Supuesto CUMPLIDO ✓
# Gráfico complementario
plot(modelo_simple, which = 3,
main = "Supuesto 3 — Homocedasticidad: Scale-Location",
col = "#2C3E50", pch = 16, cex = 0.7)Criterio (Breusch-Pagan):
- p-value > 0.05 → Varianza constante → homocedasticidad ✓
- p-value ≤ 0.05 → Varianza no constante → heterocedasticidad ✗
residuos <- residuals(modelo_simple)
media_resid <- mean(residuos)
cat(sprintf("Media de los residuos: %.12f\n", media_resid))## Media de los residuos: -0.000000000000
cat("→ La media es prácticamente cero: resultado algebraico garantizado por mínimos cuadrados (OLS). Supuesto CUMPLIDO ✓\n")## → La media es prácticamente cero: resultado algebraico garantizado por mínimos cuadrados (OLS). Supuesto CUMPLIDO ✓
Conclusión: En todo modelo OLS, la suma (y por tanto la media) de los residuos es exactamente cero por construcción matemática. Este supuesto siempre se cumple automáticamente.
par(mfrow = c(1, 2))
# Q-Q Plot
plot(modelo_simple, which = 2,
main = "Q-Q Plot de Residuos",
col = "#2C3E50", pch = 16, cex = 0.7)
# Histograma de residuos con curva normal superpuesta
h <- hist(residuos, breaks = 25, col = "#AED6F1", border = "white",
main = "Histograma de Residuos", xlab = "Residuos", ylab = "Frecuencia",
probability = FALSE)
curve(dnorm(x, mean = mean(residuos), sd = sd(residuos)) *
length(residuos) * diff(h$breaks)[1],
add = TRUE, col = "#E74C3C", lwd = 2)par(mfrow = c(1, 1))
# Prueba formal
sw_resid <- shapiro.test(residuos)
cat("=== Shapiro-Wilk sobre Residuos ===\n")## === Shapiro-Wilk sobre Residuos ===
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.84896, p-value = 4.061e-11
if (sw_resid$p.value > 0.05) {
cat("→ p > 0.05: Los residuos siguen una distribución normal. Supuesto CUMPLIDO ✓\n")
} else {
cat("→ p ≤ 0.05: Los residuos NO son normales. Supuesto NO CUMPLIDO ✗\n")
}## → p ≤ 0.05: Los residuos NO son normales. Supuesto NO CUMPLIDO ✗
| N | Supuesto | Herramienta | Resultado | Estado |
|---|---|---|---|---|
| i | Linealidad | Gráfico Residuos vs Ajustados | Evaluar gráficamente | Verificar gráfico |
| ii | Independencia de errores | Prueba Durbin-Watson | DW = 2.032 | CUMPLIDO ✓ |
| iii | Homocedasticidad | Prueba Breusch-Pagan | p = 0.4108 | CUMPLIDO ✓ |
| iv | Media cero del error | Cálculo directo OLS | Media = -1.36e-15 | CUMPLIDO ✓ |
| v | Normalidad de residuos | Q-Q Plot + Shapiro-Wilk | p = 0.0000 | REVISAR ✗ |
El modelo múltiple incorpora las variables adicionales disponibles:
\[\widehat{salario} = \beta_0 + \beta_1 \cdot experiencia + \beta_2 \cdot nivel\_educativo + \beta_3 \cdot horas\_semanales + \beta_4 \cdot num\_capacitaciones + \varepsilon\]
modelo_multiple <- lm(salario ~ experiencia + nivel_educativo +
horas_semanales + num_capacitaciones,
data = dt)
summary(modelo_multiple)##
## Call:
## lm(formula = salario ~ experiencia + nivel_educativo + horas_semanales +
## num_capacitaciones, data = dt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1111.4 -279.8 -48.9 217.8 3057.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2127.7574 319.2009 6.666 5.12e-10 ***
## experiencia 115.7348 4.7768 24.228 < 2e-16 ***
## nivel_educativo 141.1226 43.8291 3.220 0.00158 **
## horas_semanales 0.0588 6.1687 0.010 0.99241
## num_capacitaciones 36.3925 27.3927 1.329 0.18608
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 515.7 on 145 degrees of freedom
## Multiple R-squared: 0.806, Adjusted R-squared: 0.8006
## F-statistic: 150.6 on 4 and 145 DF, p-value: < 2.2e-16
## Ecuación ajustada del modelo múltiple:
## salario = 2127.76
## + 115.73 × experiencia
## + 141.12 × nivel_educativo
## + 0.06 × horas_semanales
## + 36.39 × num_capacitaciones
coef_tabla <- as.data.frame(summary(modelo_multiple)$coefficients)
coef_tabla$Significativo <- ifelse(coef_tabla[, 4] < 0.001, "*** (p<0.001)",
ifelse(coef_tabla[, 4] < 0.01, "** (p<0.01)",
ifelse(coef_tabla[, 4] < 0.05, "* (p<0.05)",
"No significativo")))
colnames(coef_tabla) <- c("Estimado", "Error Estándar", "Valor t", "p-valor", "Significancia")
knitr::kable(round(coef_tabla[, 1:4], 4),
caption = "Coeficientes del modelo de regresión lineal múltiple")| Estimado | Error Estándar | Valor t | p-valor | |
|---|---|---|---|---|
| (Intercept) | 2127.7574 | 319.2009 | 6.6659 | 0.0000 |
| experiencia | 115.7348 | 4.7768 | 24.2285 | 0.0000 |
| nivel_educativo | 141.1226 | 43.8291 | 3.2198 | 0.0016 |
| horas_semanales | 0.0588 | 6.1687 | 0.0095 | 0.9924 |
| num_capacitaciones | 36.3925 | 27.3927 | 1.3285 | 0.1861 |
r2_m <- summary(modelo_multiple)$r.squared
r2_m_adj <- summary(modelo_multiple)$adj.r.squared
cat(sprintf("R² = %.4f → El modelo explica el %.2f%% de la variabilidad del salario.\n",
r2_m, r2_m * 100))## R² = 0.8060 → El modelo explica el 80.60% de la variabilidad del salario.
## R² ajustado = 0.8006
##
## Mejora en R² respecto al modelo simple: +1.60%
## Intervalos de confianza al 95% — Modelo Múltiple:
## 2.5 % 97.5 %
## (Intercept) 1496.86976 2758.64511
## experiencia 106.29363 125.17595
## nivel_educativo 54.49610 227.74907
## horas_semanales -12.13345 12.25105
## num_capacitaciones -17.74802 90.53311
Interpretación de variables predictoras:
- Variables con p < 0.05: estadísticamente significativas, aportan información real al modelo.
- Variables con p ≥ 0.05: no tienen suficiente evidencia de influencia sobre el salario en este dataset y son candidatas a eliminarse.
- El R² ajustado penaliza la complejidad: si mejora al agregar una variable, ésta es realmente útil.
El AIC penaliza la complejidad del modelo para evitar el sobreajuste. La fórmula es:
\[AIC = 2k - 2\ln(\hat{L})\]
Donde \(k\) es el número de parámetros estimados y \(\hat{L}\) es la verosimilitud máxima. Un AIC menor indica mejor equilibrio entre ajuste y parsimonia.
aic_simple <- AIC(modelo_simple)
aic_multiple <- AIC(modelo_multiple)
cat(sprintf("AIC Modelo Simple (1 predictora): %.4f\n", aic_simple))## AIC Modelo Simple (1 predictora): 2312.1454
## AIC Modelo Múltiple (4 predictoras): 2306.2481
## Diferencia (Múltiple − Simple): -5.8974
if (aic_multiple < aic_simple) {
cat("→ El modelo MÚLTIPLE tiene menor AIC: incluir las variables adicionales\n mejora el ajuste sin sobreajustar. Se prefiere el modelo múltiple.\n")
} else {
cat("→ El modelo SIMPLE tiene menor AIC: las variables adicionales no aportan\n suficiente información. Se prefiere el modelo simple.\n")
}## → El modelo MÚLTIPLE tiene menor AIC: incluir las variables adicionales
## mejora el ajuste sin sobreajustar. Se prefiere el modelo múltiple.
# Stepwise bidireccional: evalúa adición y eliminación de variables
modelo_step <- step(modelo_multiple, direction = "both", trace = 1)## Start: AIC=1878.57
## salario ~ experiencia + nivel_educativo + horas_semanales + num_capacitaciones
##
## Df Sum of Sq RSS AIC
## - horas_semanales 1 24 38560765 1876.6
## - num_capacitaciones 1 469389 39030130 1878.4
## <none> 38560741 1878.6
## - nivel_educativo 1 2757052 41317793 1886.9
## - experiencia 1 156109865 194670606 2119.4
##
## Step: AIC=1876.57
## salario ~ experiencia + nivel_educativo + num_capacitaciones
##
## Df Sum of Sq RSS AIC
## - num_capacitaciones 1 487054 39047819 1876.5
## <none> 38560765 1876.6
## + horas_semanales 1 24 38560741 1878.6
## - nivel_educativo 1 2757231 41317996 1884.9
## - experiencia 1 157310701 195871466 2118.3
##
## Step: AIC=1876.45
## salario ~ experiencia + nivel_educativo
##
## Df Sum of Sq RSS AIC
## <none> 39047819 1876.5
## + num_capacitaciones 1 487054 38560765 1876.6
## + horas_semanales 1 17689 39030130 1878.4
## - nivel_educativo 1 2695959 41743777 1884.5
## - experiencia 1 156950042 195997861 2116.4
##
## === Modelo final seleccionado por Stepwise AIC ===
##
## Call:
## lm(formula = salario ~ experiencia + nivel_educativo, data = dt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1217.96 -277.36 -69.87 232.81 3095.53
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2241.718 141.419 15.852 < 2e-16 ***
## experiencia 115.555 4.754 24.308 < 2e-16 ***
## nivel_educativo 139.488 43.785 3.186 0.00176 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 515.4 on 147 degrees of freedom
## Multiple R-squared: 0.8035, Adjusted R-squared: 0.8008
## F-statistic: 300.6 on 2 and 147 DF, p-value: < 2.2e-16
##
## AIC Modelo Stepwise: 2304.1309
modelos_lista <- list(
"Simple (experiencia)" = modelo_simple,
"Múltiple (4 predictoras)" = modelo_multiple,
"Stepwise / AIC óptimo" = modelo_step
)
tabla_final <- data.frame(
Modelo = names(modelos_lista),
N_parametros = sapply(modelos_lista, function(m) length(coef(m))),
R2 = round(sapply(modelos_lista, function(m) summary(m)$r.squared), 4),
R2_Ajustado = round(sapply(modelos_lista, function(m) summary(m)$adj.r.squared), 4),
AIC = round(sapply(modelos_lista, AIC), 2),
BIC = round(sapply(modelos_lista, BIC), 2)
)
# Marcar el modelo ganador
tabla_final$Seleccionado <- ifelse(
tabla_final$AIC == min(tabla_final$AIC), "★ Mejor AIC", "")
knitr::kable(tabla_final,
col.names = c("Modelo", "# Parámetros", "R²", "R² Ajustado",
"AIC", "BIC", ""),
caption = "Comparación de modelos por AIC, BIC y R²",
align = c("l","c","c","c","c","c","c"))| Modelo | # Parámetros | R² | R² Ajustado | AIC | BIC | ||
|---|---|---|---|---|---|---|---|
| Simple (experiencia) | Simple (experiencia) | 2 | 0.7899 | 0.7885 | 2312.15 | 2321.18 | |
| Múltiple (4 predictoras) | Múltiple (4 predictoras) | 5 | 0.8060 | 0.8006 | 2306.25 | 2324.31 | |
| Stepwise / AIC óptimo | Stepwise / AIC óptimo | 3 | 0.8035 | 0.8008 | 2304.13 | 2316.17 | ★ Mejor AIC |
Criterio de selección: Se elige el modelo con menor AIC (y BIC como criterio complementario). Si el Stepwise selecciona el modelo múltiple completo, todas las variables son relevantes. Si elimina alguna, esa variable no aportaba suficiente información para justificar su complejidad adicional.
library(ggplot2)
dt$predicho_simple <- predict(modelo_simple)
dt$predicho_multiple <- predict(modelo_multiple)
ggplot(dt, aes(x = salario)) +
geom_point(aes(y = predicho_simple, color = "Modelo Simple"),
alpha = 0.5, size = 2) +
geom_point(aes(y = predicho_multiple, color = "Modelo Múltiple"),
alpha = 0.5, size = 2) +
geom_abline(slope = 1, intercept = 0, color = "black",
linetype = "dashed", linewidth = 1) +
scale_color_manual(values = c("Modelo Simple" = "#E74C3C",
"Modelo Múltiple" = "#2980B9")) +
labs(title = "Valores Reales vs Predichos por cada Modelo",
subtitle = "La línea diagonal perfecta (y = x) indica predicción exacta",
x = "Salario Real (miles COP)",
y = "Salario Predicho (miles COP)",
color = "Modelo") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray50"),
legend.position = "bottom")Interpretación: Los puntos más cercanos a la línea diagonal punteada representan predicciones más precisas. El modelo múltiple (azul) debería acercarse más a la línea que el modelo simple (rojo), indicando mayor capacidad predictiva.
1. Correlación: Existe una relación positiva y estadísticamente significativa entre los años de experiencia y el salario mensual. Los tres métodos (Pearson, Spearman, Kendall) coinciden en la misma conclusión, confirmando que la relación es robusta incluso ante la presencia de valores atípicos.
2. Modelo de Regresión Simple: La ecuación ajustada
salario = β₀ + β₁ × experiencia indica que por cada año
adicional de experiencia, el salario aumenta en promedio 115.57 miles de
pesos colombianos. El modelo simple explica el 79% de la variabilidad
salarial.
3. Supuestos de Gauss-Markov: Se verificaron los cinco supuestos del modelo: linealidad (evaluada gráficamente), independencia de errores (Durbin-Watson), homocedasticidad (Breusch-Pagan), media cero del error (garantizado por OLS) y normalidad de residuos (Shapiro-Wilk y Q-Q Plot).
4. Modelo Múltiple: La incorporación de variables adicionales (nivel educativo, horas semanales y número de capacitaciones) aumenta el poder explicativo del modelo al 80.6%, lo que confirma que el salario es un fenómeno multidimensional que no puede explicarse únicamente por la experiencia.
5. Selección AIC: El criterio de Akaike identifica el modelo más parsimonioso. El modelo seleccionado por el método Stepwise ofrece el mejor equilibrio entre complejidad y capacidad explicativa, siendo la recomendación final para uso predictivo.
Informe generado con R Markdown | Análisis Estadístico Económico — Salario vs Experiencia Laboral