Análisis reproducibleTemporada 2024/25Python + pandas

Análisis de fútbol con Python, al estilo Mister Chip

Cómo convertir 1.943 partidos en datos curiosos sin convertir una correlación en una historia falsa.

1.943partidos en el dataset
3ligas incluidas
2024/25periodo, no temporada actual
Antes del análisis

Define el dato antes de buscar la historia.

Premier League, La Liga y Serie A forman la cobertura real del archivo. El nombre del dataset menciona “Top 5”, pero el tutorial solo debe afirmar lo que está presente y validado.

Remontada

Definición operativa

Un equipo pierde al descanso y gana al final. No mide remontadas después de empezar perdiendo en cualquier minuto.

Goles

Media por partido

Goles locales más visitantes, divididos por encuentros con resultado completo.

Árbitros

Sin causalidad

Una media alta no demuestra estilo permisivo: rivales, liga y muestra también influyen.

Gráfico principal

Goles por partido en las tres ligas.

La Premier tuvo la media más alta dentro de esta muestra. “Más goles” no equivale automáticamente a “mejor” o “más espectacular”.

Cobertura

Resultados del dataset original 2024/25. Antes de reutilizarlos, ejecuta el notebook y comprueba número de filas válidas por liga.

Hallazgos

Cinco titulares con su matiz.

Remontadas en casaBarcelona y Liverpool · 3

Empate en la definición concreta “perdía al descanso y ganó como local”.

Partido con más golesTottenham 3–6 Liverpool

Nueve goles. Es un máximo de la muestra, no una prueba de calidad de liga.

Empates 0–0Getafe · 5

Frecuencia observada en la temporada analizada.

Media arbitralAndy Madley · 3,4

Solo entre árbitros con al menos diez partidos en la muestra.

Contraste arbitralSoto Grado · 2,1

Descriptivo; no atribuye la diferencia al árbitro.

Siguiente análisisLocalía + rival + xG

Variables necesarias para pasar de curiosidad a explicación.

Código

Un resultado que cualquiera puede repetir.

Validar cobertura y goles
import pandas as pd

df = pd.read_csv("football_matches_2024_2025.csv")
df["total_goals"] = df["home_score"] + df["away_score"]

control = df.groupby("competition_name").agg(
    partidos=("total_goals", "count"),
    goles_media=("total_goals", "mean")
)

print(control.round(2).sort_values("goles_media", ascending=False))
Definir remontadas en casa
remontadas_local = df[
    (df["home_ht_score"] < df["away_ht_score"]) &
    (df["home_score"] > df["away_score"])
]

top = remontadas_local["home_team"].value_counts()
print(top.head(10))
Control de calidad

Qué revisar antes de publicar un dato.

ComprobaciónRiesgo que evitaPrueba mínima
Partidos duplicadosContar dos veces el mismo encuentro.Fecha + local + visitante únicos.
NulosMedias calculadas con cobertura desigual.Conteo por columna y liga.
Nombres de equipoDividir Barcelona y FC Barcelona.Normalizar catálogo.
TemporadaPresentar 2024/25 como actualidad.Fecha visible en título y gráfico.
CausalidadAtribuir goles al árbitro.Redactar como asociación descriptiva.
Preparación

Del CSV a un análisis que otro pueda repetir.

1. Registra versión y cobertura

Anota la fecha de descarga, ligas, temporada, número de partidos y licencia. Este ejercicio trabaja con la cobertura disponible del dataset citado; no debe presentarse automáticamente como estudio de las cinco grandes ligas si faltan competiciones o jornadas.

2. Explora antes de agrupar

Comprueba columnas, tipos, duplicados, equipos, fechas y valores ausentes. Valida que los goles sean numéricos, que local y visitante no coincidan y que cada partido tenga una clave única. Busca nombres escritos de varias formas: dividirían un mismo club en grupos distintos.

import pandas as pd
df = pd.read_csv("partidos.csv")
print(df.shape)
print(df.columns.tolist())
print(df[["league", "home_team", "away_team"]].nunique())
print(df.isna().sum().sort_values(ascending=False).head())

3. Define cada titular

“Equipo remontador” necesita una regla: ir perdiendo en algún momento y terminar ganando. Si el dataset solo contiene marcador final, no puedes medirlo. “Árbitro goleador” es una etiqueta humorística, no causal: describe partidos con más goles bajo un árbitro, pero los equipos y el calendario explican gran parte del contexto.

“Liga con más goles” debe usar goles por partido, no total, si el número de encuentros difiere. “Rey del 0–0” requiere decidir si cuentas partidos del equipo o jornadas completas. Escribe la definición al lado del resultado.

4. Calcula y revisa

Utiliza groupby para resumir, pero vuelve siempre a filas concretas. Si un resultado sorprende, inspecciona los partidos que lo producen. Un error de carga puede convertirse fácilmente en un récord falso.

5. Visualiza la comparación

Ordena las barras, muestra el denominador y evita demasiados colores. Para distribuciones de resultados usa proporciones por liga; para equipos goleadores distingue goles a favor, partidos y promedio. Un heatmap de correlación no explica causalidad y es poco útil con variables categóricas mal codificadas.

Cinco análisis

Cómo convertir una curiosidad en una historia.

Partido con más goles

Ordena por goles totales, pero conserva fecha, competición y marcador. Comprueba empates en el máximo; presentar un único partido cuando hay varios equivalentes es una selección arbitraria.

Promedio por liga

Suma goles y divide por partidos válidos. Añade dispersión o porcentaje de 0–0 para que una media similar no oculte estilos diferentes.

Equipos goleadores

Separa total y promedio. Un club con más partidos puede liderar el total sin ser el más productivo por encuentro.

Frecuencia de 0–0

Calcula el porcentaje sobre los partidos disputados por cada equipo. Muestra el número absoluto para evitar conclusiones sobre muestras pequeñas.

Árbitros y goles

Exige un mínimo de partidos y presenta intervalos o al menos tamaño de muestra. Describe asociación; no atribuyas los goles al árbitro sin un diseño adicional.

FAQ

Preguntas antes de publicar el dato.

¿Puedo llamar récord a un máximo del dataset?

Solo como máximo dentro de esa cobertura. Un récord histórico requiere una fuente histórica completa.

¿Necesito saber estadística avanzada?

No para empezar, pero sí debes controlar denominadores, tamaños de muestra, empates y causalidad.

¿Cómo hago el análisis reproducible?

Guarda versión del dato, código, entorno y salidas; evita pasos manuales no documentados.

Fuentes

Dataset y documentación técnica.

  1. Dataset original en Kaggle. Verifica versión y licencia antes de redistribuir.
  2. pandas — GroupBy.
Análisis avanzado

Más allá de los cinco titulares.

Ventaja de jugar en casa

Calcula victorias, empates y derrotas del local por liga. Añade goles a favor y en contra y compara proporciones, no solo totales. El resultado describe esa temporada; no demuestra que el estadio cause toda la diferencia. Calidad de los equipos, calendario y muestra también influyen.

Forma reciente sin mirar al futuro

Ordena partidos por fecha y calcula puntos móviles usando únicamente encuentros anteriores. Evita una fuga de información: una métrica previa a una jornada no puede utilizar el resultado de esa jornada. Documenta si la ventana es de cinco partidos, cinco jornadas o días naturales.

Regularidad y volatilidad

Dos equipos pueden promediar los mismos goles con perfiles distintos. Compara desviación, porcentaje de partidos sin marcar y frecuencia de tres o más goles. La media cuenta el nivel; la distribución cuenta cómo se alcanza.

Local y visitante por equipo

Transforma el dataset a formato largo: una fila por equipo y partido, con condición, goles y resultado. Esa estructura permite comparar rendimiento sin escribir dos análisis separados para columnas de local y visitante.

Árbitros con muestra mínima

Antes de ordenar promedios exige, por ejemplo, un número mínimo de partidos definido antes de mirar el resultado. Publica también el tamaño de muestra. Si varios árbitros tienen pocos encuentros, la aparente diferencia puede ser inestable.

Estructura del notebook

Divide el trabajo en configuración, carga, validación, transformaciones, análisis, gráficos y conclusiones. Centraliza rutas y temporada en variables. Cada gráfico debe generarse desde código y guardarse en una carpeta de salidas; así actualizar el dataset no exige repetir pasos manuales.

Plantilla para publicar un dato

  • Titular: qué ocurrió sin afirmar más.
  • Cobertura: ligas, temporada y partidos válidos.
  • Definición: filtro y denominador.
  • Resultado: cifra y empates relevantes.
  • Matiz: qué no demuestra.
  • Reproducción: dataset, versión y código.

Ejercicios para continuar

Repite el análisis por primera y segunda vuelta; compara equipos ascendidos; estudia si la dispersión de goles cambia por mes; construye una tabla de puntos a partir de resultados y contrástala con una fuente externa. Cada ejercicio debe comenzar por una definición y terminar con una comprobación.

Proyecto final

Cómo convertir el análisis en una pieza publicable.

Organiza archivos y resultados

Conserva el CSV original, una copia procesada, el notebook, un archivo de dependencias y una carpeta de gráficos. Añade un README que explique cobertura, fuente, licencia, instrucciones y decisiones de limpieza. Si el dataset cambia, crea una nueva versión en lugar de reemplazar silenciosamente la anterior.

Crea pruebas de coherencia

Comprueba que goles locales y visitantes no sean negativos, que el resultado coincida con el marcador, que no existan equipos vacíos y que el número de partidos por competición tenga sentido para la cobertura. Guarda estas comprobaciones como afirmaciones ejecutables; una actualización rota debe detener el análisis antes de generar titulares.

Separa exploración y publicación

El notebook puede contener muchas tablas. La pieza final necesita una selección justificada. Elige hallazgos que puedan explicarse con una definición breve, muestra una visualización y enlaza la metodología. No publiques un dato solo porque es extremo: pregunta si es estable, relevante y comprensible.

Revisión editorial

Lee cada titular como si no conocieras el código. ¿Confunde máximo del dataset con récord histórico? ¿Atribuye causalidad? ¿Oculta empates o muestra pequeña? Añade el matiz en el cuerpo sin destruir el interés. Rigor y narrativa no son enemigos: la definición correcta hace que la curiosidad sea más creíble.

Extensión opcional: comparar temporadas

Para afirmar que una liga “cambió”, necesitas temporadas con la misma definición y cobertura. Normaliza equipos ascendidos, partidos suspendidos y formatos. Compara tasas por partido y distribuciones, no solo totales. Una variación anual puede ser ruido; muestra varios periodos antes de hablar de tendencia.

El dato curioso funciona cuando la definición es seria.

Publica el titular, pero conserva detrás el filtro, la cobertura y el código que lo produjo.