Informe del Proyecto: Predicción del Salario en Jugadores de Béisbol Curso: Métodos de Aprendizaje de Máquinas en Bioestadística Autor: John Jairo Prado Piñeres – Javier Esteban Santamaria Ovalle
El conjunto de datos Hitters se obtuvo originalmente de la biblioteca StatLib, mantenida por la Universidad Carnegie Mellon. Fue utilizado en la sesión de pósteres de la Sección Gráfica de la American Statistical Association (ASA) en 1988 y ha sido ampliamente adoptado en el ámbito académico para la enseñanza y aplicación de técnicas estadísticas. La información salarial proviene de la revista Sports Illustrated, en su edición del 20 de abril de 1987, mientras que las estadísticas de la temporada 1986 y de la carrera de los jugadores fueron tomadas de la Actualización de la Enciclopedia de Béisbol de 1987, publicada por Collier Books, Macmillan Publishing Company, Nueva York.
Este conjunto de datos es particularmente valioso porque reúne variables cuantitativas y cualitativas relacionadas con el rendimiento deportivo de los jugadores de béisbol de las Grandes Ligas, lo que permite explorar la relación entre desempeño individual y compensación económica. Por su riqueza informativa, ha sido utilizado extensamente en literatura estadística, incluyendo el reconocido libro An Introduction to Statistical Learning (ISLR), donde se emplea para ilustrar técnicas como la regresión lineal, Ridge, Lasso y selección de variables.
En el presente informe, se utilizará este conjunto de datos para predecir el salario de los bateadores en función de sus estadísticas individuales de rendimiento. Este problema se realiza con el fin de observar cómo los métodos de aprendizaje estadístico pueden aplicarse a datos reales para obtener modelos predictivos robustos y útiles en contextos prácticos, como el análisis de decisiones salariales en el ámbito deportivo profesional.
Predecir el salario de los jugadores de béisbol de las Grandes Ligas empleando el conjunto de datos “Hitters” del paquete ISLR en R utilizando técnicas de aprendizaje automático supervisado, dado que el salario es una variable continua, el problema se plantea como un modelo de regresión.
El análisis busca determinar si es posible estimar el salario de un jugador a partir de sus características y estadísticas de juego, lo cual puede tener aplicaciones en la toma de decisiones de equipos, agentes y analistas deportivos.
El dataset contiene más de 300 registros, de los cuales se utilizan aquellos con información completa para el análisis (después de imputación). Cada registro representa un jugador, e incluye variables como:
Variable | Descripción |
---|---|
AtBat |
Número de veces que el jugador ha tenido un turno al bate |
Hits |
Número de veces que el jugador ha golpeado la pelota y ha alcanzado la base de forma segura |
HmRun |
Número de jonrones que el jugador ha conseguido |
Runs |
Número de veces que el jugador ha anotado una carrera |
RBI |
Número de carreras que el jugador ha impulsado |
Walks |
Número de veces que el jugador ha recibido una base por bolas |
Years |
Número de años que el jugador ha jugado en las Grandes Ligas |
CAtBat |
Total de turnos al bate que el jugador ha tenido a lo largo de su carrera |
CHits |
Total de hits que el jugador ha conseguido a lo largo de su carrera |
CHmRun |
Total de jonrones que el jugador ha conseguido a lo largo de su carrera |
CRuns |
Total de carreras que el jugador ha anotado a lo largo de su carrera |
CRBI |
Total de carreras impulsadas que el jugador ha conseguido a lo largo de su carrera |
CWalks |
Total de bases por bolas que el jugador ha recibido a lo largo de su carrera |
League |
Liga en la que el jugador juega (A = Liga Americana, N = Liga Nacional) |
Division |
División en la que el jugador juega (E = Este, W = Oeste) |
PutOuts |
Número de outs que el jugador ha realizado (generalmente atribuible a un primera base) |
Assists |
Número de asistencias realizadas por el jugador |
Errors |
Número de errores cometidos por el jugador |
Salary |
Salario del jugador (en miles de dólares) |
NewLeague |
Liga en la que el jugador ha comenzado a jugar después de cambiarse (A = Liga Americana, N = Liga Nacional) |
#########################################################
# INSTALACIÓN DE PAQUETES
#########################################################
#🔧 **1. Cargar paquetes necesarios**
# Instalación de paquetes si no están ya instalados
paquetes <- c("tidyverse", "patchwork", "readxl", "gdata", "caret", "glmnet", "randomForest", "MASS", "e1071", "FNN", "rpart", "rpart.plot", "corrplot", "pheatmap", "gbm")
nuevos_paquetes <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
if(length(nuevos_paquetes)) install.packages(nuevos_paquetes)
# Cargar librerías
lapply(paquetes, library, character.only = TRUE)
Rows: 322
Columns: 20
$ AtBat <dbl> 293, 315, 479, 496, 321, 594, 185, 298, 323, 401, 574, 202, …
$ Hits <dbl> 66, 81, 130, 141, 87, 169, 37, 73, 81, 92, 159, 53, 113, 60,…
$ HmRun <dbl> 1, 7, 18, 20, 10, 4, 1, 0, 6, 17, 21, 4, 13, 0, 7, 3, 20, 2,…
$ Runs <dbl> 30, 24, 66, 65, 39, 74, 23, 24, 26, 49, 107, 31, 48, 30, 29,…
$ RBI <dbl> 29, 38, 72, 78, 42, 51, 8, 24, 32, 66, 75, 26, 61, 11, 27, 1…
$ Walks <dbl> 14, 39, 76, 37, 30, 35, 21, 7, 8, 65, 59, 27, 47, 22, 30, 11…
$ Years <dbl> 1, 14, 3, 11, 2, 11, 2, 3, 2, 13, 10, 9, 4, 6, 13, 3, 15, 5,…
$ CAtBat <dbl> 293, 3449, 1624, 5628, 396, 4408, 214, 509, 341, 5206, 4631,…
$ CHits <dbl> 66, 835, 457, 1575, 101, 1133, 42, 108, 86, 1332, 1300, 467,…
$ CHmRun <dbl> 1, 69, 63, 225, 12, 19, 1, 0, 6, 253, 90, 15, 41, 4, 36, 3, …
$ CRuns <dbl> 30, 321, 224, 828, 48, 501, 30, 41, 32, 784, 702, 192, 205, …
$ CRBI <dbl> 29, 414, 266, 838, 46, 336, 9, 37, 34, 890, 504, 186, 204, 1…
$ CWalks <dbl> 14, 375, 263, 354, 33, 194, 24, 12, 8, 866, 488, 161, 203, 2…
$ League <chr> "A", "N", "A", "N", "N", "A", "N", "A", "N", "A", "A", "N", …
$ Division <chr> "E", "W", "W", "E", "E", "W", "E", "W", "W", "E", "E", "W", …
$ PutOuts <dbl> 446, 632, 880, 200, 805, 282, 76, 121, 143, 0, 238, 304, 211…
$ Assists <dbl> 33, 43, 82, 11, 40, 421, 127, 283, 290, 0, 445, 45, 11, 151,…
$ Errors <dbl> 20, 10, 14, 3, 4, 25, 7, 9, 19, 0, 22, 11, 7, 6, 8, 0, 10, 1…
$ Salary <dbl> NA, 475.000, 480.000, 500.000, 91.500, 750.000, 70.000, 100.…
$ NewLeague <chr> "A", "N", "A", "N", "N", "A", "A", "A", "N", "A", "A", "N", …
AtBat Hits HmRun Runs RBI Walks Years CAtBat
0 0 0 0 0 0 0 0
CHits CHmRun CRuns CRBI CWalks League Division PutOuts
0 0 0 0 0 0 0 0
Assists Errors Salary NewLeague
0 0 59 0
AtBat Hits HmRun Runs RBI Walks Years CAtBat
0 0 0 0 0 0 0 0
CHits CHmRun CRuns CRBI CWalks League Division PutOuts
0 0 0 0 0 0 0 0
Assists Errors Salary NewLeague
0 0 0 0
El conjunto de datos tiene 322 observaciones (filas) y 20 variables (columnas).
Cada observación corresponde a un jugador de béisbol con información de su rendimiento y salario.
La mayoría de las variables en el dataset son numéricas (numeric), como AtBat, Hits, HmRun, Runs, RBI, Salary, etc. Estas variables representan valores cuantitativos relacionados con el rendimiento del jugador.
Algunas variables son de tipo carácter, lo cual indica que contienen categorías o etiquetas, como la liga o la división en la que juega el jugador. A continuación se enumera las Variables categóricas:
League: Identifica la liga del jugador (A = Liga Americana, N = Liga Nacional).
Division: Indica en qué división juega el jugador (E = Este, W = Oeste).
NewLeague: La liga en la que el jugador empezó a jugar después de un cambio.
La variable Salary tiene valores faltantes (59 NA). Lo que indica que hay jugadores para los cuales no se tiene información de salario, o que no tienen contrato (o salario registrado).
Variables de rendimiento deportivo: AtBat, Hits, HmRun, Runs, RBI, Walks, y las variables relacionadas con la carrera del jugador como CAtBat, CHits, CHmRun, CRuns, CRBI, CWalks son numéricas y reflejan las estadísticas de desempeño del jugador a lo largo de su carrera.
Variables de desempeño defensivo: PutOuts, Assists, Errors son variables numéricas que miden el desempeño defensivo del jugador, con PutOuts reflejando el número de outs realizados, Assists las asistencias realizadas y Errors los errores cometidos.
Salary es la única variable con valores faltantes (59 NA), lo que puede deberse a que algunos jugadores no tienen salario registrado. Sería importante investigar por qué faltan estos datos y si se pueden imputar o manejar de alguna manera.
El resto de las variables no presentan valores faltantes (ningún NA), lo que facilita el análisis.
Rows: 322
Columns: 20
$ AtBat <dbl> 293, 315, 479, 496, 321, 594, 185, 298, 323, 401, 574, 202…
$ Hits <dbl> 66, 81, 130, 141, 87, 169, 37, 73, 81, 92, 159, 53, 113, 6…
$ HmRun <dbl> 1, 7, 18, 20, 10, 4, 1, 0, 6, 17, 21, 4, 13, 0, 7, 3, 20, …
$ Runs <dbl> 30, 24, 66, 65, 39, 74, 23, 24, 26, 49, 107, 31, 48, 30, 2…
$ RBI <dbl> 29, 38, 72, 78, 42, 51, 8, 24, 32, 66, 75, 26, 61, 11, 27,…
$ Walks <dbl> 14, 39, 76, 37, 30, 35, 21, 7, 8, 65, 59, 27, 47, 22, 30, …
$ Years <dbl> 1, 14, 3, 11, 2, 11, 2, 3, 2, 13, 10, 9, 4, 6, 13, 3, 15, …
$ CAtBat <dbl> 293, 3449, 1624, 5628, 396, 4408, 214, 509, 341, 5206, 463…
$ CHits <dbl> 66, 835, 457, 1575, 101, 1133, 42, 108, 86, 1332, 1300, 46…
$ CHmRun <dbl> 1, 69, 63, 225, 12, 19, 1, 0, 6, 253, 90, 15, 41, 4, 36, 3…
$ CRuns <dbl> 30, 321, 224, 828, 48, 501, 30, 41, 32, 784, 702, 192, 205…
$ CRBI <dbl> 29, 414, 266, 838, 46, 336, 9, 37, 34, 890, 504, 186, 204,…
$ CWalks <dbl> 14, 375, 263, 354, 33, 194, 24, 12, 8, 866, 488, 161, 203,…
$ PutOuts <dbl> 446, 632, 880, 200, 805, 282, 76, 121, 143, 0, 238, 304, 2…
$ Assists <dbl> 33, 43, 82, 11, 40, 421, 127, 283, 290, 0, 445, 45, 11, 15…
$ Errors <dbl> 20, 10, 14, 3, 4, 25, 7, 9, 19, 0, 22, 11, 7, 6, 8, 0, 10,…
$ Salary <dbl> 425.000, 475.000, 480.000, 500.000, 91.500, 750.000, 70.00…
$ League_N <int> 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1…
$ Division_W <int> 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1…
$ NewLeague_N <int> 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1…
La transformación logarítmica de la variable Salary reduce la asimetría de su distribución, ya que comprime la escala de los salarios altos y expande ligeramente los salarios bajos. Esto hace que la distribución sea más simétrica y cercana a una distribución normal. Esta transformación es especialmente útil al utilizar modelos lineales, ya que mejora la normalidad de los residuos, estabiliza la varianza y contribuye a una mejor capacidad predictiva del modelo. Por estas razones, es recomendable usar LogSalary como variable objetivo en lugar del salario original.
AtBat Hits HmRun Runs
Min. : 16.0 Min. : 1 Min. : 0.00 Min. : 0.00
1st Qu.:255.2 1st Qu.: 64 1st Qu.: 4.00 1st Qu.: 30.25
Median :379.5 Median : 96 Median : 8.00 Median : 48.00
Mean :380.9 Mean :101 Mean :10.77 Mean : 50.91
3rd Qu.:512.0 3rd Qu.:137 3rd Qu.:16.00 3rd Qu.: 69.00
Max. :687.0 Max. :238 Max. :40.00 Max. :130.00
RBI Walks Years CAtBat
Min. : 0.00 Min. : 0.00 Min. : 1.000 Min. : 19.0
1st Qu.: 28.00 1st Qu.: 22.00 1st Qu.: 4.000 1st Qu.: 816.8
Median : 44.00 Median : 35.00 Median : 6.000 Median : 1928.0
Mean : 48.03 Mean : 38.74 Mean : 7.444 Mean : 2648.7
3rd Qu.: 64.75 3rd Qu.: 53.00 3rd Qu.:11.000 3rd Qu.: 3924.2
Max. :121.00 Max. :105.00 Max. :24.000 Max. :14053.0
CHits CHmRun CRuns CRBI
Min. : 4.0 Min. : 0.00 Min. : 1.0 Min. : 0.00
1st Qu.: 209.0 1st Qu.: 14.00 1st Qu.: 100.2 1st Qu.: 88.75
Median : 508.0 Median : 37.50 Median : 247.0 Median : 220.50
Mean : 717.6 Mean : 69.49 Mean : 358.8 Mean : 330.12
3rd Qu.:1059.2 3rd Qu.: 90.00 3rd Qu.: 526.2 3rd Qu.: 426.25
Max. :4256.0 Max. :548.00 Max. :2165.0 Max. :1659.00
CWalks PutOuts Assists Errors
Min. : 0.00 Min. : 0.0 Min. : 0.0 Min. : 0.00
1st Qu.: 67.25 1st Qu.: 109.2 1st Qu.: 7.0 1st Qu.: 3.00
Median : 170.50 Median : 212.0 Median : 39.5 Median : 6.00
Mean : 260.24 Mean : 288.9 Mean :106.9 Mean : 8.04
3rd Qu.: 339.25 3rd Qu.: 325.0 3rd Qu.:166.0 3rd Qu.:11.00
Max. :1566.00 Max. :1378.0 Max. :492.0 Max. :32.00
Salary League_N Division_W NewLeague_N
Min. : 67.5 Min. :0.0000 Min. :0.0000 Min. :0.0000
1st Qu.: 226.2 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
Median : 425.0 Median :0.0000 Median :1.0000 Median :0.0000
Mean : 515.6 Mean :0.4565 Mean :0.5124 Mean :0.4534
3rd Qu.: 700.0 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:1.0000
Max. :2460.0 Max. :1.0000 Max. :1.0000 Max. :1.0000
LogSalary
Min. :4.212
1st Qu.:5.422
Median :6.052
Mean :5.950
3rd Qu.:6.551
Max. :7.808
[1] "AtBat" "Hits" "HmRun" "Runs" "RBI"
[6] "Walks" "Years" "CAtBat" "CHits" "CHmRun"
[11] "CRuns" "CRBI" "CWalks" "PutOuts" "Assists"
[16] "Errors" "Salary" "League_N" "Division_W" "NewLeague_N"
[21] "LogSalary"
# A tibble: 322 × 21
AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns CRBI
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 293 66 1 30 29 14 1 293 66 1 30 29
2 315 81 7 24 38 39 14 3449 835 69 321 414
3 479 130 18 66 72 76 3 1624 457 63 224 266
4 496 141 20 65 78 37 11 5628 1575 225 828 838
5 321 87 10 39 42 30 2 396 101 12 48 46
6 594 169 4 74 51 35 11 4408 1133 19 501 336
7 185 37 1 23 8 21 2 214 42 1 30 9
8 298 73 0 24 24 7 3 509 108 0 41 37
9 323 81 6 26 32 8 2 341 86 6 32 34
10 401 92 17 49 66 65 13 5206 1332 253 784 890
# ℹ 312 more rows
# ℹ 9 more variables: CWalks <dbl>, PutOuts <dbl>, Assists <dbl>, Errors <dbl>,
# Salary <dbl>, League_N <int>, Division_W <int>, NewLeague_N <int>,
# LogSalary <dbl>
AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns
AtBat 1.00 0.97 0.59 0.91 0.82 0.67 0.05 0.24 0.25 0.24 0.27
Hits 0.97 1.00 0.56 0.92 0.81 0.64 0.04 0.23 0.26 0.20 0.26
HmRun 0.59 0.56 1.00 0.65 0.86 0.48 0.12 0.22 0.22 0.49 0.26
Runs 0.91 0.92 0.65 1.00 0.80 0.73 0.00 0.19 0.20 0.23 0.25
RBI 0.82 0.81 0.86 0.80 1.00 0.62 0.15 0.29 0.31 0.44 0.32
Walks 0.67 0.64 0.48 0.73 0.62 1.00 0.14 0.28 0.28 0.33 0.34
Years 0.05 0.04 0.12 0.00 0.15 0.14 1.00 0.92 0.90 0.73 0.88
CAtBat 0.24 0.23 0.22 0.19 0.29 0.28 0.92 1.00 1.00 0.80 0.98
CHits 0.25 0.26 0.22 0.20 0.31 0.28 0.90 1.00 1.00 0.78 0.98
CHmRun 0.24 0.20 0.49 0.23 0.44 0.33 0.73 0.80 0.78 1.00 0.82
CRuns 0.27 0.26 0.26 0.25 0.32 0.34 0.88 0.98 0.98 0.82 1.00
CRBI 0.24 0.23 0.35 0.21 0.39 0.31 0.87 0.95 0.95 0.93 0.94
CWalks 0.17 0.15 0.23 0.18 0.25 0.42 0.84 0.91 0.89 0.80 0.93
PutOuts 0.32 0.31 0.28 0.28 0.34 0.30 0.00 0.06 0.08 0.11 0.06
Assists 0.35 0.32 -0.11 0.22 0.11 0.15 -0.08 0.00 0.00 -0.16 -0.02
Errors 0.35 0.31 0.04 0.24 0.19 0.13 -0.16 -0.07 -0.06 -0.14 -0.08
Salary 0.37 0.42 0.33 0.40 0.43 0.42 0.34 0.47 0.49 0.45 0.50
League_N -0.10 -0.10 -0.18 -0.15 -0.15 -0.05 -0.05 -0.03 -0.03 -0.10 -0.05
Division_W -0.05 -0.07 -0.02 -0.08 -0.08 -0.06 0.02 0.02 0.01 0.01 0.00
NewLeague_N -0.06 -0.06 -0.17 -0.12 -0.12 -0.02 -0.04 -0.02 -0.01 -0.10 -0.04
LogSalary 0.34 0.38 0.30 0.36 0.38 0.38 0.47 0.54 0.55 0.45 0.55
CRBI CWalks PutOuts Assists Errors Salary League_N Division_W
AtBat 0.24 0.17 0.32 0.35 0.35 0.37 -0.10 -0.05
Hits 0.23 0.15 0.31 0.32 0.31 0.42 -0.10 -0.07
HmRun 0.35 0.23 0.28 -0.11 0.04 0.33 -0.18 -0.02
Runs 0.21 0.18 0.28 0.22 0.24 0.40 -0.15 -0.08
RBI 0.39 0.25 0.34 0.11 0.19 0.43 -0.15 -0.08
Walks 0.31 0.42 0.30 0.15 0.13 0.42 -0.05 -0.06
Years 0.87 0.84 0.00 -0.08 -0.16 0.34 -0.05 0.02
CAtBat 0.95 0.91 0.06 0.00 -0.07 0.47 -0.03 0.02
CHits 0.95 0.89 0.08 0.00 -0.06 0.49 -0.03 0.01
CHmRun 0.93 0.80 0.11 -0.16 -0.14 0.45 -0.10 0.01
CRuns 0.94 0.93 0.06 -0.02 -0.08 0.50 -0.05 0.00
CRBI 1.00 0.88 0.11 -0.08 -0.10 0.49 -0.05 0.01
CWalks 0.88 1.00 0.06 -0.04 -0.12 0.44 -0.05 -0.01
PutOuts 0.11 0.06 1.00 -0.03 0.11 0.27 0.02 -0.01
Assists -0.08 -0.04 -0.03 1.00 0.71 0.04 0.05 -0.01
Errors -0.10 -0.12 0.11 0.71 1.00 0.01 0.08 -0.02
Salary 0.49 0.44 0.27 0.04 0.01 1.00 -0.01 -0.17
League_N -0.05 -0.05 0.02 0.05 0.08 -0.01 1.00 0.00
Division_W 0.01 -0.01 -0.01 -0.01 -0.02 -0.17 0.00 1.00
NewLeague_N -0.05 -0.05 0.03 0.04 0.05 0.00 0.88 -0.01
LogSalary 0.53 0.49 0.20 0.04 -0.03 0.88 -0.01 -0.13
NewLeague_N LogSalary
AtBat -0.06 0.34
Hits -0.06 0.38
HmRun -0.17 0.30
Runs -0.12 0.36
RBI -0.12 0.38
Walks -0.02 0.38
Years -0.04 0.47
CAtBat -0.02 0.54
CHits -0.01 0.55
CHmRun -0.10 0.45
CRuns -0.04 0.55
CRBI -0.05 0.53
CWalks -0.05 0.49
PutOuts 0.03 0.20
Assists 0.04 0.04
Errors 0.05 -0.03
Salary 0.00 0.88
League_N 0.88 -0.01
Division_W -0.01 -0.13
NewLeague_N 1.00 -0.01
LogSalary -0.01 1.00
Variables Fuertemente Correlacionadas con LogSalary:
CAtBat: Correlación de 0.54 con LogSalary, indicando que los jugadores con más turnos al bate tienden a tener salarios más altos, en la escala logarítmica.
CHits: Correlación de 0.55 con LogSalary. Similar a CAtBat, los jugadores con más hits corregidos tienen un salario más alto.
CRuns: Correlación de 0.55 con LogSalary. Los jugadores que anotan más carreras también tienen salarios más altos.
CRBI: Correlación de 0.53 con LogSalary. Los jugadores con más carreras impulsadas muestran una relación positiva con el salario en su forma logarítmica.
Years: Correlación de 0.47 con LogSalary, lo que sugiere que los jugadores con más años de experiencia tienen un salario logarítmico más alto.
Correlaciones Moderadas con LogSalary:
Walks: Correlación de 0.38 con LogSalary, lo que indica que los jugadores que suelen recibir más bases por bolas tienen salarios logarítmicos más altos.
HmRun: Correlación de 0.30 con LogSalary. Los jugadores con más jonrones tienen una correlación moderada con un salario logarítmico más alto.
RBI: Correlación de 0.38 con LogSalary, indicando que los jugadores que impulsan más carreras también suelen tener salarios más altos en términos logarítmicos.
Al construir modelos predictivos, nos centraremos principalmente en las variables que están más fuertemente correlacionadas con LogSalary, como CAtBat, CHits, CRuns, CRBI, y Years. Se usa regresión lineal con LogSalary como la variable dependiente para modelar el salario en función de las estadísticas de rendimiento.
Conclusiones
Las métricas relacionadas con el desempeño, como CHits, CRuns, CAtBat, y CRBI, parecen tener una relación más directa y fuerte con el salario que las variables como Years.
CRBI (carreras impulsadas) y CRuns (carreras anotadas) muestran las relaciones más fuertes con el salario, sugiriendo que estos factores tienen un peso significativo en la determinación del salario de un jugador.
Si bien Years tiene una relación positiva con el salario, no es tan consistente como las métricas de rendimiento, lo que podría indicar que la experiencia no siempre se traduce de manera lineal en un salario mayor.
El gráfico CHmRun (Carrera de Jonrones) también muestra una tendencia ascendente moderada, aunque con mayor dispersión. Esto refleja que, si bien los jonrones contribuyen al rendimiento de un jugador, su impacto en el salario no es tan fuerte como otras métricas, como los hits o las carreras impulsadas.
Call:
lm(formula = formula_logsalary, data = hitters_df_dummy)
Residuals:
Min 1Q Median 3Q Max
-2.05952 -0.47102 0.06882 0.43810 2.30248
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.20238339 0.15126812 34.392 < 0.0000000000000002 ***
AtBat -0.00336685 0.00115550 -2.914 0.00384 **
Hits 0.01099984 0.00441628 2.491 0.01328 *
HmRun 0.01296730 0.01154516 1.123 0.26225
Runs 0.00046386 0.00550284 0.084 0.93288
RBI -0.00167786 0.00484357 -0.346 0.72928
Walks 0.00930768 0.00336109 2.769 0.00597 **
Years 0.03069439 0.02196932 1.397 0.16339
CAtBat 0.00007377 0.00023600 0.313 0.75481
CHits -0.00010639 0.00118203 -0.090 0.92834
CHmRun -0.00036781 0.00293627 -0.125 0.90040
CRuns 0.00127196 0.00129597 0.981 0.32714
CRBI 0.00006450 0.00128035 0.050 0.95986
CWalks -0.00120103 0.00055961 -2.146 0.03265 *
PutOuts 0.00030323 0.00013903 2.181 0.02995 *
Assists 0.00068621 0.00041323 1.661 0.09783 .
Errors -0.01255599 0.00824357 -1.523 0.12877
League_N 0.15573459 0.15043184 1.035 0.30138
Division_W -0.18351325 0.07144501 -2.569 0.01069 *
NewLeague_N -0.10692038 0.15079243 -0.709 0.47884
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6233 on 302 degrees of freedom
Multiple R-squared: 0.4357, Adjusted R-squared: 0.4002
F-statistic: 12.27 on 19 and 302 DF, p-value: < 0.00000000000000022
Modelo con LogSalary:
R²: 0.4357303
MSE: 0.3643309
MAE: 0.5054889
Variables no significativas (valor-p > 0.1): Estas variables no aportan evidencia estadística clara de estar asociadas con LogSalary en este modelo: HmRun, Runs, RBI, Years, CAtBat, CHits, CHmRun, CRuns, CRBI, Errors, League_N
Las variables AtBat, Hits, Walks, CWalks, PutOuts, Division_W serían las más relevantes para predecir LogSalary, según este modelo. Por lo tanto procederemos a eliminar las no significativas.
Call:
lm(formula = LogSalary ~ AtBat + Hits + Walks + CWalks + PutOuts +
Division_W, data = hitters_df_dummy)
Residuals:
Min 1Q Median 3Q Max
-2.16460 -0.49204 0.08381 0.49404 2.39760
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.2761169 0.1111000 47.490 < 0.0000000000000002 ***
AtBat -0.0025625 0.0009765 -2.624 0.00911 **
Hits 0.0127998 0.0031201 4.102 0.0000521 ***
Walks 0.0002024 0.0025154 0.080 0.93592
CWalks 0.0013493 0.0001521 8.869 < 0.0000000000000002 ***
PutOuts 0.0002815 0.0001371 2.054 0.04081 *
Division_W -0.1625549 0.0727968 -2.233 0.02625 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6476 on 315 degrees of freedom
Multiple R-squared: 0.3645, Adjusted R-squared: 0.3524
F-statistic: 30.12 on 6 and 315 DF, p-value: < 0.00000000000000022
Modelo reducido (solo variables significativas):
R²: 0.3645295
MSE: 0.410303
MAE: 0.5293277
# A tibble: 322 × 19
AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns CRBI
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 293 66 1 30 29 14 1 293 66 1 30 29
2 315 81 7 24 38 39 14 3449 835 69 321 414
3 479 130 18 66 72 76 3 1624 457 63 224 266
4 496 141 20 65 78 37 11 5628 1575 225 828 838
5 321 87 10 39 42 30 2 396 101 12 48 46
6 594 169 4 74 51 35 11 4408 1133 19 501 336
7 185 37 1 23 8 21 2 214 42 1 30 9
8 298 73 0 24 24 7 3 509 108 0 41 37
9 323 81 6 26 32 8 2 341 86 6 32 34
10 401 92 17 49 66 65 13 5206 1332 253 784 890
# ℹ 312 more rows
# ℹ 7 more variables: CWalks <dbl>, PutOuts <dbl>, Assists <dbl>, Errors <dbl>,
# League_N <int>, Division_W <int>, NewLeague_N <int>
Call:
lm(formula = formula_vif, data = hitters_df_dummy)
Residuals:
Min 1Q Median 3Q Max
-2.05952 -0.47102 0.06882 0.43810 2.30248
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.20238339 0.15126812 34.392 < 0.0000000000000002 ***
AtBat -0.00336685 0.00115550 -2.914 0.00384 **
Hits 0.01099984 0.00441628 2.491 0.01328 *
HmRun 0.01296730 0.01154516 1.123 0.26225
Runs 0.00046386 0.00550284 0.084 0.93288
RBI -0.00167786 0.00484357 -0.346 0.72928
Walks 0.00930768 0.00336109 2.769 0.00597 **
Years 0.03069439 0.02196932 1.397 0.16339
CAtBat 0.00007377 0.00023600 0.313 0.75481
CHits -0.00010639 0.00118203 -0.090 0.92834
CHmRun -0.00036781 0.00293627 -0.125 0.90040
CRuns 0.00127196 0.00129597 0.981 0.32714
CRBI 0.00006450 0.00128035 0.050 0.95986
CWalks -0.00120103 0.00055961 -2.146 0.03265 *
PutOuts 0.00030323 0.00013903 2.181 0.02995 *
Assists 0.00068621 0.00041323 1.661 0.09783 .
Errors -0.01255599 0.00824357 -1.523 0.12877
League_N 0.15573459 0.15043184 1.035 0.30138
Division_W -0.18351325 0.07144501 -2.569 0.01069 *
NewLeague_N -0.10692038 0.15079243 -0.709 0.47884
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6233 on 302 degrees of freedom
Multiple R-squared: 0.4357, Adjusted R-squared: 0.4002
F-statistic: 12.27 on 19 and 302 DF, p-value: < 0.00000000000000022
Modelo de regresión con VIF (LogSalary):
R²: 0.4357303
MSE: 0.3643309
MAE: 0.5054889
Valores de VIF para cada variable:
AtBat Hits HmRun Runs RBI Walks
25.964579 34.780246 8.354115 16.946732 13.273811 4.371276
Years CAtBat CHits CHmRun CRuns CRBI
9.678270 248.610088 494.542062 53.019214 154.923233 150.409512
CWalks PutOuts Assists Errors League_N Division_W
18.456402 1.258513 2.642843 2.277437 4.654083 1.057126
NewLeague_N
4.671150
Variables con VIF muy alto (CAtBat, CHits, CRuns, CRBI) están altamente correlacionadas con otras variables y causan multicolinealidad, lo que puede afectar la estabilidad y precisión del modelo. Se recomienda eliminarlas.
Variables con VIF moderado (HmRun, Runs, RBI, CWalks) aún tienen cierta colinealidad, pero no generan problemas graves. Es recomendable revisar su inclusión en el modelo.
Variables con VIF bajo (Walks, PutOuts, Division_W, League_N) no presentan multicolinealidad significativa y aportan información útil al modelo. Deben mantenerse.
Acción recomendada: Eliminar variables con VIF alto y revisar las de VIF moderado para mejorar la precisión y estabilidad del modelo.
Call:
lm(formula = formula_reducida_vif, data = hitters_df_dummy)
Residuals:
Min 1Q Median 3Q Max
-2.2200 -0.3940 0.1417 0.5044 2.2363
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.4290193 0.1310113 41.439 < 0.0000000000000002 ***
AtBat -0.0028798 0.0010910 -2.640 0.008714 **
Hits 0.0122938 0.0034871 3.526 0.000485 ***
Walks 0.0097740 0.0025392 3.849 0.000144 ***
PutOuts 0.0002159 0.0001533 1.409 0.159860
Division_W -0.1497023 0.0813561 -1.840 0.066696 .
League_N 0.0257876 0.0815852 0.316 0.752149
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.7239 on 315 degrees of freedom
Multiple R-squared: 0.2061, Adjusted R-squared: 0.191
F-statistic: 13.63 on 6 and 315 DF, p-value: 0.00000000000009242
Nuevo modelo reducido (con variables de bajo VIF):
R²: 0.2060802
MSE: 0.5126086
MAE: 0.5757515
Call:
lm(formula = LogSalary ~ CRuns + Hits + Division_W + PutOuts +
Years + Walks + CWalks + Errors, data = hitters_df_dummy)
Residuals:
Min 1Q Median 3Q Max
-1.72429 -0.50700 0.05328 0.46597 2.56942
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.0418784 0.1290101 39.081 < 0.0000000000000002 ***
CRuns 0.0012562 0.0003977 3.159 0.00174 **
Hits 0.0024539 0.0012799 1.917 0.05612 .
Division_W -0.1942794 0.0700932 -2.772 0.00591 **
PutOuts 0.0002731 0.0001326 2.060 0.04021 *
Years 0.0365384 0.0170043 2.149 0.03242 *
Walks 0.0066027 0.0028222 2.340 0.01994 *
CWalks -0.0008886 0.0004625 -1.921 0.05562 .
Errors -0.0082490 0.0058952 -1.399 0.16272
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6264 on 313 degrees of freedom
Multiple R-squared: 0.4092, Adjusted R-squared: 0.3941
F-statistic: 27.1 on 8 and 313 DF, p-value: < 0.00000000000000022
Modelo Stepwise:
R²: 0.4091879
MSE: 0.3814685
MAE: 0.5109051
Las variables más relevantes para predecir el LogSalary en este modelo son CRuns, Division_W, PutOuts, Years y Walks.
Hits y CWalks son marginalmente significativas, por lo que podrían considerarse para mantenerlas si es necesario.
Errors no tiene un impacto significativo en el modelo y podría eliminarse.
El modelo tiene un R² ajustado de 0.3941, lo que sugiere que aún hay un margen de mejora en la capacidad de predicción, aunque es un modelo razonablemente bueno.
# Filtrar filas sin NA para las variables relevantes
vars_modelo <- c("LogSalary", "CRuns", "Division_W", "PutOuts", "Years", "Walks")
hitters_df_modelo <- hitters_df_dummy[complete.cases(hitters_df_dummy[, vars_modelo]), ]
# Crear fórmula y ajustar el modelo
formula_reducida <- LogSalary ~ CRuns + Division_W + PutOuts + Years + Walks
modelo_stepwise <- lm(formula_reducida, data = hitters_df_modelo)
# Resumen del modelo
summary(modelo_stepwise)
Call:
lm(formula = formula_reducida, data = hitters_df_modelo)
Residuals:
Min 1Q Median 3Q Max
-1.54964 -0.50315 0.06806 0.48297 2.38318
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.2077471 0.1099788 47.352 < 0.0000000000000002 ***
CRuns 0.0009039 0.0002576 3.509 0.000515 ***
Division_W -0.2008517 0.0714746 -2.810 0.005261 **
PutOuts 0.0003433 0.0001335 2.572 0.010559 *
Years 0.0197470 0.0166023 1.189 0.235169
Walks 0.0070926 0.0019594 3.620 0.000343 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6396 on 316 degrees of freedom
Multiple R-squared: 0.3783, Adjusted R-squared: 0.3685
F-statistic: 38.46 on 5 and 316 DF, p-value: < 0.00000000000000022
# Predicciones
predicciones_reducidas <- predict(modelo_stepwise, newdata = hitters_df_modelo)
# Métricas de rendimiento
mse_reducido <- mean((hitters_df_modelo$LogSalary - predicciones_reducidas)^2)
mae_reducido <- mean(abs(hitters_df_modelo$LogSalary - predicciones_reducidas))
r2_reducido <- summary(modelo_stepwise)$r.squared
# Imprimir resultados
cat("Modelo reducido (LogSalary):\n")
Modelo reducido (LogSalary):
cat("R²:", round(r2_reducido, 4), "\n")
R²: 0.3783
cat("MSE:", round(mse_reducido, 4), "\n")
MSE: 0.4014
cat("MAE:", round(mae_reducido, 4), "\n")
MAE: 0.5267
# Instalar y cargar el paquete "glmnet" si no está instalado
# install.packages("glmnet")
library(glmnet)
# 1. Seleccionar variables numéricas y excluir Salary y LogSalary
numeric_vars <- hitters_df_dummy[sapply(hitters_df_dummy, is.numeric)]
numeric_vars <- numeric_vars[, !colnames(numeric_vars) %in% c("LogSalary", "Salary")]
# 2. Combinar con la variable respuesta
datos_lasso <- cbind(numeric_vars, LogSalary = hitters_df_dummy$LogSalary)
# 3. Eliminar filas con NA en cualquiera de las columnas
datos_lasso <- datos_lasso[complete.cases(datos_lasso), ]
# 4. Crear matriz de predictores y vector de respuesta
X <- as.matrix(datos_lasso[, !colnames(datos_lasso) %in% "LogSalary"])
y <- datos_lasso$LogSalary
# 5. Ajustar modelo Lasso con validación cruzada
set.seed(12345)
lasso_cv <- cv.glmnet(X, y, alpha = 1)
# 6. Seleccionar el mejor lambda
best_lambda <- lasso_cv$lambda.min
# 7. Ajustar modelo final con el mejor lambda
lasso_model <- glmnet(X, y, alpha = 1, lambda = best_lambda)
# 8. Extraer variables seleccionadas
coef_lasso <- coef(lasso_model)
selected_features <- rownames(coef_lasso)[which(coef_lasso != 0)]
selected_features <- selected_features[selected_features != "(Intercept)"]
cat("Variables seleccionadas por Lasso:\n")
Variables seleccionadas por Lasso:
print(selected_features)
[1] "AtBat" "Hits" "HmRun" "Runs" "Walks"
[6] "Years" "CHits" "CRuns" "CWalks" "PutOuts"
[11] "Assists" "Errors" "League_N" "Division_W" "NewLeague_N"
# 9. Ajustar modelo lineal solo con esas variables
modelo_lasso <- lm(as.formula(paste("LogSalary ~", paste(selected_features, collapse = " + "))), data = datos_lasso)
# 10. Predicción y métricas
y_pred_lasso <- predict(modelo_lasso, newdata = datos_lasso)
mse_lasso <- mean((datos_lasso$LogSalary - y_pred_lasso)^2)
mae_lasso <- mean(abs(datos_lasso$LogSalary - y_pred_lasso))
r2_lasso <- summary(modelo_lasso)$r.squared
# 11. Imprimir resultados
cat("Modelo Lasso:\n")
Modelo Lasso:
cat("R²:", round(r2_lasso, 4), "\n")
R²: 0.4352
cat("MSE:", round(mse_lasso, 4), "\n")
MSE: 0.3647
cat("MAE:", round(mae_lasso, 4), "\n")
MAE: 0.5051
Conclusiones
De acuerdo con los valores p y el resumen de la regresión, deberías eliminar las siguientes variables del modelo, ya que no son significativas: HmRun Runs CHits CRuns, Errors, League_N, Las demás variables tienen p-valores significativos y deberían mantenerse en el modelo. Además, las variables Years y Assists pueden ser consideradas marginalmente significativas, y su inclusión dependerá de si deseas mantener variables con un efecto marginal.
Call:
lm(formula = formula_reducido, data = hitters_df_dummy)
Residuals:
Min 1Q Median 3Q Max
-2.16460 -0.49204 0.08381 0.49404 2.39760
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.2761169 0.1111000 47.490 < 0.0000000000000002 ***
AtBat -0.0025625 0.0009765 -2.624 0.00911 **
Hits 0.0127998 0.0031201 4.102 0.0000521 ***
Walks 0.0002024 0.0025154 0.080 0.93592
CWalks 0.0013493 0.0001521 8.869 < 0.0000000000000002 ***
PutOuts 0.0002815 0.0001371 2.054 0.04081 *
Division_W -0.1625549 0.0727968 -2.233 0.02625 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6476 on 315 degrees of freedom
Multiple R-squared: 0.3645, Adjusted R-squared: 0.3524
F-statistic: 30.12 on 6 and 315 DF, p-value: < 0.00000000000000022
Modelo reducido con las variables seleccionadas:
R²: 0.3645295
MSE: 0.410303
MAE: 0.5293277
Modelo | R² | MSE | MAE | Variables seleccionadas |
---|---|---|---|---|
Modelo de Regresión | 0.3645 | 0.410303 | 0.5293277 | AtBat, Hits, Walks, CWalks, PutOuts, Division_W |
Modelo VIF | 0.2061 | 0.5126086 | 0.5757515 | AtBat, Hits, Walks, PutOuts, Division_W |
Modelo Stepwise | 0.3783 | 0.4014135 | 0.5266722 | CRuns, Division_W, PutOuts, Walks |
Modelo Lasso | 0.3645 | 0.410303 | 0.5293277 | AtBat, Hits, Walks, CWalks, PutOuts, Division_W |
Mejor modelo: El Modelo Stepwise parece ser el que tiene el mejor rendimiento en términos de R² (0.3783), ya que logra la mayor proporción de varianza explicada en los datos. Sin embargo, si nos basamos en MSE y MAE, el Modelo Reducido (solo variables significativas) también tiene un buen rendimiento, con un R² similar (0.3645) y un MSE y MAE ligeramente mejores que el modelo Stepwise.
Variables a utilizar Modelo de Regresión: “AtBat”, “Hits”, “Walks”, “CWalks”, “PutOuts”, “Division_W”
Variables a utilizar Modelo Stepwise: “CRuns”, “Division_W”, “PutOuts”, “Walks”,
Método a Tomar
Considerando el equilibrio entre R², MSE y MAE y su buen ajuste y baja complejidad, el Modelo de Regresión es una excelente opción.
Mejor valor de k: 24
Mean Squared Error (MSE) en conjunto de prueba: 0.4078
El valor de k=24 parece ser el óptimo para el modelo. Esto indica que este número de características (o hiperparámetros) permite un buen equilibrio entre el ajuste del modelo y su capacidad de generalización.
El Mean Squared Error (MSE) en el conjunto de prueba es de 0.4078. Este valor indica que el modelo tiene una capacidad moderada de predicción, ya que los errores cuadráticos promedio están controlados, pero aún hay espacio para mejorar.
Este MSE es relativamente bajo, lo que sugiere que el modelo se desempeña bien al generalizar sobre datos nuevos (en comparación con los valores más altos de MSE en otros modelos que podrían estar sobreajustados). Sin embargo, siempre es posible mejorar este rendimiento mediante la optimización del modelo, como probar diferentes transformaciones de las características, o incluso ajustar otros hiperparámetros.
MSE: 0.2326
MAE: 0.3954
R²: 0.6211
Importancia de las características:
var rel.inf
CWalks CWalks 49.353968
Walks Walks 14.402717
Hits Hits 12.898165
PutOuts PutOuts 11.227998
AtBat AtBat 10.706345
Division_W Division_W 1.410807
Conclusiones
Rendimiento del Modelo. MSE: 0.2324 (error relativamente bajo en las predicciones). MAE: 0.3961 (el modelo se equivoca, en promedio, en 0.3961 unidades del salario logarítmico). R²: 0.6215 (el modelo explica el 62.15% de la variabilidad de los salarios).
Las variables más importantes para predecir el salario logarítmico son:
CWalks (49.07%), Walks (14.54%), Hits (12.57%), AtBat (11.20%), PutOuts (11.06%), Division_W (1.57%).
Recomendaciones:
el mejor rendimiento lo generó Learning Rate: 0.010.
Características clave: Enfocarse en CWalks, Walks y Hits para mejorar interpretabilidad o selección de características.
Posibles Mejoras: Ajustar más parámetros como el número de árboles o la profundidad de los árboles, y considerar otros modelos como Random Forest o XGBoost para comparar rendimiento.
En resumen, el modelo GBM con un learning rate de 0.010 mostró un buen rendimiento, pero siempre hay espacio para optimizar y explorar otros enfoques.
Modelo | MSE |
---|---|
Random Forest | 0.0666 |
GBM (Optimizado) | 0.2324 |
Modelo Stepwise | 0.4014 |
Modelo de Regresión | 0.4103 |
Modelo Lasso | 0.4103 |
kNN (k=24) | 0.4078 |
Modelo VIF | 0.5126 |
CONCLUSIONES FINALES
Random Forest es el modelo con el mejor desempeño, alcanzando un MSE de 0.0666, lo que lo convierte en el más preciso en las predicciones. Este modelo maneja de manera efectiva la no linealidad y las interacciones entre variables, siendo altamente robusto para este tipo de problemas.
GBM (Optimizado) ocupa el segundo lugar con un MSE de 0.2324. Aunque tiene un buen rendimiento, no supera a Random Forest en términos de precisión.
Los modelos lineales (Regresión, Lasso, y Stepwise) presentan MSEs más altos (todos superiores a 0.4), lo que sugiere que no logran capturar adecuadamente las relaciones no lineales en los datos.
kNN (k=24) tiene un MSE de 0.4078, lo cual es similar a los modelos lineales, pero sigue siendo menos efectivo que Random Forest y GBM.
Modelo VIF tiene el peor desempeño, con un MSE de 0.5126, lo que indica que no es adecuado para este conjunto de datos en comparación con los demás modelos evaluados.