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.
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.
Definición operativa
Un equipo pierde al descanso y gana al final. No mide remontadas después de empezar perdiendo en cualquier minuto.
Media por partido
Goles locales más visitantes, divididos por encuentros con resultado completo.
Sin causalidad
Una media alta no demuestra estilo permisivo: rivales, liga y muestra también influyen.
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”.
Resultados del dataset original 2024/25. Antes de reutilizarlos, ejecuta el notebook y comprueba número de filas válidas por liga.
Cinco titulares con su matiz.
Empate en la definición concreta “perdía al descanso y ganó como local”.
Nueve goles. Es un máximo de la muestra, no una prueba de calidad de liga.
Frecuencia observada en la temporada analizada.
Solo entre árbitros con al menos diez partidos en la muestra.
Descriptivo; no atribuye la diferencia al árbitro.
Variables necesarias para pasar de curiosidad a explicación.
Un resultado que cualquiera puede repetir.
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))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))Qué revisar antes de publicar un dato.
| Comprobación | Riesgo que evita | Prueba mínima |
|---|---|---|
| Partidos duplicados | Contar dos veces el mismo encuentro. | Fecha + local + visitante únicos. |
| Nulos | Medias calculadas con cobertura desigual. | Conteo por columna y liga. |
| Nombres de equipo | Dividir Barcelona y FC Barcelona. | Normalizar catálogo. |
| Temporada | Presentar 2024/25 como actualidad. | Fecha visible en título y gráfico. |
| Causalidad | Atribuir goles al árbitro. | Redactar como asociación descriptiva. |
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.
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.
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.
Dataset y documentación técnica.
- Dataset original en Kaggle. Verifica versión y licencia antes de redistribuir.
- pandas — GroupBy.
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.
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.