Visualizacion Estadistica con Seaborn

SEABORN: Libreria de visualizaci贸n de datos estad铆sticos de Python

Seaborn complementa a Matplotlib y se dirige espec铆ficamente a la visualizaci贸n de datos estad铆sticos, funciona muy bien con pandas.

Instalacion Seaborn

Anaconda instala automaticamente Seaborn, en caso de no tenerlo instalarlo con el siguiente comando:

conda install seaborn o pip install seaborn.

Importar seaborn

Se importa de forma estandar de la siguiente manera:

import seaborn as sns
#para graficar dentro del jupyter notebook
%matplotlib inline 

Datos integrados en seaborn

Seaborn viene con algunos data sets integrados, la lista competa se puede encontrar en: https://github.com/mwaskom/seaborn-data

tips = sns.load_dataset('tips') # Importar el dataset tips
type(tips)
pandas.core.frame.DataFrame
tips.head() # ver los primeros 5 registros
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
tips.dtypes #tipos de datos en el dataframe
total_bill     float64
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
dtype: object
tips.describe() #Resumen estadistico de los datos del data frame por columna
total_bill tip size
count 244.000000 244.000000 244.000000
mean 19.785943 2.998279 2.569672
std 8.902412 1.383638 0.951100
min 3.070000 1.000000 1.000000
25% 13.347500 2.000000 2.000000
50% 17.795000 2.900000 2.000000
75% 24.127500 3.562500 3.000000
max 50.810000 10.000000 6.000000

Plots de Distribucion en Seaborn

distplot

El distplot muestra la distribuci贸n de un conjunto univariante de observaciones.

sns.distplot(tips['total_bill']);

png

Si se quiere eliminar la grafica kde y solo tener el histograma entonces:

sns.distplot(tips['total_bill'],kde=False,bins=30);

png

jointplot

jointplot() le permite b谩sicamente emparejar dos distplots para datos bivariados. Con su elecci贸n de que par谩metro kind va comparar:

  • 鈥渟catter鈥
  • 鈥渞eg鈥
  • 鈥渞esid鈥
  • 鈥渒de鈥
  • 鈥渉ex鈥
# Histogramas y scatter plot
sns.jointplot(x='total_bill',y='tip',data=tips,kind='scatter');

png

# Histogramas  y hexagonal
sns.jointplot(x='total_bill',y='tip',data=tips,kind='hex');

png

#Hystogramas con kde y scatter plot
sns.jointplot(x='total_bill',y='tip',data=tips,kind='reg');

png

pairplot

pairplot grafica relaciones por pares en un dataframe completo (para las columnas num茅ricas) y soporta un argumento de tono de color(Hue) (para columnas categ贸ricas).

#diagonal histogramas los demas son scatter plots
sns.pairplot(tips); # datos numericos

png

# Datos categoricos

# Diagonal KDE y los otros plots son scatter
sns.pairplot(tips,hue='sex',palette='coolwarm'); # cambio de colormap

png

kdeplot

kdeplots son Gr谩ficos de Estimaci贸n de Densidad del N煤cleo.

# Variable 'total bill'
sns.kdeplot(tips['total_bill']) #plot kde
<matplotlib.axes._subplots.AxesSubplot at 0x7f47c6f3c860>

png

#Variable 'tip'
sns.kdeplot(tips['tip'])
<matplotlib.axes._subplots.AxesSubplot at 0x7f47c6964908>

png

Plots para datos categoricos

  • boxplot
  • violinplot
  • stripplot
  • swarmplot
  • barplot
  • countplot
import seaborn as sns
%matplotlib inline

barplot

Es un gr谩fico general que le permite agregar los datos categ贸ricos basados en alguna funci贸n, el valor predeterminado es la media:

sns.barplot(x='sex',y='total_bill',data=tips);

png

Puede cambiar el objeto estimador a su propia funci贸n, que convierte un vector a escalar:

import numpy as np
sns.barplot(x='sex',y='total_bill',data=tips,estimator=np.std); # la desviacion estandar como estimador

png

countplot

Esto es esencialmente lo mismo que Barplot, excepto que el estimador est谩 contando expl铆citamente el n煤mero de ocurrencias. Por eso solo pasamos el valor de x:

sns.countplot(x='sex',data=tips);

png

boxplot

los boxplots (diagrama de caja) y violin plots se utilizan para mostrar la distribuci贸n de datos categ贸ricos. Un diagrama de caja (boxplots o gr谩fico de caja y bigotes) muestra la distribuci贸n de datos cuantitativos de una manera que facilita las comparaciones entre variables o entre niveles de una variable categ贸rica. El cuadro muestra los cuartiles del conjunto de datos, mientras que los bigotes se extienden para mostrar el resto de la distribuci贸n, a excepci贸n de los puntos que se determinan como “valores at铆picos” utilizando un m茅todo que es una funci贸n del rango intercuart铆lico.

sns.boxplot(x="day", y="total_bill", data=tips,palette='rainbow');

png

# se pueden graficar de forma horizontal
sns.boxplot(data=tips,palette='rainbow',orient='h');

png

# cambiar el color y ver varias variables (hue)
sns.boxplot(x="day", y="total_bill", hue="smoker",data=tips, palette="coolwarm");

png

violinplot

Un plot de viol铆n juega un papel similar a un box and whisker plot (diagrama de cajas y bigotes). Muestra la distribuci贸n de datos cuantitativos a trav茅s de varios niveles de una (o m谩s) variables categ贸ricas de modo que esas distribuciones se puedan comparar. A diferencia de un diagrama de caja, en el que todos los componentes de la gr谩fica corresponden a los puntos de datos reales, la gr谩fica del viol铆n presenta una estimaci贸n de la densidad del n煤cleo de la distribuci贸n subyacente.

sns.violinplot(x="day", y="total_bill", data=tips,palette='rainbow');

png

# Varias Variables
sns.violinplot(x="day", y="total_bill", data=tips,hue='sex',palette='Set1');

png

# Varias variables
sns.violinplot(x="day", y="total_bill", data=tips,hue='sex',split=True,palette='Set1');

png

stripplot

El stripplot dibujar谩 un diagrama de dispersi贸n donde una variable es categ贸rica. Un stripplot se puede dibujar por s铆 mismo, pero tambi茅n es un buen complemento de una casilla o trama de viol铆n en los casos en que desea mostrar todas las observaciones junto con alguna representaci贸n de la distribuci贸n subyacente.

sns.stripplot(x="day", y="total_bill", data=tips);

png

sns.stripplot(x="day", y="total_bill", data=tips,jitter=True);

png

# Varias variables
sns.stripplot(x="day", y="total_bill", data=tips,jitter=True,hue='sex',palette='Set1');

png

# Varias Variables
sns.stripplot(x="day", y="total_bill", data=tips,jitter=True,hue='sex',palette='Set1',dodge=True);

png

swarmplot

El swarmplot es similar a stripplot(), pero los puntos se ajustan (solo a lo largo del eje categ贸rico) para que no se superpongan. Esto proporciona una mejor representaci贸n de la distribuci贸n de los valores, aunque no se ajusta a un gran n煤mero de observaciones (tanto en t茅rminos de la capacidad de mostrar todos los puntos como en t茅rminos del c谩lculo necesario para organizarlos).

sns.swarmplot(x="day", y="total_bill", data=tips);

png

sns.swarmplot(x="day", y="total_bill",hue='sex',data=tips, palette="Set1", dodge=True);

png

Combininando Plots Categoricos

sns.violinplot(x="tip", y="day", data=tips,palette='rainbow')
sns.swarmplot(x="tip", y="day", data=tips,color='black',size=3);

png

Graficas de Matrices

Los Plot de matriz permiten graficar los datos como matrices codificadas por colores y tambi茅n se pueden usar para indicar cl煤steres dentro de los datos, algunos de los mas usados son el heatmap y el clustermap de seaborn:

flights = sns.load_dataset('flights') # carga de datos
tips = sns.load_dataset('tips') # carga de datos
tips.head() # ver los primeros 5 elementos de la tabla
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
flights.head() # ver los primeros 5 elementos de la tabla
year month passengers
0 1949 January 112
1 1949 February 118
2 1949 March 132
3 1949 April 129
4 1949 May 121

Heatmap

Para que un mapa de calor funcione correctamente, los datos ya deben estar en forma de matriz, la funci贸n de sns.heatmap b谩sicamente los colorea. Por ejemplo:

tips.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
# Matriz de correlacion de los datos
tips.corr()
total_bill tip size
total_bill 1.000000 0.675734 0.598315
tip 0.675734 1.000000 0.489299
size 0.598315 0.489299 1.000000
# Heatmap de la matriz de correlacion
sns.heatmap(tips.corr());

png

# Cambiando el mapa de colres y agregando las anotaciones a la grafica
sns.heatmap(tips.corr(),cmap='coolwarm',annot=True);

png

O para los datos de vuelos:

# Definir una pivot table
flights.pivot_table(values='passengers',index='month',columns='year')
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
month
January 112 115 145 171 196 204 242 284 315 340 360 417
February 118 126 150 180 196 188 233 277 301 318 342 391
March 132 141 178 193 236 235 267 317 356 362 406 419
April 129 135 163 181 235 227 269 313 348 348 396 461
May 121 125 172 183 229 234 270 318 355 363 420 472
June 135 149 178 218 243 264 315 374 422 435 472 535
July 148 170 199 230 264 302 364 413 465 491 548 622
August 148 170 199 242 272 293 347 405 467 505 559 606
September 136 158 184 209 237 259 312 355 404 404 463 508
October 119 133 162 191 211 229 274 306 347 359 407 461
November 104 114 146 172 180 203 237 271 305 310 362 390
December 118 140 166 194 201 229 278 306 336 337 405 432
# Graficar la pivot table como un heatmap
pvflights = flights.pivot_table(values='passengers',index='month',columns='year')
sns.heatmap(pvflights);

png

# Cambiando los parametros del colormap y el ancho y color de las lineas d division
sns.heatmap(pvflights,cmap='magma',linecolor='white',linewidths=1);

png

clustermap

El mapa de cl煤ster utiliza la agrupaci贸n jer谩rquica para producir una versi贸n agrupada del mapa de calor. Por ejemplo:

# Grafica Clustermap de la tabla pivot de los vuelos
sns.clustermap(pvflights);

png

Observe ahora c贸mo los a帽os y meses ya no est谩n en orden, en su lugar se agrupan por similitud en el valor (recuento de pasajeros). Eso significa que podemos comenzar a inferir cosas de esta trama, como agosto y julio siendo similares (tiene sentido, ya que ambos son meses de viaje de verano)

# M谩s opciones para obtener la informaci贸n un poco m谩s clara como la normalizaci贸n
# Cambiar el colormap
sns.clustermap(pvflights,cmap='coolwarm',standard_scale=1);

png

Grids

Las grids son tipos generales de plots que le permiten mapear tipos de plots en filas y columnas de una cuadr铆cula, esto le ayuda a crear plots similares separadas por caracter铆sticas.

# Importar librerias
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
iris = sns.load_dataset('iris') #Importar el dataset
iris.head() #Ver los primeros 5 elementos de la tabla
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa

PairGrid

Pairgrid es un subplot grid para graficar relaciones por pares en un conjunto de datos.

# solo el Grid
sns.PairGrid(iris);

png

# Ahora se mapea el grid
g = sns.PairGrid(iris)
g.map(plt.scatter);

png

# Mapear a arriba, abajo y diagonal
g = sns.PairGrid(iris) # crear una cuadricula
g.map_diag(plt.hist) #Histogramas en la diagonal
g.map_upper(plt.scatter) # Scatter plots en la parte superior
g.map_lower(sns.kdeplot); # Plots de densidad kde en la parte inferior

png

pairplot

pairplot es una versi贸n m谩s simple de PairGrid (se usa con bastante frecuencia)

# La diagonal es un histograma
# las otras graficas son scatter plots
sns.pairplot(iris);

png

# la diagonal son kde de los datos categoricos
# las otars graficas son scatter plots
sns.pairplot(iris,hue='species',palette='rainbow');

png

Facet Grid

FacetGrid es la forma general de crear grids de plots basados en dos caracteristica:

tips = sns.load_dataset('tips')
tips.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
# Solo el Grid
g = sns.FacetGrid(tips, col="time", row="smoker");

png

# histogramas entre las dos variables
g = sns.FacetGrid(tips, col="time",  row="smoker")
g = g.map(plt.hist, "total_bill")

png

# Scatterplots
g = sns.FacetGrid(tips, col="time",  row="smoker",hue='sex')
# Observe como los argumentos vienen despues de llamar a plt.scatter
g = g.map(plt.scatter, "total_bill", "tip").add_legend()

png

JointGrid

JointGrid es la version general de jointplot()

# Solo el grid
g = sns.JointGrid(x="total_bill", y="tip", data=tips)

png

# Grafica de regresion y histograma con kde
g = sns.JointGrid(x="total_bill", y="tip", data=tips)
g = g.plot(sns.regplot, sns.distplot)

png

Plots de Regresion

Seaborn tiene muchas capacidades integradas para trazados de regresi贸n, lmplot le permite visualizar modelos lineales, pero tambi茅n le permite dividir los gr谩ficos en funci贸n de las caracter铆sticas, as铆 como tambi茅n colorear el tono (hue) en funci贸n de las caracter铆sticas.

#Importar librerias
import seaborn as sns
%matplotlib inline
tips = sns.load_dataset('tips') # importar el dataset
tips.head() # ver los primeros datos del dataset
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4

lmplot()

#scatter plot mas la regresion lineal
sns.lmplot(x='total_bill',y='tip',data=tips);

png

#scatter plot mas la regresion lineal basado en el genero
sns.lmplot(x='total_bill',y='tip',data=tips,hue='sex');

png

# Cambio de paleta de colores
sns.lmplot(x='total_bill',y='tip',data=tips,hue='sex',palette='coolwarm');

png

Usando Marcadores

Los argumentos kwargs lmplot pasan a regplto que es una forma m谩s general de lmplot(). regplot tiene un par谩metro scatter_kws que se pasa a plt.scatter y puede modificar los parametros.

Mire siempre la documentacion http://matplotlib.org/api/markers_api.html

# http://matplotlib.org/api/markers_api.html
sns.lmplot(x='total_bill',y='tip',data=tips,hue='sex',palette='coolwarm',
           markers=['o','v'],scatter_kws={'s':100});

png

Usando un Grid

Podemos agregar una separaci贸n m谩s variable a trav茅s de columnas y filas con el uso de un grid. Simplemente ind铆candolo en los argumentos col o row:

sns.lmplot(x='total_bill',y='tip',data=tips,col='sex'); #hace una division por el genero

png

# division por el genero y por tiempo de almuerzo o cena
sns.lmplot(x="total_bill", y="tip", row="sex", col="time",data=tips);

png

# informacion del genero en HUE
sns.lmplot(x='total_bill',y='tip',data=tips,col='day',hue='sex',palette='coolwarm');

png

Aspecto y Tama帽o

Las figuras de Seaborn se les puede ajustar su tama帽o y relaci贸n de aspecto con los par谩metros height y aspect:

sns.lmplot(x='total_bill',y='tip',data=tips,col='day',hue='sex',palette='coolwarm',
          aspect=0.6,height=8);

png

Referencias

Phd. Jose R. Zapata

Previous