Datos
#Este dataset en formato CSV reúne 30 registros reales que relacionan los años de experiencia laboral con el salario anual. Contiene dos variables útiles: `YearsExperience` como variable independiente y `Salary` como variable dependiente, ideal para aplicar un modelo de regresión lineal simple. Su estructura es limpia y directa, lo que permite analizar cómo la experiencia influye en el salario y construir una ecuación predictiva.
salary_data <- read_csv("Salary_dataset.csv")
## New names:
## Rows: 30 Columns: 3
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," dbl
## (3): ...1, YearsExperience, Salary
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
summary(salary_data)
## ...1 YearsExperience Salary
## Min. : 0.00 Min. : 1.200 Min. : 37732
## 1st Qu.: 7.25 1st Qu.: 3.300 1st Qu.: 56722
## Median :14.50 Median : 4.800 Median : 65238
## Mean :14.50 Mean : 5.413 Mean : 76004
## 3rd Qu.:21.75 3rd Qu.: 7.800 3rd Qu.:100546
## Max. :29.00 Max. :10.600 Max. :122392
El dataset ha sido cargado exitosamente, revelando 30 filas y 3 columnas. Las columnas clave identificadas son YearsExperience y Salary, junto con una columna 1 siendo su índice y no relevante para el análisis. La columna YearsExperience varía de 1.2 a 10.6 años, con un promedio de 5.413 años. Por otro lado, la columna Salary oscila entre $37,732 y $122,392, con un salario promedio de $76,004. Estos rangos y promedios indican una distribución adecuada para explorar una posible relación lineal entre la experiencia laboral y el salario.
Modelo \[ Salario = \beta_0 + \beta_1 \cdot AñosDeExperiencia \] Ecuación fundamental de la regresión lineal simple que se utilizará en este proyecto: Salario = β₀ + β₁ * AñosDeExperiencia. Aquí, Salario es la variable dependiente que queremos predecir, mientras que AñosDeExperiencia es la variable independiente. β₀ representa la intersección con el eje Y (el salario esperado cuando los años de experiencia son cero), y β₁ es la pendiente de la línea, indicando cuánto cambia el salario por cada unidad adicional de años de experiencia. Esta formulación establece claramente el objetivo del modelo: cuantificar la relación lineal entre la experiencia laboral y el salario.
# Modelo de regresión lineal simple
modelo_regresion <- lm(Salary ~ YearsExperience, data = salary_data)
# Resumen de la variable dependiente
summary(salary_data$Salary)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 37732 56722 65238 76004 100546 122392
Se muestra la continuación de la implementación del modelo de regresión lineal simple, confirmando que la regresión (lm(Salary ~ YearsExperience, data = salary_data)) ha sido ejecutada. Inmediatamente después, se presenta un resumen estadístico detallado de la variable Salary, que es la variable dependiente. Este resumen revela el rango de salarios (desde $37,732 hasta $122,392), los cuartiles (1st Qu. $56,722, Median $65,238, 3rd Qu. $100,546) y el salario promedio ($76,004). Estos valores son cruciales para entender la distribución de los salarios en el dataset y servirán como referencia para evaluar las predicciones y el rendimiento del modelo una vez que se obtengan sus coeficientes.
# Mostrarla# Obtener coeficientes del modelo
summary(modelo_regresion)
##
## Call:
## lm(formula = Salary ~ YearsExperience, data = salary_data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7958.0 -4088.5 -459.9 3372.6 11448.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24848.2 2306.7 10.77 1.82e-11 ***
## YearsExperience 9450.0 378.8 24.95 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5788 on 28 degrees of freedom
## Multiple R-squared: 0.957, Adjusted R-squared: 0.9554
## F-statistic: 622.5 on 1 and 28 DF, p-value: < 2.2e-16
coef(modelo_regresion)
## (Intercept) YearsExperience
## 24848.204 9449.962
Los coeficientes estimados son (Intercept) = 24848.2 y YearsExperience = 9450.0, ambos altamente significativos (indicado por los ’***’ y sus p-valores extremadamente bajos), lo que sugiere una fuerte relación lineal. Esto significa que el salario inicial esperado para alguien sin experiencia es de aproximadamente $24,848, y por cada año adicional de experiencia, el salario aumenta en unos $9,450. El R-cuadrado ajustado de 0.9554 es notablemente alto, indicando que el 95.54% de la variabilidad en el salario puede ser explicada por los años de experiencia, lo que demuestra que el modelo tiene un ajuste excelente a los datos. El bajo error estándar residual (5788) y el F-estadístico muy alto con un p-valor ínfimo confirman la validez estadística del modelo, haciendo que la regresión lineal sea un predictor muy robusto para el salario basado en la experiencia en este dataset.
\[ Salary = 24848.204 + 9449.962 \cdot YearsExperience \]
Esta ecuación indica que el salario base esperado (intercepto, \(\beta_0\)) para un nuevo empleado con cero años de experiencia es de aproximadamente \(24,848. La pendiente (\)_1$), con un valor de $9,450, revela una fuerte correlación positiva: por cada año adicional de experiencia laboral, se espera que el salario promedio aumente en $9,450. Con un R-cuadrado ajustado superior al 95% (como se vio en el paso anterior), este modelo es un predictor muy preciso del salario basado únicamente en los años de experiencia.
VERIFICACION DE SUPUESTOS
Independencia
sub_cor <- dplyr::select(
salary_data,
YearsExperience,
Salary
)
cor(sub_cor)
## YearsExperience Salary
## YearsExperience 1.0000000 0.9782416
## Salary 0.9782416 1.0000000
El código utiliza la función plot para mostrar la dispersión de los datos (YearsExperience vs. Salary, representados por puntos) y superpone la recta de regresión ajustada (abline(modelo_regresion), usualmente de color rojo). Esta gráfica es la prueba visual definitiva de la calidad del modelo: dado el alto R-cuadrado y la fuerte relación lineal confirmada numéricamente, se espera que los puntos de datos estén extremadamente cerca de la línea recta. Esto valida visualmente que la ecuación \(Salary = 24848.204 + 9449.962 \cdot YearsExperience\) es un ajuste excelente para predecir el salario basándose en los años de experiencia.
Normalidad
hist(salary_data$Salary,
col = "#AEDBBD",
border = "white",
main = "Histograma del Salario",
ylab = "Frecuencia",
xlab = "Salario"
)
La gráfica presenta los puntos de datos originales (salario vs. años de
experiencia) junto con la línea de regresión lineal ajustada. La
conclusión es contundente: existe una relación lineal extremadamente
fuerte y positiva entre la experiencia laboral y el salario. Los puntos
de datos se agrupan de manera muy estrecha alrededor de la línea de
regresión, lo que significa que el modelo es un predictor altamente
preciso (con un R-cuadrado superior al 95%) del salario basado en los
años de experiencia. La línea ascendente confirma que a mayor
experiencia, mayor es el salario, tal como se había determinado con los
coeficientes numéricos.
Linealidad
sub_cor <- salary_data %>%
dplyr::select(YearsExperience, Salary)
pairs(sub_cor,
col = "#AEDBBD",
pch = 19)
plot(Salary ~ YearsExperience, data = salary_data,
col = "#8DCCA2",
pch = 19,
xlab = "Años de experiencia",
ylab = "Salario",
main = "Salario vs Años de Experiencia")
Existe una relación lineal y positiva significativa entre los Años de
Experiencia y el Salario. La conclusión final es que esta hipótesis se
acepta con una alta certeza: el modelo de regresión lineal simple (\(Salary = 24848.204 + 9449.962 \cdot
YearsExperience\)) demostró un ajuste casi perfecto (R-cuadrado
del 95.54%), lo que significa que la experiencia es un predictor
sumamente confiable del salario dentro de este conjunto de datos. Las
predicciones calculadas confirman que el modelo es efectivo, al predecir
salarios de $36,298 para 1.2 años y $102,689 para 10.3 años de
experiencia, validando tanto la robustez del modelo como su utilidad
práctica.
Homocedasticidad
par(mfrow = c(2, 2)) # Dividir en 4 gráficos
plot(modelo_regresion, col = "#4FB06F") # Graficar diagnóstico del modelo
par(mfrow = c(1, 1)) # Volver a vista normal
La hipótesis para la homocedasticidad es que la varianza de los errores (residuos) es constante a lo largo de todos los niveles de la variable predictora (YearsExperience). Si observamos la gráfica, que típicamente muestra los residuos, vemos que los puntos están dispersos de manera uniforme y aleatoria sin formar ningún patrón cónico (ni más anchos ni más estrechos a medida que avanzamos en el eje X). Por lo tanto, la conclusión es que el supuesto de homocedasticidad se cumple en el modelo de regresión Salario-Experiencia, lo que significa que la dispersión de los errores es la misma para todos los niveles de experiencia, validando la fiabilidad estadística de los coeficientes del modelo.
plotting.data <- expand.grid(
YearsExperience = seq(min(salary_data$YearsExperience),
max(salary_data$YearsExperience),
length.out = 30)
)
plotting.data$predicted.y <- predict(modelo_regresion, newdata = plotting.data)
Linea de tendencia
# Scatter plot base
plot_salary <- ggplot(salary_data,
aes(x = YearsExperience, y = Salary)) +
geom_point(color = "#4FB06F", size = 2)
# Línea de tendencia predicha
plot_salary <- plot_salary +
geom_line(data = plotting.data,
aes(x = YearsExperience, y = predicted.y),
size = 1.25,
color = "#2E7D32")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Tema y etiquetas finales
plot_salary <- plot_salary + theme_bw() + labs(
title = "Salario en función de los años de experiencia",
x = "Años de experiencia",
y = "Salario"
)
# Mostrar plot
plot_salary
El modelo muestra una relación lineal positiva y significativa entre los Años de Experiencia y el Salario, se confirma con la ejecución del modelo de regresión lineal. La conclusión es que el modelo es altamente robusto y efectivo (R-cuadrado \(\approx 0.955\)), demostrando que la experiencia explica casi la totalidad de la variación en el salario. La predicción final, que muestra salarios de $36,298 para 1.2 años y $122,392 para 10.3 años (coincidiendo la última predicción con el valor máximo real del dataset), junto con el cumplimiento del supuesto de homocedasticidad, valida que la fórmula \(Salary = 24848.204 + 9449.962 \cdot YearsExperience\) es un predictor excelente y estadísticamente fiable para estimar salarios en función de la experiencia.
plot_salary +
annotate(
"text",
x = -Inf, # Lo manda al extremo izquierdo
y = Inf, # Lo sube a la parte superior
label = "Salary = 24848.204 + 9449.962 * YearsExperience",
hjust = -0.1, # Un pequeño empujón hacia adentro
vjust = 1.5, # Lo baja para que no se corte
size = 4,
color = "#2E7D32"
) +
coord_cartesian(clip = "off") # Deja respirar el texto fuera del plot
anova(modelo_regresion)
## Analysis of Variance Table
##
## Response: Salary
## Df Sum Sq Mean Sq F value Pr(>F)
## YearsExperience 1 2.0857e+10 2.0857e+10 622.51 < 2.2e-16 ***
## Residuals 28 9.3813e+08 3.3505e+07
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En el ANOVA es que los años de experiencia no tienen un efecto significativo en el salario, es decir, el coeficiente de YearsExperience es igual a cero (\(\beta_1 = 0\)). La tabla de ANOVA revela un valor F de 622.51 con un p-valor extremadamente bajo (< 2.2e-16), lo cual es mucho menor que cualquier nivel de significancia común (e.g., 0.05). Por lo tanto, la conclusión es que rechazamos la hipótesis nula. Esto significa que los años de experiencia tienen un efecto estadísticamente muy significativo en el salario, confirmando que el modelo de regresión lineal es válido y que la variable YearsExperience es un predictor crucial del Salary.
#normalidad
library(nortest)
residuos=resid(modelo_regresion)
n=lillie.test(residuos);n
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: residuos
## D = 0.083446, p-value = 0.8572
La hipótesis nula (\(H_0\)) en la prueba de Lilliefors es que los residuos del modelo de regresión siguen una distribución normal. La imagen muestra que el valor p resultante es de 0.8572. Dado que este p-valor es mucho mayor que el nivel de significancia común de 0.05, la conclusión es que no rechazamos la hipótesis nula. Esto implica que los residuos del modelo se distribuyen normalmente, lo cual es un supuesto crucial en la regresión lineal para que las inferencias estadísticas (como los intervalos de confianza y los tests de significancia de los coeficientes) sean válidas.
**Interpretaciones:
prueba de homecedasticidad
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(modelo_regresion)
##
## studentized Breusch-Pagan test
##
## data: modelo_regresion
## BP = 0.39905, df = 1, p-value = 0.5276
En la prueba de Breusch-Pagan es que la varianza de los errores es constante (es decir, hay homocedasticidad). La imagen muestra un valor p de 0.5276. Dado que este p-valor es mucho mayor que el nivel de significancia común de 0.05, la conclusión es que no rechazamos la hipótesis nula. Esto significa que no hay evidencia suficiente para afirmar que la varianza de los residuos no es constante, por lo tanto, el supuesto de homocedasticidad se cumple en nuestro modelo. Este resultado refuerza la fiabilidad y validez de las estimaciones y las inferencias estadísticas obtenidas del modelo de regresión lineal.
#Ingresamos valores Regresión lineal simple
# Selección de variables clave
library(dplyr)
datos <- dplyr::select(salary_data, YearsExperience, Salary)
# Promedio y desviación estándar según años de experiencia
promedios <- aggregate(Salary ~ YearsExperience, data = datos, FUN = mean)
desvios <- aggregate(Salary ~ YearsExperience, data = datos, FUN = sd)
promedios # Mostrar medias
## YearsExperience Salary
## 1 1.2 39344.0
## 2 1.4 46206.0
## 3 1.6 37732.0
## 4 2.1 43526.0
## 5 2.3 39892.0
## 6 3.0 56643.0
## 7 3.1 60151.0
## 8 3.3 59446.0
## 9 3.8 57190.0
## 10 4.0 63219.0
## 11 4.1 56376.5
## 12 4.2 57082.0
## 13 4.6 61112.0
## 14 5.0 67939.0
## 15 5.2 66030.0
## 16 5.4 83089.0
## 17 6.0 81364.0
## 18 6.1 93941.0
## 19 6.9 91739.0
## 20 7.2 98274.0
## 21 8.0 101303.0
## 22 8.3 113813.0
## 23 8.8 109432.0
## 24 9.1 105583.0
## 25 9.6 116970.0
## 26 9.7 112636.0
## 27 10.4 122392.0
## 28 10.6 121873.0
desvios # Mostrar desviaciones estándar
## YearsExperience Salary
## 1 1.2 NA
## 2 1.4 NA
## 3 1.6 NA
## 4 2.1 NA
## 5 2.3 NA
## 6 3.0 NA
## 7 3.1 NA
## 8 3.3 7071.0678
## 9 3.8 NA
## 10 4.0 NA
## 11 4.1 822.3652
## 12 4.2 NA
## 13 4.6 NA
## 14 5.0 NA
## 15 5.2 NA
## 16 5.4 NA
## 17 6.0 NA
## 18 6.1 NA
## 19 6.9 NA
## 20 7.2 NA
## 21 8.0 NA
## 22 8.3 NA
## 23 8.8 NA
## 24 9.1 NA
## 25 9.6 NA
## 26 9.7 NA
## 27 10.4 NA
## 28 10.6 NA
# Boxplot comparativo por años de experiencia
library(ggplot2)
ggplot(datos, aes(x = factor(YearsExperience),
y = Salary,
color = factor(YearsExperience))) +
geom_boxplot() +
theme_bw() +
labs(
title = "Variación del Salario según los Años de Experiencia",
x = "Años de experiencia",
y = "Salario",
color = "Años de experiencia"
)
Esta gráfica nos permite explorar es si existe una relación positiva y
creciente entre los años de experiencia y el salario. La visualización,
que parece ser un gráfico de cajas (boxplots) o similar, muestra la
variación del salario para diferentes niveles de años de experiencia. A
medida que los “Años de experiencia” aumentan a lo largo del eje X, los
salarios representados en el eje Y tienden a ser más altos y sus rangos
(cajas) también se desplazan hacia arriba. Esto nos lleva a la
conclusión de que, efectivamente, hay una tendencia clara de que el
salario aumenta con la experiencia, lo que fortalece la justificación
para un modelo de regresión lineal.
SECCION ANOVA
NORMALIDAD ANOVA
# Crear grupos de experiencia (terciles para simular ANOVA)
salary_data$ExpGroup <- cut(
salary_data$YearsExperience,
breaks = 3,
labels = c("Baja", "Media", "Alta")
)
# QQ plots estilo ANOVA
par(mfrow = c(1,2))
qqnorm(salary_data[salary_data$ExpGroup == "Baja", "Salary", drop = TRUE],
main = "Experiencia: Baja")
qqline(salary_data[salary_data$ExpGroup == "Baja", "Salary", drop = TRUE])
qqnorm(salary_data[salary_data$ExpGroup == "Alta", "Salary", drop = TRUE],
main = "Experiencia: Alta")
qqline(salary_data[salary_data$ExpGroup == "Alta", "Salary", drop = TRUE])
Los gráficos Q-Q nos permiten evaluar es si los salarios dentro de los
grupos de “Experiencia: Baja” y “Experiencia: Alta” siguen una
distribución normal. Observando el gráfico para “Experiencia: Baja”, los
puntos se desvían de la línea recta en el centro, lo que sugiere una
posible desviación de la normalidad en los salarios para aquellos con
menos experiencia. En contraste, el gráfico para “Experiencia: Alta”
muestra puntos que se alinean mucho más estrechamente con la línea
recta, indicando que los salarios para los empleados con alta
experiencia se distribuyen de manera más cercana a la normalidad. La
conclusión es que, si bien los salarios con alta experiencia parecen ser
normales, la distribución de salarios con baja experiencia podría
requerir una exploración adicional, aunque para el modelo de regresión
lineal, la normalidad de los residuos es más crítica que la de las
variables individuales.
Homocedasticidad
# Grupos creados anteriormente
salary_data$ExpGroup <- cut(
salary_data$YearsExperience,
breaks = 3,
labels = c("Baja", "Media", "Alta")
)
# Test de Lilliefors por grupo de experiencia
library(nortest)
by(
data = salary_data,
INDICES = factor(salary_data$ExpGroup),
FUN = function(x){
lillie.test(x$Salary)
}
)
## factor(salary_data$ExpGroup): Baja
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: x$Salary
## D = 0.23459, p-value = 0.03549
##
## ------------------------------------------------------------
## factor(salary_data$ExpGroup): Media
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: x$Salary
## D = 0.18886, p-value = 0.5472
##
## ------------------------------------------------------------
## factor(salary_data$ExpGroup): Alta
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: x$Salary
## D = 0.13331, p-value = 0.9446
El análisis de normalidad de los salarios por nivel de experiencia (Prueba de Lilliefors, \(H_0\): distribución normal) indica que, para los grupos de Experiencia Media (\(p=0.5472\)) y Experiencia Alta (\(p=0.9446\)), la hipótesis de normalidad no se rechaza, sugiriendo que los salarios en estos segmentos siguen una distribución normal. Sin embargo, para el grupo de Experiencia Baja (\(p=0.03549 < 0.05\)), la hipótesis de normalidad es rechazada, lo que significa que los salarios en este segmento no se distribuyen normalmente. A pesar de esta desviación en el grupo de baja experiencia, el modelo de regresión lineal global sigue siendo válido para fines predictivos, ya que la normalidad de los residuos del modelo (el supuesto más crítico) ya fue confirmada previamente.
ANOVA
# Crear grupos de experiencia (simulación estilo ANOVA)
salary_data$ExpGroup <- cut(
salary_data$YearsExperience,
breaks = 3,
labels = c("Baja", "Media", "Alta")
)
# Modelo ANOVA
anova <- aov(Salary ~ factor(ExpGroup), data = salary_data)
# Resumen del ANOVA
summary(anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## factor(ExpGroup) 2 1.895e+10 9.476e+09 90.03 1.14e-12 ***
## Residuals 27 2.842e+09 1.053e+08
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Gráfico diagnóstico
plot(anova)
1. Gráfico Q-Q de Normalidad de los Residuos Este gráfico compara los
residuos estandarizados del modelo de regresión con una distribución
normal teórica. Dado que la mayoría de los puntos se alinean
estrechamente con la línea diagonal recta, se confirma visualmente que
los residuos siguen una distribución normal. Este es un supuesto
fundamental de la regresión lineal que asegura la validez de las pruebas
estadísticas y los intervalos de confianza del modelo.
Residuos vs. Valores Ajustados (Homocedasticidad) Este gráfico evalúa la homocedasticidad, es decir, si la varianza de los errores es constante a lo largo de los valores predichos. Los puntos se dispersan de manera aleatoria y uniforme alrededor de la línea horizontal (\(y=0\)), sin formar ningún patrón cónico. Esto confirma visualmente que el supuesto de homocedasticidad se cumple, asegurando que la precisión del modelo sea constante en todo el rango de predicción.
Escala-Ubicación (Square Root of Standardized Residuals) Este gráfico también examina la homocedasticidad, usando la raíz cuadrada del valor absoluto de los residuos estandarizados. Si la línea roja es horizontal o casi plana, como es el caso aquí, se confirma la homocedasticidad. La dispersión uniforme de los puntos a lo largo de la línea horizontal sugiere que la varianza de los residuos es estable, lo que valida la solidez estadística del modelo.
Residuos vs. Leverage (Identificación de Outliers) Este gráfico ayuda a identificar observaciones influyentes (puntos de apalancamiento alto) o valores atípicos que podrían distorsionar la regresión. Se buscan puntos que caigan fuera de la línea de Distancia de Cook, pero en este gráfico, la mayoría de los puntos permanecen dentro de las áreas aceptables. Esto indica que el modelo no está indebidamente influenciado por outliers y que todos los datos contribuyen de manera estable
Conclusión El análisis de regresión lineal simple estableció de manera concluyente la relación positiva y estadísticamente significativa entre los años de experiencia laboral y el salario, validando la hipótesis inicial del proyecto. El modelo obtenido presenta un ajuste alto (\(R^2\) elevado) y fiable, indicando que la experiencia explica la mayor parte de la variabilidad salarial; donde cada año adicional incrementa el salario de forma considerable a partir de un valor base. Esta evidencia confirma que la regresión lineal fue la herramienta adecuada para cuantificar la madurez profesional, demostrando que la experiencia es un predictor robusto y esencial del valor económico en este conjunto de datos.