Resumo Estatístico Agrupando por Categoria em Python

Há várias formas de se obter estatísticas descritivas no Python. A mais comum é utilizando o describe(). Porém, essa função não é tão útil quando precisamos de resumos por grupo. Imagine, por exemplo, tentar obter a idade média dos clientes por estado, ou por gênero. Além dessa flexibilização, seria interessante também poder fazer um resumo de alguma métrica criada por você. O post de hoje é, claro, sobre isso. Vamos obter um resumo estatístico agrupando por categoria, além de incluir funções criadas por nós mesmos, em Python.

Primeiro, importamos o popular dataset Iris, que contém uma amostra com as informações de comprimento e largura de algumas espécies de flores:

import pandas as pd

iris = pd.read_csv('iris.csv')
iris.head(5)

Agora, vamos relembrar como funciona o group by. É bem simples, a função é utilizada para agrupar seus dados por uma ou mais colunas. Ou seja, para você obter as visões de alguma variável, mas agrupada por coluna. É interessante saber a média do comprimento da largura das sépalas da amostra, mas mais interessante talvez seja saber a média por cada espécie. Para isso, temos o group by:

iris.groupby('Species')['SepalWidthCm'].mean()

Veja que o comando é bem simples: nome do dataset + groupby + variável pela qual os dados serão agrupados entre parênteses + variável que queremos obter o resumo estatístico.

Caso você quisesse obter um resumo por mais de uma variável, como por exemplo qual a média de gasto em compras por estado e faixa de idade, bastaria você passar uma lista de variáveis para a função. Seria algo assim:

dataset.groupby(['col1', 'col2', ...])['colx'].mean()

Claro que outras medidas também podem ser tomadas, como a mediana:

iris.groupby('Species')['SepalWidthCm'].median()

Agora, vamos entender como combinar o group by com a função agg. Como você deve imaginar pelo nome, essa função serve para agregar seus dados. Para utilizá-la, você deve passar o nome da variável que será agregada e qual o tipo de agregação a ser feita (média, mediana, máximo, soma, etc). Veja no simples exemplo abaixo:

iris.groupby('Species').agg({'SepalWidthCm':'mean'})

Além de ser mais simples de combinar diversas formas de agregação com diversas variáveis, você ainda tem a vantagem de ter um dataframe como saída e poder incluir funções suas.

Primeiro, um exemplo de como você pode obter várias descritivas diferentes para variáveis diferentes:

resumo = iris.groupby('Species').agg({'SepalWidthCm':['mean', 'sum'],
'PetalLengthCm':['median', 'std']})
resumo

Particularmente, acho difícil a leitura da tabela acima. Note que as duas primeiras colunas são somente para a variável SepalWidthCm e as duas últimas para PetalLengthCm. Não acho uma boa, mas é útil em alguns casos.

O jeito que eu prefiro utilizar o agg é para gerar uma nova tabela contendo resumos descritivos, preferencialmente, para a mesma variável. Veja o exemplo abaixo, onde eu ainda encaixo uma função nova que criei para me auxiliar a obter os percentis:

import numpy as np

def percentile(n):
    """ Calcula percentil """
    def percentile_(x):
    return np.percentile(x, n)
    percentile_.__name__ = 'percentile_%s' % n
    return percentile_

resumo = iris.groupby(['Species'], sort=False).agg(media=('SepalWidthCm','mean'),
desvpad=('SepalWidthCm','std'),
minimo=('SepalWidthCm','min'),
p10=('SepalWidthCm',percentile(10)),
p25=('SepalWidthCm',percentile(25)),
p50=('SepalWidthCm',percentile(50)),
p75=('SepalWidthCm',percentile(75)),
p90=('SepalWidthCm',percentile(90)),
p95=('SepalWidthCm',percentile(95)),
maximo=('SepalWidthCm','min'),).reset_index().round(1)

resumo

Cuidado com o espaçamento na hora de replicar o código acima. Muitas vezes eu colo o código aqui no blog e ele não sai com o espaçamento correto. De resto, é só alegria daqui para frente quando você tiver que criar resumos das suas tabelas!

E aí? Gostou do conteúdo? Se inscreva para receber todas as novidades. Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e, principalmente, compartilhar com seus amigos. De verdade, isso faz toda a diferença. Além disso, você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @UniDosDados, no Instagram @universidadedosdados ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal Universidade dos Dados.

Aproveite e adquira sua camiseta de data science na LOJA DA UNIVERSIDADE DOS DADOS. Vai ficar estiloso e me ajudar neste projeto!

BONS ESTUDOS!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *