1 1. Descripción del Problema e Hipótesis

1.1 Contexto del Problema

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.

1.2 Hipótesis del Estudio

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.


2 2. Descripción de las Variables

# 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)

2.1 Variable Independiente — 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

2.2 Variable Dependiente — 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

2.3 Variables Adicionales (Modelo Múltiple)

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)

2.4 Estadísticas Descriptivas

summary(dt)
##     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

3 3. Correlación: Gráficos y Prueba de Shapiro-Wilk

3.1 Análisis Exploratorio Visual

3.1.1 Diagramas de Cajas y Bigotes (Boxplot)

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")

par(mfrow = c(1, 1))

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.


3.1.2 Diagrama de Dispersión

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%.


3.2 Prueba de Normalidad de Shapiro-Wilk

sw_x <- shapiro.test(x)
sw_y <- shapiro.test(y)

cat("=== Prueba de Shapiro-Wilk ===\n\n")
## === Prueba de Shapiro-Wilk ===
cat("Variable X (experiencia):\n")
## Variable X (experiencia):
print(sw_x)
## 
##  Shapiro-Wilk normality test
## 
## data:  x
## W = 0.94765, p-value = 2.099e-05
cat("\nVariable Y (salario):\n")
## 
## Variable Y (salario):
print(sw_y)
## 
##  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.

3.3 Cálculo de Coeficientes de Correlación

3.3.1 Correlación de Pearson

pearson <- cor.test(x, y, method = "pearson", use = "complete.obs")
pearson
## 
##  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.

3.3.2 Correlación de Spearman

spearman <- cor.test(x, y, method = "spearman", use = "complete.obs")
spearman
## 
##  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.

3.3.3 Correlación de Kendall

kendall <- cor.test(x, y, method = "kendall", use = "complete.obs")
kendall
## 
##  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.

3.3.4 Tabla Resumen de Correlaciones

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")
Resumen comparativo de métodos de correlación
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.


4 4. Modelo de Regresión Lineal Simple

4.1 4a. Ecuación del Modelo

modelo_simple <- lm(salario ~ experiencia, data = dt)
summary(modelo_simple)
## 
## 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
cat(sprintf("Interpretación:\n"))
## 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.

4.2 4b. Análisis 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:
confint(modelo_simple, level = 0.95)
##                2.5 %    97.5 %
## (Intercept) 2443.773 2775.8578
## experiencia  105.885  125.2455
# Tabla ANOVA del modelo
cat("\nTabla ANOVA del modelo:\n")
## 
## Tabla ANOVA del modelo:
anova(modelo_simple)
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.
cat(sprintf("R² ajustado = %.4f\n", r2_adj))
## R² ajustado = 0.7885
cat(sprintf("Estadístico F = %.2f  (p < 0.05 indica modelo globalmente significativo)\n",
            fstat[1]))
## 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.).


4.3 4c. Evaluación del Modelo — Supuestos de Gauss-Markov

Para que las estimaciones del modelo sean óptimas, lineales e insesgadas (MELI/BLUE), deben cumplirse los cinco supuestos de Gauss-Markov.

4.3.1 Gráficos de Diagnóstico

par(mfrow = c(2, 2))
plot(modelo_simple,
     col  = "#2C3E50",
     pch  = 16,
     cex  = 0.7,
     id.n = 3)

par(mfrow = c(1, 1))

4.3.2 Supuesto i: Linealidad

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.


4.3.3 Supuesto ii: Independencia de los Errores (Durbin-Watson)

library(lmtest)

dw <- dwtest(modelo_simple)
cat("=== Prueba de Durbin-Watson ===\n")
## === Prueba de Durbin-Watson ===
print(dw)
## 
##  Durbin-Watson test
## 
## data:  modelo_simple
## DW = 2.0324, p-value = 0.5815
## alternative hypothesis: true autocorrelation is greater than 0
cat(sprintf("\nEstadístico DW = %.4f\n", dw$statistic))
## 
## 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

4.3.4 Supuesto iii: Homocedasticidad (Breusch-Pagan)

bp <- bptest(modelo_simple)
cat("=== Prueba de Breusch-Pagan ===\n")
## === Prueba de Breusch-Pagan ===
print(bp)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_simple
## BP = 0.67647, df = 1, p-value = 0.4108
cat(sprintf("\np-value = %.4f\n", bp$p.value))
## 
## 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 ✗

4.3.5 Supuesto iv: Media Cero del Error

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.


4.3.6 Supuesto v: Normalidad de los Residuos

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 ===
print(sw_resid)
## 
##  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 ✗

4.3.7 Tabla Resumen de Supuestos

Validación de supuestos de Gauss-Markov
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 ✗

5 5. Modelo de Regresión Lineal Múltiple

5.1 5a. Ecuación del Modelo

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
b <- round(coef(modelo_multiple), 2)
cat("Ecuación ajustada del modelo múltiple:\n\n")
## Ecuación ajustada del modelo múltiple:
cat(sprintf("  salario = %.2f\n", b[1]))
##   salario = 2127.76
cat(sprintf("           + %.2f × experiencia\n", b[2]))
##            + 115.73 × experiencia
cat(sprintf("           + %.2f × nivel_educativo\n", b[3]))
##            + 141.12 × nivel_educativo
cat(sprintf("           + %.2f × horas_semanales\n", b[4]))
##            + 0.06 × horas_semanales
cat(sprintf("           + %.2f × num_capacitaciones\n", b[5]))
##            + 36.39 × num_capacitaciones

5.2 5b. Análisis del Modelo — Revisión de Variables Predictoras

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")
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.
cat(sprintf("R² ajustado  = %.4f\n", r2_m_adj))
## R² ajustado  = 0.8006
cat(sprintf("\nMejora en R² respecto al modelo simple: +%.2f%%\n",
            (r2_m - r2) * 100))
## 
## Mejora en R² respecto al modelo simple: +1.60%
cat("Intervalos de confianza al 95% — Modelo Múltiple:\n")
## Intervalos de confianza al 95% — Modelo Múltiple:
confint(modelo_multiple)
##                         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.

6 6. Selección del Modelo — Criterio de Información de Akaike (AIC)

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.

6.1 Comparación Directa Simple vs Múltiple

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
cat(sprintf("AIC Modelo Múltiple (4 predictoras):  %.4f\n", aic_multiple))
## AIC Modelo Múltiple (4 predictoras):  2306.2481
cat(sprintf("Diferencia (Múltiple − Simple):       %.4f\n\n", aic_multiple - aic_simple))
## 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.

6.2 Selección Automática por Stepwise (AIC)

# 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
cat("\n=== Modelo final seleccionado por Stepwise AIC ===\n")
## 
## === Modelo final seleccionado por Stepwise AIC ===
summary(modelo_step)
## 
## 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
cat(sprintf("\nAIC Modelo Stepwise: %.4f\n", AIC(modelo_step)))
## 
## AIC Modelo Stepwise: 2304.1309

6.3 Tabla Comparativa Final

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"))
Comparación de modelos por AIC, BIC y R²
Modelo # Parámetros 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.

6.4 Visualización: Valores Reales vs Predichos

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.


7 Conclusiones Generales

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