Estatísticas Descritivas
Deixe de lado a tarefa de escrever mean() e std() para cada coluna. Aprenda como automatizar estatísticas descritivas em Python e gere tabelas resumidas prontas para publicação em apenas alguns passos. Todas as análises começam da mesma forma: você carrega um conjunto de dados e tenta descobrir o que realmente está nele. Quantas linhas? Quais colunas são numéricas? Quanto está faltando? Alguma coisa está muito inclinada? A maioria de nós responde a essas perguntas copiando e colando os mesmos trechos de código df.describe(), df.isna().sum() e df.groupby(…).agg(…) que digitamos mil vezes, e depois reformata o resultado à mão quando é hora de colocá-lo em um relatório. Isso é um esforço desperdiçado. O ecossistema Python agora tem ferramentas que levam você de um DataFrame bruto a uma tabela resumida formatada e compartilhável em uma ou duas linhas — e outras construídas especificamente para produzir o tipo de “Tabela 1” que você vê principalmente em artigos de pesquisa. Este tutorial o levará através dos 7 passos para criar um pipeline repetível em vez de um monte de trechos de código de uso único. Vamos usar o conjunto de dados dos Pinguins de Palmer ao longo do caminho. É pequeno, é aberto e tem uma mistura realista de colunas numéricas e categóricas, valores reais faltando e uma variável de agrupamento natural (espécie). Então, vamos começar.
Instale os pacotes que usaremos neste tutorial: pandas, seaborn, skimpy e fg-data-profiling. Uma nota importante sobre o último: a biblioteca de perfil popular foi renomeada mais de uma vez. Inicialmente, era pandas-profiling, tornou-se ydata-profiling em 2023 e foi renomeada novamente para fg-data-profiling em abril de 2026. O pacote ydata-profiling ainda instala e executa, mas não recebe mais atualizações, portanto, novos projetos devem preferir fg-data-profiling. Vamos cobrir ambos os estilos de importação no Passo 5. Agora, carregue os dados. Seaborn tem um conjunto de dados de pinguins embutido, o que nos economiza um download:
Você verá sete colunas: três categóricas (espécie, ilha, sexo) e quatro medições numéricas (comprimento_do_bico_mm, profundidade_do_bico_mm, comprimento_da_barbatana_mm, massa_do_corpo_g). As medições têm 2 valores faltantes cada, e o sexo tem 11. Mantenha essa informação — veremos como cada ferramenta relata esses dados faltantes. O describe() embutido do Pandas é o ponto de partida óbvio, e por uma boa razão. É instantâneo e não requer instalação adicional:
Isso é genuinamente útil, mas note seus pontos cegos. Por padrão, ele ignora completamente as colunas categóricas. Ele fornece uma contagem de valores não nulos, mas nunca informa o percentual de dados faltantes diretamente. E ele para no resumo de cinco números — sem inclinação, sem curtose, sem sentido de forma de distribuição. Para uma verificação rápida, está bem, mas como base de um relatório, deixa lacunas. O próximo passo fecha algumas delas sem sair do Pandas.
Antes de alcançar pacotes externos, é importante saber até onde o Pandas sozinho pode levá-lo — porque, para muito do trabalho do dia a dia, isso é suficiente. Primeiro, inclua as colunas categóricas no mesmo resumo com include=”all”:
Agora você obtém único, topo e frequência para as colunas de texto ao lado das estatísticas numéricas (com NaN preenchendo as células onde uma estatística não se aplica). Uma tabela, todas as colunas. Em segundo lugar, construa um resumo personalizado com .agg() para que você controle exatamente quais estatísticas aparecem — incluindo aquelas que describe() omite, como inclinação e curtose — e adicione um percentual de dados faltantes:
Terceiro — e essa é a jogada que as pessoas esquecem — encadear groupby() antes de describe() para obter um resumo estratificado em uma linha única:
O padrão a internalizar: select_dtypes para escolher colunas, .agg([…]) para escolher estatísticas, groupby para escolher estratos. Essa tríade lida com uma parte surpreendente das necessidades de relatórios reais com zero dependências. Os passos restantes são sobre economizar tempo, adicionar polimento e lidar com os casos em que “bom o suficiente” não é.
Quando você quer mais do que describe() mas não quer montá-lo à mão, skimpy é a opção certa. É como um describe() supercarregado que roda em sua console ou notebook e lida com todos os tipos de colunas de uma vez. Ele funciona com DataFrames do Pandas e Polars.
Um único chamado imprime um relatório estruturado: um resumo de dados (contagens de linhas e colunas), uma quebra por tipo de dados, uma tabela numérica com média, desvio padrão, a distribuição completa de percentis e um histograma ASCII em linha por coluna, além de uma tabela separada para colunas de string que mostra coisas como contagens de caracteres e valores mais/menos frequentes. Os dados faltantes são relatados como uma contagem e um percentual, exatamente onde você os esperaria.
Os histogramas em linha são o recurso de destaque. Você obtém uma leitura da forma de cada distribuição sem abrir uma biblioteca de plotagem. Para exploração interativa, skimpy é um bom meio-termo: muito mais informativo do que describe(), muito mais leve do que um relatório HTML completo.
Quando você precisa da imagem completa — distribuições, correlações, interações, detecção de duplicatas e avisos de qualidade de dados — é melhor gerar um relatório de perfil completo. Essa é a linha de comando que substituiu uma