¿Qué tan predecible es el fútbol de fantasía? Muchos fanáticos del fútbol, como yo, nos preguntamos año tras año si existe alguna forma de alcanzar el éxito de manera consistente en las ligas de fantasía. ¡Descubrámoslo con JMP!
Gracias a las mejoras en la integración de JMP con Python, importar los datos de tu liga de fútbol americano de fantasía a JMP es más fácil que nunca. Tras mostrar brevemente cómo usar la funcionalidad nativa de solicitudes HTTP de JMP para acceder a las API documentadas de proveedores de fútbol americano de fantasía como ESPN y Sleeper, esta charla se centra en cómo usar las bibliotecas de API existentes de la comunidad Python para importar años de datos de ligas de fantasía. Desde clasificaciones de ligas, resultados de playoffs, estadísticas de jugadores de la NFL y resultados de fantasía hasta selecciones destacadas y decepciones en el draft, ¡hay muchísimos datos por explorar!
Una vez importados los datos y organizados en tablas, podemos empezar a trabajar con las herramientas de análisis estadístico de JMP para explorar y analizar los datos específicos de nuestra liga, encontrando posibles tendencias y patrones que nos den una ventaja.
¿El éxito depende principalmente de acertar en el draft o de realizar traspasos y adquisiciones a lo largo del año? ¿Se pueden repetir las actuaciones estelares de los jugadores año tras año? ¿Qué tan importante es tener a uno de los tres mejores productores de fantasy en tu equipo? ¿Siguen siendo los corredores las posiciones de mayor impacto en fantasy, o la situación ha cambiado a favor de los receptores abiertos y los quarterbacks? Estas son las preguntas que analizamos para descubrir si JMP puede ayudarte a ganar tu próxima liga.
Hola a todos. Mi nombre es Nick Holmes. Soy ingeniero de pruebas aquí en JMP. Gracias por acompañarme hoy. Hoy vamos a hablar sobre cómo pueden usar JMP para ganar su liga de fútbol americano de fantasía. Como pueden ver, dije "quizás" porque, obviamente, en el fútbol americano de fantasía no hay garantías. Hoy vamos a trabajar en importar nuestros datos de fútbol americano de fantasía a JMP, realizar algunos análisis y ver qué podemos descubrir.
Un breve resumen sobre mí. Me considero un fanático del fútbol americano de fantasía. Soy comisionado de una liga de draft anual de 12 personas que existe desde 2015. Estos son los datos que utilizamos principalmente para nuestros ejemplos y análisis de hoy. La motivación detrás de esta presentación o proyecto es que gané la liga en 2022 y terminé en último lugar en 2023. Busco algún tipo de predictibilidad o análisis que me ayude a predecir mis resultados en el fútbol americano de fantasía.
No soy estadístico, pero haré todo lo posible. Usaremos datos de ESPN y Sleeper. Probablemente ya conozcan ESPN; es un proveedor de ligas de fútbol americano de fantasía. Sleeper es lo mismo, solo que es una plataforma diferente para organizar tu liga. Importaremos datos de ambas plataformas y los usaremos para nuestro análisis.
Utilicé SPN desde aproximadamente 2015 hasta 2020 y Sleeper desde 2021 hasta la actualidad, por lo que necesitábamos obtener datos de ambas plataformas. Este es un breve resumen de lo que haremos hoy para importar estos datos a JMP y luego analizarlos. Primero, necesitamos usar API para importar los datos. Lo haremos de dos maneras: una usando New HTTP Request y otra mediante la integración de JMP con Python.
A continuación, organizaremos, o mejor dicho, les mostraré cómo organizar estas solicitudes en clases JMP u objetos de clase JMP. Una vez que tengamos estos datos en JMP, debemos organizarlos en tablas de datos JMP. Existen varios métodos para hacerlo; les explicaré cómo convertir JSON a tabla de datos, una función nativa de JMP, así como también cómo trabajar con matrices asociativas y cómo usar JSL para crear tablas de datos JMP.
Una vez que tengamos los datos en las tablas de datos de JMP, realizaremos una exploración y un análisis. La primera parte consistirá en manipular las tablas de datos. Les mostraré cómo hacerlo usando Workflow Builder, y luego realizaremos visualizaciones y análisis en algunas de las plataformas de JMP.
Bien, ¿qué es una API? Puedes ver la definición de API al lado, pero en resumen, una API es una forma de recuperar datos de un servidor web. Existen varios métodos asociados a HTTP: GET, POST, DELETE y PUT, pero hoy nos centraremos en el más sencillo: GET. Enviaremos una solicitud GET a una URL o punto final de la API, y el servidor nos devolverá una cadena JSON, que utilizaremos para crear un array asociativo en JMP y también para crear nuestras tablas de datos en JMP.
La función `new HTTP request` de JMP nos permite usar JSL para comunicarnos con estas API REST. Esta función permite, como mencioné antes, el uso de `get`, `post`, `put` y `delete`. Hoy nos centraremos principalmente en `get` y veremos lo sencillo que es usar `new HTTP request` para importar nuestros datos a JMP.
Primero quiero mostrarte cómo obtener datos de Fantasy League Sleeper. Si haces una búsqueda rápida en Google sobre su API, encontrarás una documentación bastante completa que te indica exactamente qué punto final de solicitud HTTP usar y el tipo de datos que puedes esperar recibir.
Este es, de hecho, el mejor escenario para trabajar con una API: el proveedor ofrece una API muy clara, especifica el tipo de datos que se recibirán y proporciona una documentación muy completa. Como se puede ver en su documentación, se explica cómo obtener los datos de la liga y cómo importar los datos de la plantilla a JMP. Al parecer, en la mayoría de los casos, la única información que necesitamos agregar a la URL es el ID de la liga.
Como pueden ver en este ejemplo, solo les presento un esquema de cómo se vería esto en JMP. Proporcionamos nuestro propio ID de liga y lo definimos como una variable de URL. Luego, enviamos la solicitud usando `new HTTP request`, proporcionando la URL con el método `get`. Enviamos la solicitud y luego analizamos el JSON que se devuelve a JMP.
Ahora que hemos visto cómo podría ser esta solicitud, veamos cómo se comporta en JMP. Como pueden ver, tenemos una ventana de script de JMP abierta. Si observan la URL definida, verán que tenemos nuestro ID de liga y la solicitud que vieron en la diapositiva. Si ejecutamos esto, verán que obtenemos una cadena JSON. Para interactuar mejor con estos datos en JMP, queremos convertirlos en un array asociativo de JMP, que es el propósito de esta función Parsed JSON.
Como pueden ver, se nos asigna un array asociativo. Si miramos este array asociativo y luego lo indexamos para obtener el nombre de nuestra liga, podemos ver que obtenemos "league-certified fantasy football", que es el nombre de la liga. Ahora que les he mostrado una demostración muy simple, quiero mostrarles cómo podemos interactuar u organizar nuestras consultas en clases JMP para organizar nuestra solicitud, nuestra solicitud HTTP. Cerremos esto y abramos nuestro archivo de proyecto. Al mirar este archivo de proyecto, verán que tenemos clases definidas para organizar nuestras consultas.
Tenemos esta clase de liga. Como pueden ver en esta referencia, está basada en una API de Python de la que tomé prestado el esquema, y hablaremos de ello con más detalle cuando abordemos nuestra integración de JMP con Python. Si observan esta clase, verán que tenemos clases para usuarios de la liga, jugadores, selección de jugadores y estadísticas. Todas estas clases en el backend llaman a esta API basada en clases, que es la que realiza nuestra nueva solicitud HTTP en segundo plano.
Veamos cómo podríamos usar esta clase para obtener nuestros datos. Voy a ejecutar la definición de esta clase y luego me desplazaré hacia abajo hasta donde tengo algunos ejemplos. Disculpen si se marean al desplazarse. Ahora verán que estoy definiendo un objeto de liga. Nuevamente, le proporciono mi ID de liga. Aquí pueden ver que tenemos la definición de la clase, y ahora podemos usar los métodos definidos para ese objeto en particular para obtener las listas de jugadores de la liga. Podemos obtener los usuarios de la liga, y así sucesivamente. Todo esto se devolvió en un array asociativo.
Por ahora, no nos preocuparemos por analizar con exactitud el contenido, sino que les mostraremos los datos que obtenemos. Ahora tenemos lo mismo para usuarios, jugadores y cortinas. Compartiré todo esto con la comunidad de JMP como material de presentación junto con las diapositivas. Podrán usar estas clases en la presentación que les mostraré más adelante para importar sus datos a JMP.
En el caso de Sleeper, obtener nuestros datos fue muy sencillo. Contábamos con una API muy bien definida que pudimos usar para crear nuestra solicitud HTTP. Desafortunadamente, no parece ser el caso con ESPN. Si realizas una búsqueda rápida de "ESPN API" o "ESPN fantasy API", verás que lo único que aparece es una clase de Python creada por un usuario. No parece haber documentación pública disponible para su API.
¿Qué hacemos? Bueno, ahora es el momento perfecto para hablarles de JMP y la nueva integración de Python en JMP 18. En JMP 18, Python viene instalado. Podemos usar paquetes de Python con una configuración mínima. Con las clases de Sleeper que les mostré antes, o inspiradas en clases de Python, en lugar de crear las clases y las definiciones de métodos nosotros mismos, podemos instalar el paquete de Python usando la línea de código que ven aquí e interactuar con Python para importar los datos a JMP.
Dado que esto ya existe para ESPN, ahora podemos hacer lo mismo para ESPN, y como no hay buena documentación para ellos, podemos recurrir a la API de Python preexistente que alguien ya ha escrito. ¿Cuáles son algunas de las ventajas de usar la integración de Python? Todo el trabajo pesado ya está hecho. No necesitamos programar la lógica de las llamadas a la API ni ningún otro tipo de manipulación de datos para las funciones que queramos crear. Simplemente podemos confiar en las funciones y la documentación que otras personas han escrito en Python.
Simplemente llamamos a las funciones de Python y enviamos esos datos de vuelta a JMP. Aquí hay un ejemplo sencillo de cómo se vería. Disculpen si es un poco difícil de ver, pero quería que cupiera todo en la pantalla. Repito, estas diapositivas se incluirán para que las vean más tarde, pero pueden verlas simplemente observando el tamaño de la definición de la función. Encontrar nuestra propia función para obtener el marcador es mucho más complicado que usar la integración de Python para llamar a la función `get_scoreboard` que alguien ya ha definido para nosotros en Python.
Ahora veamos cómo podría ser la integración de ESP y Python en el módulo de programación en espera. Con esto terminamos. Volveremos a analizar esas clases de programación en espera, pero esta vez con integración de Python. Como se puede observar en nuestra clase `league`, estamos utilizando una serie de instrucciones `submit` y `get` de Python para interactuar con la API de Python ya existente.
Para obtener la información de nuestra liga, simplemente ejecutaríamos una instrucción `submit` de Python para definir una variable de información de la liga. Luego, con esa variable, usaríamos `get_league` para obtener la información y, posteriormente, enviaríamos esa variable de vuelta a JMP mediante la función `get` de Python.
Todas estas funciones operan exactamente igual que antes con la implementación JSL que teníamos para la nueva solicitud HTTP, con la diferencia de que ya no tenemos esa clase porque la solicitud HTTP se ha abstraído y ahora se ejecuta a nivel de Python. Esto simplifica mucho las definiciones de métodos para nuestra clase. Ahora veamos ESPN, que probablemente sea la plataforma con la que la mayoría de ustedes están más familiarizados, y pueden ver que aquí tenemos clases iguales o similares para ESPN.
La API de Python está construida con un enfoque más orientado a objetos, donde la liga devuelve objetos de equipo, de jugador, etc. Luego, con esos objetos, usaremos métodos para acceder a sus atributos. Ejecutaré esta definición de clase para que podamos ver algunos ejemplos de cómo podríamos obtener nuestros datos de ESPN y cómo podríamos interactuar con esos objetos de clase.
Aquí verás que obtendré la información de mi liga privada. Como ves, ese objeto ha sido definido. Usaremos el método get teams en la liga para obtener la información del equipo. Ahora tenemos un array asociativo definido. Recorreremos este array asociativo usando for each para imprimir los nombres de todos los equipos. Como puedes ver aquí, este es el nombre de mi equipo. Si quiero acceder a mi equipo, usaría el índice de esa variable teams para obtener mi equipo. Ahora, si quiero ejecutar get wins en ese equipo, puedo ver cuántas victorias tuve en esa temporada, siete, así que bastante mediocre.
Ahora bien, si quisiera consultar la lista de jugadores de ese equipo, usaría la función `get roster` y luego la analizaría para obtener los nombres de los jugadores. Como pueden ver aquí, vería a todos los jugadores que incluí en la lista para esa temporada en particular. Como mencioné, estas clases estarán disponibles. Me tomé el tiempo de comentarlas, creo, bastante bien para que puedan usarlas para acceder a la información de su propio equipo.
Ahora que tenemos estos datos en JMP, para analizarlos, necesitamos convertirlos en tablas de datos de JMP. Hay varias maneras de hacerlo. Como mencioné antes, al obtener datos de una API, estos suelen devolverse en formato JSON. JMP incluye una función llamada "JSON a tabla de datos", que podemos usar, como se muestra en este ejemplo, para crear una tabla de datos a partir de nuestra cadena JSON.
Esta es probablemente la forma más sencilla de hacerlo. También hay un Asistente de importación JSON en JMP que puedes usar para personalizar qué columnas estás importando y qué datos específicos quieres de tu tabla. Otra forma de hacerlo, como puedes imaginar, podría ser más útil cuando trabajamos con nuestros datos de ESPN, ya que eran más orientados a objetos, es definir nuestra tabla manualmente usando JSL, y luego usar los métodos del objeto para llenar… Perdón. Para llenar esas columnas.
Como pueden ver aquí, estamos recorriendo los objetos de equipo para completar los equipos que están en una liga. Estamos recorriendo los objetos de equipo, y pueden ver aquí, para definir los datos de una columna en particular, simplemente usamos el método que necesitemos para completar esa columna. Para la columna de victorias, usaríamos obtener victorias, para las derrotas, obtener derrotas, y así sucesivamente, y si hay objetos anidados, podemos recorrer esos objetos para, por ejemplo, completar una lista de ID de jugadores que usaríamos para una columna.
Puedes verlo para cada expresión. Ahora déjame mostrarte cómo tenemos estas tablas de datos en JMP. Tengo archivos separados para obtener datos de Sleeper y datos de ESPN. Puedes ver que para los datos de Sleeper, importamos nuestras clases porque esos son los métodos que usamos para obtener los datos. Voy a desplazarme rápidamente por aquí, pero resaltaré el método del que hablé antes, JSON a tabla de datos. Puedes ver que lo usamos aquí para definir nuestras columnas y crear una tabla de datos para los equipos de una liga.
De nuevo, compartiré estos archivos con ustedes. Con suerte, si tienen datos en una liga de fantasía, todo lo que necesitan hacer para obtener todos sus datos para cada año que la liga ha existido es ejecutar esta última línea aquí, y utiliza todas estas funciones definidas previamente en este archivo, que pueden revisar cuando quieran. Tenemos algo similar para ESPN. Notarán que aquí creamos nuestras tablas de una manera un poco diferente, como vieron resaltado en la diapositiva, donde definimos una tabla con JSL y luego usamos métodos de objeto para llenar esas tablas.
De nuevo, con suerte, lo único que tendrás que hacer para obtener todos tus datos de ESPN es ejecutar esta última línea. Veamos cómo se ven estos datos en JMP. Después de procesar esos archivos, deberías tener un directorio con el nombre de tu liga. Para cada año de la liga, deberías tener las siguientes tablas: la tabla de selección de jugadores, la tabla de miembros, la tabla de equipos, así como las plantillas individuales de cada usuario de la liga.
Vamos a echarles un vistazo. Como pueden ver, tenemos una lista de los equipos. Permítanme ver si puedo ampliar estas columnas. Espero que se vea bien. Para cada equipo, verán el nombre de usuario. Voy a reducir un poco el tamaño para que se vea mejor. Para cada equipo, verán los miembros de la liga, el número de victorias y derrotas que han tenido. Pueden hacer clic en la columna de jugadores y resaltar la lista de jugadores de una plantilla en particular.
Tendremos una tabla de datos para el draft y los jugadores seleccionados por ronda y número de selección. Puedes hacer clic en un usuario para ver qué jugador fue seleccionado en su draft, y también tenemos una tabla para los miembros de la liga. Puedes imaginar el tipo de análisis que podemos realizar con estas tablas.
Antes de entrar en el análisis, quiero darles una idea de la motivación, como ya les comenté. En 2022, terminé primero en mi liga, mientras que en 2023, lamentablemente, terminé último. Busco cierta previsibilidad en los resultados. Como pueden ver en el diagrama de dispersión de la izquierda, tuve un ala cerrada y un mariscal de campo de primer nivel, mientras que en la liga donde terminé último, ninguno de esos dos jugadores figuraba entre los cinco primeros.
Sin embargo, tuve un mejor receptor abierto, así que al observar estas dos gráficas, realmente no puedo decir exactamente qué causó mi éxito en un año en comparación con otro, así que esa es la inspiración para mi análisis. ¿Qué vamos a ver hoy? Lo primero que vamos a ver es que la liga de fantasía comienza con el draft. Hay ciertos puestos de selección en el draft que son mejores que otros.
Lo siguiente que vamos a analizar son las tendencias o cambios que se han producido en el fútbol americano de fantasía durante la última década. ¿Qué estrategias de selección de jugadores ofrecen las mejores posibilidades de ganar? Un enfoque conservador o arriesgado, y al final, simplemente tengo la configuración de mi liga, que es bastante típica. Un quarterback, dos receptores derechos, dos running backs, dos posiciones flexibles, un kicker y una defensa con puntuación PPR a la mitad. Creo que estas son configuraciones de liga bastante estándar.
Esperamos que las conclusiones de nuestro análisis también sean útiles para tu liga. ¿Influye la posición de selección en el éxito? Trabajaremos con las tablas de datos que les mostré anteriormente para realizar un análisis. Para ello, utilizaremos un Generador de Flujos de Trabajo que nos permitirá visualizar los pasos necesarios para organizar las tablas y realizar el análisis.
Puedes ver el flujo de trabajo aquí. Tenemos este paso de configuración inicial, que simplemente define el nombre de nuestra liga, que simplemente le indica al flujo de trabajo de dónde obtener los datos. Voy a explicar esto paso a paso inicialmente y te lo mostraré. Estamos haciendo los siguientes pasos para cada año de la liga. Vamos a abrir una tabla de selección. Vamos a abrir una tabla de equipos.
Ahora, para nuestra tabla de selección, vamos a subconjuntar por el número de usuarios en la liga para obtener el número de selección asociado a cada usuario. Disculpen, se ve así. Ahora vamos a unir esta tabla de datos a nuestra tabla de equipos para obtener una tabla como esta, que ahora tiene el número de victorias que tuvo ese jugador, o ese miembro de la liga, así como su posición en el draft. Haremos esto para cada año de la liga y concatenaremos la tabla para realizar nuestro análisis.
Repasaré el resto de los pasos aquí. Algunas de estas tablas aparecen en otra pantalla, pero les mostraré la tabla de resultados final y el análisis. Como pueden ver en este gráfico, tenemos nuestro número de selección en el eje X, y en el eje Y, tanto el número de victorias del equipo como su posición final.
Al observar este gráfico, no veo una gran discrepancia ni correlación entre el número de selección y el rendimiento final. Me fijo en las victorias. Podemos ver que, si eliges pronto en el draft, el promedio de victorias a lo largo de mi historial en la liga es ligeramente superior, y luego hay una posible caída a mediados del draft. Lo que interpreto de esto es que, independientemente de la posición en la que elijas, parece que tienes posibilidades de ganar tu liga.
Ahora veamos cómo ha cambiado la estrategia de selección de jugadores a lo largo de los nueve años de historia de mi liga. Para ahorrar tiempo, les mostraré los pasos que seguimos. Básicamente, abrimos todas nuestras tablas de selección, las concatenamos y luego creamos subconjuntos, pero para ahorrar tiempo, simplemente les mostraré el proceso y el resultado.
Aquí tenemos dos gráficos de resultados. Analicemos con más detalle. Les explicaré el principal, y si les interesa, pueden echarle un vistazo al siguiente. Este es un desglose de las rondas de selección. Básicamente, aquí tenemos el año en el eje X y el número de jugadores seleccionados en una posición determinada en las primeras cuatro rondas en el eje Y.
Al observar este gráfico, podemos ver que el número de… esto es a nivel de toda la liga, es decir, toda la liga, cuántos quarterbacks, running backs, tight-ins y wide-receivers fueron seleccionados en las primeras cuatro rondas. Podemos ver que desde 2015 hasta 2020, hubo un aumento en el número de running backs seleccionados, y esto ha disminuido decentemente en los últimos tres años, por lo que menos running backs seleccionados en las primeras cuatro rondas. Puedes ver por qué el receptor tuvo una tendencia similar a la de los running backs, con una meseta aquí y manteniéndose un poco más alto que los running backs. Puedes ver que los quarterbacks han disminuido en el draft, popularidad temprana del draft con un ligero aumento aquí últimamente.
La posición de ala cerrada se ha mantenido bastante estable, con solo un ligero aumento en los últimos dos años. Como pueden ver en este gráfico, tenemos un desglose ronda por ronda, y lo compartiré con la comunidad si desean analizarlo con más detalle.
Ahora, vimos cómo ha cambiado la estrategia de selección de jugadores a lo largo de los años, y ahora quiero ver si funciona un cambio en la estrategia de selección. Para este análisis, vamos a ver la cantidad de jugadores seleccionados en cada posición durante las primeras seis rondas, y vamos a ver esto solo durante los últimos tres años. Puedes ver los pasos que se siguen para este análisis aquí. Voy a ejecutar ese paso de configuración. Para cada año, vamos a abrir la tabla de selección. Vamos a abrir una tabla de equipos. Vamos a subconjuntar esta tabla de selección para las primeras seis rondas. Luego vamos a hacer una tabla resumen que muestre la cantidad de jugadores seleccionados en cada posición para cada usuario. Vamos a hacer esto para cada año, y luego concatenamos eso para realizar nuestro análisis.
Primero, echemos un vistazo a este gráfico de Graph Builder. Podemos ver que la cantidad de corredores seleccionados en las primeras seis rondas tiende a estar ligeramente correlacionada negativamente con la cantidad de victorias. Esto respalda la tendencia que vimos en nuestro análisis anterior, donde la cantidad de corredores seleccionados disminuyó. Podemos ver un pico en receptores abiertos con dos seleccionados en las primeras seis rondas, seguido de una ligera disminución, con tres receptores abiertos seleccionados.
La pendiente más pronunciada que vemos aquí es la del ala cerrada, a la que volveremos en un segundo, lo que demuestra que elegir un ala cerrada en las primeras seis rondas tiende a tener una correlación bastante positiva con el número de victorias que se pueden esperar en la temporada. De manera similar, con el mariscal de campo, pero la línea es ligeramente menos pronunciada. Veamos esto de una manera más estadística usando un modelo de ajuste. Aquí podemos ver esta línea muy pronunciada que podemos ver para el ala cerrada. Mirando nuestras estimaciones de parámetros aquí abajo en la esquina inferior izquierda.
De hecho, con significancia estadística, se observa una correlación positiva bastante fuerte entre elegir un ala cerrada en las primeras seis rondas y la cantidad de victorias que se pueden esperar en una temporada. Diría que la conclusión más importante de este análisis es que, si bien se debería elegir menos corredores, como se puede apreciar en esta correlación negativa, elegir un ala cerrada en las primeras seis rondas tiene una correlación bastante fuerte para predecir la cantidad de victorias que se pueden obtener en una temporada.
Ahora quiero analizar si los mejores jugadores son predecibles año tras año. Más concretamente, quiero ver qué porcentaje de los 12 mejores productores de fantasy por posición se mantienen iguales año tras año y ver si eso te da alguna pista sobre en qué jugadores deberías centrarte en tu draft.
Para ahorrar tiempo, voy a mostrarles este flujo de trabajo. Pueden ver los pasos aquí al lado mientras se ejecuta. Esto solo toma un poco de tiempo. Les hablaré sobre las ventajas de usar flujos de trabajo para su análisis. Les permite recorrer iterativamente los diferentes pasos del análisis e identificar áreas problemáticas.
Además, si tus compañeros de trabajo tienen fácil acceso a los datos con los que estás trabajando, les permite replicar tu análisis y los pasos para generarlo con facilidad. Aquí te mostraré los gráficos y los datos que produjo este análisis. Puedes ver los datos aquí al lado; básicamente, esto te indica año tras año qué porcentaje de los 12 primeros puestos de cada posición se mantuvo igual que el año anterior.
Observando este gráfico, diría que el número de corredores, representados por esta línea azul, tiende a disminuir en los últimos años. Esto significa que el rendimiento de los corredores año tras año es un poco menos predecible en comparación con el año anterior. Por otro lado, el rendimiento de los receptores y alas cerradas también es un poco más predecible. Una conclusión que puedo extraer de esto es que, por ejemplo, los mejores corredores que vimos en 2023 solo mantuvieron el 33% de su rendimiento en los últimos dos años entre los 12 mejores. Estas posiciones podrían ser un poco más difíciles de predecir que, por ejemplo, las de receptor abierto y ala cerrada.
Nuestro último análisis. Vamos a ver a quién deberíamos seleccionar en el draft. Analizamos todas estas tendencias y patrones. ¿Cuáles deberían ser nuestras estrategias de draft? Para este análisis, vamos a examinar el valor del draft y cómo los jugadores con un rendimiento superior al esperado, según su posición en el draft, influyen en el éxito de tu equipo. Quiero destacar este análisis un poco más porque me parece bastante interesante.
Después de la configuración inicial, repetiremos el proceso cada año. Primero, abriremos la tabla de selección y la tabla de equipos. Estos dos pasos siguientes son solo de mantenimiento. Ahora, realizaremos un análisis bivariado en la tabla de selección para observar la relación entre la posición del jugador seleccionado y el total de puntos anotados.
Al analizar esto mediante un análisis de variables, tenemos un desglose por posición que muestra en el eje X el número de selección y luego el número total de puntos que anotó ese jugador. Me interesan particularmente los puntos de la gráfica que están por encima y por debajo de lo esperado o de lo que la regresión indica como esperado para la posición.
Quiero ver cómo estos resultados por encima y por debajo del ajuste lineal previsto afectan nuestras posibilidades de ganar. Eso es lo que hará el resto de este análisis. Guardaremos estos valores de regresión y estos residuos de estos gráficos en nuestra tabla de borrador, como pueden ver aquí. Luego agruparemos nuestras rondas por tempranas, intermedias y tardías. Hagamos una rápida recodificación aquí para nuestra columna de ronda.
Ahora tenemos un desglose de temprano, medio y tardío. Podemos ver cómo los jugadores con rendimiento superior e inferior al esperado por categoría de ronda afectan la victoria. Repasaré el resto de este análisis. Esperen un segundo mientras se carga. Disculpen la demora. Ya casi terminamos. Ahora pueden ver que nos queda una tabla de datos que nos muestra que es una tabla de datos combinada donde están todos los datos del año. Ahora tenemos la cantidad de jugadores con rendimiento extremadamente superior al esperado por categoría de ronda para cada usuario a lo largo de un año en particular, y tenemos estos datos para todos nuestros años. El punto de este análisis es ver cómo los jugadores con rendimiento extremadamente superior o inferior al esperado en las rondas particulares en las que fueron seleccionados afectan nuestras posibilidades de ganar.
Podemos ver este gráfico del modelo ajustado aquí. Este, creo, es el análisis más interesante del día. Podemos ver algunos de los gráficos de apalancamiento aquí, prestando especial atención a estos jugadores con rendimiento extremadamente alto en las rondas intermedias y a los jugadores con rendimiento extremadamente bajo en las rondas iniciales. Estoy viendo nuestras estimaciones de parámetros aquí, podemos ver que con significancia estadística, un jugador con rendimiento superior en las rondas intermedias tiene una correlación bastante positiva para predecir la cantidad de victorias que tienes en la temporada con varios jugadores con rendimiento superior, tener más jugadores con rendimiento superior en las rondas intermedias te da una mejor oportunidad de tener más victorias de fantasía.
Por el contrario, un jugador con un rendimiento muy bajo en las primeras rondas tiene una correlación muy negativa con el número de victorias que puedes predecir para la temporada. Una conclusión sería que te arriesgues en las rondas intermedias. Voy a intentar seleccionar a esos jugadores que son capaces de hacer grandes jugadas, por ejemplo, y no me preocuparé por fallar. Como puedes ver, conseguir un jugador con un rendimiento muy bajo en las rondas intermedias no parece ser tan perjudicial.
Podrías apuntar alto y tratar de conseguir a esos jugadores que te den ventaja en la liga y la mejor oportunidad de ganar, sobre todo porque no te penalizarán mucho si no los consigues. Por otro lado, no elegir a un jugador al principio del draft y seleccionar a uno propenso a las lesiones puede ser muy perjudicial para tu éxito en el fantasy football.
Gracias por acompañarme durante estos análisis. Estas son algunas de las conclusiones principales. El año pasado nunca se repite. Como vimos en uno de nuestros análisis, los mejores jugadores de fantasía de una temporada, especialmente los corredores, son mucho menos predecibles de una temporada a otra.
En los formatos típicos, los corredores están perdiendo valor y, como mencioné, son menos predecibles, mientras que los receptores abiertos están ganando algo de valor y son definitivamente más predecibles que los corredores. Ya no podemos ignorar las posiciones de mariscal de campo y, sobre todo, de ala cerrada, ya que, como vimos, seleccionar un ala cerrada al principio del draft suele ser clave para el éxito en la liga. Las selecciones tempranas no garantizan la victoria en la liga, pero sí pueden hacerla perder, y las ligas se juegan en las rondas intermedias.
Arriésgate con jugadores de alto potencial por las razones que mencioné anteriormente. Ahora es tu turno. Les he proporcionado las clases y la API que uso para importar datos de Sleeper y ESPN a JMP. Pueden usar estas API para compartir sus análisis en la comunidad de JMP. Si su liga de fantasía no está en Sleeper ni en ESPN, pueden usar el esquema de integración de Python para utilizar cualquier repositorio de Python que encuentren, importar esos datos a JMP y realizar sus análisis.
Quiero agradecerles muchísimo por su tiempo hoy. Tengo mucho interés en ver los análisis que realicen y espero que me ayuden a ganar mi próxima liga de fútbol americano de fantasía. Gracias.