Trama de viol铆n de Seaborn – Tutorial y ejemplos

    Introducci贸n

    Seaborn es una de las bibliotecas de visualizaci贸n de datos m谩s utilizadas en Python, como una extensi贸n de Matplotlib. Ofrece una API simple, intuitiva pero altamente personalizable para la visualizaci贸n de datos.

    En este tutorial, veremos c贸mo trazar una trama de viol铆n en Seaborn.

    Los gr谩ficos de viol铆n se utilizan para visualizar distribuciones de datos, mostrando el rango, la mediana y la distribuci贸n de los datos.

    Los diagramas de viol铆n muestran las mismas estad铆sticas de resumen que los diagramas de caja, pero tambi茅n incluyen estimaciones de densidad de granos que representan la forma / distribuci贸n de los datos.

    Importaci贸n de datos

    Para empezar, querremos elegir un conjunto de datos que sea adecuado para la creaci贸n de tramas de viol铆n.

    El conjunto de datos debe tener caracter铆sticas num茅ricas continuas. Esto se debe a que los gr谩ficos de viol铆n se utilizan para visualizar distribuciones de datos continuos. Muestran el rango, la mediana y la distribuci贸n de los datos.

    Los gr谩ficos de viol铆n muestran esencialmente las mismas estad铆sticas de resumen que los gr谩ficos de caja, pero tambi茅n incluyen informaci贸n adicional. La forma del “viol铆n” en un diagrama de viol铆n es una estimaci贸n de densidad de kernel que representa la forma / distribuci贸n de los datos.

    Para este tutorial, trabajaremos con el Gapminder conjunto de datos.

    Comenzaremos importando Seaborn, el m贸dulo PyPlot de Matplotlib y Pandas:

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    

    Luego, necesitaremos importar los datos. Imprimiremos el encabezado del conjunto de datos para asegurarnos de que los datos se hayan cargado correctamente y para ver los nombres de las columnas / caracter铆sticas.

    Tambi茅n verificaremos para asegurarnos de que no falten datos:

    dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
    print(dataframe.head())
    print(dataframe.isnull().values.any())
    

    Esto resulta en:

           country  year  population continent  life_exp     gdp_cap
    0  Afghanistan  1952     8425333      Asia    28.801  779.445314
    1  Afghanistan  1957     9240934      Asia    30.332  820.853030
    2  Afghanistan  1962    10267083      Asia    31.997  853.100710
    3  Afghanistan  1967    11537966      Asia    34.020  836.197138
    4  Afghanistan  1972    13079460      Asia    36.088  739.981106
    

    Seleccionaremos nuestras funciones continuas y las guardaremos como variables para pasar a las funciones de Seaborn:

    country = dataframe.country
    continent = dataframe.continent
    population = dataframe.population
    life_exp = dataframe.life_exp
    gdp_cap = dataframe.gdp_cap
    

    Trazar una trama de viol铆n simple en Seaborn

    Ahora que hemos cargado los datos y seleccionado nuestras caracter铆sticas preferidas, podemos crear la trama del viol铆n.

    Para crear una trama de viol铆n, solo usamos el violinplot() funci贸n en Seaborn.

    Pasamos el marco de datos as铆 como las variables que queremos visualizar. Podemos pasar solo la variable X y la funci贸n calcular谩 autom谩ticamente los valores en el eje Y:

    sns.violinplot(x=life_exp)
    
    plt.show()
    

    Alternativamente, no necesita extraer las caracter铆sticas de antemano. Suministrando el data argumento, y asign谩ndolo a nuestro DataFrame, puede simplemente hacer referencia al nombre de la variable, que luego se hace coincidir con el conjunto de datos:

    sns.violinplot(x="life_exp", data = dataframe)
    

    Esto produce exactamente el mismo resultado.

    Tenga en cuenta: En esta imagen, Seaborn est谩 trazando la distribuci贸n de la esperanza de vida en todos los pa铆ses, ya que solo hemos proporcionado el life_exp variable. La mayor铆a de las veces, tambi茅n querremos separar una variable como esta en funci贸n de otra variable, como country o continent.

    Trazado de una gr谩fica de viol铆n con variables X e Y

    Aqu铆 pasaremos una variable X categ贸rica y una variable Y continua, ya que hay una distribuci贸n espec铆fica que nos gustar铆a ver segmentada por tipo.

    En este conjunto de datos, tenemos muchos pa铆ses. Si los graficamos todos, habr谩 demasiados para verlos pr谩cticamente y la figura estar谩 demasiado abarrotada. Podr铆amos crear un subconjunto del conjunto de datos y simplemente trazar, digamos, 10 pa铆ses.

    En cambio, tambi茅n podr铆amos trazar por continente.

    sns.violinplot(x=continent, y=life_exp, data=dataframe)
    

    Personalizaci贸n de la trama

    Podemos personalizar la trama de nuestro viol铆n de diferentes maneras.

    Cambiar las etiquetas de la trama de viol铆n con Seaborn

    Digamos que nos gustar铆a agregar algunos t铆tulos y etiquetas a nuestro gr谩fico para ayudar a otros a interpretar los datos. Aunque Seaborn etiquetar谩 autom谩ticamente los ejes X e Y, es posible que deseemos cambiar las etiquetas.

    Esto se puede hacer con el set_title() y set_label() funciones despu茅s de crear un objeto de ejes. Simplemente pasamos el t铆tulo que queremos darle a nuestra trama al set_title() funci贸n.

    Para etiquetar los ejes, usamos el set() funci贸n y proporcionar etiquetas a la xlabel y ylabel argumentos, o use el contenedor set_xlabel()/set_ylabel() funciones:

    ax = sns.violinplot(x=continent, y=life_exp)
    ax.set_title("Life Expectancy By Country")
    ax.set_ylabel("Gapminder Life Expectancy")
    ax.set_xlabel("Nations")
    
    plt.show()
    

    Cambiar el color de la trama del viol铆n con Seaborn

    Una forma de personalizar el gr谩fico es asignarle colores espec铆ficos. Podemos crear una lista de colores preseleccionados y pasarlos al palette par谩metro:

    colors_list = ['#78C850', '#F08030',  '#6890F0',  '#A8B820',  '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']
    
    ax = sns.violinplot(x=continent, y=life_exp, palette=colors_list)
    ax.set_title("Life Expectancy By Country")
    ax.set_ylabel("Gapminder Life Expectancy")
    ax.set_xlabel("Nations")
    
    plt.show()
    

    Superposici贸n de Swarmplot sobre trama de viol铆n en Seaborn

    Incluso podr铆amos superponer un Swarmplot en el Violin Plot para ver la distribuci贸n y las muestras de los puntos que componen esa distribuci贸n. Para hacer esto, simplemente creamos un objeto de figura 煤nica y luego creamos dos gr谩ficos diferentes:

    colors_list = ['#78C850', '#F08030',  '#6890F0',  '#A8B820',  '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']
    
    plt.figure(figsize=(10,6))
    sns.violinplot(x=continent, y=life_exp,palette=colors_list)
    sns.swarmplot(x=continent, y=life_exp, color="k", alpha=0.8)
    plt.title("Life Expectancy By Country")
    plt.ylabel("Gapminder Life Expectancy")
    plt.xlabel("Nations")
    
    plt.show()
    

    Cambiar el estilo de la trama del viol铆n con Seaborn

    Podemos cambiar f谩cilmente el estilo y la paleta de colores de nuestra trama usando el set_style() y set_palette() funciones respectivamente.

    Seaborn admite varias opciones diferentes para cambiar el estilo y paleta de la figura:

    plt.figure(figsize=(10,6))
    sns.set_palette("RdBu")
    sns.set_style("darkgrid")
    sns.violinplot(x=continent, y=life_exp, data=dataframe)
    sns.swarmplot(x=continent, y=life_exp, data=dataframe, color="k", alpha=0.8)
    plt.title("Life Expectancy By Country")
    plt.ylabel("Gapminder Life Expectancy")
    plt.xlabel("Nations")
    
    plt.show()
    

    Subparcelas de viol铆n con Seaborn

    Finalmente, si quisi茅ramos dividir las columnas en sus propias subtramas, podr铆amos hacerlo creando una figura y luego usando el add_gridspec() funci贸n para crear una cuadr铆cula donde podamos colocar nuestra subtrama.

    Luego solo usamos el add_subplot() funci贸n y especificar en qu茅 lugar de la cuadr铆cula queremos colocar la subparcela actual, creando la gr谩fica como lo har铆amos normalmente, usando el objeto ejes.

    Aqu铆, podemos configurar y=variable, o usar data=variable.

    fig = plt.figure(figsize=(6, 6))
    gs = fig.add_gridspec(1, 3)
    
    ax = fig.add_subplot(gs[0, 0])
    
    sns.violinplot(data=population)
    ax.set_xlabel("Population")
    
    ax = fig.add_subplot(gs[0, 1])
    sns.violinplot(data=life_exp)
    ax.set_xlabel("Life Exp.")
    
    ax = fig.add_subplot(gs[0, 2])
    sns.violinplot(data=gdp_cap)
    ax.set_xlabel("GDP Capacity")
    
    fig.tight_layout()
    plt.show()
    

    Agrupaci贸n de parcelas de viol铆n por tono

    Una cosa realmente 煤til que se puede hacer con Violin Plots es agrupar por matiz. Si tiene un valor categ贸rico, tiene dos valores (normalmente, un true/false-variable de estilo), puede agrupar las parcelas por matiz.

    Por ejemplo, podr铆a tener un conjunto de datos de personas y un employment columna, con employed y unemployed como valores. A continuaci贸n, puede agrupar parcelas de viol铆n por “matiz”, estos dos tipos de empleo.

    Dado que el conjunto de datos de Gapminder no tiene una columna como esta, podemos hacer una nosotros mismos. Calculemos la esperanza de vida media de un subconjunto de pa铆ses. Digamos, calculamos la esperanza de vida media de los pa铆ses europeos.

    Entonces, podemos asignar un Yes/No valor a una nueva columna – above_average_life_exp para cada pa铆s. Si la esperanza de vida media es superior a la media del continente, este valor es Yes, y viceversa:

    # Separate European countries from the original dataset
    europe = dataframe.loc[dataframe["continent"] == "Europe"]
    
    # Calculate mean of the `life_exp` variable
    avg_life_exp = dataframe["life_exp"].mean()
    
    # Declare an empty list
    above_average_life_exp = []
    
    # Iterate through the rows in the dataset, assigning Yes/No
    # Depending on the value of the variable in the iterated row
    for index, row in europe.iterrows():
    	if row["life_exp"] > avg_life_exp:
    		above_average_life_exp.append("Yes")
    	else:
    		above_average_life_exp.append("No")
    
    # Add new column to dataset
    europe["above_average_life_exp"] = above_average_life_exp
    

    Ahora, si imprimimos nuestro conjunto de datos, tenemos algo como:

                 country  year  population continent  life_exp       gdp_cap avle
    12           Albania  1952     1282697    Europe    55.230   1601.056136  No
    13           Albania  1957     1476505    Europe    59.280   1942.284244  No
    14           Albania  1962     1728137    Europe    64.820   2312.888958  Yes
    15           Albania  1967     1984060    Europe    66.220   2760.196931  Yes
    16           Albania  1972     2263554    Europe    67.690   3313.422188  Yes
    ...              ...   ...         ...       ...       ...           ...  ...
    1603  United Kingdom  1987    56981620    Europe    75.007  21664.787670  Yes
    1604  United Kingdom  1992    57866349    Europe    76.420  22705.092540  Yes
    1605  United Kingdom  1997    58808266    Europe    77.218  26074.531360  Yes
    1606  United Kingdom  2002    59912431    Europe    78.471  29478.999190  Yes
    1607  United Kingdom  2007    60776238    Europe    79.425  33203.261280  Yes
    

    El nombre de la variable se trunca a avle en aras de la brevedad.

    Ahora, seleccionemos un subconjunto m谩s peque帽o de estos pa铆ses usando europe.head() y trazar diagramas de viol铆n agrupados por la nueva columna que hemos insertado:

    europe = europe.tail(50)
    
    ax = sns.violinplot(x=europe.country, y=europe.life_exp, hue=europe.above_average_life_exp)
    ax.set_title("Life Expectancy By Country")
    ax.set_ylabel("Gapminder Life Expectancy")
    ax.set_xlabel("Nations")
    
    plt.show()
    

    Esto ahora resulta en:

    Ahora, los pa铆ses con una esperanza de vida inferior a la media est谩n coloreados de naranja, mientras que los dem谩s pa铆ses est谩n coloreados de azul. Sin embargo, incluso esto no nos dice todo. Quiz谩s nos gustar铆a comprobar cu谩ntas personas en Turqu铆a tienen una esperanza de vida inferior a la media.

    Aqu铆 es donde entra en juego la divisi贸n.

    Divisi贸n de parcelas de viol铆n por tono

    Seaborn Violin Plots te deja pasar en el split argumento, que se puede establecer en True o False.

    Si lo configura en Truey un hue argumento est谩 presente, dividir谩 los violines entre los hue valores.

    En nuestro caso, un lado del viol铆n representar谩 el lado izquierdo del viol铆n como entradas con una esperanza de vida superior al promedio, mientras que el lado derecho se utilizar谩 para trazar las expectativas de vida inferiores al promedio:

    Conclusi贸n

    En este tutorial, hemos repasado varias formas de trazar una trama de viol铆n usando Seaborn y Python. Tambi茅n cubrimos c贸mo personalizar y cambiar las etiquetas y el color, as铆 como superponer Swarmplots, crear subtramas de m煤ltiples gr谩ficos de viol铆n y, finalmente, c贸mo agrupar los gr谩ficos por tono y crear gr谩ficos de viol铆n divididos en funci贸n de una variable.

     

    Data Visualization in Python, un libro para desarrolladores de Python principiantes e intermedios, lo guiar谩 a trav茅s de la manipulaci贸n simple de datos con Pandas, cubrir谩 bibliotecas de trazado centrales como Matplotlib y Seaborn, y le mostrar谩 c贸mo aprovechar las bibliotecas declarativas y experimentales como Altair.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *