DEVFUT

Visualiza el Dominio en un Partido con xT Momentum en Google Colab

📊 Cómo crear un gráfico de xT Momentum con Python y LanusStats en Google Colab

Aprende a generar gráficos de xT Momentum como los expertos, utilizando Google Colab y la librería LanusStat. Ideal para analizar partidos de fútbol y visualizar la amenaza ofensiva minuto a minuto. Incluye código explicado y ejemplos prácticos.


El análisis de datos en el fútbol ha evolucionado enormemente, y una de las métricas más interesantes es el Expected Threat (xT). Esta métrica permite cuantificar qué tan peligrosa es una acción con el balón, sin necesidad de que termine en remate o gol.

Una herramienta visual poderosa basada en esta métrica es el xT Momentum, que muestra el dominio ofensivo de cada equipo durante el partido. En este tutorial aprenderás a crear tu propio gráfico de xT Momentum usando Python, Google Colab y la librería LanusStats, aplicándolo al análisis de un partidazo: Barcelona 4-3 Real Madrid.


🧰 Herramientas necesarias

Vamos a trabajar en un entorno online gratuito: Google Colab, que no necesita instalación local.

Además, usaremos una excelente librería para análisis de fútbol llamada LanusStats.

!pip install LanusStats

import LanusStats as ls
import pandas as pd
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter1d

📂 Carga de datos

Usaremos la librería LanusStats para llamar a Fotmob y hacer el analísis donde necesitaremos el ID del partido, los scores y colores para el equipo local y equipo visitante.

fotmob = ls.FotMob()

response = fotmob.request_match_details('4507097')
home_color, away_color = '#00FF00', '#0000CD'
momentum_df = pd.DataFrame(response.json()['content']['matchFacts']['momentum']['main']['data'])
HOME_TEAM = 'BARCELONA'
AWAY_TEAM = 'REAL MADRID'
scores_HOME = 4
scores_AWAY = 3


💻 Código para generar el gráfico xT Momentum

# Normalizar los valores conservando el signo
max_abs = momentum_df['value'].abs().max()
momentum_df['norm_value'] = momentum_df['value'] / max_abs

# Suavizado
momentum_df['smoothed_momentum'] = gaussian_filter1d(momentum_df['norm_value'], sigma=2)

# Crear gráfico
fig, ax = plt.subplots(figsize=(12, 6))
fig.set_facecolor('#0e1117')
ax.set_facecolor('#0e1117')

# Ejes y estilo
ax.tick_params(axis='x', colors='white')
ax.margins(x=0)
ax.set_xticks([0, 15, 30, 45, 60, 75, 90])
ax.tick_params(axis='y', which='both', left=False, right=False, labelleft=False)
ax.set_ylim(-1, 1)  # Ahora los valores están entre -1 y 1

for spine in ['top', 'right', 'bottom', 'left']:
    ax.spines[spine].set_visible(False)

# Graficar la línea normalizada
ax.plot(momentum_df['minute'], momentum_df['smoothed_momentum'], color='white', linewidth=.5)

# Línea base y relleno de áreas
ax.axhline(0, color='white', linestyle='--', linewidth=0.5)
ax.fill_between(momentum_df['minute'], momentum_df['smoothed_momentum'], where=(momentum_df['smoothed_momentum'] > 0), color=home_color, alpha=0.5, interpolate=True)
ax.fill_between(momentum_df['minute'], momentum_df['smoothed_momentum'], where=(momentum_df['smoothed_momentum'] < 0), color=away_color, alpha=0.5, interpolate=True)

# Etiquetas de equipos
home_team_text = ax.text(7, 0.9, HOME_TEAM, fontsize=12, ha='center', fontfamily="Monospace", fontweight='bold', color=home_color)
home_team_text.set_bbox(dict(facecolor='black', alpha=0.5, edgecolor='white', boxstyle='round'))
away_team_text = ax.text(7, -0.9, AWAY_TEAM, fontsize=12, ha='center', fontfamily="Monospace", fontweight='bold', color=away_color)
away_team_text.set_bbox(dict(facecolor='black', alpha=0.5, edgecolor='white', boxstyle='round'))

ax.set_title(f'xT Momentum\n{HOME_TEAM} {scores_HOME}-{scores_AWAY} {AWAY_TEAM}', color='white', fontsize=20, fontweight='bold', fontfamily='Monospace', pad=-5)

plt.show()

✔️ ¡Y listo! El gráfico muestra cómo varió el peligro ofensivo (xT) durante los 90 minutos para ambos equipos.


🧠 Interpretación visual

Visualización del xT Momentum del partido entre Barcelona y Real Madrid, donde se observa el dominio ofensivo de cada equipo a lo largo del tiempo. Barcelona logró más tramos de alta amenaza, lo que se refleja en su victoria por 4-3.

El gráfico muestra el momentum de amenaza esperada (xT) a lo largo del tiempo. Algunas claves para interpretarlo:

  • Áreas verdes: acciones ofensivas de Barcelona.
  • Áreas azules: acciones ofensivas de Real Madrid.
  • Cuanto más alto el área, más peligro generó ese equipo en ese tramo del partido.
  • Puedes identificar momentos clave de dominio, remontadas o bajones.

En este caso, Barcelona tuvo más tramos de alta amenaza, lo que se ve reflejado en el marcador final: 4-3.


🧾 Conclusión

El xT Momentum es una herramienta visual poderosa para entender quién dominó el partido, incluso más allá de los goles o la posesión.

✅ Con solo unas líneas de código, puedes:

  • Comparar equipos
  • Analizar partidos pasados
  • Generar contenido para redes sociales o blogs

Te invito a experimentar con tus propios partidos, cambiar estilos del gráfico y combinarlo con otras visualizaciones como mapas de calor, redes de pases y más.


🤝 ¿Te gustó este análisis? ¡Conectemos!

Me apasiona el análisis de datos aplicado al fútbol y otros proyectos con Python. Si te interesa este tipo de contenido, puedes seguirme en mis redes sociales para más proyectos, tutoriales y herramientas:


🎯 Facebook: https://www.facebook.com/developfutbol

🐦 Twitter: https://x.com/aless_palomino

📷 Instagram: https://www.instagram.com/nicolee.palomino/

💼 LinkedIn: https://www.linkedin.com/in/nicole-palomino-alvarado/

🎯 Github: https://github.com/Nicole-Palomino


📬 También puedes dejarme tus dudas o sugerencias en los comentarios. ¡Gracias por leer!

Publicar un comentario

0 Comentarios