Mis artículos anteriores en el blog se basaron principalmente en análisis/visualizaciones utilizando la poderosa herramienta Tableau Public. Sin embargo, recientemente he estado estudiando un poco la herramienta R para hacer el mismo tipo de análisis.
Me parece que R no es muy atrayente al início porque su interfaz es menos amigable que la de Tableau (básicamente debemos programar todo lo que hacemos), pero después de unas lecciones importantes en internet , comprobé que es una poderosa herramienta y que es cuestión de tiempo comprender la parte abstracta del programa, para después explorarla y utilizar todo su poder.
En esta oportunidad, despúes de unos cuantos meses sin publicar artículos, quise publicar mi primer análisis utilizando R, intentando responder las siguientes interrogantes:
- ¿Cuál es la edad promedio en la cual los jugadores latinoamericanos debutan en la MLB?,
- ¿Cuál es el país latinoamericano en el que sus jugadores llegan más temprano a la MLB?
Para comenzar necesitaba el número de jugadores que han pasado por la MLB para cada uno de los países latinoamericanos.
En www.baseball-reference.com esta información está disponible fácilmente cuando buscamos en esta página y filtramos por todos los años disponibles (1850 o antes, hasta 2016):
Parte del resultado de esa búsqueda está en la imagen anterior. De allí podemos observar que después de los Estados Unidos, de los 6 países con más jugadores en la historia de la MLB, 5 son latinoamericanos: República Dominicana, Venezuela, Puerto Rico, Cuba y México.
Panamá, está por debajo de Japón con 55 jugadores. Y luego seguían más abajo en la tabla Colombia con 19 y Curaçao con 14 jugadores.
Decidí entonces determinar la edad a la cual cada uno de los jugadores de estos 6 países (incluyendo panamá) debutaron en las mayores. Esta información también se encuentra disponible en la página de cada jugador en Baseball-Reference, pero sería muy tedioso buscarlas una a una.
Sin embargo, como en la página de cada uno de estos 5 países existe la fecha de nacimiento de cada jugador así como la fecha de su debut, se puede calcular/estimar la edad a la cual cada jugador tuvo su primer juego en la mayores.
Para esto, utilicé el “R Package” XML el cual permite obtener información desde páginas web directamente en R. Después de haber instalado ese aplicativo, lo cargué en el ambiente de trabajo junto con otros más que también necesitaré para las visualizaciones.
## Loading needed R packages #### library(XML) library(ggplot2) library(dplyr) library(lubridate) library(plotly) Sys.setlocale("LC_TIME","English")
Los URLs de las páginas web con información de los jugadores de los primeiros 6 países Latinoamericanos se guardan en variables de texto para utilizarlas posteriormente:
NOTA: todos los comentarios y gráficos en el código R fueron escritos en inglés una vez que serán compartidos posteriormente en Github.
# Web page scrapping with Latin American players (Top 8) #### url_cont = c("Venezuela", "D-R-", "P-R-", "Cuba", "Mexico", "Panama", "Colombia", "Curacao") i = 1 for (pais in url_cont) { url_cont[i] = paste("http://www.baseball-reference.com/bio/", pais, "_born.shtml", sep = "") i = i + 1 } cont_abb = c("ven", "rd", "pr", "cub", "mex", "pan", "col", "cur")
Y es aquí dónde vino mi primer Aha! del poder que tenemos haciendo análisis con R. Con la ayuda de este artículo en fue muy fácil recoger toda esa información para cada país y convertirlas en tablas para mi posterior análisis, de la siguiente forma:
# Create several a List of the data-frames based on the Web Pages, and define the type of colum data #### i = 1 for (link in url_cont) { assign(paste("Table_", cont_abb[i],sep = ""), value = readHTMLTable(url_cont[[i]] ,stringAsFactors = FALSE ,colClasses=c("integer","character",rep("integer",17) ,rep("numeric", 4),"factor","factor" , "character", "character") ) ) i = i + 1 }
Luego asigné las tablas que me interesaban de cada país a un Data Frame, que es la principal forma de guardar datos en R.
## Assign First table of the Web Page of each country to a DF, which includes the target info #### ven_batting = Table_ven[[1]] rd_batting = Table_rd[[1]] pr_batting = Table_pr[[1]] cub_batting = Table_cub[[1]] mex_batting = Table_mex[[1]] pan_batting = Table_pan[[1]] col_batting = Table_col[[1]] cur_batting = Table_cur[[1]]
Después de hacer una série de correcciones a los datos
## Add name of country to each of the Data Frames #### ven_batting$Country = "Venezuela" rd_batting$Country = "Dominican Republic" pr_batting$Country = "Puerto Rico" cub_batting$Country = "Cuba" mex_batting$Country = "Mexico" pan_batting$Country = "Panama" col_batting$Country = "Colombia" cur_batting$Country = "Curacao" ## Perform some data correction into tables #### names(rd_batting)[2] = "Name" names(pr_batting)[2] = "Name" ## Create a unique Data Frame with all the 5 countries #### batting = rbind(ven_batting, rd_batting, pr_batting, cub_batting, mex_batting, pan_batting, col_batting, cur_batting) summary(batting) # Change the type of some variables into the Data Frame #### names(batting)[28] = "Countries" batting$Countries = factor(batting$Countries, levels = c("Dominican Republic", "Venezuela", "Puerto Rico", "Cuba", "Mexico", "Panama", "Colombia", "Curacao")) batting$Name = as.character(batting$Name) batting$Birthplace = as.character(batting$Birthplace) batting$Pos = as.character(batting$Pos) batting$Birthdate = mdy(batting$Birthdate) batting$Debut = mdy(batting$Debut) names(batting)[names(batting) == "2B"] <- "X2B" names(batting)[names(batting) == "3B"] <- "X3B"
compilé las tablas entre países, para calcular la edad estimada de los jugadores (en años) y asignar ese valor a una nueva variable de la Data Frame compilada:
batting$AgeAtDebut = as.integer(batting$Debut - batting$Birthdate)/365
Teniendo la tabla compilada es posible responder a ambas preguntas al inicio del artículo:
Con ayuda de un comando en R, es posible obtener esas respuestas en dos sencillas lineas de código:
- ¿Cuál es la edad promedio en la cual los jugadores latinoamericanos debutan en la MLB?:
## Calculate the median Age At Debut of all Latin American Players #### mean(batting$AgeAtDebut) [1] 24.14762
Por lo tanto, 24 años es la edad promedio de los jugadores latinoamericanos (de estos 8 países) en su debut.
- ¿Cuál es el país latinoamericano en el que sus jugadores llegan más temprano a la MLB?
## Calculate the median Age At Debut of Players by Country #### sort(tapply(batting$AgeAtDebut, batting$Countries, mean), decreasing = FALSE) Curacao Colombia Puerto Rico Dominican Republic Venezuela 22.38415 23.64513 23.71233 23.89046 23.94509 Mexico Panama Cuba 24.51980 24.55856 25.61477
De los países analizados, Curaçao es el que tiene jugadores que han debutado, en promedio, con menor edad, a pesar de que sea un país con un número mucho menor de jugadores Grandes Ligas que los primeros 5 Latinoamericanos. Cuba, por su parte, es el país con jugadores que llegan a la MLB con más edad, lo que no es sorprendente debido a las restricciones que tenían sus jugadores para llegar a jugar en la MLB.
Por otra parte, aprovechando el potencial visual del aplicativo ggplot2, teniendo la edad de cada jugador así como la fecha de su debut, se puede graficar una scatter plot cada uno de los pares “Año del primer juego en MLB” y “Edad del jugador” para cada país.
# Create an scatter plot with all the players by countries analyzed p_country = ggplot(data=batting, aes(x=Debut, y=AgeAtDebut)) + geom_point(data=batting, alpha=0.2, size=2.5) + geom_smooth(data=batting, aes(color=Countries), se=FALSE, size=1.5) + ggtitle("Age of Latin American MLB Players at their debut")+ theme_bw()+ xlab("Year of Debut") + ylab("Age at debut") + geom_text(data=subset(batting, AgeAtDebut > 40 | AgeAtDebut < 18), aes(Debut, AgeAtDebut, label = paste(Name, ",", format(AgeAtDebut, digits = 2, nsmall = 1))), hjust=0.1, vjust=1)+ facet_wrap(~ Countries, ncol=4) p_country
En el gráfico anterior se pueden ver algunos puntos interesantes:
- Dominicana, Venezuela, Puerto Rico, México y Panamá tienen concentrado el debut de sus jugadores más o menos desde la segunda mitad del siglo XX hasta hoy.
- Cuba por su parte tiene el debut de sus jugadores más dispersos, incluso desde el siglo IX, considerando el debut del jugador Steve Bellan.
- República Dominicana, Venezuela y Puerto Rico tienen una tendencia reciente en el aumento de la edad promedio de sus jugadores. Cuba por su parte ha mantenido constante la edad promedio de sus jugadores en los últimos años.
- México prácticamente tiene una tendencia constantes desde que debutara Mel Almada en 1933.
- Diomedes Olivo de República Dominicana es el jugador Latinoamericano que ha debutado con más edad, con más de 41 años.
- Por su parte, el Cubano Merito Acosta ha sido hasta ahora el latinoamericano, de los países analizados, que ha debutado con menor edad en la MLB, con un poco más de 17 años.
Considerando los 8 países, la edad promedio de los jugadores viene ligeramente en tendencia creciente desde 1979, tal y como lo muestra la gráfica siguiente:
# Create an scatter plot with all the players of countries analyzed p_all = ggplot(data=batting, aes(x=Debut, y=AgeAtDebut)) + geom_point(data=batting, alpha=0.5, size=2.5) + geom_smooth(size=1.5) + ggtitle("Age of Latin American MLB Players at their debut")+ theme_bw()+ geom_text(data=subset(batting, AgeAtDebut > 40 | AgeAtDebut < 18), aes(Debut, AgeAtDebut, label = Name), hjust=0.1, vjust=1)+ xlab("Year of Debut") + ylab("Age at debut") p_all
En el transcurso del análisis, surgió otra interrogante:
- ¿Cómo es la relación o tendencia de temporadas en MLB en función de la edad de los jugadores en su debut?
El siguiente código permite obtener una grafica para responder esa pregunta.
# Create a scatter plot of Years vs. Age At debut p_years = ggplot(data=batting, aes(x=AgeAtDebut, y=Yrs))+ geom_point(data=batting, alpha=0.1, size=2) + geom_smooth(data=batting, aes(color=Countries), size=1.5, se= FALSE) + ggtitle("Seasons in MLB vs. Age of player at their debut")+ xlab("Age at debut") + ylab("Career Years") + geom_text(data=subset(batting, Yrs > 22), aes(AgeAtDebut, Yrs, label = Name), hjust=0.1, vjust=1) + theme_bw()+ facet_wrap(~ Countries, ncol=4) p_years
Del gráfico anterior se pueden resaltar vários puntos interesantes:
- La mayoría de los países tienen una tendencia decreciente o negativa del número de temporadas de un jugador en la MLB a medida que debuten con más edad. Esto es lo que esperaba una vez que si un jugador debuta con más edad, independientemente de su desempeño, tendrá menos capacidad física útil para mantenerse por más años en la MLB.
- Cuba es el país que tiene una tendencia diferente a los otros (a pesar de que Curaçao también tenga una curva diferente, no la consideré en este análise por causa del poco número de jugadores comparado con los primeros cinco países). En este caso, de la gráfica de Cuba se puede inferir que los jugadores que debutaron a temprana edad (menos de 20 años) tuvieron pocas temporadas en juego. Los que debutaron entre 2 y 25 años fueron los que tuvieron en promedio el mayor número de temporadas. Y debido a algunos “outliers”, los jugadores que debutaron con más de 25 años, parece que, en promedio, han tenido una tendencia constante en el número de temporadas en MLB.
- Los tres latinoamericanos con más temporadas en MLB son: Omar Vizquel con 24 temporadas, y Julio Franco y Tany Pérez con 23 temporadas cada uno.
En resumen, la edad promedio a la que debutan los jugadores latinos es de apoximadamente 24 años, siendo Curaçao el país con jugadores debutando más jovenes (a pesar de ser el país con menos jugadores de los 8 analizados) y Cuba con jugadores más edad.
Con relación a la aplicación R, se muestra como en pocas líneas se puede obtener información directamente desde páginas web, convertirlas en Data Frames y hacer cualquier tipo de análisis y gráficos para responder perguntas simples o complejas. Todo el código aqui expuesto puede ser copiado en una consola de R y obtener los mismos resultados de este artículo, incusive con datos más actualizados a medida que las páginas web vayan siendo modificadas.
Deja tus comentarios en el blog.
Saludos.
Daniel.