Sidetable es un complemento para Pandas con el que es posible crear fácilmente tablas resumen en Python de los conjuntos de datos. Lo que consigue mediante la combinación de funciones de tabulación cruzada y recuento de datos, simplificando muchos análisis habituales.
Instalación y conjunto de datos de ejemplo
El método más sencillo para instalar Sidetable en Python es usar el comando pip
en la terminal. Así para instalar la librería solamente es necesario abrir la terminal y escribir el siguiente comando
pip install sidetable
Para ver el funcionamiento de Sidetable usare el conjunto de datos tips que se puede importar de la librería Seaborn. Un conjunto de datos que cuenta con 244 registros de facturas de restaurantes con la cantidad total de la cuenta, la propina y datos sobre los comensales. La importación y los primeros registros se pueden ver con el siguiente código.
import pandas as pd import sidetable from seaborn import load_dataset tips = 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
Obtener la frecuencia de ocurrencia con Sidetable
Para este conjunto de datos puede ser interesante la frecuencia de ocurrencia en base al día de la semana. Algo que, gracias a haber importado Sidetable, se puede conseguir fácilmente con
tips.stb.freq(['day'])
day count percent cumulative_count cumulative_percent 0 Sat 87 35.655738 87 35.655738 1 Sun 76 31.147541 163 66.803279 2 Thur 62 25.409836 225 92.213115 3 Fri 19 7.786885 244 100.000000
Nótese que ahora el objeto DataFrame cuenta con una nueva propiedad llamada stb
dentro de la cual se pueden encontrar métodos para la creación de tablas resumen. En este caso se ha utilizado el método freq()
para crear una tabla resumen de frecuencias en función del día de la semana, columna que se ha indicado mediante la lista de nombres. El resultado es una tabla ordenada de mayor a menor con el número de ocurrencias, el porcentaje, el número de ocurrencias y el porcentaje acumulados.
Por defecto la función freq()
cuenta en número de ocurrencias, pero también se puede conseguir la suma de cualquier otra columna. Para esto es necesario pasar el nombre de la columna sobre la que se desea sumar en la propiedad value
. Así los valores de facturación por día de la semana se pueden conseguir de la siguiente manera.
tips.stb.freq(['day'], value='total_bill')
day total_bill percent cumulative_total_bill cumulative_percent 0 Sat 1778.40 36.836883 1778.40 36.836883 1 Sun 1627.16 33.704174 3405.56 70.541057 2 Thur 1096.33 22.708828 4501.89 93.249886 3 Fri 325.88 6.750114 4827.77 100.000000
Obtener la frecuencia en base a múltiples columnas
El método freq()
admite análisis más complejos, en lugar de una única columna se pueden indicar varias, obteniéndose de este modo la frecuencia para todas la indicadas. Por ejemplo, se pueden combinar el día de la semana con el género de los comensales.
tips.stb.freq(['day','sex'])
day sex count percent cumulative_count cumulative_percent 0 Sat Male 59 24.180328 59 24.180328 1 Sun Male 58 23.770492 117 47.950820 2 Thur Female 32 13.114754 149 61.065574 3 Thur Male 30 12.295082 179 73.360656 4 Sat Female 28 11.475410 207 84.836066 5 Sun Female 18 7.377049 225 92.213115 6 Fri Male 10 4.098361 235 96.311475 7 Fri Female 9 3.688525 244 100.000000
En este caso también se pueden cambiar el conteo de ocurrencias por el sumatoria de otras columnas, como puede ser el caso de la factura total.
tips.stb.freq(['day', 'sex'], value='total_bill')
day sex total_bill percent cumulative_total_bill cumulative_percent 0 Sun Male 1269.46 26.294956 1269.46 26.294956 1 Sat Male 1227.35 25.422711 2496.81 51.717667 2 Thur Male 561.44 11.629386 3058.25 63.347053 3 Sat Female 551.05 11.414173 3609.30 74.761225 4 Thur Female 534.89 11.079442 4144.19 85.840668 5 Sun Female 357.70 7.409218 4501.89 93.249886 6 Fri Male 198.57 4.113079 4700.46 97.362965 7 Fri Female 127.31 2.637035 4827.77 100.000000
Una opción interesante para cuando existen demasiados valores diferentes es seleccionar únicamente los primeros registros que suman hasta un porcentaje. Para lo que se puede usar la propiedad thresh
. Por ejemplo, se puede seleccionar únicamente los registros que suman el primer 70% de la factura. Selecciona de esta manera las categorías de datos más significativas.
tips.stb.freq(['day', 'sex'], value='total_bill', thresh=70)
day sex total_bill percent cumulative_total_bill cumulative_percent 0 Sun Male 1269.46 26.294956 1269.46 26.294956 1 Sat Male 1227.35 25.422711 2496.81 51.717667 2 Thur Male 561.44 11.629386 3058.25 63.347053 3 others others 1769.52 36.652947 4827.77 100.000000
Agrupando el resto de los valores en un fila a la que se denomina others
.
Contar los registros de todas las columnas
Otra método de los que ofrece Sidetable es counts()
con el que se puede obtener una tabla resumen con la frecuencia y otros valores de cada una de las columnas.
tips.stb.counts()
count unique most_freq most_freq_count least_freq least_freq_count sex 244 2 Male 157 Female 87 smoker 244 2 No 151 Yes 93 time 244 2 Dinner 176 Lunch 68 day 244 4 Sat 87 Fri 19 size 244 6 2 156 6 4 tip 244 123 2 33 1.01 1 total_bill 244 229 13.42 3 17.82 1
En el caso de que únicamente sea de interés las variables de algún tipo existe la opción de excluir valores con exclude
. Por ejemplo, se puede excluir los valores categóricos con
tips.stb.counts(exclude='category')
count unique most_freq most_freq_count least_freq least_freq_count size 244 6 2.00 156 6.00 4 tip 244 123 2.00 33 1.01 1 total_bill 244 229 13.42 3 17.82 1
Valores faltantes o nulos
Sidetable también cuenta con un método para contar el número de valores faltantes o nulos. Lo que se puede obtener con el método missing
. El conjunto de datos tips no cuenta con este tipo de valores, por lo que este método es mejor evaluarlo con otro conjunto como planets.
planets = load_dataset("planets") planets.stb.missing()
missing total percent mass 522 1035 50.434783 distance 227 1035 21.932367 orbital_period 43 1035 4.154589 method 0 1035 0.000000 number 0 1035 0.000000 year 0 1035 0.000000
Obteniendo como resultado una tabla en la que están ordenadas de mayor a menor las columnas que cuentan con más valores faltantes. Información que puede ser necesaria para saber si es necesario imputar o no los valores faltantes.
Subtotales
Al resumir los valores en base a dos variables muchas veces es interesante contar con los valores agregados en base a cada una. Por ejemplo, si se tiene el total de facturación por día y género posible que nos interese el subtotal por día. Valores que los métodos de Pandas no ofrecen. En estas situaciones se puede usar el método subtotal()
de Sidetable para completar las tablas con esta información.
tips[['day', 'sex', 'total_bill']].groupby(['day', 'sex']).sum().stb.subtotal()
total_bill day sex Thur Male 561.44 Female 534.89 Thur - subtotal 1096.33 Fri Male 198.57 Female 127.31 Fri - subtotal 325.88 Sat Male 1227.35 Female 551.05 Sat - subtotal 1778.40 Sun Male 1269.46 Female 357.70 Sun - subtotal 1627.16 grand_total 4827.77
Conclusiones
En esta ocasión se ha visto las opciones que ofrece Sidetable para la creación de tablas resumen en Python. Una librería que sea de utilidad para el trabajo diario con Pandas, facilitando la creación de muchos de los resúmenes habituales.