Learn data science and machine learning by building real-world projects on Jovian
In [ ]:
!pip install "notebook>=5.3" "ipywidgets>=7.2"

Análisis de los jugadores de la LIGA PRO 2020

Vamos a analizar a los jugadores de los equipos del a LIGAPRO de Ecuador del año 2020.

La Liga Pro es el campeonato oficial de fútbol, y el primer año que es manejada por una institución diferente a la Fedeación Ecuatoriana de Fútbol.

Los datos son proporcionados por DATAFACTORY a través de un contrato.

El dataset fue trabajado previamente para llevarlo de XML original a CSV

In [63]:
project_name = "zerotopandas-project" # change this
In [9]:
!pip install jovian --upgrade -q
In [10]:
import jovian
In [251]:
jovian.commit(project=project_name)
[jovian] Detected Colab notebook... [jovian] Uploading colab notebook to Jovian... [jovian] Committed successfully! https://jovian.ml/restevesd/zerotopandas-project
In [9]:
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive

Data Preparation and Cleaning

In [252]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
In [14]:
df = pd.read_csv("/content/drive/My Drive/Jovian/ligapro2020.csv",sep=";")
In [15]:
df.head()
Out[15]:
In [13]:
df.columns
Out[13]:
Index(['nacimientojugador', 'edadjugador', 'pesojugador', 'alturajugador',
       'roljugador', 'paisjugador', 'idJugador', 'jugadoresequipo', 'idequipo',
       'nombreequipo'],
      dtype='object')
In [24]:
df.dtypes
Out[24]:
pesojugador        float64
alturajugador      float64
roljugador          object
paisjugador         object
idJugador           object
jugadoresequipo      int64
idequipo            object
nombreequipo        object
dtype: object
In [16]:
#elimino columna fecha porque ya tengo la edad de los jugadores
df = df.drop("nacimientojugador",axis=1)
In [17]:
#elimino columna porque tiene datos que sirven para el análisis
df = df.drop("edadjugador",axis = 1)
In [18]:
#Cambio el tipo de dato ID a caracter
df["idJugador"] = df["idJugador"].astype("str")
df["idequipo"] = df["idequipo"].astype("str")
In [19]:
df.isnull().sum()
Out[19]:
pesojugador        112
alturajugador      105
roljugador           0
paisjugador          0
idJugador            0
jugadoresequipo      0
idequipo             0
nombreequipo         0
dtype: int64
In [20]:
#saco la media de la altura y del peso
med = df.groupby('nombreequipo')['pesojugador'].transform('median') 
med_alt = df.groupby('nombreequipo')['alturajugador'].transform('median') 
In [21]:
#reemplazo en los valores nulos o NA
df["pesojugador"] = df['pesojugador'].fillna(med) 
df["alturajugador"] = df["alturajugador"].fillna(med_alt)
In [ ]:
import jovian
In [253]:
jovian.commit(project=project_name)
[jovian] Detected Colab notebook... [jovian] Uploading colab notebook to Jovian... [jovian] Committed successfully! https://jovian.ml/restevesd/zerotopandas-project

Exploratory Analysis and Visualization

In [84]:
#cuantos jugadores hay registrado por cada equipo
df.groupby('nombreequipo')["idequipo"].count().sort_values()
Out[84]:
nombreequipo
MushucRuna               28
Delf?n                   29
Emelec                   30
LigadeQuito              30
Macar?                   30
U.Cat?lica(E)            30
ElNacional               31
T?cnicoUniversitario     31
GuayaquilCity            32
IndependientedelValle    32
Barcelona                34
Aucas                    35
LigadePortoviejo         35
Orense                   35
Olmedo                   36
DeportivoCuenca          38
Name: idequipo, dtype: int64
In [24]:
# Gráfico de barras jugadores inscritos por equipo
plot = df['nombreequipo'].value_counts().plot(kind='bar',title='Jugadores por equipo')
Notebook Image
In [115]:
#Gráfico de correlaciones entre la altura de los jugadores y el peso
sns.pairplot(
    df,
    hue ="roljugador",
    x_vars=["pesojugador", "alturajugador"],
    y_vars=["pesojugador", "alturajugador"],
)
plt.show()
Notebook Image
In [123]:
#Saco a los técnicos y los arqueros
df_jugadores = df[df['roljugador'] != 'DT']
df_jugadores = df_jugadores[df_jugadores['roljugador'] != 'Arquero']

#Elimino el registro aparentemente oulier
df_jugadores = df_jugadores[df_jugadores['pesojugador'] < 160]
In [124]:
#Gráfico de correlaciones entre la altura de los jugadores y el peso con el 
#dataset nuevo donde se elimina el rol DT y Arquero
#Se elimina tambié un outlier en el peso

sns.pairplot(
    df_jugadores,
    hue ="roljugador",
    x_vars=["pesojugador", "alturajugador"],
    y_vars=["pesojugador", "alturajugador"],
)
plt.show()
Notebook Image
In [126]:
# Mejor graficada la relación entre peso y altura x rol del jugadpr
sns.relplot(x="pesojugador", y="alturajugador", hue="roljugador",
            height=7, data=df_jugadores)
Out[126]:
<seaborn.axisgrid.FacetGrid at 0x7efc21c06470>
Notebook Image

Vamos a analizar el peso de los jugadores

In [113]:
fig, ax = plt.subplots(figsize = (15, 5))
sns.distplot(df_jugadores["pesojugador"],kde=False, bins=10)
Out[113]:
<matplotlib.axes._subplots.AxesSubplot at 0x7efc1fa2fdd8>
Notebook Image
In [191]:
fig, ax = plt.subplots(figsize = (15, 5))
#Hago un boxplot del peso de los jugadores por equipo
ax = sns.boxplot(y="pesojugador", x="nombreequipo" ,
                 data=df_jugadores, palette="Set3")

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
Out[191]:
[Text(0, 0, 'Aucas'),
 Text(0, 0, 'Barcelona'),
 Text(0, 0, 'Delf?n'),
 Text(0, 0, 'DeportivoCuenca'),
 Text(0, 0, 'ElNacional'),
 Text(0, 0, 'Emelec'),
 Text(0, 0, 'GuayaquilCity'),
 Text(0, 0, 'IndependientedelValle'),
 Text(0, 0, 'LigadePortoviejo'),
 Text(0, 0, 'LigadeQuito'),
 Text(0, 0, 'Macar?'),
 Text(0, 0, 'MushucRuna'),
 Text(0, 0, 'Olmedo'),
 Text(0, 0, 'Orense'),
 Text(0, 0, 'T?cnicoUniversitario'),
 Text(0, 0, 'U.Cat?lica(E)')]
Notebook Image
In [197]:
fig, ax = plt.subplots(figsize = (15, 5))
#Hago un boxplot del peso de los jugadores por equipo
ax = sns.boxplot(y="pesojugador", x="roljugador" ,
                 data=df_jugadores, palette="Set3")
Notebook Image
In [42]:
import jovian
In [232]:
jovian.commit(project= project_name)
[jovian] Detected Colab notebook... [jovian] Uploading colab notebook to Jovian... [jovian] Committed successfully! https://jovian.ml/restevesd/zerotopandas-project

Vamos a analizar la altura de los jugadores

In [107]:
fig, ax = plt.subplots(figsize = (15, 5))
sns.distplot(df_jugadores['alturajugador'], kde=False, bins=10)
Out[107]:
<matplotlib.axes._subplots.AxesSubplot at 0x7efc1f12dc50>
Notebook Image
In [192]:
fig, ax = plt.subplots(figsize = (15, 5))

#Hago un boxplot de la altura de los jugadores por equipo
ax = sns.boxplot(y="alturajugador", x="nombreequipo" ,
                 data=df_jugadores, palette="Set3")

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
Out[192]:
[Text(0, 0, 'Aucas'),
 Text(0, 0, 'Barcelona'),
 Text(0, 0, 'Delf?n'),
 Text(0, 0, 'DeportivoCuenca'),
 Text(0, 0, 'ElNacional'),
 Text(0, 0, 'Emelec'),
 Text(0, 0, 'GuayaquilCity'),
 Text(0, 0, 'IndependientedelValle'),
 Text(0, 0, 'LigadePortoviejo'),
 Text(0, 0, 'LigadeQuito'),
 Text(0, 0, 'Macar?'),
 Text(0, 0, 'MushucRuna'),
 Text(0, 0, 'Olmedo'),
 Text(0, 0, 'Orense'),
 Text(0, 0, 'T?cnicoUniversitario'),
 Text(0, 0, 'U.Cat?lica(E)')]
Notebook Image
In [199]:
fig, ax = plt.subplots(figsize = (15, 5))
#Hago un boxplot del peso de los jugadores rol
ax = sns.boxplot(y="alturajugador", x="roljugador" ,
                 data=df_jugadores, palette="Set3")
Notebook Image

Asking and Answering Questions

¿ Qué equipo empezó con más jugadores en su plantilla ?

El Deportivo Cuenca con 38 jugadores inscritos

¿ Qué equipo tiene la menor cantidad de jugadores en su plantilla ?

El equipo Mushuc Runa es el equipo que menos jugadores tiene inscritos, 28

¿ Cuál es el peso y altura promedios de los jugadores de la LIGA PRO ?

In [230]:
prom_peso = round(df_jugadores[["pesojugador","alturajugador"]].mean()[0],2)
prom_altura = round(df_jugadores[["pesojugador","alturajugador"]].mean()[1],2)
print ("El peso promedio de los jugadores de la Liga Pro 2020 es " + prom_peso.astype(str))
print ("La altura promedio de los jugadores de la Liga Pro 2020 es " + prom_altura.astype(str))
El peso promedio de los jugadores de la Liga Pro 2020 es 72.69 La altura promedio de los jugadores de la Liga Pro 2020 es 177.43

¿ Cuál es el promedio de la altura y peso en cada posición ?

In [185]:
df_jugadores.groupby("roljugador")[["pesojugador","alturajugador"]].mean()
Out[185]:

Nos damos cuenta que la estatura y peso de los delanteros y defensas son similares, los volantes tienen a ser más bajos y con menos peso

¿ Cuál es el promedio de la altura y peso por equipo ?

In [211]:
df_data = df_jugadores.groupby("nombreequipo")[["pesojugador","alturajugador"]].mean()
df_data
Out[211]:

¿ Cuál es el equipo que tiene los jugadores más altos ?

In [246]:
#Filtro todos los jugadores que su altura sea superior al promedio
mas_altos = df_jugadores[df_jugadores["alturajugador"]>prom_altura]
mas_altos["nombreequipo"].value_counts()
Out[246]:
Orense                   26
Emelec                   21
LigadePortoviejo         21
T?cnicoUniversitario     20
Barcelona                18
ElNacional               18
U.Cat?lica(E)            16
Olmedo                   16
Aucas                    15
IndependientedelValle    15
Delf?n                   15
MushucRuna               15
Macar?                   13
LigadeQuito              12
DeportivoCuenca           5
GuayaquilCity             5
Name: nombreequipo, dtype: int64

¿ Cuál es el equipo que tiene los jugadores más pesados ?

In [247]:
#Filtro todos los jugadores que su peso sea superior al promedio
mas_peso = df_jugadores[df_jugadores["pesojugador"]>prom_peso]
mas_peso["nombreequipo"].value_counts()
Out[247]:
Orense                   26
GuayaquilCity            21
ElNacional               20
IndependientedelValle    18
Barcelona                16
LigadePortoviejo         16
Aucas                    14
Emelec                   13
LigadeQuito              13
MushucRuna               12
U.Cat?lica(E)            11
Delf?n                   11
Olmedo                   10
Macar?                    6
DeportivoCuenca           5
T?cnicoUniversitario      4
Name: nombreequipo, dtype: int64

Inferences and Conclusion

Utilizando la data demográfica de los jugadores podemos tomar decisiones de como contratar jugadores, o que alineación usar contra los otros equipos, al saber si nos toca jugar con un equipo de jugadores más altos o más pesados, la cantidad de goles que hacen en todas sus lineas, si los que hacen los goles son los más pesados o los más altos y a partir de esa información tomar las decisiones como técnico.

In [250]:
jovian.commit(project=project_name)
[jovian] Detected Colab notebook... [jovian] Uploading colab notebook to Jovian... [jovian] Committed successfully! https://jovian.ml/restevesd/zerotopandas-project

References and Future Work

Se usó como referencia las páginas oficiales de PANAS, SEABORN, DATA FACTORY

En un trabajo futuro se analizará la edad, la cantidad de goles de cada jugador, las tarjetas, las faltas y más características.

También se trabajará en un modelo de Arboles de Decisión para enteder cuales son las características deben tener los jugadores por cada puesto para maximizar los goles

In [ ]:
import jovian
In [249]:
jovian.commit(project=project_name)
[jovian] Detected Colab notebook... [jovian] Uploading colab notebook to Jovian... [jovian] Committed successfully! https://jovian.ml/restevesd/zerotopandas-project