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!