DEVFUT

Cómo Analizar los Toques por Zonas en el Fútbol: Premier League 2024/25

¿Qué es la distribución de toques por zonas?

Analiza toques por zonas en la Premier League 2024/25 con Python y datos de FBref. Visualiza estilos tácticos.

La distribución de toques por zonas es un análisis que divide el campo de fútbol en tres grandes secciones zona defensiva, zona media y zona ofensiva y calcula qué porcentaje de los toques de un equipo ocurren en cada una. Este enfoque permite visualizar dónde se concentra el juego de un equipo a lo largo de un partido o una temporada.

Cada toque que realizan los jugadores (pases, controles, despejes, etc.) se asigna a una de esas tres zonas según su posición en el campo. A partir de esa información, se puede representar gráficamente el estilo y enfoque táctico de cada equipo. 

¿Por qué es útil este análisis?

Analizar la distribución de toques por zonas permite entender aspectos clave del estilo de juego de un equipo, como por ejemplo:

  • Estilo de juego: Equipos que dominan en la zona media tienden a jugar con posesión, mientras que los que se concentran en la zona defensiva pueden tener un estilo más conservador.
  • Presión alta o baja: Si un equipo tiene muchos toques en la zona ofensiva, puede indicar una estrategia de presión alta o ataque constante.
  • Comparaciones tácticas: Ayuda a comparar equipos entre sí para ver diferencias en enfoque, incluso cuando tienen resultados similares.
  • Preparación de partidos: Los entrenadores pueden usar esta información para ajustar su estrategia según las tendencias del rival.

En resumen, este tipo de análisis transforma datos en una herramienta visual y táctica que revela cómo se comporta un equipo en el campo.

🧠 ¿Quieres explorar el código completo? Aquí tienes el Google Colab:

🔗 https://colab.research.google.com/drive/1xLZSUiroSNppfpt7eFOfT-tFzuZ7Otg6?usp=sharing

Distribución de toques por zonas de la Premier League


RECOLECCIÓN DE DATOS

La fuente que nos brindará los datos será FBref (https://fbref.com/en/comps/9/Premier-League-Stats).

HERRAMIENTAS

Utilizaremos Google Colab y Python.

PROCESAMIENTO DE DATOS

Usamos la biblioteca pandas para extraer automáticamente las tablas de la página oficial de estadísticas de la Premier League en FBref. Seleccionamos la tabla número 18 (que contiene los toques distribuidos por zona) y extraemos solo las columnas necesarias para nuestro análisis: el nombre del equipo y sus toques en distintas partes del campo.

import pandas as pd

URL = 'https://fbref.com/en/comps/9/Premier-League-Stats'
df = pd.read_html(URL)[18]
df = df[['Unnamed: 0_level_0', 'Touches']].copy()

Eliminamos un nivel de encabezado porque FBref entrega tablas con encabezados jerárquicos que complican el análisis.

df.columns = df.columns.droplevel()
df = df.drop(["Def Pen", "Att Pen", "Live"], axis = 1)

Ahora que tenemos los datos de toques por zona (defensiva, media y ofensiva), necesitamos entender qué proporción del juego de cada equipo ocurre en cada tercio del campo. Para eso, convertimos los totales en porcentajes.

touches_cols = ['Def 3rd', 'Mid 3rd', 'Att 3rd']
df_total = pd.DataFrame(df[touches_cols].sum())
df_total.columns = ['total']
df_total = df_total.T
df_total = df_total.divide(df_total.sum(axis=1), axis=0) * 100

Ya tenemos el promedio general de la liga, pero ahora vamos a ver cómo se comporta cada equipo individualmente. Convertimos sus toques por zona en porcentajes y ordenamos para ver tendencias claras, como qué equipos juegan más en campo propio o en campo rival.

df[touches_cols] = df[touches_cols].divide(df[touches_cols].sum(axis=1), axis=0) * 100.
df.sort_values(['Att 3rd', 'Def 3rd'], ascending=[True, False], inplace=True)

Ahora vamos a mejorar el aspecto visual del gráfico: agregamos el logo de StatsPerform, la fuente personalizada y efectos de trazo en los textos. Estos detalles no cambian los datos, pero sí hacen que la visualización luzca profesional y clara para compartir.

SP_LOGO_URL = ('https://upload.wikimedia.org/wikipedia/commons/d/d5/StatsPerform_Logo_Primary_01.png')
sp_logo = Image.open(urlopen(SP_LOGO_URL))
fm = FontManager()
path_eff = [path_effects.Stroke(linewidth=3, foreground='black'),
            path_effects.Normal()]

Ahora es cuando todo cobra vida. Usamos la biblioteca mplsoccer para trazar los campos de fútbol y sobre cada uno mostramos el porcentaje de toques en cada tercio del campo, equipo por equipo. Esta visualización facilita comparar estilos de juego sin necesidad de ver cada partido.

“Este es el paso que transforma el análisis en una herramienta visual poderosa. En lugar de una tabla numérica, ahora podemos entender la filosofía de juego de cada equipo con un solo vistazo.”

pitch = Pitch(line_zorder=2, line_color='black', pad_top=20)

bin_statistic = pitch.bin_statistic([0], [0], statistic='count', bins=(3, 1))

GRID_HEIGHT = 0.8
CBAR_WIDTH = 0.03
fig, axs = pitch.grid(nrows=4, ncols=5, figheight=20, grid_width=0.88, left=0.025,
                      endnote_height=0.03, endnote_space=0, axis=False,
                      title_space=0.02, title_height=0.06, grid_height=GRID_HEIGHT)


fig.set_facecolor('white')

teams = df['Squad'].values
vmin = df[touches_cols].min().min()  # we normalise the heatmaps with the min / max values
vmax = df[touches_cols].max().max()

for i, ax in enumerate(axs['pitch'].flat[:len(teams)]):
    ax.text(60, -10, teams[i],
            ha='center', va='center', fontsize=50, fontproperties=fm.prop)
    
    bin_statistic['statistic'] = df.loc[df.Squad == teams[i], touches_cols].values
    heatmap = pitch.heatmap(bin_statistic, ax=ax, cmap='coolwarm', vmin=vmin, vmax=vmax)
    annotate = pitch.label_heatmap(bin_statistic, color='white', fontproperties=fm.prop,
                                   path_effects=path_eff, fontsize=50, ax=ax,
                                   str_format='{0:.0f}%', ha='center', va='center')

if len(teams) == 18:
    for ax in axs['pitch'][-1, 3:]:
        ax.remove()

cbar_bottom = axs['pitch'][-1, 0].get_position().y0
cbar_left = axs['pitch'][0, -1].get_position().x1 + 0.01
ax_cbar = fig.add_axes((cbar_left, cbar_bottom, CBAR_WIDTH,
                        GRID_HEIGHT - 0.036))
cbar = plt.colorbar(heatmap, cax=ax_cbar)
for label in cbar.ax.get_yticklabels():
    label.set_fontproperties(fm.prop)
    label.set_fontsize(50)

add_image(sp_logo, fig,
          left=axs['endnote'].get_position().x0,
          bottom=axs['endnote'].get_position().y0,
          height=axs['endnote'].get_position().height)
title = axs['title'].text(0.5, 0.5, 'Touches events %, Premier League, 2024/25',
                          ha='center', va='center', fontsize=70)

Gracias a Python, pandas, mplsoccer y matplotlib, hemos convertido una tabla cruda de toques por tercio del campo en una visualización táctica clara y poderosa. Este tipo de análisis permite a analistas, entrenadores y aficionados entender mejor el comportamiento territorial de los equipos de la Premier League 2024/25.

Este enfoque no solo ofrece valor visual, sino que impulsa conversaciones sobre estilos de juego, control del balón y estrategias ofensivas o defensivas con respaldo de datos.

¿Lo mejor? Cualquiera puede replicarlo con unas pocas líneas de código.


¿Te gustaría que analice a tu equipo favorito o alguna otra liga?

Déjame tu comentario aquí abajo o escríbeme en redes sociales.

🛠 ¡Conectemos!

💡 Sígueme para más contenido de análisis y visualización de datos deportivos:

🎯 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

Publicar un comentario

0 Comentarios