Análisis Exploratorio de los jugadores de FIFA 20. Parte II

Bienvenidos de nuevo a la continuación del análisis exploratorio (EDA) que estamos llevando a cabo con los datos del juego FIFA 20.

¿ Qué hicimos en la última entrada ?

Para el que no quiera leerse la primera entrada sobre este análisis exploratorio, lo que hicimos fue una auto-correlación de todas las variables numéricas del dataset con una visualización bastante potente (de la mano de Networkx + Bokeh) y vimos una segmentación por posiciones de jugadores de las 8 naciones más representadas en el juego.

Análisis de todas las nacionalidades del juego

Ya que en el anterior post empezamos a analizar las nacionalidades, se me ha ocurrido que podemos continuar analizándolas mediante una visualización muy potente con la ayuda de la librería Folium.

Lo que vamos a hacer, es representar en un mapa todas las nacionalidades mediante un círculo. El tamaño del círculo representará la cantidad de jugadores que son de tal país.

Sacamos las coordenadas de los países

Para poder colocar bien los círculos en el mapa, es necesario sacar las coordenadas de cada país, así que vamos a buscar con Google un dataset que contenga las coordenadas de todos los países que necesitamos. Yo encontré este dataset en Kaggle, pero hay un montón de repositorios de donde sacarlo.

paises = pd.read_csv('/content/datasets_552239_1006003_world_country_and_usa_states_latitude_and_longitude_values.csv')
paises.head()
paises = paises.iloc[:,:4]

Como vemos, el dataset tiene 8 columnas, de las cuales solo nos sirven 4. Que las otras son estados de Estados Unidos, que no nos sirve para nada en este problema, así que las dropeamos con el comando ‘iloc‘.
Lo que hacemos en el siguiente paso es sacar la distribución de nacionalidades, que ya lo conseguimos en la entrada anterior:

nacionalidades = jugadores.nationality.value_counts()
nacionalidades.sort_values(ascending=False, inplace=True)
# Creamos DF base para la visualizacion
df = pd.DataFrame()
df['country'] = list(nacionalidades.index)
df['Cantidad'] = list(nacionalidades.values)

Ya tenemos por un lado el DataFrame con las coordenadas de los países, y por otro lado la cantidad de jugadores de cada país, así que lo que nos queda por hacer es unir ambos datos. Para ello utilizamos un left join, ya que solo queremos tener las coordenadas de los países que tenemos en el juego. Añadir coordenadas de países con 0 jugadores simplemente es usar espacio para nada.

df_coord= pd.merge(df, paises, how='left', on='country')
df_coord[df_coord.isnull().any(axis=1)].head()

Primeros problemas que encontramos en este join:

  • Los países que pertenecen a Reino Unido en el FIFA aparecen individualmente, y en el DataFrame de coordenadas aparece solo Reino Unido.
  • Los países que no hacen ‘match‘ al 100% no conseguimos hacer join bien.

Para estos problemas pues, decidimos implantar las siguientes soluciones:

  • Sustituimos los países de Reino Unido por ‘United Kingdom’ en el dataset del juego.
  • Hacemos el join mediante la distancia de Levenshtein, para hallar el país que más se parece. Para ello, utilizamos la librería FuzzyWuzzy

Las librerias de fuzzywuzzy y de distancia Levenshtein no están en Google Colab, así que las tendremos que instalar antes de importarlas:

!pip install fuzzywuzzy python-Levenshtein
from fuzzywuzzy import fuzz
df_coord = df.copy()
col_anadir = ['country_code', 'latitude', 'longitude']
for col in col_anadir:
  df_coord[col] = '' 
for i, fila in df.iterrows():
    nacion = fila.country
    best_match = ''
    best_ratio = 0
    for pais in paises['country']:
        try:
            ratio = fuzz.partial_ratio(nacion, pais)
            # Si mejora el ratio, nos quedamos con este pais
            if ratio > best_ratio:
                best_ratio = ratio
                best_match = pais
        except TypeError:
            pass  
    match = paises.loc[paises['country'] == best_match,
                       ['country_code', 'latitude', 'longitude']]
    # Sustituimos el datafram de coordenadas con el pais que más
    # se parece a la nacion de los datos del Fifa
    df_coord.loc[df_coord['country'] == nacion,
                 ['country_code', 'latitude', 'longitude']] = match.values

Inicializamos el gráfico y lo populamos:

# Inicializamos el grafico
m = folium.Map(location=[20, 0], zoom_start=2)
# Añadimos los marcadores uno a uno
for i in range(0,len(df_coord)):
    lon = df_coord.iloc[i]['longitude']
    lat = df_coord.iloc[i]['latitude']
    popular = 'Country:' + str(df_coord.iloc[i]['country']) + \
        '\nTotal:' + str(df_coord.iloc[i]['Cantidad'])
    folium.Circle(
        location=[lat, lon],
        popup=popular,
        radius=float(df_coord.iloc[i]['Cantidad'])*100,
        color='crimson',
        fill=True,
        fill_color='crimson'
    ).add_to(m)
  
  # Lo guardamos como html
m.save('mapa Folium.html')
Animated GIF - Find & Share on GIPHY

Conclusión

Con este post sobre el análisis exploratorio hemos aprendido como hacer left joins con pandas, cómo conseguir matchear strings aunque no sean 100% iguales mediante la distancia Levenshtein con la ayuda de la librería FuzzyWuzzy, y cómo hacer una visualización potente en mapas necesitando sólo las coordenadas de lo que queremos representar. Hasta la siguiente entrada!