Creación de tablas resumen en Python con Sidetable

Publicado el 13 diciembre 2021 por Daniel Rodríguez @analyticslane

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.

Imagen de Goumbik en Pixabay