Análisis de Datos en el Fútbol

Jorge Luis
64 min readMay 7, 2024

El mundo del deporte siempre ha sido un campo fascinante, lleno de emoción, competencia y habilidades sobresalientes. Desde las tácticas en el campo hasta las estrategias fuera de él, el deporte ha evolucionado constantemente, impulsado por la pasión de los aficionados y la búsqueda de la excelencia por parte de los atletas y equipos.

Pero detrás de cada paso en el campo, cada gol marcado y cada victoria celebrada, hay un mundo de datos esperando ser explorado. En este artículo, nos sumergiremos en el apasionante mundo del fútbol a través del prisma del análisis de datos. Pero, ¿qué nos lleva a este fascinante territorio?

Como amante del deporte y ávido seguidor del fútbol, siempre he sido cautivado por la belleza y la complejidad de este juego. Sin embargo, más allá de la emoción de los partidos y los momentos memorables en el campo, siempre me ha intrigado entender qué hace que un jugador destaque entre los demás. ¿Qué habilidades hacen brillar a los verdaderos campeones? ¿Y cómo podemos cuantificar y comprender mejor estas habilidades?

Con estas preguntas en mente, me embarqué en un proyecto de análisis de datos en el mundo del fútbol. Utilizando técnicas de web scraping, recopilé una extensa base de datos de jugadores de fútbol de todo el mundo, desde estrellas consolidadas hasta talentos emergentes. Este vasto conjunto de datos contiene una riqueza de información, desde detalles básicos como nombres y nacionalidades hasta métricas avanzadas como habilidades técnicas, salarios y valores de mercado.

El potencial de estos datos es inmenso, pero para desbloquearlo, necesitamos las herramientas adecuadas. Es aquí donde entra en juego la ciencia de datos. Combina la estadística, la programación y el conocimiento del dominio para revelar patrones, tendencias y percepciones ocultas en los datos. Con esta poderosa combinación, podemos trazar un mapa detallado de las habilidades, el rendimiento y el valor de cada jugador en el mundo del fútbol.

A través de este proyecto, no solo busco comprender mejor el juego que tantas alegrías y tristezas me ha dado, sino también compartir este conocimiento con otros apasionados del fútbol. Este análisis no solo arrojará luz sobre las habilidades y el rendimiento de los jugadores, sino que también servirá como un recurso valioso para entrenadores, scouts, analistas y aficionados que buscan comprender y apreciar más profundamente este deporte.

Con una amplia gama de técnicas estadísticas y herramientas de visualización, exploraremos el mundo del fútbol desde una perspectiva logica. Desde medidas de tendencia central hasta pruebas de correlación y modelos estadísticos avanzados, desglosaremos algunos aspecto del juego para revelar sus secretos.

Al final de este viaje, no solo habremos examinado las habilidades y el rendimiento de los jugadores, sino que también habremos comparado a los mejores entre ellos. A través de gráficos de radar, destacaremos las diferencias entre los jugadores élite y el resto del campo, ofreciendo una visión única y perspicaz del mundo del fútbol.

Entonces, únete a mí mientras nos sumergimos en este emocionante viaje a través del análisis de datos en el fútbol.

¡Prepárate para descubrir nuevas perspectivas, desafiar suposiciones y explorar las complejidades de uno de los deportes más apasionantes del mundo!

Objetivo del Estudio

El objetivo principal de este estudio es analizar y comprender las habilidades y el rendimiento de los jugadores de fútbol utilizando técnicas de análisis de datos. Me Propongo responder preguntas fundamentales sobre qué habilidades son cruciales para destacar en el campo, cómo se comparan los jugadores entre sí y qué factores pueden influir en su rendimiento. Además, busco proporcionar una visión detallada y perspicaz del mundo del fútbol desde una perspectiva basada en datos, con el fin de mejorar la comprensión y la apreciación de este apasionante deporte.

Metodología

Para llevar a cabo este análisis de datos, utilizamos una variedad de fuentes de datos disponibles en línea, obtenidas mediante técnicas de web scraping de una página web de renombre en el ámbito futbolístico. La base de datos resultante contiene información detallada sobre 17,954 jugadores de fútbol de diversas nacionalidades y posiciones.

Una vez recopilados los datos, procedí con el preprocesamiento, que incluyó la limpieza y la organización de los datos para garantizar su calidad y coherencia. Se realizaron transformaciones necesarias para adaptar los datos al análisis estadístico, como la conversión de variables categóricas a numéricas y la corrección de valores atípicos.

Para el análisis estadístico, aplicamos una variedad de técnicas y herramientas, incluyendo medidas de tendencia central y dispersión, pruebas de correlación, análisis multivariado y selección de modelos estadísticos. Utilizamos programación en Python junto con bibliotecas como Pandas, NumPy y Matplotlib para llevar a cabo estos cálculos y generar visualizaciones claras y significativas.

Además, empleamos técnicas de comparación entre los mejores jugadores y el resto del conjunto de datos, utilizando gráficos de radar para destacar las diferencias en habilidades y rendimiento.

Esta metodología nos permitió obtener una comprensión profunda y detallada de las habilidades y el rendimiento de los jugadores de fútbol, así como identificar patrones y tendencias importantes que pueden ser de interés para entrenadores, analistas y aficionados del deporte en general.

¿Qué puedes obtener de este artículo?

Si eres un fanático del fútbol y de la ciencia de datos como yo, te prometo que este artículo te va a encantar. Te preguntarás, ¿por qué? Bueno, aquí te lo cuento:

  1. Conocer mejor el juego: ¿Alguna vez te has preguntado qué hace que un jugador se destaque en el campo? Con este artículo, te voy a mostrar las claves detrás del éxito de los jugadores de élite y cómo se comparan entre ellos.
  2. Recursos útiles para todos: No importa si eres un entrenador, un scout, un analista o simplemente un aficionado, este análisis te va a ser de mucha ayuda. Te dará información valiosa para entender el rendimiento de los jugadores y tomar decisiones inteligentes sobre tácticas y fichajes.
  3. Perspectivas frescas y sorprendentes: Vas a ver el fútbol de una manera completamente nueva. Con gráficos de radar y otras visualizaciones, descubrirás las diferencias entre los mejores jugadores y el resto, ¡y te sorprenderás con lo que encuentras!.
  4. No tengas miedo del código: Sí, hay algo de código en este artículo, pero no te preocupes, ¡no tienes que ser un experto en programación! Incluso con solo un poquito de conocimiento, podrás entender y usar estos códigos para hacer tus propios análisis. Así que no te asustes cuando veas esas líneas de código, ¡son más amigables de lo que piensas!

Así que prepárate para una lectura tecnica que te hará ver el juego desde otra perspectiva. Este artículo está lleno de datos interesantes y te garantizo que no te decepcionará.

Estimado lector, es importante tener en cuenta que los resultados de este análisis no son definitivos ni infalibles. Como científico de datos, mi labor consiste en interpretar los datos y presentar una narrativa coherente basada en ellos. Por lo tanto, te animo a considerar este análisis como una pieza en el rompecabezas del conocimiento, pero no como la única verdad. Mantengamos siempre abierta la mente a diferentes interpretaciones y puntos de vista.

Explorando el conjunto de datos

Voy a comenzar importando la fuente de datos, que en este caso es un archivo .csv con información sobre jugadores de fútbol. Para hacerlo, utilizaré Python, un lenguaje de programación popular en análisis de datos. También, necesitaré algunas bibliotecas de Python, que son conjuntos de herramientas predefinidas que facilitan diversas tareas sin necesidad de escribir código desde cero. Con estas herramientas, estaremos listos para explorar el conjunto de datos.

# Importamos las bibliotecas necesarias para nuestro análisis de datos

# Librerías para manipulación y visualización de datos
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import seaborn as sns

# Librería para cálculos matemáticos
import math

# Librería para gráficos interactivos
import plotly.graph_objs as go

# Librería para convertir nombres de países
from country_converter import CountryConverter

# Librerías para análisis estadístico
from scipy.stats import f_oneway
from scipy import stats

# Librerías para modelos de aprendizaje automático
from sklearn.linear_model import LinearRegression
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# Librería para gráficos 3D
from mpl_toolkits.mplot3d import Axes3D

Importar los datos desde un archivo .CSV para su posterior exploración:

# Ruta al archivo CSV
file_path = "fifa_players_data_2024.csv"

# Cargar el archivo CSV en un DataFrame de Pandas
df = pd.read_csv(file_path)

# Ver las primeras 5 filas del DataFrame para asegurarnos
# de que se cargó correctamente
df.head()

En estos códigos, primero definimos la ruta al archivo CSV que contiene los datos de los jugadores de fútbol. Luego, utilizamos Pandas para cargar este archivo CSV en un DataFrame llamado df. Después, usamos df.head() para ver las primeras filas 5 del DataFrame y asegurarnos de que se cargaron correctamente.

Resultado:

| name         | full_name                     | birth_date | age | height_cm | weight_kgs | positions  | nationality | overall_rating | potential | ... | long_shots | aggression | interceptions | positioning | vision | penalties | composure | marking | standing_tackle | sliding_tackle |
|--------------|-------------------------------|------------|-----|-----------|------------|------------|-------------|-----------------|-----------|-----|------------|------------|----------------|-------------|--------|-----------|-----------|---------|-----------------|----------------|
| L. Messi | Lionel Andrés Messi Cuccittini | 6/24/1987 | 36 | 170.18 | 72.1 | CF,RW,ST | Argentina | 94 | 94 | ... | 94 | 48 | 22 | 94 | 94 | 75 | 96 | 33 | 28 | 26 |
| C. Eriksen | Christian Dannemann Eriksen | 2/14/1992 | 32 | 154.94 | 76.2 | CAM,RM,CM | Denmark | 88 | 89 | ... | 89 | 46 | 56 | 84 | 91 | 67 | 88 | 59 | 57 | 22 |
| P. Pogba | Paul Pogba | 3/15/1993 | 30 | 190.50 | 83.9 | CM,CAM | France | 88 | 91 | ... | 82 | 78 | 64 | 82 | 88 | 82 | 87 | 63 | 67 | 67 |
| L. Insigne | Lorenzo Insigne | 6/4/1991 | 32 | 162.56 | 59.0 | LW,ST | Italy | 88 | 88 | ... | 84 | 34 | 26 | 83 | 87 | 61 | 83 | 51 | 24 | 22 |
| K. Koulibaly | Kalidou Koulibaly | 6/20/1991 | 32 | 187.96 | 88.9 | CB | Senegal | 88 | 91 | ... | 15 | 87 | 88 | 24 | 49 | 33 | 80 | 91 | 88 | 87 |
df.info()

Finalmente, utilizamos df.info() para obtener un resumen conciso de la información sobre el DataFrame, incluyendo el tipo de datos de cada columna, la cantidad de valores no nulos y el uso de memoria.

Resultado:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17954 entries, 0 to 17953
Data columns (total 51 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 17954 non-null object
1 full_name 17954 non-null object
2 birth_date 17954 non-null object
3 age 17954 non-null int64
4 height_cm 17954 non-null float64
5 weight_kgs 17954 non-null float64
6 positions 17954 non-null object
7 nationality 17954 non-null object
8 overall_rating 17954 non-null int64
9 potential 17954 non-null int64
10 value_euro 17699 non-null float64
11 wage_euro 17708 non-null float64
12 preferred_foot 17954 non-null object
13 international_reputation(1-5) 17954 non-null int64
14 weak_foot(1-5) 17954 non-null int64
15 skill_moves(1-5) 17954 non-null int64
16 body_type 17954 non-null object
17 release_clause_euro 16117 non-null float64
18 national_team 857 non-null object
19 national_rating 857 non-null float64
20 national_team_position 857 non-null object
21 national_jersey_number 857 non-null float64
22 crossing 17954 non-null int64
23 finishing 17954 non-null int64
24 heading_accuracy 17954 non-null int64
25 short_passing 17954 non-null int64
26 volleys 17954 non-null int64
27 dribbling 17954 non-null int64
28 curve 17954 non-null int64
29 freekick_accuracy 17954 non-null int64
30 long_passing 17954 non-null int64
31 ball_control 17954 non-null int64
32 acceleration 17954 non-null int64
33 sprint_speed 17954 non-null int64
34 agility 17954 non-null int64
35 reactions 17954 non-null int64
36 balance 17954 non-null int64
37 shot_power 17954 non-null int64
38 jumping 17954 non-null int64
39 stamina 17954 non-null int64
40 strength 17954 non-null int64
41 long_shots 17954 non-null int64
42 aggression 17954 non-null int64
43 interceptions 17954 non-null int64
44 positioning 17954 non-null int64
45 vision 17954 non-null int64
46 penalties 17954 non-null int64
47 composure 17954 non-null int64
48 marking 17954 non-null int64
49 standing_tackle 17954 non-null int64
50 sliding_tackle 17954 non-null int64
dtypes: float64(7), int64(35), object(9)
memory usage: 7.0+ MB

Traducir las columnas al idioma Español:

# Diccionario de traducción de nombres de columnas
traduccion_columnas = {
'name': 'nombre',
'full_name': 'nombre_completo',
'birth_date': 'fecha_nacimiento',
'age': 'edad',
'height_cm': 'altura_cm',
'weight_kgs': 'peso_kg',
'positions': 'posiciones',
'nationality': 'nacionalidad',
'overall_rating': 'calificación_general',
'potential': 'potencial',
'value_euro': 'valor_euros',
'wage_euro': 'salario_euros',
'preferred_foot': 'pie_preferido',
'international_reputation(1-5)': 'reputacion_internacional(1-5)',
'weak_foot(1-5)': 'pierna_mala(1-5)',
'skill_moves(1-5)': 'habilidad_movimientos(1-5)',
'body_type': 'tipo_cuerpo',
'release_clause_euro': 'cláusula_rescisión_euros',
'national_team': 'equipo_nacional',
'national_rating': 'calificación_nacional',
'national_team_position': 'posición_equipo_nacional',
'national_jersey_number': 'número_camiseta_nacional',
'crossing': 'centros',
'finishing': 'remates',
'heading_accuracy': 'precisión_cabeza',
'short_passing': 'pase_corto',
'volleys': 'voleas',
'dribbling': 'regate',
'curve': 'curva',
'freekick_accuracy': 'precisión_falta',
'long_passing': 'pase_largo',
'ball_control': 'control_balón',
'acceleration': 'aceleración',
'sprint_speed': 'velocidad_sprint',
'agility': 'agilidad',
'reactions': 'reacciones',
'balance': 'equilibrio',
'shot_power': 'potencia_tiro',
'jumping': 'salto',
'stamina': 'resistencia',
'strength': 'fuerza',
'long_shots': 'tiros_largos',
'aggression': 'agresividad',
'interceptions': 'intercepciones',
'positioning': 'posicionamiento',
'vision': 'visión',
'penalties': 'penales',
'composure': 'compostura',
'marking': 'marcaje',
'standing_tackle': 'tackle_estático',
'sliding_tackle': 'tackle_deslizante'
}

# Renombrar las columnas utilizando el diccionario de traducción
df = df.rename(columns=traduccion_columnas)

# Verificar las primeras filas del DataFrame para asegurarnos de que se hayan traducido correctamente
df.head()

Este código crea un diccionario llamado traduccion_columnas, que mapea los nombres originales de las columnas en inglés a sus equivalentes traducidos en español. Luego, utiliza el método rename() de Pandas para renombrar las columnas del DataFrame df utilizando este diccionario de traducción.

Por último, muestra las primeras filas del DataFrame para verificar que las columnas se hayan traducido correctamente. Este proceso es útil para cambiar los nombres de las columnas a un idioma más comprensible o familiar para el usuario.

Resultado:

| nombre       | nombre_completo               | fecha_nacimiento | edad | altura_cm | peso_kg | posiciones | nacionalidad | calificación_general | potencial | ... | tiros_largos | agresividad | intercepciones | posicionamiento | visión | penales | compostura | marcaje | tackle_estático | tackle_deslizante |
|--------------|-------------------------------|------------------|------|-----------|---------|------------|--------------|---------------------|-----------|-----|--------------|-------------|----------------|-----------------|--------|---------|------------|---------|-----------------|------------------|
| L. Messi | Lionel Andrés Messi Cuccittini | 6/24/1987 | 36 | 170.18 | 72.1 | CF,RW,ST | Argentina | 94 | 94 | ... | 94 | 48 | 22 | 94 | 94 | 75 | 96 | 33 | 28 | 26 |
| C. Eriksen | Christian Dannemann Eriksen | 2/14/1992 | 32 | 154.94 | 76.2 | CAM,RM,CM | Denmark | 88 | 89 | ... | 89 | 46 | 56 | 84 | 91 | 67 | 88 | 59 | 57 | 22 |
| P. Pogba | Paul Pogba | 3/15/1993 | 30 | 190.50 | 83.9 | CM,CAM | France | 88 | 91 | ... | 82 | 78 | 64 | 82 | 88 | 82 | 87 | 63 | 67 | 67 |
| L. Insigne | Lorenzo Insigne | 6/4/1991 | 32 | 162.56 | 59.0 | LW,ST | Italy | 88 | 88 | ... | 84 | 34 | 26 | 83 | 87 | 61 | 83 | 51 | 24 | 22 |
| K. Koulibaly | Kalidou Koulibaly | 6/20/1991 | 32 | 187.96 | 88.9 | CB | Senegal | 88 | 91 | ... | 15 | 87 | 88 | 24 | 49 | 33 | 80 | 91 | 88 | 87 |
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17954 entries, 0 to 17953
Data columns (total 51 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 nombre 17954 non-null object
1 nombre_completo 17954 non-null object
2 fecha_nacimiento 17954 non-null object
3 edad 17954 non-null int64
4 altura_cm 17954 non-null float64
5 peso_kg 17954 non-null float64
6 posiciones 17954 non-null object
7 nacionalidad 17954 non-null object
8 calificación_general 17954 non-null int64
9 potencial 17954 non-null int64
10 valor_euros 17699 non-null float64
11 salario_euros 17708 non-null float64
12 pie_preferido 17954 non-null object
13 reputacion_internacional(1-5) 17954 non-null int64
14 pierna_mala(1-5) 17954 non-null int64
15 habilidad_movimientos(1-5) 17954 non-null int64
16 tipo_cuerpo 17954 non-null object
17 cláusula_rescisión_euros 16117 non-null float64
18 equipo_nacional 857 non-null object
19 calificación_nacional 857 non-null float64
20 posición_equipo_nacional 857 non-null object
21 número_camiseta_nacional 857 non-null float64
22 centros 17954 non-null int64
23 remates 17954 non-null int64
24 precisión_cabeza 17954 non-null int64
25 pase_corto 17954 non-null int64
26 voleas 17954 non-null int64
27 regate 17954 non-null int64
28 curva 17954 non-null int64
29 precisión_falta 17954 non-null int64
30 pase_largo 17954 non-null int64
31 control_balón 17954 non-null int64
32 aceleración 17954 non-null int64
33 velocidad_sprint 17954 non-null int64
34 agilidad 17954 non-null int64
35 reacciones 17954 non-null int64
36 equilibrio 17954 non-null int64
37 potencia_tiro 17954 non-null int64
38 salto 17954 non-null int64
39 resistencia 17954 non-null int64
40 fuerza 17954 non-null int64
41 tiros_largos 17954 non-null int64
42 agresividad 17954 non-null int64
43 intercepciones 17954 non-null int64
44 posicionamiento 17954 non-null int64
45 visión 17954 non-null int64
46 penales 17954 non-null int64
47 compostura 17954 non-null int64
48 marcaje 17954 non-null int64
49 tackle_estático 17954 non-null int64
50 tackle_deslizante 17954 non-null int64
dtypes: float64(7), int64(35), object(9)
memory usage: 7.0+ MB

Este resumen describe un DataFrame con 17954 entradas y 51 columnas. Algunas de las columnas más relevantes incluyen:

  • nombre , `nombre_completo`, fecha_nacimiento, edad, altura_cm, peso_kg: Datos personales del jugador.
  • posiciones, nacionalidad: Información sobre la posición del jugador y su nacionalidad.
  • valor_euros, salario_euros: Valor y salario del jugador en euros.
  • pie_preferido: Pie preferido para jugar.
  • centros, remates, precisión_cabeza, etc.: Habilidades específicas de juego del jugador.

Además, se observa la presencia de valores nulos en algunas columnas como valor_euros, salario_euros, cláusula_rescisión_euros, equipo_nacional, calificación_nacional, posición_equipo_nacional, y número_camiseta_nacional.

El DataFrame contiene principalmente datos numéricos (int64 y float64), aunque también hay algunas columnas de tipo object que contienen cadenas de texto. El uso de memoria del DataFrame es de aproximadamente 7.0+ MB.

Diccionario de Columnas

- `nombre`: Nombre del jugador
- `nombre_completo`: Nombre completo del jugador
- `fecha_nacimiento`: Fecha de nacimiento del jugador
- `edad`: Edad del jugador
- `altura_cm`: Altura del jugador en centímetros
- `peso_kg`: Peso del jugador en kilogramos
- `posiciones`: Posiciones en las que puede jugar el jugador
- `nacionalidad`: Nacionalidad del jugador
- `calificación_general`: Calificación general del jugador
- `potencial`: Potencial de crecimiento del jugador
- `valor_euros`: Valor del jugador en euros
- `salario_euros`: Salario del jugador en euros mensual
- `pie_preferido`: Pie preferido para jugar del jugador
- `reputacion_internacional(1-5)`: Reputación internacional del jugador (1-5)
- `pierna_mala(1-5)`: Calidad de la pierna menos hábil del jugador (1-5)
- `habilidad_movimientos(1-5)`: Habilidad de movimientos del jugador (1-5)
- `tipo_cuerpo`: Tipo de cuerpo del jugador
- `cláusula_rescisión_euros`: Cláusula de rescisión del contrato del jugador en euros
- `equipo_nacional`: Equipo nacional al que pertenece el jugador
- `calificación_nacional`: Calificación del jugador en su equipo nacional
- `posición_equipo_nacional`: Posición en el equipo nacional del jugador
- `número_camiseta_nacional`: Número de camiseta del jugador en su equipo nacional
- `centros`: Habilidad de centros del jugador
- `remates`: Habilidad de remates del jugador
- `precisión_cabeza`: Precisión de cabezazos del jugador
- `pase_corto`: Precisión de pases cortos del jugador
- `voleas`: Habilidad de voleas del jugador
- `regate`: Habilidad de regate del jugador
- `curva`: Curva del tiro del jugador
- `precisión_falta`: Precisión de tiros libres del jugador
- `pase_largo`: Precisión de pases largos del jugador
- `control_balón`: Control de balón del jugador
- `aceleración`: Aceleración del jugador
- `velocidad_sprint`: Velocidad de sprint del jugador
- `agilidad`: Agilidad del jugador
- `reacciones`: Reacciones del jugador
- `equilibrio`: Equilibrio del jugador
- `potencia_tiro`: Potencia de tiro del jugador
- `salto`: Capacidad de salto del jugador
- `resistencia`: Resistencia del jugador
- `fuerza`: Fuerza del jugador
- `tiros_largos`: Habilidad de tiros largos del jugador
- `agresividad`: Agresividad del jugador
- `intercepciones`: Habilidad de intercepciones del jugador
- `posicionamiento`: Posicionamiento en el campo del jugador
- `visión`: Visión de juego del jugador
- `penales`: Precisión en tiros de penal del jugador
- `compostura`: Compostura del jugador
- `marcaje`: Habilidad de marcaje del jugador
- `tackle_estático`: Habilidad de tackle estático del jugador
- `tackle_deslizante`: Habilidad de tackle deslizante del jugador

El proceso de calificación de los jugadores se basa en una escala del 0 al 100, donde una puntuación más alta indica un desempeño mejor. Esta escala se establece considerando las medias centrales de datos históricos recopilados de diversas fuentes, como canteras y equipos de primer nivel. Además, se tiene en cuenta la experiencia de observadores especializados en fútbol, muchos de los cuales tienen una amplia trayectoria en el deporte, incluyendo entrenadores y exjugadores.

Sin embargo, algunas columnas, como la Reputación internacional, Calidad de la pierna menos hábil y Habilidad de movimientos, se evalúan en una escala del 1 al 5. Esto implica que se realizan evaluaciones más específicas en áreas particulares del juego.

Davor Suker, goleador del Mundial de Francia 1998

Dado que nuestra base de datos contiene jugadores de diversas posiciones, es necesario segmentarlos según su posición en el campo. Esta distinción es crucial, ya que las habilidades técnicas de un delantero, por ejemplo, difieren considerablemente de las de un defensor o un portero. Por lo tanto, crearemos conjuntos de datos separados, cada uno agrupando jugadores que desempeñan una misma posición. Con el fin de ser más precisos, subdividiremos nuestro conjunto de datos principal en los siguientes conjuntos:

| Abreviatura | Posición en Inglés   | Posición en Español             |
|-------------|----------------------|---------------------------------|
| GK | Goalkeeper | Portero |
| CB | Centre Back | Defensa Central |
| RB | Right Back | Lateral Derecho |
| RWB | Right Wing Back | Lateral Derecho (Lateral con vocación ofensiva) |
| LB | Left Back | Lateral Izquierdo |
| LWB | Left Wing Back | Lateral Izquierdo (Lateral con vocación ofensiva) |
| CDM | Central Defensive Mid| Mediocampista Defensivo |
| CM | Center Midfield | Mediocampista Central |
| CAM | Center Attacking Mid | Mediocampista Ofensivo Central |
| RM | Right Midfield | Mediocampista Derecho |
| LM | Left Midfield | Mediocampista Izquierdo |
| RW | Right Wing | Ala Derecha |
| CF | Center Forward | Delantero Centro |
| ST | Striker | Delantero |
| LW | Left Wing | Ala Izquierda |

Para separar a los jugadores por posición según el diccionario de posiciones proporcionado, quiero agruparlos en las siguientes categorías principales:

1. Porteros (GK)
2. Defensas Centrales (CB)
3. Laterales Derechos (RB, RWB)
4. Laterales Izquierdos (LB, LWB)
5. Centrocampistas Defensivos (CDM)
6. Centrocampistas Centrales (CM)
7. Centrocampistas Derechos (RM)
8. Centrocampistas Izquierdos (LM)
9. Mediocampistas Ofensivos Centrales (CAM)
10. Extremos Derechos (RW)
11. Extremos Izquierdos (LW)
12. Delanteros Centrales (CF)
13. Delanteros (ST)

Después de una revisión inicial, he optado por comenzar nuestro análisis centrándome en los delanteros. Aunque no lo haya mencionado previamente, debo señalar que este análisis de datos es sumamente amplio y exigirá una inversión considerable de tiempo, ya que mi objetivo es examinar exhaustivamente todos los conjuntos de datos disponibles. Es crucial resaltar que lo que estamos presenciando es solo el comienzo de un análisis de datos más completo.

Por otro lado, es importante subrayar que, en esta ocasión, los conjuntos de datos no serán compartidos. Su adquisición ha sido un proceso laborioso y complejo, y por ende, deseo preservar su acceso con precaución, ya que representan un recurso valioso.

Al iniciar el análisis de los datos, se ha vuelto evidente que nuestro conjunto incluye jugadores de ataque capaces de desempeñarse tanto en posiciones centrales como en los extremos, ya sea en el flanco derecho o izquierdo del campo. Un caso ilustrativo es el de Maximilian Philipp, futbolista alemán con habilidades versátiles que le permiten ocupar diversas posiciones, como delantero (ST), centrodelantero (CF), extremo izquierdo (LM) o mediocampista ofensivo central (CAM), dependiendo de las necesidades tácticas del equipo. Otros ejemplos destacados son Agüero y Cavani, delanteros de puros, mientras que Lucas Andersen es un caso peculiar, capaz de desempeñarse tanto en la delantera como en el centro, además de ejercer funciones en el mediocampo izquierdo.

Estas observaciones están respaldadas por los datos disponibles. Para la construcción de nuestro conjunto de datos específico de delanteros, nos enfocaremos en aquellos jugadores que exhiban cualidades de delantero (ST) o centrodelantero (CF). Con esta información, llevaremos a cabo un análisis detallado para identificar a los mejores delanteros en función de sus características distintivas.

Seleccionar solo jugadores que tienen posicion de DELANTEROS

# Filtrar el DataFrame original para obtener solo los datos de los delanteros
delanteros_df = df[df['posiciones'].str.contains('ST|CF')]

# Guardar el DataFrame filtrado en un nuevo archivo CSV
delanteros_df.to_csv('posicion_delantero.csv', index=False)
# Ruta al archivo CSV
file_path = "posicion_delantero.csv"

# Cargar el archivo CSV en un DataFrame de Pandas
df = pd.read_csv(file_path)

# Establecer la configuración de pandas para expandir todas las columnas
pd.set_option('display.max_colwidth', None)

# Ver las primeras 20 filas del DataFrame para asegurarnos de que se cargó correctamente
df.head()

Aquí tenemos un nuevo DataFrame llamado con 3370 entradas, donde cada fila representa a un delantero.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3370 entries, 0 to 3369
Data columns (total 51 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 nombre 3370 non-null object
1 nombre_completo 3370 non-null object
2 fecha_nacimiento 3370 non-null object
3 edad 3370 non-null int64
4 altura_cm 3370 non-null float64
5 peso_kg 3370 non-null float64
6 posiciones 3370 non-null object
7 nacionalidad 3370 non-null object
8 calificación_general 3370 non-null int64
9 potencial 3370 non-null int64
10 valor_euros 3321 non-null float64
11 salario_euros 3322 non-null float64
12 pie_preferido 3370 non-null object
13 reputacion_internacional(1-5) 3370 non-null int64
14 pierna_mala(1-5) 3370 non-null int64
15 habilidad_movimientos(1-5) 3370 non-null int64
16 tipo_cuerpo 3370 non-null object
17 cláusula_rescisión_euros 2901 non-null float64
18 equipo_nacional 165 non-null object
19 calificación_nacional 165 non-null float64
20 posición_equipo_nacional 165 non-null object
21 número_camiseta_nacional 165 non-null float64
22 centros 3370 non-null int64
23 remates 3370 non-null int64
24 precisión_cabeza 3370 non-null int64
25 pase_corto 3370 non-null int64
26 voleas 3370 non-null int64
27 regate 3370 non-null int64
28 curva 3370 non-null int64
29 precisión_falta 3370 non-null int64
30 pase_largo 3370 non-null int64
31 control_balón 3370 non-null int64
32 aceleración 3370 non-null int64
33 velocidad_sprint 3370 non-null int64
34 agilidad 3370 non-null int64
35 reacciones 3370 non-null int64
36 equilibrio 3370 non-null int64
37 potencia_tiro 3370 non-null int64
38 salto 3370 non-null int64
39 resistencia 3370 non-null int64
40 fuerza 3370 non-null int64
41 tiros_largos 3370 non-null int64
42 agresividad 3370 non-null int64
43 intercepciones 3370 non-null int64
44 posicionamiento 3370 non-null int64
45 visión 3370 non-null int64
46 penales 3370 non-null int64
47 compostura 3370 non-null int64
48 marcaje 3370 non-null int64
49 tackle_estático 3370 non-null int64
50 tackle_deslizante 3370 non-null int64
dtypes: float64(7), int64(35), object(9)
memory usage: 1.3+ MB

Algunas observaciones clave son:

  • Valores no nulos: La mayoría de las columnas tienen un recuento no nulo de 3370, pero hay algunas con valores faltantes, como valor_euros, salario_euros, cláusula_rescisión_euros, `equipo_nacional`, `calificación_nacional`, posición_equipo_nacional, y número_camiseta_nacional.
  • Tipos de datos: El DataFrame contiene principalmente datos numéricos (int64 y float64), aunque también hay algunas columnas de tipo object que contienen cadenas de texto.

En resumen, este DataFrame contiene información detallada sobre 3370 jugadores de fútbol, incluyendo detalles personales, calificaciones, habilidades técnicas y más.

Dado que algunas columnas resultan innecesarias o contienen valores faltantes, procederé de la siguiente manera:

  1. Para las columnas valor_euros y salario_euros, que presentan respectivamente 49 y 48 datos faltantes, optaré por eliminar las filas que contengan valores faltantes en estas columnas.
  2. La columna cláusula_rescisión_euros, así como fecha_nacimiento, equipo_nacional, calificación_nacional, posición_equipo_nacional, número_camiseta_nacional y tipo_cuerpo, resultan irrelevantes para mi análisis. Por lo tanto, las eliminaré del conjunto de datos. Además, también descartaré la columna posiciones, ya que todos los jugadores pertenecen a la misma posición: delanteros.
  3. La columna pie_preferido contiene dos valores en sus celdas: “left” (Izquierda) y “right” (Derecha). Para simplificar su análisis, convertiré estos valores en binarios, asignando 0 para “left” (Izquierda) y 1 para “right” (Derecha).
  4. No traducire la columna nacionalidad .
  5. Agregaré una nueva columna llamada continente, en la cual se asignará el continente al que pertenece cada jugador.
  6. Reorganizaré las columnas del conjunto de datos de acuerdo a las siguientes categorías: Información Personal, Habilidades de Juego, Habilidades de Ataque, Habilidades Físicas y Atléticas, y Habilidades Defensivas.
  7. Finalmente, crearé un nuevo conjunto de datos denominado delanteros_df con las columnas restantes.
# Eliminar las filas con valores faltantes en las columnas 'valor_euros' y 'salario_euros'
df = df.dropna(subset=['valor_euros', 'salario_euros'])
# Lista de columnas a eliminar
columnas_a_eliminar = ['cláusula_rescisión_euros', 'equipo_nacional', 'calificación_nacional', 'posición_equipo_nacional',
'número_camiseta_nacional', 'posiciones', 'tipo_cuerpo', 'fecha_nacimiento']

# Eliminar las columnas
df = df.drop(columns=columnas_a_eliminar)
# Verificar cuántos datos únicos hay en la columna pie_preferido 
# para asegurarme de que solo tenga valores "left" y "right".
tipos_pie_preferido = df['pie_preferido'].nunique()
print("Número de tipos de datos únicos en la columna 'pie_preferido':", tipos_pie_preferido)

Resultado:

Número de tipos de datos únicos en la columna ‘pie_preferido’: 2

# Convertir todos los valores de la columna a minúsculas
df['pie_preferido'] = df['pie_preferido'].str.lower()

# Reemplazar "left" por 0 y "right" por 1 en la columna "pie_preferido"
df['pie_preferido'] = df['pie_preferido'].replace({'left': 0, 'right': 1})

# Convertir los valores de la columna al tipo de dato int64
df['pie_preferido'] = df['pie_preferido'].astype('int64')

# Verificar los cambios
print(df['pie_preferido'].unique())

Resultado:

[0 1]

Continúo:

# Crear una instancia del convertidor de países
cc = CountryConverter()

# Función para obtener el continente
def obtener_continente(nacionalidad):
# Obtener el código ISO del país
codigo_iso = cc.convert(nacionalidad, src='name', to='ISO3')
# Obtener el continente a partir del código ISO
continente = cc.convert(codigo_iso, src='ISO3', to='continent')
return continente

# Agregar la columna de continente
df['continente'] = df['nacionalidad'].apply(obtener_continente)
# Definir las categorías y las columnas correspondientes a cada categoría
categorias = {
'Información Personal': ['nombre', 'nombre_completo', 'edad', 'altura_cm', 'peso_kg', 'nacionalidad', 'continente'],
'Habilidades de Juego': ['calificación_general', 'potencial', 'valor_euros', 'salario_euros', 'pie_preferido', 'reputacion_internacional(1-5)'],
'Habilidades de Ataque': ['pierna_mala(1-5)', 'habilidad_movimientos(1-5)', 'centros', 'remates', 'precisión_cabeza', 'pase_corto', 'voleas', 'regate', 'curva', 'precisión_falta', 'pase_largo'],
'Habilidades Físicas y Atléticas': ['control_balón', 'aceleración', 'velocidad_sprint', 'agilidad', 'reacciones', 'equilibrio', 'potencia_tiro', 'salto', 'resistencia', 'fuerza', 'tiros_largos'],
'Habilidades Defensivas': ['agresividad', 'intercepciones', 'posicionamiento', 'visión', 'penales', 'compostura', 'marcaje', 'tackle_estático', 'tackle_deslizante']
}

# Crear un nuevo DataFrame con las columnas ordenadas por categoría
df = df[categorias['Información Personal'] +
categorias['Habilidades de Juego'] +
categorias['Habilidades de Ataque'] +
categorias['Habilidades Físicas y Atléticas'] +
categorias['Habilidades Defensivas']]

# Verificar el nuevo DataFrame
df.head()

Resultado:

| nombre   | nombre_completo                     | edad | altura_cm | peso_kg | nacionalidad | continente | calificación_general | potencial | valor_euros | ... | tiros_largos | agresividad | intercepciones | posicionamiento | visión | penales | compostura | marcaje | tackle_estático | tackle_deslizante |
|----------|-------------------------------------|------|-----------|---------|--------------|------------|----------------------|-----------|-------------|-----|--------------|-------------|----------------|-----------------|--------|---------|------------|---------|-----------------|-------------------|
| L. Messi | Lionel Andrés Messi Cuccittini | 36 | 170.18 | 72.1 | Argentina | America | 94 | 94 | 110500000.0 | ... | 94 | 48 | 22 | 94 | 94 | 75 | 96 | 33 | 28 | 26 |
| L. Insigne | Lorenzo Insigne | 32 | 162.56 | 59.0 | Italy | Europe | 88 | 88 | 62000000.0 | ... | 84 | 34 | 26 | 83 | 87 | 61 | 83 | 51 | 24 | 22 |
| K. Mbappé | Kylian Mbappé | 25 | 152.40 | 73.0 | France | Europe | 88 | 95 | 81000000.0 | ... | 78 | 62 | 38 | 88 | 82 | 70 | 86 | 34 | 34 | 32 |
| S. Agüero | Sergio Leonel Agüero del Castillo | 35 | 172.72 | 69.9 | Argentina | America | 89 | 89 | 64500000.0 | ... | 83 | 65 | 24 | 92 | 83 | 83 | 90 | 30 | 20 | 12 |
| E. Cavani | Edinson Roberto Cavani Gómez | 37 | 185.42 | 77.1 | Uruguay | America | 89 | 89 | 60000000.0 | ... | 79 | 84 | 48 | 93 | 77 | 85 | 82 | 52 | 45 | 39 |
# Copia el DataFrame original en uno nuevo llamado delanteros_df
delanteros_df = df

# Muestra un resumen de la información del DataFrame delanteros_df
delanteros_df.info()
delanteros_df.info()

Resultado:

<class 'pandas.core.frame.DataFrame'>
Index: 3321 entries, 0 to 3369
Data columns (total 44 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 nombre 3321 non-null object
1 nombre_completo 3321 non-null object
2 edad 3321 non-null int64
3 altura_cm 3321 non-null float64
4 peso_kg 3321 non-null float64
5 nacionalidad 3321 non-null object
6 continente 3321 non-null object
7 calificación_general 3321 non-null int64
8 potencial 3321 non-null int64
9 valor_euros 3321 non-null float64
10 salario_euros 3321 non-null float64
11 pie_preferido 3321 non-null int64
12 reputacion_internacional(1-5) 3321 non-null int64
13 pierna_mala(1-5) 3321 non-null int64
14 habilidad_movimientos(1-5) 3321 non-null int64
15 centros 3321 non-null int64
16 remates 3321 non-null int64
17 precisión_cabeza 3321 non-null int64
18 pase_corto 3321 non-null int64
19 voleas 3321 non-null int64
20 regate 3321 non-null int64
21 curva 3321 non-null int64
22 precisión_falta 3321 non-null int64
23 pase_largo 3321 non-null int64
24 control_balón 3321 non-null int64
25 aceleración 3321 non-null int64
26 velocidad_sprint 3321 non-null int64
27 agilidad 3321 non-null int64
28 reacciones 3321 non-null int64
29 equilibrio 3321 non-null int64
30 potencia_tiro 3321 non-null int64
31 salto 3321 non-null int64
32 resistencia 3321 non-null int64
33 fuerza 3321 non-null int64
34 tiros_largos 3321 non-null int64
35 agresividad 3321 non-null int64
36 intercepciones 3321 non-null int64
37 posicionamiento 3321 non-null int64
38 visión 3321 non-null int64
39 penales 3321 non-null int64
40 compostura 3321 non-null int64
41 marcaje 3321 non-null int64
42 tackle_estático 3321 non-null int64
43 tackle_deslizante 3321 non-null int64
dtypes: float64(4), int64(36), object(4)
memory usage: 1.1+ MB

El DataFrame delanteros_df ahora está limpio, organizado y listo para ser utilizado en el análisis de datos. Contiene información relevante sobre los delanteros, con columnas ordenadas de manera lógica y coherente. Además, se ha eliminado cualquier valor faltante, garantizando así la integridad de los datos.

Primeras Estadisticas

La función describe() es una herramienta fundamental en el análisis de datos. Cuando se aplica a un DataFrame, proporciona un resumen estadístico de las columnas numéricas presentes en el conjunto de datos.

Este resumen incluye medidas descriptivas como la media, la desviación estándar, los valores mínimo y máximo, y los cuartiles (25%, 50%, 75%).

Además, ofrece una visión general rápida de la distribución y la dispersión de los datos en cada columna numérica, lo que permite identificar patrones, valores atípicos y comprender mejor la naturaleza de los datos antes de profundizar en un análisis más detallado.

delanteros_df.describe().T

Resultado:

|                  | count  | mean        | std         | min   | 25%   | 50%   | 75%   | max     |
|------------------|--------|-------------|-------------|-------|-------|-------|-------|---------|
| Edad | 3321.0 | 3.041343e+01| 4.610470e+00| 22.0 | 27.00 | 30.00 | 34.00 | 45.0 |
| Altura Cm | 3321.0 | 1.746099e+02| 1.408901e+01| 152.4 | 154.94| 175.26| 185.42| 203.2 |
| Peso Kg | 3321.0 | 7.568802e+01| 6.983214e+00| 49.9 | 71.20 | 74.80 | 79.80 | 110.2 |
| Calificación General | 3321.0 | 6.666938e+01| 6.997826e+00| 47.0 | 62.00 | 67.00 | 71.00 | 94.0 |
| Potencial | 3321.0 | 7.184011e+01| 6.119348e+00| 53.0 | 68.00 | 71.00 | 76.00 | 95.0 |
| Valor Euros | 3321.0 | 3.091957e+06| 7.248211e+06| 30000.0| 425000.00| 875000.00| 2800000.00| 110500000.0|
| Salario Euros | 3321.0 | 1.170310e+04| 2.689571e+04| 1000.0 | 2000.00 | 4000.00 | 11000.00 | 565000.0|
| Pie Preferido | 3321.0 | 8.404095e-01| 3.662810e-01| 0.0 | 1.00 | 1.00 | 1.00 | 1.0 |
| Reputacion Internacional(1-5) | 3321.0 | 1.144234e+00| 4.598035e-01| 1.0 | 1.00 | 1.00 | 1.00 | 5.0 |
| Pierna Mala(1-5) | 3321.0 | 3.138211e+00| 6.280494e-01| 1.0 | 3.00 | 3.00 | 3.00 | 5.0 |
| Habilidad Movimientos(1-5) | 3321.0 | 2.699789e+00| 6.299957e-01| 2.0 | 2.00 | 3.00 | 3.00 | 5.0 |
| Centros | 3321.0 | 5.059229e+01| 1.359168e+01| 18.0 | 39.00 | 52.00 | 62.00 | 87.0 |
| Remates | 3321.0 | 6.642126e+01| 7.776232e+00| 30.0 | 61.00 | 66.00 | 71.00 | 95.0 |
| Precisión Cabeza | 3321.0 | 6.133905e+01| 1.101839e+01| 20.0 | 54.00 | 62.00 | 69.00 | 94.0 |
| Pase Corto | 3321.0 | 6.021078e+01| 9.401302e+00| 31.0 | 54.00 | 61.00 | 67.00 | 92.0 |
| Voleas | 3321.0 | 5.841253e+01| 1.124946e+01| 24.0 | 51.00 | 59.00 | 66.00 | 90.0 |
| Regate | 3321.0 | 6.507648e+01| 8.784134e+00| 25.0 | 60.00 | 65.00 | 71.00 | 97.0 |
| Curva | 3321.0 | 5.369407e+01| 1.298726e+01| 21.0 | 44.00 | 53.00 | 63.00 | 93.0 |
| Precisión Falta | 3321.0 | 4.673954e+01| 1.428631e+01| 19.0 | 35.00 | 44.00 | 58.00 | 94.0 |
| Pase Largo | 3321.0 | 4.849654e+01| 1.212868e+01| 19.0 | 39.00 | 49.00 | 58.00 | 89.0 |
| Control Balón | 3321.0 | 6.554321e+01| 8.312497e+00| 33.0 | 60.00 | 66.00 | 71.00 | 96.0 |
| Aceleración | 3321.0 | 7.107618e+01| 1.108222e+01| 22.0 | 65.00 | 72.00 | 78.00 | 96.0 |
| Velocidad Sprint | 3321.0 | 7.158747e+01| 1.045505e+01| 30.0 | 66.00 | 72.00 | 78.00 | 96.0 |
| Agilidad | 3321.0 | 6.878229e+01| 1.112778e+01| 29.0 | 62.00 | 69.00 | 76.00 | 95.0 |
| Reacciones | 3321.0 | 6.277025e+01| 9.139938e+00| 33.0 | 56.00 | 63.00 | 69.00 | 96.0 |
| Equilibrio | 3321.0 | 6.614002e+01| 1.199053e+01| 24.0 | 59.00 | 67.00 | 74.00 | 95.0 |
| Potencia Tiro | 3321.0 | 6.673472e+01| 9.066244e+00| 23.0 | 61.00 | 67.00 | 73.00 | 95.0 |
| Salto | 3321.0 | 6.718187e+01| 1.103770e+01| 30.0 | 61.00 | 68.00 | 74.00 | 95.0 |
| Resistencia | 3321.0 | 6.516290e+01| 1.011817e+01| 29.0 | 58.00 | 66.00 | 72.00 | 93.0 |
| Fuerza | 3321.0 | 6.728696e+01| 1.283493e+01| 25.0 | 60.00 | 68.00 | 76.00 | 97.0 |
| Tiros Largos | 3321.0 | 6.023276e+01| 9.259854e+00| 21.0 | 54.00 | 60.00 | 66.00 | 94.0 |
| Agresividad | 3321.0 | 5.272177e+01| 1.544927e+01| 21.0 | 40.00 | 53.00 | 65.00 | 93.0 |
| Intercepciones | 3321.0 | 2.824300e+01| 1.212953e+01| 10.0 | 19.00 | 25.00 | 36.00 | 76.0 |
| Posicionamiento | 3321.0 | 6.580036e+01| 9.128643e+00| 35.0 | 60.00 | 66.00 | 72.00 | 95.0 |
| Visión | 3321.0 | 5.749082e+01| 9.882136e+00| 27.0 | 50.00 | 57.00 | 65.00 | 94.0 |
| Penales | 3321.0 | 6.250918e+01| 8.893445e+00| 23.0 | 57.00 | 63.00 | 68.00 | 92.0 |
| Compostura | 3321.0 | 6.133815e+01| 1.007644e+01| 34.0 | 54.00 | 61.00 | 68.00 | 96.0 |
| Marcaje | 3321.0 | 3.117013e+01| 1.196102e+01| 10.0 | 22.00 | 30.00 | 39.00 | 76.0 |
| Tackle Estático | 3321.0 | 2.787895e+01| 1.170312e+01| 10.0 | 19.00 | 25.00 | 35.00 | 78.0 |
| Tackle Deslizante| 3321.0| 2.528004e+01| 1.073180e+01| 10.0 | 18.00 | 22.00 | 31.00 | 74.0 |
  • Edad: La edad promedio de los delanteros es de aproximadamente 30 años, con una desviación estándar de alrededor de 4.6 años. El rango de edad oscila entre 22 y 45 años.
  • Altura y Peso: La altura promedio es de alrededor de 174.6 cm, con un rango que va desde 152.4 cm hasta 203.2 cm. El peso promedio es de aproximadamente 75.7 kg, con un rango que va desde 49.9 kg hasta 110.2 kg.
  • Valor y Salario: El valor promedio en euros de los delanteros es de alrededor de 3.09 millones, con un rango que va desde 30,000 euros hasta 110.5 millones de euros. El salario promedio es de aproximadamente 11,703 euros, con un rango que va desde 1,000 euros hasta 565,000 euros.
  • Habilidades de Juego: Las calificaciones generales y el potencial tienen valores promedio alrededor de 66.7 y 71.8, respectivamente. Estas calificaciones varían en un rango amplio.
  • Pie Preferido: La mayoría de los delanteros tienen preferencia por el pie derecho, con un promedio de alrededor de 0.84.
  • Habilidades Técnicas: Se proporcionan estadísticas para diversas habilidades técnicas como centros, remates, regate, precisión de pases, entre otros. Estas habilidades tienen diferentes promedios y rangos, lo que indica la variabilidad en las capacidades técnicas de los delanteros.
  • Habilidades Defensivas: Se incluyen habilidades defensivas como marcaje, tackle estático y tackle deslizante, que muestran un rango de valores que indican la diversidad en las capacidades defensivas de los delanteros.

En resumen, este análisis brinda una comprensión inicial de las características y habilidades de los delanteros en el conjunto de datos, lo que puede ser útil para la toma de decisiones en el análisis posterior.

Análisis de la Nacionalidad de los Delanteros en el Conjunto de Datos

El análisis revela una distribución diversa y global de los delanteros, con una fuerte representación de países europeos y americanos. Con 334 jugadores, Inglaterra lidera en nacionalidad, seguido de Alemania con 193.

Argentina y Brasil comparten una cantidad similar de jugadores, destacando la pasión por el fútbol en América del Sur.

Europa lidera en cantidad de jugadores, con 1314 en total, subrayando su papel central en el panorama futbolístico mundial. América sigue en segundo lugar con 782 jugadores, reflejando la importancia del fútbol en las Américas.

África y Asia también tienen una presencia considerable, con 296 y 183 jugadores respectivamente, mientras que Oceanía tiene la menor cantidad con 35 jugadores.

Generar Gráficos de Distribución Para Analizar Columnas del Conjunto De Datos

Nos adentraremos ahora en el análisis de nuestro conjunto de datos, generando una serie de gráficos de distribución. El propósito principal es examinar cómo se distribuyen los datos en cada columna, lo que nos permitirá apreciar medidas centrales y percentiles.

Es importante comprender que, aunque los resultados puedan parecer un tanto decepcionantes a primera vista, estas visualizaciones son fundamentales para entender la distribución de nuestras variables. A través de ellas, podemos identificar los diferentes tipos de jugadores y en qué nivel (bajo, regular o alto) se distribuyen.

Es cierto que las medidas medias y medianas pueden parecer algo bajas inicialmente. Sin embargo, hay que tener en cuenta que estamos evaluando todo el conjunto de datos, desde los mejores jugadores hasta aquellos que se sitúan por debajo del promedio.

Esencialmente, estos gráficos nos permitirán identificar la cantidad de jugadores por encima y por debajo del promedio. Con esta información, en una etapa posterior, podremos seleccionar exclusivamente a los jugadores que se encuentran por encima del percentil 85, quienes conformarán nuestro grupo de jugadores destacados.

Posteriormente, utilizaremos una matriz de correlación para comprender las relaciones entre las variables. Esto nos ayudará a identificar qué variables dependen unas de otras, lo que será fundamental para seleccionar las columnas necesarias y construir un nuevo conjunto de datos con los jugadores más destacados.

Nota Importante:
Antes de continuar quiero mejorar el nombre de las columnas!

# Lista de nombres de las columnas originales
columnas_originales = ['nombre', 'nombre_completo', 'edad', 'altura_cm', 'peso_kg',
'nacionalidad', 'continente', 'calificación_general', 'potencial',
'valor_euros', 'salario_euros', 'pie_preferido',
'reputacion_internacional(1-5)', 'pierna_mala(1-5)',
'habilidad_movimientos(1-5)', 'centros', 'remates', 'precisión_cabeza',
'pase_corto', 'voleas', 'regate', 'curva', 'precisión_falta',
'pase_largo', 'control_balón', 'aceleración', 'velocidad_sprint',
'agilidad', 'reacciones', 'equilibrio', 'potencia_tiro', 'salto',
'resistencia', 'fuerza', 'tiros_largos', 'agresividad',
'intercepciones', 'posicionamiento', 'visión', 'penales', 'compostura',
'marcaje', 'tackle_estático', 'tackle_deslizante']

# Mejorar los nombres de las columnas
columnas_mejoradas = [columna.replace('_', ' ').title() for columna in columnas_originales]

# Asignar los nuevos nombres de columnas al DataFrame
delanteros_df.columns = columnas_mejoradas

# Mostrar los nuevos nombres de columnas
print(delanteros_df.columns)

Resultado:

Index(['Nombre', 'Nombre Completo', 'Edad', 'Altura Cm', 'Peso Kg',
'Nacionalidad', 'Continente', 'Calificación General', 'Potencial',
'Valor Euros', 'Salario Euros', 'Pie Preferido',
'Reputacion Internacional(1-5)', 'Pierna Mala(1-5)',
'Habilidad Movimientos(1-5)', 'Centros', 'Remates', 'Precisión Cabeza',
'Pase Corto', 'Voleas', 'Regate', 'Curva', 'Precisión Falta',
'Pase Largo', 'Control Balón', 'Aceleración', 'Velocidad Sprint',
'Agilidad', 'Reacciones', 'Equilibrio', 'Potencia Tiro', 'Salto',
'Resistencia', 'Fuerza', 'Tiros Largos', 'Agresividad',
'Intercepciones', 'Posicionamiento', 'Visión', 'Penales', 'Compostura',
'Marcaje', 'Tackle Estático', 'Tackle Deslizante'],
dtype='object')
<class 'pandas.core.frame.DataFrame'>
Index: 3321 entries, 0 to 3369
Data columns (total 44 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Nombre 3321 non-null object
1 Nombre Completo 3321 non-null object
2 Edad 3321 non-null int64
3 Altura Cm 3321 non-null float64
4 Peso Kg 3321 non-null float64
5 Nacionalidad 3321 non-null object
6 Continente 3321 non-null object
7 Calificación General 3321 non-null int64
8 Potencial 3321 non-null int64
9 Valor Euros 3321 non-null float64
10 Salario Euros 3321 non-null float64
11 Pie Preferido 3321 non-null int64
12 Reputacion Internacional(1-5) 3321 non-null int64
13 Pierna Mala(1-5) 3321 non-null int64
14 Habilidad Movimientos(1-5) 3321 non-null int64
15 Centros 3321 non-null int64
16 Remates 3321 non-null int64
17 Precisión Cabeza 3321 non-null int64
18 Pase Corto 3321 non-null int64
19 Voleas 3321 non-null int64
20 Regate 3321 non-null int64
21 Curva 3321 non-null int64
22 Precisión Falta 3321 non-null int64
23 Pase Largo 3321 non-null int64
24 Control Balón 3321 non-null int64
25 Aceleración 3321 non-null int64
26 Velocidad Sprint 3321 non-null int64
27 Agilidad 3321 non-null int64
28 Reacciones 3321 non-null int64
29 Equilibrio 3321 non-null int64
30 Potencia Tiro 3321 non-null int64
31 Salto 3321 non-null int64
32 Resistencia 3321 non-null int64
33 Fuerza 3321 non-null int64
34 Tiros Largos 3321 non-null int64
35 Agresividad 3321 non-null int64
36 Intercepciones 3321 non-null int64
37 Posicionamiento 3321 non-null int64
38 Visión 3321 non-null int64
39 Penales 3321 non-null int64
40 Compostura 3321 non-null int64
41 Marcaje 3321 non-null int64
42 Tackle Estático 3321 non-null int64
43 Tackle Deslizante 3321 non-null int64
dtypes: float64(4), int64(36), object(4)
memory usage: 1.1+ MB

Función para Generar Gráficos de Distribución

def graficas_cuatro_columnas(df, col1, col2, col3, col4):
# Definir los datos de las columnas
datos_col1 = df[col1]
datos_col2 = df[col2]
datos_col3 = df[col3]
datos_col4 = df[col4]

# Calcular estadísticas descriptivas
media_col1 = datos_col1.mean()
mediana_col1 = datos_col1.median()
p25_col1 = datos_col1.quantile(0.25)
p75_col1 = datos_col1.quantile(0.75)

media_col2 = datos_col2.mean()
mediana_col2 = datos_col2.median()
p25_col2 = datos_col2.quantile(0.25)
p75_col2 = datos_col2.quantile(0.75)

media_col3 = datos_col3.mean()
mediana_col3 = datos_col3.median()
p25_col3 = datos_col3.quantile(0.25)
p75_col3 = datos_col3.quantile(0.75)

media_col4 = datos_col4.mean()
mediana_col4 = datos_col4.median()
p25_col4 = datos_col4.quantile(0.25)
p75_col4 = datos_col4.quantile(0.75)

# Crear subplots
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 10))

# Graficar la distribución de la primera columna
sns.histplot(datos_col1, kde=True, color='skyblue', ax=ax1)
ax1.axvline(media_col1, color='red', linestyle='--', label=f'Media: {media_col1:.2f}')
ax1.axvline(mediana_col1, color='green', linestyle='--', label=f'Mediana: {mediana_col1:.2f}')
ax1.axvline(p25_col1, color='purple', linestyle='--', label=f'P25: {p25_col1:.2f}')
ax1.axvline(p75_col1, color='orange', linestyle='--', label=f'P75: {p75_col1:.2f}')
ax1.set_title(f'Distribución de {col1}')
ax1.set_xlabel('Valor')
ax1.set_ylabel('Frecuencia')
ax1.legend()

# Graficar la distribución de la segunda columna
sns.histplot(datos_col2, kde=True, color='orange', ax=ax2)
ax2.axvline(media_col2, color='red', linestyle='--', label=f'Media: {media_col2:.2f}')
ax2.axvline(mediana_col2, color='green', linestyle='--', label=f'Mediana: {mediana_col2:.2f}')
ax2.axvline(p25_col2, color='purple', linestyle='--', label=f'P25: {p25_col2:.2f}')
ax2.axvline(p75_col2, color='orange', linestyle='--', label=f'P75: {p75_col2:.2f}')
ax2.set_title(f'Distribución de {col2}')
ax2.set_xlabel('Valor')
ax2.set_ylabel('Frecuencia')
ax2.legend()

# Graficar la distribución de la tercera columna
sns.histplot(datos_col3, kde=True, color='green', ax=ax3)
ax3.axvline(media_col3, color='red', linestyle='--', label=f'Media: {media_col3:.2f}')
ax3.axvline(mediana_col3, color='green', linestyle='--', label=f'Mediana: {mediana_col3:.2f}')
ax3.axvline(p25_col3, color='purple', linestyle='--', label=f'P25: {p25_col3:.2f}')
ax3.axvline(p75_col3, color='orange', linestyle='--', label=f'P75: {p75_col3:.2f}')
ax3.set_title(f'Distribución de {col3}')
ax3.set_xlabel('Valor')
ax3.set_ylabel('Frecuencia')
ax3.legend()

# Graficar la distribución de la cuarta columna
sns.histplot(datos_col4, kde=True, color='purple', ax=ax4)
ax4.axvline(media_col4, color='red', linestyle='--', label=f'Media: {media_col4:.2f}')
ax4.axvline(mediana_col4, color='green', linestyle='--', label=f'Mediana: {mediana_col4:.2f}')
ax4.axvline(p25_col4, color='purple', linestyle='--', label=f'P25: {p25_col4:.2f}')
ax4.axvline(p75_col4, color='orange', linestyle='--', label=f'P75: {p75_col4:.2f}')
ax4.set_title(f'Distribución de {col4}')
ax4.set_xlabel('Valor')
ax4.set_ylabel('Frecuencia')
ax4.legend()

# Mostrar las gráficas
plt.tight_layout()
plt.show()

¡Lo que viene es fuerte! ¡Sírvete un café!

graficas_cuatro_columnas(delanteros_df, 'Edad', 'Altura Cm', 
'Peso Kg', 'Calificación General')

Resultado:

La edad promedio de los jugadores en el conjunto de datos es de alrededor de 30 años, con un rango que va desde 22 hasta 45 años. La desviación estándar es relativamente baja, lo que sugiere que la mayoría de los jugadores se encuentran en un rango de edad similar. No se observan valores atípicos evidentes, ya que el rango y los cuartiles son consistentes.

En cuanto a la altura, el promedio es de aproximadamente 174.6 centímetros, con un rango que va desde 152.4 hasta 203.2 centímetros. La desviación estándar es moderada, indicando cierta variabilidad en las alturas de los jugadores. No se identifican valores atípicos significativos en este aspecto.

En relación al peso, el promedio es de alrededor de 75.7 kilogramos, con un rango que va desde 49.9 hasta 110.2 kilogramos. La desviación estándar también es moderada, lo que indica cierta variabilidad en los pesos de los jugadores. No se encuentran valores atípicos evidentes en este conjunto de datos.

Finalmente, la calificación general promedio de los jugadores es de aproximadamente 66.7, con un rango que va desde 47 hasta 94. La desviación estándar es relativamente alta, lo que indica una dispersión considerable en las calificaciones generales de los jugadores. Es posible que existan algunos valores atípicos en el extremo superior, ya que el tercer cuartil es significativamente más bajo que el máximo observado.

graficas_cuatro_columnas(delanteros_df, 'Potencial', 'Valor Euros', 
'Salario Euros', 'Pie Preferido')

Para las columnas Potencial, Valor Euros, Salario Euros y Pie Preferido, podemos realizar el siguiente análisis:

El potencial medio de los jugadores en el conjunto de datos es aproximadamente 71.8, con un rango que va desde 53 hasta 95. La desviación estándar indica una variabilidad moderada en los potenciales de los jugadores. No se observan valores atípicos evidentes en esta columna.

En cuanto al valor en euros, la media es de alrededor de 3.1 millones de euros, con un rango que va desde 30,000 hasta 110.5 millones de euros. La desviación estándar es alta, lo que sugiere una amplia variabilidad en los valores de los jugadores. Se observan valores atípicos en el extremo superior del rango, indicando la presencia de algunos jugadores con valores muy altos en euros.

Respecto al salario en euros, la media es de aproximadamente 11,703 euros, con un rango que va desde 1,000 hasta 565,000 euros mensuales. La desviación estándar también es alta, lo que indica una gran variabilidad en los salarios de los jugadores. Al igual que con el valor en euros, se observan valores atípicos en el extremo superior del rango, sugiriendo la presencia de algunos jugadores con salarios muy altos.

En relación al pie preferido, el 84% de los jugadores en el conjunto de datos prefieren utilizar su pie derecho, mientras que el 16% prefiere el pie izquierdo. Esto sugiere una clara preferencia por el pie derecho en la población de jugadores analizados.

graficas_cuatro_columnas(delanteros_df, 'Reputacion Internacional(1-5)', 'Pierna Mala(1-5)', 
'Habilidad Movimientos(1-5)', 'Centros')

Para las columnas Reputación Internacional, Pierna Mala, Habilidad Movimientos y Centros, podemos realizar el siguiente análisis:

La reputación internacional de los jugadores, en una escala del 1 al 5, tiene una media de aproximadamente 0.84, con un rango que va desde 0 hasta 1. No se observan valores atípicos en esta columna, y la mayoría de los jugadores tienen una reputación internacional baja, cercana a 1.

En cuanto a la evaluación de la pierna mala de los jugadores, en una escala del 1 al 5, la mayoría de los jugadores tienen una puntuación de 1, lo que indica que su pierna mala es bastante débil. La media se encuentra alrededor de 1.14, con un rango que va desde 1 hasta 5. No se observan valores atípicos en esta columna.

La habilidad en movimientos de los jugadores, también en una escala del 1 al 5, tiene una media de aproximadamente 3.14, con un rango que va desde 1 hasta 5. La desviación estándar indica una variabilidad moderada en las habilidades de movimiento de los jugadores. No se observan valores atípicos evidentes en esta columna.

Respecto a la habilidad en centros, en una escala del 1 al 100, la media se encuentra alrededor de 50.59, con un rango que va desde 18 hasta 87. La desviación estándar indica una variabilidad moderada en las habilidades de centrar de los jugadores. No se observan valores atípicos evidentes en esta columna.

graficas_cuatro_columnas(delanteros_df, 'Remates', 'Precisión Cabeza', 
'Pase Corto', 'Voleas')

Para las columnas Remates, Precisión Cabeza, Pase Corto y Voleas, podemos realizar el siguiente análisis:

En cuanto a los remates de los jugadores, observamos que la media se sitúa alrededor de 66.42, con un rango que va desde 30 hasta 95. Esto sugiere que la mayoría de los jugadores tienen una capacidad de remate relativamente alta, aunque hay una variabilidad considerable en esta habilidad.

La precisión en el juego aéreo, medida por la columna Precisión Cabeza tiene una media de aproximadamente 61.34, con un rango que va desde 20 hasta 94. Esto indica que la mayoría de los jugadores tienen una precisión de cabeza moderada, pero también hay una variabilidad significativa en esta habilidad.

En cuanto al pase corto, observamos que la media se encuentra alrededor de 60.21, con un rango que va desde 31 hasta 92. Esto sugiere que la mayoría de los jugadores tienen una habilidad moderada en el pase corto, pero también hay una variabilidad considerable en esta habilidad.

Para las voleas, la media se sitúa alrededor de 58.41, con un rango que va desde 24 hasta 90. Esto indica que la mayoría de los jugadores tienen una capacidad de volea relativamente alta, aunque también hay una variabilidad considerable en esta habilidad.

graficas_cuatro_columnas(delanteros_df, 'Regate', 'Curva', 
'Precisión Falta', 'Pase Largo')

Para las columnas Regate, Curva, Precisión Falta y Pase Largo, podemos hacer el siguiente análisis:

En cuanto al regate, observamos que la media se sitúa en torno a los 65 puntos, con una desviación estándar que indica una variabilidad considerable (ojo con esto!) entre las habilidades de regate de los delanteros. Aunque la mayoría parece tener habilidades promedio en este aspecto, se evidencia una dispersión notable de puntajes, lo que sugiere la presencia de jugadores tanto con habilidades inferiores como superiores a la media.

En relación a la curva, se nota una media cercana a los 71 puntos, lo que indica que la mayoría de los delanteros tienen habilidades decentes en este aspecto. Sin embargo, al igual que con el regate, la variabilidad en las puntuaciones es significativa, lo que sugiere la presencia de jugadores con habilidades de curva tanto por debajo como por encima de la media.

En cuanto a la precisión en falta, la media se encuentra alrededor de los 71 puntos, lo que sugiere que la mayoría de los delanteros tienen habilidades relativamente buenas en este aspecto. Sin embargo, al igual que con las otras habilidades, la variabilidad en las puntuaciones es notable, lo que implica la presencia de jugadores con habilidades de precisión en falta tanto inferiores como superiores a la media.

Por último, en relación al pase largo, la media se sitúa en torno a los 66 puntos, lo que indica que la mayoría de los delanteros tienen habilidades promedio en este aspecto. Sin embargo, la variabilidad en las puntuaciones es notable, lo que sugiere la presencia de jugadores con habilidades de pase largo tanto inferiores como superiores a la media.

graficas_cuatro_columnas(delanteros_df, 'Control Balón', 'Aceleración', 
'Velocidad Sprint', 'Agilidad')

Para las columnas Control Balón, Aceleración, Velocidad Sprint y Agilidad, el análisis es el siguiente:

En relación al control de balón, se observa una media cercana a los 71 puntos, lo que sugiere que la mayoría de los delanteros tienen habilidades aceptables en este aspecto. Sin embargo, la dispersión de las puntuaciones es significativa, indicando la presencia de jugadores con habilidades de control de balón tanto por debajo como por encima de la media.

En cuanto a la aceleración, la media se sitúa alrededor de los 71 puntos, lo que indica que la mayoría de los delanteros tienen una buena capacidad de aceleración. La variabilidad en las puntuaciones es moderada, sugiriendo que la mayoría de los jugadores se encuentran dentro de un rango similar en este aspecto.

En relación a la velocidad de sprint, se nota una media cercana a los 68 puntos, lo que sugiere que la mayoría de los delanteros tienen una velocidad de sprint aceptable. Sin embargo, al igual que con otras habilidades físicas, la variabilidad en las puntuaciones es notable, lo que indica la presencia de jugadores con velocidades de sprint tanto por debajo como por encima de la media.

Por último, en cuanto a la agilidad, la media se sitúa alrededor de los 69 puntos, lo que sugiere que la mayoría de los delanteros tienen una buena agilidad. La dispersión de las puntuaciones es moderada, indicando que la mayoría de los jugadores se encuentran dentro de un rango similar en este aspecto.

graficas_cuatro_columnas(delanteros_df, 'Reacciones', 'Equilibrio', 
'Potencia Tiro', 'Salto')

Para las columnas Reacciones, Equilibrio, Potencia Tiro y Salto, el análisis es el siguiente:

En cuanto a las reacciones, se observa una media cercana a los 66 puntos, lo que sugiere que la mayoría de los delanteros tienen habilidades decentes para reaccionar rápidamente en diferentes situaciones durante el juego. La dispersión de las puntuaciones es moderada, lo que indica cierta variabilidad en las habilidades de reacción de los jugadores.

Respecto al equilibrio, la media se sitúa alrededor de los 67 puntos, lo que sugiere que la mayoría de los delanteros tienen un buen equilibrio corporal. La variabilidad en las puntuaciones es moderada, indicando que la mayoría de los jugadores se encuentran dentro de un rango similar en este aspecto.

En relación a la potencia de tiro, se observa una media cercana a los 65 puntos, lo que sugiere que la mayoría de los delanteros tienen una buena potencia en sus disparos. Sin embargo, la dispersión de las puntuaciones es significativa, lo que indica la presencia de jugadores con habilidades de tiro tanto por debajo como por encima de la media.

Finalmente, en cuanto al salto, se nota una media cercana a los 68 puntos, lo que sugiere que la mayoría de los delanteros tienen una buena capacidad de salto. La variabilidad en las puntuaciones es moderada, indicando que la mayoría de los jugadores se encuentran dentro de un rango similar en este aspecto.

graficas_cuatro_columnas(delanteros_df, 'Resistencia', 'Fuerza', 
'Tiros Largos', 'Agresividad')

Para las columnas Resistencia, Fuerza, Tiros Largos y Agresividad, observamos lo siguiente:

En cuanto a la resistencia, la media se sitúa en aproximadamente 71 puntos. Esto indica que la mayoría de los delanteros tienen una resistencia decente en el campo. Sin embargo, la variabilidad en las puntuaciones es notable, lo que sugiere la presencia de jugadores tanto con niveles de resistencia inferiores como superiores a la media.

Respecto a la fuerza, la media se encuentra alrededor de los 67 puntos. Esto sugiere que la mayoría de los delanteros tienen una fuerza promedio en el juego. Nuevamente, la variabilidad en las puntuaciones es significativa, lo que implica la existencia de jugadores tanto más débiles como más fuertes en términos de fuerza física.

En relación a los tiros largos, la media se sitúa en torno a los 66 puntos. Esto indica que la mayoría de los delanteros tienen habilidades promedio en este aspecto. Sin embargo, al igual que con otras habilidades, la variabilidad en las puntuaciones es notable, lo que sugiere la presencia de jugadores con habilidades de tiros largos tanto inferiores como superiores a la media.

Por último, en cuanto a la agresividad, la media se encuentra alrededor de los 62 puntos. Esto sugiere que la mayoría de los delanteros tienen una agresividad moderada en el juego. Sin embargo, como en los otros aspectos, la variabilidad en las puntuaciones es notable, lo que implica la existencia de jugadores tanto más agresivos como más pasivos en el campo.

graficas_cuatro_columnas(delanteros_df, 'Intercepciones', 'Posicionamiento', 
'Visión', 'Penales')

Para las columnas Intercepciones, Posicionamiento, Visión y Penales, realizamos el siguiente análisis:

En lo que respecta a las intercepciones, se observa una media alrededor de los 66 puntos. Esto sugiere que la mayoría de los delanteros tienen habilidades promedio en cuanto a la capacidad de realizar intercepciones. Sin embargo, la desviación estándar indica cierta variabilidad en las puntuaciones, lo que sugiere la presencia de jugadores con habilidades tanto por encima como por debajo de la media en este aspecto.

En relación al posicionamiento, se nota una media cercana a los 66 puntos. Esto indica que la mayoría de los delanteros tienen habilidades promedio en cuanto a la capacidad de posicionarse en el campo. Al igual que con las intercepciones, la desviación estándar sugiere cierta variabilidad en las puntuaciones, lo que implica la presencia de jugadores con habilidades de posicionamiento tanto inferiores como superiores a la media.

En cuanto a la visión, la media se encuentra alrededor de los 67 puntos. Esto sugiere que la mayoría de los delanteros tienen habilidades relativamente buenas en cuanto a la visión del juego. No obstante, la variabilidad en las puntuaciones indica la presencia de jugadores con habilidades de visión tanto por debajo como por encima de la media.

Por último, en relación a los penales, la media se sitúa en torno a los 61 puntos. Esto sugiere que la mayoría de los delanteros tienen habilidades promedio en cuanto a la ejecución de penales. Sin embargo, al igual que con las otras habilidades analizadas, la variabilidad en las puntuaciones sugiere la presencia de jugadores con habilidades de penal tanto inferiores como superiores a la media.

graficas_cuatro_columnas(delanteros_df, 'Compostura', 'Marcaje', 
'Tackle Estático', 'Tackle Deslizante')

Para las columnas Compostura, Marcaje, Tackle Estático y Tackle Deslizante, observamos lo siguiente:

En cuanto a la compostura, se registra una media alrededor de los 31 puntos. Esto indica que la mayoría de los delanteros tienen habilidades promedio en cuanto a la compostura en situaciones de juego. Sin embargo, la desviación estándar sugiere cierta variabilidad en las puntuaciones, lo que implica la presencia de jugadores con habilidades tanto por debajo como por encima de la media en este aspecto.

En relación al marcaje, se observa una media cercana a los 28 puntos. Esto sugiere que la mayoría de los delanteros tienen habilidades promedio en cuanto al marcaje de los oponentes. Sin embargo, la variabilidad en las puntuaciones indica la presencia de jugadores con habilidades de marcaje tanto inferiores como superiores a la media.

En lo que respecta al tackle estático, se registra una media alrededor de los 25 puntos. Esto indica que la mayoría de los delanteros tienen habilidades promedio en cuanto a la ejecución de tackles estáticos. Al igual que con las otras habilidades analizadas, la variabilidad en las puntuaciones sugiere la presencia de jugadores con habilidades tanto por debajo como por encima de la media en este aspecto.

Por último, en relación al tackle deslizante, la media se sitúa en torno a los 25 puntos. Esto sugiere que la mayoría de los delanteros tienen habilidades promedio en cuanto a la ejecución de tackles deslizantes. Al igual que con las otras habilidades analizadas, la variabilidad en las puntuaciones indica la presencia de jugadores con habilidades tanto inferiores como superiores a la media.

Preparándonos para Identificar a los Mejores

Para avanzar en nuestro análisis, me propongo crear un conjunto de datos que reúna únicamente a los jugadores que se sitúan por encima del percentil 85 en cuanto a sus habilidades. Esto nos permitirá enfocarnos exclusivamente en los mejores jugadores y entender mejor las características que los distinguen del resto.

Una vez tengamos este conjunto de datos reducido, nuestro objetivo será visualizar las diferencias porcentuales en habilidades entre estos jugadores destacados y el resto del grupo. Para ello, generaremos gráficas que nos permitan comparar las habilidades de los jugadores de élite con las del resto de los jugadores.

Pero antes de reducir nuestro conjunto de datos y proceder con estas comparaciones, llevaremos a cabo un análisis de correlación entre las diferentes columnas. Este análisis nos ayudará a comprender las relaciones existentes entre las distintas habilidades de los jugadores. Al entender estas relaciones, estaremos mejor preparados para seleccionar las columnas más relevantes y construir nuestro conjunto de datos final con los jugadores más destacados.

Análisis de Correlación:

# Seleccionar solo las columnas numéricas
columnas_numericas = delanteros_df.select_dtypes(include=np.number).columns.tolist()

# Filtrar el DataFrame original para seleccionar solo esas columnas
delanteros_corr = delanteros_df[columnas_numericas]

# Calcular la matriz de correlación
correlation_matrix = delanteros_corr.corr()

# Crear una máscara para ocultar la mitad superior de la matriz de correlación
mask = np.triu(np.ones_like(correlation_matrix, dtype=bool))

# Crear un mapa de calor para visualizar la matriz de correlación
plt.figure(figsize=(24, 16))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", mask=mask)
plt.title('Matriz de correlación de atributos de delanteros')
plt.show()

Todas las graficas son importantes pero esta, la matriz de correlacion, es magica y te explicare como interpretarla!

Esta grafica muestra la relación entre diferentes pares de variables en un conjunto de datos. Cada celda del mapa de calor representa el coeficiente de correlación entre dos variables.

Si una celda es de color cálido, como rojo o naranja, indica una correlación positiva entre las dos variables, lo que significa que cuando una variable aumenta, la otra también tiende a aumentar (Peso vs Fuerza).

Si la celda es de un color más frío, como azul o púrpura, indica una correlación negativa, lo que significa que cuando una variable aumenta, la otra tiende a disminuir (Peso vs Aceleración).

Una ausencia de color (generalmente en la diagonal principal) indica una correlación perfecta de 1, lo que significa que las variables son idénticas entre sí (Salario vs Salario).

Por otro lado, los números en cada celda indican el valor del coeficiente de correlación entre las variables correspondientes. Este valor puede variar entre -1 y 1, donde -1 representa una correlación negativa perfecta, 0 representa la ausencia de correlación y 1 representa una correlación positiva perfecta.

En resumen, el mapa de calor proporciona una forma visual de identificar patrones de correlación entre las variables en un conjunto de datos, lo que puede ayudar a comprender mejor cómo están relacionadas entre sí.

Explorando relaciones y tendencias

Visualización con gráficos de líneas de tendencia

def comparar_variables_con(df, variable_base, variable1, variable2, variable3, variable4):
"""
Compara la variable base con otras cuatro variables del DataFrame df y visualiza las relaciones mediante
gráficos de dispersión con líneas de tendencia.

Parámetros:
- df: DataFrame de pandas que contiene las variables a comparar.
- variable_base: Nombre de la variable base para la comparación.
- variable1: Nombre de la primera variable a comparar con la variable base.
- variable2: Nombre de la segunda variable a comparar con la variable base.
- variable3: Nombre de la tercera variable a comparar con la variable base.
- variable4: Nombre de la cuarta variable a comparar con la variable base.
"""
# Inicializar modelos de regresión lineal
reg_variable1 = LinearRegression()
reg_variable2 = LinearRegression()
reg_variable3 = LinearRegression()
reg_variable4 = LinearRegression()

# Ajustar modelos de regresión lineal
reg_variable1.fit(df[[variable_base]], df[variable1])
reg_variable2.fit(df[[variable_base]], df[variable2])
reg_variable3.fit(df[[variable_base]], df[variable3])
reg_variable4.fit(df[[variable_base]], df[variable4])

# Crear gráficos
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 10))

# Gráfico de regresión para Variable Base vs. Variable1
ax1.scatter(df[[variable_base]], df[variable1], color='blue', label='Datos')
ax1.plot(df[[variable_base]], reg_variable1.predict(df[[variable_base]]), color='red', label='Regresión lineal')
ax1.set_title(f'{variable_base} vs. {variable1}')
ax1.set_xlabel(variable_base)
ax1.set_ylabel(variable1)
ax1.legend()

# Gráfico de regresión para Variable Base vs. Variable2
ax2.scatter(df[[variable_base]], df[variable2], color='green', label='Datos')
ax2.plot(df[[variable_base]], reg_variable2.predict(df[[variable_base]]), color='red', label='Regresión lineal')
ax2.set_title(f'{variable_base} vs. {variable2}')
ax2.set_xlabel(variable_base)
ax2.set_ylabel(variable2)
ax2.legend()

# Gráfico de regresión para Variable Base vs. Variable3
ax3.scatter(df[[variable_base]], df[variable3], color='purple', label='Datos')
ax3.plot(df[[variable_base]], reg_variable3.predict(df[[variable_base]]), color='red', label='Regresión lineal')
ax3.set_title(f'{variable_base} vs. {variable3}')
ax3.set_xlabel(variable_base)
ax3.set_ylabel(variable3)
ax3.legend()

# Gráfico de regresión para Variable Base vs. Variable4
ax4.scatter(df[[variable_base]], df[variable4], color='orange', label='Datos')
ax4.plot(df[[variable_base]], reg_variable4.predict(df[[variable_base]]), color='red', label='Regresión lineal')
ax4.set_title(f'{variable_base} vs. {variable4}')
ax4.set_xlabel(variable_base)
ax4.set_ylabel(variable4)
ax4.legend()

# Mostrar gráficos
plt.tight_layout()
plt.show()
comparar_variables_con(delanteros_df, 'Peso Kg', 'Equilibrio', 
'Agilidad', 'Aceleración', 'Velocidad Sprint')

Estas cuatro gráficas muestran la relación entre el peso de un jugador de fútbol y cuatro atributos clave: equilibrio, agilidad, aceleración y velocidad de sprint. El resultado sugiere que a medida que el peso de un jugador aumenta, tiende a experimentar una disminución en su equilibrio, agilidad, aceleración y velocidad de sprint.

Al observar estas cuatro gráficas, se destaca una relación intrigante entre las variables. Parece que la altura y el peso de un jugador no influyen significativamente en su potencial. Sin embargo, encontramos una correlación notable entre el potencial y la edad del jugador; a medida que la edad aumenta, el potencial tiende a disminuir. Asimismo, se observa que a mayor potencial, la calificación general del jugador tiende a mejorar. Estas tendencias sugieren que la edad puede ser un factor determinante en el potencial de un jugador y, por ende, en su desempeño general.

Una relación inversa se observa entre la fuerza y la aceleración, así como entre la fuerza y la agilidad. Además, un aumento en la fuerza tiende a correlacionarse con una disminución en el equilibrio. Sin embargo, es importante destacar que una mayor fuerza se traduce en una mayor potencia en el tiro.

¿Qué revelan estas 8 últimas gráficas?

Sin lugar a dudas, el regate se posiciona como la habilidad principal que distingue a un delantero estrella. Un jugador con un regate destacado no solo posee un mayor potencial, sino que también exhibe una mayor destreza en movimientos, una visión más aguda del partido, una aceleración más potente, reacciones más rápidas, un control excepcional del balón, una velocidad superior y una agilidad más pronunciada. Este dato es fundamental, emergiendo como un factor clave en la evaluación del desempeño futbolístico.

Por lo tanto, tomando en cuenta este revelador resultado, continuaremos con un nuevo conjunto de datos.

Seleccionar jugadores que se sitúan por encima del percentil 85 en Regate

Después de haber analizado exhaustivamente el conjunto de datos completo, mi próximo paso es seleccionar un nuevo conjunto de datos que incluya exclusivamente a aquellos jugadores cuyo puntaje en la habilidad de regate se encuentra igual o por encima del percentil 85. Esto me permitirá focalizarme en los jugadores que destacan específicamente en esta destreza técnica clave.

El criterio de selección se centra en identificar a aquellos con un nivel excepcional de regate, considerando que esta habilidad puede marcar una diferencia significativa en el desempeño individual y colectivo en el terreno de juego. He observado que el regate del jugador está positivamente correlacionado con otras habilidades como visión, reacciones, potencia de tiro, agilidad, control del balón y aceleración.

# Filtrar el DataFrame para incluir solo los jugadores con regate mayor o igual a 90
jugadores_percentil_85_regate = delanteros_df[delanteros_df['Regate'] >= 85].reset_index(drop=True)
jugadores_percentil_85_regate.info()

Resultado:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 47 entries, 0 to 46
Data columns (total 44 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Nombre 47 non-null object
1 Nombre Completo 47 non-null object
2 Edad 47 non-null int64
3 Altura Cm 47 non-null float64
4 Peso Kg 47 non-null float64
5 Nacionalidad 47 non-null object
6 Continente 47 non-null object
7 Calificación General 47 non-null int64
8 Potencial 47 non-null int64
9 Valor Euros 47 non-null float64
10 Salario Euros 47 non-null float64
11 Pie Preferido 47 non-null int64
12 Reputacion Internacional(1-5) 47 non-null int64
13 Pierna Mala(1-5) 47 non-null int64
14 Habilidad Movimientos(1-5) 47 non-null int64
15 Centros 47 non-null int64
16 Remates 47 non-null int64
17 Precisión Cabeza 47 non-null int64
18 Pase Corto 47 non-null int64
19 Voleas 47 non-null int64
20 Regate 47 non-null int64
21 Curva 47 non-null int64
22 Precisión Falta 47 non-null int64
23 Pase Largo 47 non-null int64
24 Control Balón 47 non-null int64
25 Aceleración 47 non-null int64
26 Velocidad Sprint 47 non-null int64
27 Agilidad 47 non-null int64
28 Reacciones 47 non-null int64
29 Equilibrio 47 non-null int64
30 Potencia Tiro 47 non-null int64
31 Salto 47 non-null int64
32 Resistencia 47 non-null int64
33 Fuerza 47 non-null int64
34 Tiros Largos 47 non-null int64
35 Agresividad 47 non-null int64
36 Intercepciones 47 non-null int64
37 Posicionamiento 47 non-null int64
38 Visión 47 non-null int64
39 Penales 47 non-null int64
40 Compostura 47 non-null int64
41 Marcaje 47 non-null int64
42 Tackle Estático 47 non-null int64
43 Tackle Deslizante 47 non-null int64
dtypes: float64(4), int64(36), object(4)
memory usage: 16.3+ KB

Después de un análisis exhaustivo de los datos, he reducido nuestra muestra inicial de 3321 delanteros a solo 47 jugadores que se encuentran en el percentil 85 o superior en términos de habilidad de regate. Este enfoque selectivo nos permite centrarnos en aquellos jugadores que destacan en una de las habilidades más importantes del fútbol: el regate.

Al observar los atributos de estos jugadores, podemos notar que su calificación general, potencial y otras habilidades futbolísticas no se ven comprometidas a pesar de esta reducción en la muestra. Esto sugiere que estos jugadores destacan no solo en regate, sino también en otros aspectos del juego, lo que los convierte en jugadores completos y talentosos.

Es interesante destacar que estos jugadores, a pesar de tener un alto nivel de habilidad en el regate, no muestran necesariamente una correlación directa con atributos físicos como la altura y el peso. Esto subraya la importancia de la técnica y la habilidad sobre las características físicas en el fútbol moderno.

En resumen, nuestra selección de jugadores por encima del percentil 85 en regate nos proporciona una muestra de talento concentrado y nos permite profundizar en el análisis de los jugadores más hábiles en esta faceta del juego. Esto nos brinda una visión más detallada de cómo se destacan estos jugadores en comparación con el conjunto más amplio de delanteros.

Generar Gráficos Para Observar Origen Geografico De Los Jugadores

Explorando la Destreza en el Regate a través de Gráficas

Top 10

def regate_vs(columna):
"""
Grafica la relación entre la columna especificada y el regate para los 10 jugadores con mejor regate.

Parámetros:
columna (str): El nombre de la columna que se va a graficar junto con el regate.

Retorna:
None
"""
# Ordenar el DataFrame por regate en orden descendente
jugadores_ordenados = jugadores_percentil_85_regate.sort_values(by='Regate', ascending=False)

# Crear una figura y un conjunto de ejes
plt.figure(figsize=(15, 12))

# Graficar regate vs la columna especificada para los 10 primeros jugadores con transparencia
plt.scatter(jugadores_ordenados['Regate'][:10], jugadores_ordenados[columna][:10], color='blue', alpha=0.5)

# Agregar etiquetas y título al gráfico
plt.xlabel('Regate')
plt.ylabel(columna.capitalize()) # Capitalizar el nombre de la columna
plt.title(f'Top 10 Jugadores con Mejor Regate vs {columna.capitalize()}')

# Agregar etiquetas a cada punto con el nombre del jugador, la columna especificada y el regate
for i, jugador in jugadores_ordenados.head(10).iterrows():
plt.text(jugador['Regate'], jugador[columna], f"{jugador['Nombre Completo']}\n{columna.capitalize()}: {jugador[columna]}\nRegate: {jugador['Regate']}",
fontsize=8, ha='center', va='top')

# Mostrar el gráfico
plt.grid(True)
plt.show()

Este código define una función llamada regate_vs que grafica la relación entre una columna especificada y la habilidad de regate. Se graficaran solo los 10 jugadores con el mejor regate.

Henrik Larsson anotó 37 goles en 106 partidos con la selección Sueca.

Análisis de componentes principales (PCA)

Revelar Cuales Son Los 10 Mejores Jugadores

Para reducir la dimensionalidad de los datos y explorar la estructura subyacente de las relaciones entre las variables. Esto nos permitiría identificar qué variables contribuyen más a la variabilidad en los datos y cómo se agrupan los jugadores en función de sus características.

El Análisis de Componentes Principales (PCA, por sus siglas en inglés) es una técnica de reducción de la dimensionalidad que se utiliza comúnmente en el análisis exploratorio de datos. El objetivo principal del PCA es identificar patrones en los datos al encontrar las direcciones (o componentes principales) a lo largo de las cuales los datos tienen la mayor variabilidad. Esto permite resumir la información contenida en múltiples variables en un conjunto más pequeño de variables (llamadas componentes principales) que retienen la mayor parte de la variabilidad de los datos originales.

El proceso de PCA implica los siguientes pasos:

  1. Estandarización de datos: Antes de realizar el PCA, es común estandarizar los datos para que todas las variables tengan una media de cero y una desviación estándar de uno. Esto es importante para asegurarse de que las variables estén en la misma escala y que ninguna variable domine el análisis debido a su escala numérica.
  2. Cálculo de la matriz de covarianza o correlación: El PCA se basa en la matriz de covarianza (o correlación) de las variables. Esta matriz muestra cómo cada par de variables se relaciona entre sí. Si hay una alta covarianza (o correlación) entre dos variables, significa que varían juntas. El PCA calcula esta matriz para entender la estructura de las relaciones entre las variables.
  3. Cálculo de los componentes principales: Utilizando la matriz de covarianza (o correlación), el PCA calcula los componentes principales, que son combinaciones lineales de las variables originales. El primer componente principal explica la mayor cantidad de variabilidad en los datos, seguido por el segundo componente principal, y así sucesivamente. Estos componentes principales son ortogonales entre sí, lo que significa que son independientes.
  4. Selección de componentes principales: Generalmente, se seleccionan los primeros k componentes principales que explican la mayor parte de la variabilidad en los datos. Esto reduce la dimensionalidad de los datos al eliminar componentes con menor importancia.
  5. Transformación de datos: Finalmente, los datos originales se transforman en el nuevo espacio de variables definido por los componentes principales seleccionados. Esto permite visualizar y analizar los datos en un espacio de dimensionalidad reducida.

NOTA IMPORTANTE:
Para el siguiente cálculo, en el que se pretende determinar quiénes son los 10 mejores jugadores según esta fuente de datos, he decidido no limitarnos al conjunto de datos jugadores_percentil_85_regate.

Aunque este conjunto se centra en jugadores cuyo regate supera el umbral de 85, y si bien el regate es un factor crucial en la evaluación del talento de un jugador, reconozco la importancia de considerar todas las variables disponibles en el conjunto de datos completo (almacenado en la variable delanteros_df).

Es fundamental comprender que el rendimiento de un jugador no se reduce únicamente a una habilidad específica, como el regate. Hay una multitud de factores que influyen en el desempeño y la calidad general de un jugador, muchos de los cuales pueden ser documentados y cuantificados.

Estos factores abarcan aspectos como la psicología del jugador, su nivel de competitividad, el salario (si bien puede no estar disponible para todos los jugadores en este conjunto de datos), su valor en el mercado, la percepción de la fanaticada, los contratos de patrocinio, la exposición publicitaria, la nutrición, la calidad del sueño, el ritmo cardíaco, la salud mental, la experiencia y trayectoria profesional, las estrategias de entrenamiento, la adaptación a diferentes sistemas de juego y tácticas, las habilidades de liderazgo, la capacidad para motivar al equipo, y la actitud hacia el trabajo en equipo y la cooperación, entre otros aspectos relevantes.

Por lo tanto, al considerar el conjunto de datos completo, estamos tomando en cuenta una variedad más amplia de variables que podrían proporcionar una perspectiva más holística sobre qué jugadores se destacan como los mejores.

# Eliminar las columnas especificadas del DataFrame
columnas_eliminar = ['Nombre', 'Nombre Completo', 'Nacionalidad', 'Edad', 'Continente']
jugadores_numericos = delanteros_df.drop(columnas_eliminar, axis=1)

# Estandarizar los datos
scaler = StandardScaler()
scaled_data = scaler.fit_transform(jugadores_numericos)

# Crear un objeto PCA con 3 componentes principales
pca = PCA(n_components=3)

# Ajustar el PCA a los datos estandarizados
pca.fit(scaled_data)

# Transformar los datos originales al nuevo espacio de variables definido por los componentes principales
pca_data = pca.transform(scaled_data)

# Verificar las dimensiones de los datos transformados
print("Dimensiones de los datos transformados:", pca_data.shape)

Resultado:

Dimensiones de los datos transformados: (3321, 3)
# Calcular la distancia euclidiana de cada punto al origen en el espacio tridimensional de los componentes principales
distancias_al_origen = np.linalg.norm(pca_data, axis=1)

# Obtener los índices de los 10 jugadores con las mayores distancias al origen
mejores_indices = np.argsort(distancias_al_origen)[::-1][:10]

# Mostrar los nombres y nacionalidades de los 10 mejores jugadores
mejores_jugadores = delanteros_df.iloc[mejores_indices][['Nombre Completo', 'Nacionalidad']]

# Reiniciar el índice comenzando en 1 después de seleccionar los mejores jugadores
mejores_jugadores.reset_index(drop=True, inplace=True)
mejores_jugadores.index += 1 # Comenzar el índice en 1
print("Los 10 mejores jugadores son:")
mejores_jugadores

Resultado:

Los 10 mejores jugadores son:

| Nombre Completo                     | Nacionalidad |
|------------------------------------|--------------|
| Lionel Andrés Messi Cuccittini | Argentina |
| Cristiano Ronaldo dos Santos Aveiro| Portugal |
| Luis Alberto Suárez Díaz | Uruguay |
| Eden Hazard | Belgium |
| Gareth Frank Bale | Wales |
| Sergio Leonel Agüero del Castillo | Argentina |
| Harry Kane | England |
| Antoine Griezmann | France |
| Robert Lewandowski | Poland |
| Mohamed Salah Ghaly | Egypt |

Los resultados muestran a los 10 mejores jugadores de acuerdo con el conjunto de datos utilizado. Puede que estos resultados nos sorprendan, pero es importante recordar que se basan en datos concretos y hechos reales, no en cálculos estadísticos aleatorios.

Como un mero mediador de estos conocimientos, mi papel es revelar estos resultados gracias a los datos y análisis disponibles.

Para culminar esta primera etapa del proyecto, me propongo crear gráficos de radar. Estas visualizaciones son cruciales, ya que nos permiten comprender cuán destacados son los jugadores del top 10 en comparación con el resto de los delanteros en este conjunto de datos.

Planeo elaborar dos gráficos de radar por jugador, cada uno enfocado en las siguientes áreas:

  • Ingresos, Valoración, Habilidades Técnicas, Habilidades de Ataque.
  • Habilidades defensivas y habilidades físicas.

A través de estas representaciones gráficas, podremos determinar en qué percentil se ubica cada habilidad de un jugador del top y compararlos con el resto de los delanteros de manera más detallada.

Graficas de Radar

Comparando Jugadores TOP con el Resto

Voy a filtrar el conjunto de datos delanteros_df para crear un nuevo conjunto de datos llamado delanteros_df_grafica_radar, el cual utilizaré específicamente para generar gráficas de radar.

# Lista de columnas requeridas
columnas_requeridas = [
'Nombre Completo', 'Nacionalidad', 'Valor Euros', 'Salario Euros', 'Calificación General', 'Potencial',
'Reputacion Internacional(1-5)', 'Pierna Mala(1-5)', 'Habilidad Movimientos(1-5)',
'Centros', 'Remates', 'Precisión Cabeza', 'Pase Corto',
'Voleas', 'Regate', 'Curva', 'Precisión Falta', 'Pase Largo', 'Control Balón',
'Potencia Tiro', 'Tiros Largos', 'Penales', 'Compostura', 'Marcaje',
'Intercepciones', 'Posicionamiento', 'Visión', 'Tackle Estático', 'Tackle Deslizante',
'Aceleración', 'Velocidad Sprint', 'Agilidad', 'Reacciones', 'Equilibrio',
'Salto', 'Resistencia', 'Fuerza'
]

# Crear el nuevo DataFrame con las columnas seleccionadas
delanteros_df_grafica_radar = delanteros_df[columnas_requeridas].copy()
# Renombrar las columnas
delanteros_df_grafica_radar = delanteros_df_grafica_radar.rename(columns={
'Reputacion Internacional(1-5)': 'Reputacion Internacional',
'Pierna Mala(1-5)': 'Pierna Mala',
'Habilidad Movimientos(1-5)': 'Habilidad Movimientos'
})

# Configurar la opción para mostrar todas las columnas
pd.set_option('display.max_columns', None)

# Sustituir espacio entre palabras por salto de línea en los nombres de las columnas
delanteros_df_grafica_radar.columns = [column.replace(' ', '\n') for column in delanteros_df_grafica_radar.columns]

¡Excelente! ¡Continuemos!

Ahora prepararé una lista que contenga todas las columnas que utilizaré para calcular los parámetros estadísticos de todos los jugadores en el conjunto de datos delanteros_df_grafica_radar. Es importante tener en cuenta que este conjunto abarca a los 3321 jugadores delanteros.

params = delanteros_df_grafica_radar.columns[2:].tolist()
params

Resultado:

['Valor\nEuros',
'Salario\nEuros',
'Calificación\nGeneral',
'Potencial',
'Reputacion\nInternacional',
'Pierna\nMala',
'Habilidad\nMovimientos',
'Centros',
'Remates',
'Precisión\nCabeza',
'Pase\nCorto',
'Voleas',
'Regate',
'Curva',
'Precisión\nFalta',
'Pase\nLargo',
'Control\nBalón',
'Potencia\nTiro',
'Tiros\nLargos',
'Penales',
'Compostura',
'Marcaje',
'Intercepciones',
'Posicionamiento',
'Visión',
'Tackle\nEstático',
'Tackle\nDeslizante',
'Aceleración',
'Velocidad\nSprint',
'Agilidad',
'Reacciones',
'Equilibrio',
'Salto',
'Resistencia',
'Fuerza']
print(f'Tenemos un total de {len(params)} columnas')

Resultado:

Tenemos un total de 35 columnas

Calcular Métricas para un Jugador Específico del Top 10

jugador = list(delanteros_df_grafica_radar
[delanteros_df_grafica_radar['Nombre\nCompleto'] ==
'Lionel Andrés Messi Cuccittini'].iloc[0].values[2:])
print(jugador)

Resultado:

[110500000.0, 565000.0, 94, 94, 5, 4, 4, 86, 95, 70, 92, 86, 97, 93, 
94, 89, 96, 85, 94, 75, 96, 33, 22, 94, 94, 28, 26, 91, 86, 93, 95,
95, 68, 72, 66]
# Verificar la cantidad de columnas calculadas
print(f'Cantidad de columnas calculadas: {len(jugador)}')

Resultado:

Cantidad de columnas calculadas: 35

Calcular Métricas para de Todo el Conjunto de Jugadores Delanteros del Conjunto de Datos delanteros_df_grafica_radar

# Imputa valores faltantes con 0 en el DataFrame delanteros_todos
delanteros_todos_imputados = delanteros_df_grafica_radar.fillna(0)

# Calcula los percentiles utilizando el DataFrame con valores imputados
values = []
for x in range(len(params)):
values.append(math.floor(stats.percentileofscore(delanteros_todos_imputados[params[x]], jugador[x])))

print(values)

Resultado:

[100, 100, 99, 99, 99, 87, 95, 99, 100, 77, 100, 99, 100, 100, 100, 
100, 100, 98, 100, 92, 100, 61, 37, 99, 100, 57, 62, 98, 92, 99, 99,
99, 51, 74, 42]
# Verificar la cantidad de columnas calculadas
print(f'Cantidad de columnas calculadas: {len(values)}')
Cantidad de columnas calculadas: 35

Generando Graficas de Radar

from urllib.request import urlopen  # Importa la función urlopen para abrir URLs
import matplotlib.pyplot as plt # Importa pyplot de matplotlib para graficar
from PIL import Image # Importa la clase Image de PIL para manejar imágenes
from mplsoccer import PyPizza, add_image, FontManager # Importa PyPizza y funciones relacionadas

# Se definen tres fuentes de texto utilizando URLs a archivos de fuente en la web
font_normal = FontManager('https://raw.githubusercontent.com/googlefonts/roboto/main/'
'src/hinted/Roboto-Regular.ttf')
font_italic = FontManager('https://raw.githubusercontent.com/googlefonts/roboto/main/'
'src/hinted/Roboto-Italic.ttf')
font_bold = FontManager('https://raw.githubusercontent.com/google/fonts/main/apache/robotoslab/'
'RobotoSlab[wght].ttf')

# Se abre la imagen del jugador Messi desde una dirección local
URL = "imagenes_jugadores/messi1.png"
fdj_cropped = Image.open(URL)

# Se abre otra imagen del jugador Messi desde una dirección local
URL = "imagenes_jugadores/messi2.png"
fdj_cropped_2 = Image.open(URL)

# Nombre del jugador
name = "Lionel Andrés Messi Cuccittini"
name_corto = "Messi"

# Colores para las porciones de la pizza y el texto
slice_colors = ["#1A78CF"] * 2 + ["#FF9300"] * 3 + ["#D70232"] * 7 + ["#008000"] * 8
text_colors = ["#000000"] * 20

# Instancia de la clase PyPizza para crear la gráfica de radar
baker = PyPizza(
params=params[:20], # lista de parámetros para la gráfica
background_color="#EBEBE9", # color de fondo
straight_line_color="#EBEBE9", # color para líneas rectas
straight_line_lw=1, # grosor de línea para líneas rectas
last_circle_lw=0, # grosor de línea del último círculo
other_circle_lw=0, # grosor de línea para otros círculos
inner_circle_size=45 # tamaño del círculo interno
)

# Grafica la pizza
fig, ax = baker.make_pizza(
values[:20], # lista de valores para la gráfica
figsize=(16, 16.5), # ajusta el tamaño según tus necesidades
color_blank_space="same", # usa el mismo color para rellenar el espacio en blanco
slice_colors=slice_colors, # colores para las porciones individuales
value_colors=text_colors, # colores para el texto de los valores
value_bck_colors=slice_colors, # colores para los espacios en blanco
blank_alpha=0.4, # transparencia para los colores del espacio en blanco
kwargs_slices=dict(
edgecolor="#F2F2F2", zorder=2, linewidth=1
), # argumentos para las porciones de la gráfica
kwargs_params=dict(
color="#000000", fontsize=12,
fontproperties=font_normal.prop, va="center"
), # argumentos para agregar parámetros
kwargs_values=dict(
color="#000000", fontsize=11,
fontproperties=font_normal.prop, zorder=3,
bbox=dict(
edgecolor="#000000", facecolor="cornflowerblue",
boxstyle="round,pad=0.2", lw=1
)
) # argumentos para agregar valores de parámetros
)

# Agrega el título
fig.text(
0.515, 0.975, name, size=16,
ha="center", fontproperties=font_bold.prop, color="#000000"
)

# Agrega el subtítulo
fig.text(
0.515, 0.953,
f"Análisis de Ingresos, Valoración, Habilidades Técnicas y de Ataque\n{name_corto} vs. Resto de Delanteros",
size=13,
ha="center", fontproperties=font_bold.prop, color="#000000"
)

# Agrega los créditos
CREDIT_1 = "Datos: Jugadores de Fifa 2024"
CREDIT_2 = "Autor: Jorge Luis García - desarrollador@tutanota.com"

fig.text(
0.99, 0.02, f"{CREDIT_1}\n{CREDIT_2}", size=9,
fontproperties=font_italic.prop, color="#000000",
ha="right"
)

# Agrega texto
fig.text(
0.34, 0.925, "Ingresos Valoración Habilidades Técnicas Habilidades de Ataque", size=14,
fontproperties=font_bold.prop, color="#000000"
)

# Agrega rectángulos
fig.patches.extend([
plt.Rectangle(
(0.31, 0.9225), 0.025, 0.021, fill=True, color="#1a78cf",
transform=fig.transFigure, figure=fig
),
plt.Rectangle(
(0.412, 0.9225), 0.025, 0.021, fill=True, color="#ff9300",
transform=fig.transFigure, figure=fig
),
plt.Rectangle(
(0.530, 0.9225), 0.025, 0.021, fill=True, color="#d70232",
transform=fig.transFigure, figure=fig
),
plt.Rectangle(
(0.697, 0.9225), 0.025, 0.021, fill=True, color="#008000",
transform=fig.transFigure, figure=fig
),
])

# Agrega imagen
ax_image = add_image(
fdj_cropped, fig, left=0.78, bottom=0.78, width=0.28, height=0.28
) # estos valores podrían diferir cuando estás graficando

# Agrega otra imagen
ax_image = add_image(
fdj_cropped_2, fig, left=0.42, bottom=0.382, width=0.22, height=0.22
) # estos valores podrían diferir cuando estás graficando

plt.show() # Muestra la gráfica

Resultado:

Lionel Andrés Messi Cuccittini

Entender este gráfico de radar es bastante sencillo y, como mencioné anteriormente, tiene una gran utilidad.

¿Qué significa?

En la primera gráfica, podemos observar que en términos de ingresos, Messi se sitúa en el percentil 100. Esto indica que Messi tiene un valor y un salario por encima del 100% de los delanteros registrados en el conjunto de datos. También podemos apreciar otras métricas; su pierna mala es mejor que la del 87% del resto de jugadores, su habilidad de movimiento está por encima del 95% del resto, y sus remates son un 100% mejores que los de los demás jugadores.

En la segunda gráfica, vemos que Messi tiene un mejor marcaje que el 61% y a pesar de ser la “Pulga”, tiene un mejor salto que el 51% del resto de jugadores, pero una agilidad que está por encima del 100%.

Final de la Champion — 27 de mayo del 2009 — El gol de Messi al United

En la competencia, estas gráficas son magníficas porque permiten comparar de manera ágil y eficiente las destrezas y habilidades de un jugador con el resto de los jugadores. Esta es una herramienta que debe ser utilizada por todos los jugadores y clubes, independientemente de su nivel profesional.

Estas métricas son clave para todos aquellos que, sin importar el deporte que practiquen, la edad o el nivel (especialmente los jugadores de las canteras y que sueñan con llegar a un primer equipo) y que planean alcanzar un nivel de juego superior en el futuro, puedan observar su posición.

Los entrenadores, así como el resto del cuerpo técnico y los representantes de atletas y clubes, deben tener en cuenta este tipo de gráficas, ya que definen y muestran con facilidad en qué percentil se encuentra su club o prospecto en comparación con su competencia.

Además, este tipo de visualizaciones brinda una contribución importante al momento de desarrollar una estrategia de juego. De acuerdo con las capacidades de un jugador en una posición específica (hablando específicamente en el contexto del fútbol), un entrenador y su equipo de estrategas podrían fácilmente identificar sus debilidades y fortalezas frente a un rival y, por ende, planificar la contienda.

Cuando un equipo y sus jugadores cuentan con una documentación detallada, cuando conocen sus ventajas y desventajas ante el contrincante, tienen una mejor comprensión de su desempeño en la cancha. Esto les permite reconocer la importancia de esforzarse, de desarrollar estrategias sólidas, de mantener una preparación mental adecuada y de afinar sus tácticas personales. Esta conciencia marca la diferencia crucial entre la victoria y la derrota.

Obtener este tipo de información puede ser un desafío, pero contar con esta ventaja adicional puede marcar la diferencia para alcanzar el éxito en el campo y acercarte a levantar la copa.

Continuamos con el resto de las gráficas de radar de los otros 9 jugadores del top 10.

Vamos con el “BICHO”

Cristiano Ronaldo dos Santos Aveiro

Doblete de Cristiano Ronaldo ante Eslovaquia asegura pase de Portugal a la Eurocopa de Alemania 2024

Luis Alberto Suárez Díaz

Perla mundialista: la mordida de Suárez a Chiellini

Eden Hazard

Cctavos de final del mundial de 2018

Gareth Frank Bale

Partido final del playoff de clasificación de la Copa Mundial de la FIFA 2022 entre Gales y Ucrania

Sergio Leonel Agüero del Castillo

Sergio Agüero, festeja su gol ante Costa Rica en la Copa América

Harry Kane

El primer gol en el Mundial de Qatar 2022

Antoine Griezmann

Máximo asistente de Francia.

Robert Lewandowski

Mundial 2022 — La emoción de Robert Lewandowski

Mohamed Salah Ghaly

Después de analizar detenidamente las estadísticas de los 10 mejores jugadores, queda claro que se encuentran en la cúspide del fútbol mundial. Estos jugadores representan una combinación excepcional de habilidades técnicas, físicas y mentales que los destacan entre sus pares. Sus valores de mercado y salarios reflejan su valía en el campo y su impacto en el juego.

Observando las métricas clave, como la calificación general, el potencial, la reputación internacional y las habilidades específicas como el regate, los remates y el marcaje, podemos apreciar la excelencia que estos jugadores poseen en diversas facetas del juego. Sus capacidades están muy por encima del promedio, lo que los convierte en verdaderos referentes en sus posiciones.

Es evidente que acceder a este tipo de información detallada proporciona una ventaja estratégica significativa. Tanto para los jugadores como para los equipos, comprender estas métricas es fundamental para planificar entrenamientos, tácticas y estrategias personalizadas. La conciencia de sus fortalezas y debilidades les permite mejorar constantemente y adaptarse a los desafíos que se presentan en el campo.

En resumen, estos jugadores no solo representan el pináculo del éxito en el fútbol, sino que también demuestran la importancia de la preparación, el análisis de datos y la constante búsqueda de la excelencia en el deporte.

Es crucial recordar que estos resultados, aunque reveladores, no representan la verdad absoluta. Como he mencionado previamente, existen otras métricas y perspectivas contables que podrían, con certeza, arrojar conclusiones diferentes. Sin embargo, afirmo con confianza que estos resultados no son arbitrarios ni ajenos a la realidad.

Al finalizar este primer análisis de la serie ‘Explorando el campo de las estrellas’, queda claro que el fútbol es un vasto universo de talento y habilidad, donde la grandeza de un jugador no puede medirse únicamente por estadísticas numéricas. Si bien estos datos revelan aspectos importantes del desempeño de los delanteros, también es cierto que hay un componente intangible en el juego que escapa a cualquier métrica.

En nuestro recorrido por el terreno de los delanteros, hemos vislumbrado solo una fracción de la complejidad y la magia que encierra este deporte. Cada jugador es un universo en sí mismo, con sus propias virtudes y desafíos, y cada posición en el campo aguarda sus propios secretos por descubrir.

Si al revisar los resultados no encontraste a tu delantero favorito, aquel que consideras merecedor de estar entre los diez mejores, te comprendo perfectamente; mi desilusión es compartida.

A medida que concluimos esta primera parte, es importante destacar que en mi próximo análisis, nos enfocaremos en examinar a los extremos, continuando así nuestra exploración de las habilidades y el desempeño de los jugadores en diversas posiciones del campo.

Si deseas un gráfico de radar adicional de tu delantero favorito, no dudes en solicitarlo en los comentarios, o también puedes escribirme en mi perfil de LinkedIn. Los añadiré con gratitud.

Además, si deseas explorar el código con mayor detalle, te invito a visitar mi repositorio en GitHub. Allí encontrarás todo el código completo, con el que podrás experimentar y profundizar aún más.

A medida que continuamos este camino, recordemos que detrás de cada número, cada jugada, y cada nombre en la lista de los ‘mejores’, hay historias de pasión, esfuerzo y sacrificio. Porque al final del día, el fútbol no se trata solo de victorias y derrotas, sino de los sueños que inspira, las emociones que despierta, y el vínculo humano que trasciende fronteras y culturas.

Desde mi perspectiva personal, sostengo que no existe un jugador superior al resto. Cada uno depende del otro, formando parte de una constelación interconectada. Es precisamente esta interdependencia la que da título a esta serie en la que estudiamos a través de los datos, el deporte más hermoso del mundo.

Así que sigamos explorando juntos este vasto campo de las estrellas, donde cada paso nos acerca un poco más a comprender la belleza y el misterio de este deporte que nos une a todos.

--

--

Jorge Luis
Jorge Luis

Written by Jorge Luis

Data Engineer | Python Developer | Data Science | Big Data | Machine Learning | BI & Analytics Consultant | Maintenance Engineer | Industrial Diver |