Introducción
El análisis de datos en deportes de conjunto es una herramienta poderosa, pero su impacto depende de qué tan bien se estructura el proceso de interpretación. No se trata solo de acumular números; se trata de convertir esos números en información útil para la toma de decisiones. A continuación, exploramos un enfoque sistemático para dar sentido a los datos en el contexto del rendimiento deportivo, acompañado de un ejemplo práctico con código en R.
Paso 1: Hacer las Preguntas Correctas
El primer paso es definir claramente qué queremos saber. Esto implica formular preguntas específicas que guíen el análisis y permitan extraer información útil. Sin preguntas bien planteadas, el proceso analítico puede volverse difuso y generar una acumulación de datos sin propósito real.
Para lograrlo, es recomendable basarse en el conocimiento del deporte, las necesidades del cuerpo técnico y los objetivos de rendimiento. Las preguntas deben ser accionables y responder a un problema concreto.
Por ejemplo, en un equipo de fútbol, en lugar de simplemente analizar la distancia recorrida por un jugador, podríamos preguntarnos: ¿Qué tarea de entrenamiento es más similar a las demandas físicas del partido en términos de distancia recorrida por minuto? Este tipo de pregunta permite comparar sesiones y ajustar la planificación de cargas en función de la competencia.
Ejemplo Práctico
Pregunta: ¿Qué tarea de entrenamiento es más similar a las demandas físicas del partido en términos de distancia recorrida por minuto?
Paso 2: Conocé Tus Datos
El contexto es clave. Un error común es asumir que los datos son homogéneos sin considerar su origen y limitaciones. Cada conjunto de datos proviene de un sistema de medición con sesgos específicos, errores potenciales y características propias. La limpieza y análisis adecuados dependen de un entendimiento profundo de la estructura de los datos, pero también del deporte en cuestión y de las variables relevantes.
Por ejemplo, en una base de datos de GPS, es fundamental saber qué dispositivos se usaron, su frecuencia de muestreo y su margen de error. No es lo mismo analizar datos provenientes de un dispositivo con una tasa de 10 Hz que de 1 Hz, ya que la precisión del posicionamiento varía considerablemente. Además, los datos pueden estar influenciados por la posición del sensor en el cuerpo del atleta y las condiciones del entorno (por ejemplo, la pérdida de señal en estadios cerrados).
Asimismo, comprender la estructura de los datos implica reconocer qué jugadores tienen registros completos y cuáles pueden haber sufrido cortes en la señal. También es esencial conocer las posiciones de los jugadores para interpretar correctamente las métricas. Un portero no recorrerá la misma distancia por minuto que un mediocampista, por lo que aplicar criterios de limpieza uniformes sin considerar estas diferencias puede llevar a conclusiones erróneas.
Ejemplo Práctico
Antes de limpiar los datos, es fundamental explorarlos. Para eso usaremos R studio y su paqute Tidyverse:
library(tidyverse)
library(readxl)
library(readr) # Cargamos los paquetes a usar
df <- read_csv("~/Downloads/Weekly_Sessions_Data_Week.csv") # Carga Base De Datos
View(df) # Ver la tabla, Explorarla
head(df) # Exploramos visualmente las primeras filas
summary(df) # Creamos un resumen de la Base de datos (ver bloque siguiente)
sapply(df, anyNA) # vemos si existen NA (no hay)
RESUMEN DE LA BD
Username Position Team Name Session Date Match Day
Length:574 Length:574 Length:574 Length:574 Length:574
Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character
Session Type Session Name Task Name Player Duration Distance (m)
Length:574 Length:574 Length:574 Length:574 Min. : 0.0
Class :character Class :character Class :character Class1:hms 1st Qu.: 481.9
Mode :character Mode :character Mode :character Class2:difftime Median : 1024.9
Mode :numeric Mean : 2481.7
3rd Qu.: 3922.4
Max. :14208.7
Speed Zones (m) [0.0, 6.0] Speed Zones (m) [6.0, 12.0] Speed Zones (m) [12.0, 18.0]
Min. : 0.0 Min. : 0.0 Min. : 0.0
1st Qu.: 224.9 1st Qu.: 147.5 1st Qu.: 48.1
Median : 446.7 Median : 353.5 Median : 175.8
Mean :1011.5 Mean : 852.5 Mean : 450.1
3rd Qu.:1530.3 3rd Qu.:1336.8 3rd Qu.: 581.3
Max. :6000.6 Max. :5600.2 Max. :2922.6
Speed Zones (m) [18.0, 21.0] Speed Zones (m) [21.0, 24.0] Speed Zones (m) [24.0, 50.0] Max Speed (km/h)
Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. : 0.00
1st Qu.: 3.636 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.:18.65
Median : 32.630 Median : 12.01 Median : 1.394 Median :23.93
Mean : 89.978 Mean : 49.58 Mean : 27.968 Mean :23.06
3rd Qu.:114.067 3rd Qu.: 57.67 3rd Qu.: 34.785 3rd Qu.:28.84
Max. :656.259 Max. :422.63 Max. :303.140 Max. :36.34
Max Speed (Historical Player Maximum)
Min. :28.36
1st Qu.:33.20
Median :33.57
Mean :34.15
3rd Qu.:34.49
Max. :37.72
Paso 3: Transformación de Datos
Una vez comprendidos los datos, el siguiente paso es limpiarlos y transformarlos en métricas más interpretables. La transformación de datos es esencial porque permite generar indicadores que realmente reflejen el rendimiento de los atletas en términos prácticos. Dependiendo del tipo de datos, la transformación puede incluir normalización, filtrado de valores atípicos, cálculos derivados y categorización de variables.
En deportes de conjunto, algunas transformaciones comunes incluyen:
- Conversión de métricas absolutas a relativas: como distancia total recorrida a distancia por minuto, o esfuerzos en zonas de velocidad como porcentaje del tiempo total jugado.
- Filtrado de valores extremos: eliminación de datos erróneos debido a fallas del GPS o sensores con mala señal.
- Agrupación y segmentación de datos: para analizar tendencias dentro de distintos tipos de sesiones (entrenamientos, partidos, sesiones de recuperación).
- Calculo de métricas compuestas: como la carga de trabajo aguda/crónica para evaluar el riesgo de fatiga o lesión.
Una transformación bien aplicada permite comparar jugadores, evaluar cargas de entrenamiento y extraer información útil para la toma de decisiones.
Ejemplo Práctico en R
Aplicamos una serie de procesos al explorar la BD.
Encontramos que hay columnas con nombres que podemos acortar para facilitar manipularlos, errores gramáticos, Métricas que quizás necesitamos que crear (HSR, Distancia por min), y lo mas importante limpiar NA si es que existen.
En la base de datos que estamos usando no existen NA, caso contrario hay 2 alernativas: eliminarlos o reemplazarlos por mediana.
df |>
rename(MSS = `Max Speed (Historical Player Maximum)`)|> # Renombramos MSS, para manipular mas fácil
rename(Max_Speed = `Max Speed (km/h)`)|> # Lo mismo para "max speed"
mutate(Position = case_when(
Position %in% c("Center Back", "Centre Back") ~ "Center Back", # Limpiamos un error de tipeo
TRUE ~ Position
))|>
mutate(HSR = `Speed Zones (m) [21.0, 24.0]`+ `Speed Zones (m) [24.0, 50.0]`) |> # Creamos HSR sumando ambas zonas de velocidad
mutate(Duration_min = as.numeric(hms(`Player Duration`)) / 60, # Transformamos "player duration" en minutos
Distance_per_min = `Distance (m)` / Duration_min) %>% # Creamos la variable "Distance/min"
mutate(`Task Name` = case_when(
`Task Name` %in% c("1st Half", "2nd Half") ~ "MATCH", # Creamos "Match" sumando 1 y 2 tiempo
TRUE ~ `Task Name`
))
Paso 4: Exploratory Data Analysis (EDA)
El análisis exploratorio de datos nos ayuda a detectar patrones, anomalías y tendencias. Uno de los pasos clave en este proceso es la identificación y limpieza de valores atípicos (outliers), ya que pueden influir en la interpretación de los datos y en la toma de decisiones.
¿Qué son los outliers y por qué importan?
Los outliers son valores que se alejan significativamente de la distribución esperada de los datos. En el contexto del rendimiento deportivo, pueden surgir por errores en la recolección de datos (fallas en el GPS, interferencias en la señal) o por eventos poco comunes (un jugador que solo participó unos minutos en el partido, sesiones interrumpidas, etc.).
Sin embargo, es clave hacer los ajustes necesarios para no caer en reduccionismos. No todos los valores atípicos son errores; algunos pueden reflejar diferencias legítimas entre jugadores debido a su posición, rol táctico o tiempo de juego. Por ello, al limpiar outliers, puede ser necesario agrupar por puesto, filtrar por cantidad de minutos jugados o incluso analizar en función del tipo de sesión (entrenamiento vs. partido) para evitar eliminar datos relevantes.
Métodos para identificar outliers
- Método de la Regla del Rango Intercuartil (IQR): Se utiliza la distancia entre el primer cuartil (Q1) y el tercer cuartil (Q3) para definir límites fuera de los cuales se consideran valores atípicos.
- Z-score: Evalúa cuántas desviaciones estándar se encuentra un dato respecto a la media.
- Visualización de datos: Gráficos como boxplots y histogramas permiten una inspección visual de valores atípicos.
Ejemplo Práctico en R
Apliquemos el método del IQR para detectar y eliminar outliers en la distancia recorrida por minuto, pero antes de hacerlo, agruparemos los datos por posición para asegurarnos de no eliminar valores extremos que sean naturales para ciertos roles dentro del equipo:
#RANGO IQ
check_outliers_zscore <- function(df) {
df %>%
summarise(across(where(is.numeric),
~ sum(abs(scale(.)) > 3, na.rm = TRUE),
.names = "Outliers_in_{.col}"))
} #función para chequear outliers en cada columna
outlier_counts_zscore <- check_outliers_zscore(df) # Applicamos función
print(outlier_counts_zscore) # vemos cantidad de outliers en cada columna
#Función para remover outliers con rango IQ
remove_outliers_iqr <- function(df) {
df %>%
mutate(across(where(is.numeric), ~ ifelse(
. < quantile(., 0.25, na.rm = TRUE) - 1.5 * IQR(., na.rm = TRUE) |
. > quantile(., 0.75, na.rm = TRUE) + 1.5 * IQR(., na.rm = TRUE),
NA, .)))
}
GPS_clean <- remove_outliers_iqr(df) # aplicamos función sin filtros
GPS_clean <- df %>%
group_by(Position)%>%
filter(`Task Name` != "Drills")%>%
remove_outliers_iqr # aplicamos función agrupando por puesto, eliminando datos no cortados, podriamos tambien filtrar por minutos jugados (=> 60 min por ejemplo)
# podemos explorar outliers visualmente con un histograma
ggplot(df, aes(x = distancia_por_minuto)) +
geom_histogram(bins = 30, fill = "blue", alpha = 0.7) +
theme_minimal() +
labs(title = "Distribución de la Distancia Recorrida por Minuto",
x = "Distancia por minuto",
y = "Frecuencia")
Este enfoque nos permite mantener valores extremos que sean propios de ciertas posiciones y evitar una sobrecorrección en la limpieza de datos. Además, si fuera necesario, podríamos aplicar un filtro adicional para eliminar jugadores con pocos minutos jugados, ya que su distancia por minuto podría no ser representativa
Al eliminar outliers de manera informada y contextualizada, nos aseguramos de que el análisis refleje mejor la realidad del rendimiento de los jugadores, evitando interpretaciones erróneas causadas por datos anómalos o errores de medición. El análisis exploratorio de datos nos ayuda a detectar patrones, anomalías y tendencias. Uno de los pasos clave en este proceso es la identificación y limpieza de valores atípicos (outliers), ya que pueden influir en la interpretación de los datos y en la toma de decisiones.
Paso 5: Visualización de Datos
Las visualizaciones permiten comunicar información de manera efectiva y desempeñan un rol clave en el storytelling de datos. No basta con mostrar gráficos atractivos; la verdadera utilidad de la visualización radica en su capacidad para contar una historia que facilite la toma de decisiones.
En el contexto del rendimiento deportivo, una buena visualización debe responder preguntas específicas y destacar patrones clave sin generar confusión. Por ejemplo, en lugar de solo presentar un gráfico de barras con la distancia recorrida por cada jugador, podemos estructurar la visualización para comparar la carga física entre entrenamientos y partidos, facilitando la identificación de discrepancias y ajustes en la planificación.
El storytelling con datos implica estructurar la información de manera que el lector pueda seguir una narrativa lógica: desde la presentación del contexto, pasando por el análisis de los datos, hasta llegar a conclusiones accionables. Un dashboard bien diseñado no solo muestra métricas, sino que guía al usuario a través de una interpretación coherente que lleva a decisiones fundamentadas.
Ejemplo Práctico en R
Podemos comparar distancia recorrida por minuto de las diferentes tareas con los partidos usando un boxplot:
GPS %>%
filter(`Team Name` == "Wimu team", #filtramos los datos para evitar promedio de equipo
`Task Name` != "Drills", #filtramos los datos para evitar Sesion cortada completa
`Task Name` != "Session") %>% #filtramos los datos para evitar Sesion cortada
ggplot(aes(y = Distance_per_min , colour = `Match Day`)) +
geom_boxplot(outlier.color = "black" ) +
facet_wrap(~ `Task Name`, nrow = 6, scales = "fixed") +
theme(legend.position = "none")

Paso 6: Interpretación de Datos
Finalmente, el objetivo del análisis es convertir datos en decisiones. Aquí es donde la experiencia y el conocimiento del deporte juegan un papel crucial. Los números por sí solos no toman decisiones; los humanos sí.
El análisis de datos no es un proceso puramente técnico, sino una herramienta que debe integrarse dentro de un marco más amplio de interpretación contextual. La clave está en saber conectar los datos con preguntas relevantes y traducir los hallazgos en acciones concretas. Esto requiere no solo competencia en técnicas estadísticas, sino también un profundo conocimiento del deporte y sus dinámicas.
Un punto esencial en este proceso es la comunicación efectiva de los hallazgos. Los datos, cuando se presentan de forma aislada o sin una narrativa clara, pueden perder su impacto. Por eso, la interpretación debe ser guiada por el storytelling, estructurando los resultados en una secuencia lógica que conduzca a decisiones bien fundamentadas. Por ejemplo, si observamos que un jugador tiene una caída en su carga de sprint en los últimos 15 minutos del partido, no basta con señalar el número: debemos contextualizarlo en términos de fatiga, demandas tácticas y posibles intervenciones.
En este sentido, el rol del analista de datos deportivos no es solo calcular métricas, sino integrarlas en un marco de toma de decisiones que involucre al cuerpo técnico, preparadores físicos y jugadores, asegurando que los datos se traduzcan en estrategias efectivas de entrenamiento y competición.
Ejemplo Práctico
Si el análisis muestra que las sesiones de entrenamiento tienen valores significativamente más bajos de distancia por minuto en comparación con los partidos, podríamos cuestionar si el diseño del entrenamiento está replicando adecuadamente las demandas del juego.
En el ejemplo que vimos, las tareas “JDP”, “Possession” y “Set Piece” son las mas similares en terminos de distancia recorrida por minuto a las demandas de juego. Aunque como nota precautoria es importante entender que estamos viendo los numeros promedios del equipo y quizas un analisis por puesto o incluso por jugador podria ser necesario para un análisis mas profundo.
Conclusión
El análisis de datos en deportes de conjunto no se trata solo de manejar software o generar reportes visualmente atractivos. Se trata de hacer preguntas relevantes, entender el contexto, transformar los datos de manera significativa, explorarlos con criterio, visualizarlos de forma efectiva e interpretarlos con profundidad. La combinación de ciencia y aplicación práctica es lo que realmente da sentido a los datos. Con R, podemos sistematizar este proceso y facilitar la toma de decisiones basadas en evidencia.