Blog

Postado em em 3 de agosto de 2024

Função Crosstab do Pandas – Guia Completo

Descubra como usar a função crosstab do Pandas para calcular tabelas de contingência e analisar dados categóricos de forma eficaz.

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Função Crosstab do Pandas – Guia Completo

A biblioteca Pandas é uma das ferramentas mais poderosas e amplamente utilizadas para análise de dados em Python.

Entre suas muitas funções, a função crosstab se destaca por sua capacidade de gerar e calcular tabelas de contingência, também conhecidas como tabelas cruzadas, facilitando a análise de dados categóricos.

Esta postagem abordará em detalhes o uso da função crosstab, seus parâmetros, aplicações práticas e comparações com outras funções do Pandas, como groupby e pivot_table.

Esta é uma função extremamente útil quando você precisa cruzar informações para realizar análises de dados profissionais.

O que é a Função Crosstab?

A função crosstab do Pandas é usada para calcular tabelas de contingência, que resumem a frequência de combinações de valores entre duas ou mais colunas categóricas.

Essa função é útil para explorar a relação entre diferentes categorias de dados, facilitando a visualização de como essas categorias se distribuem e interagem.

Para mais detalhes, confira a documentação oficial: pandas.crosstab

O que é uma Tabela de Contingência?

Uma tabela de contingência é uma matriz que exibe a distribuição de frequências de variáveis categóricas, permitindo analisar a relação entre elas.

Quando Usar a Função Crosstab?

A função crosstab é otimizada para lidar com grandes conjuntos de dados, embora seu desempenho possa variar dependendo da complexidade e tamanho dos dados. Seu uso é recomendado principalmente nos seguintes casos:

1. Explorar relações categóricas: Entender a relação entre duas ou mais variáveis categóricas, como a distribuição de vendas por região e produto, ou a frequência de respostas por faixa etária e gênero.

2. Análise de dados: Criar uma tabela de frequência para entender melhor como as diferentes categorias se comportam em conjunto.

3. Preparação de dados para visualização: Preparar dados para visualizações, como gráficos de barras empilhadas, gráficos de calor ou outros tipos de gráficos que se beneficiam de tabelas de contingência.

Visualizando a Base de Dados

No material disponível para download, você encontrará a base de dados que utilizaremos ao longo desta aula.

Nela, temos o registro de vendas de uma empresa que vende produtos em várias regiões do país, com registros da receita obtida por cada um desses produtos no período analisado. Cada produto pode ser vendido em várias regiões diferentes.

import pandas as pd

BASE = "./dados/produtos_regioes.csv"
df = pd.read_csv(BASE)
df
Visualizando a Base de Dados

Variáveis Categóricas

No contexto de análise de dados, uma variável categórica é uma variável que pode assumir um número limitado de valores distintos e não numéricos, conhecidos como categorias ou rótulos.

Essas variáveis representam grupos ou classificações e são usadas para segmentar dados em categorias distintas.

Dentro da nossa base de dados, temos as colunas produto e região como colunas categóricas.

Em produto, temos valores limitados e distintos que podem ser assumidos: A, B e C. Já em região, também temos valores limitados que segmentam os dados em: norte, sul, nordeste, centro-oeste e sudeste.

Além dessas características, os valores das variáveis categóricas não possuem uma ordem intrínseca. Por exemplo, região não tem uma ordem natural entre norte, sul, etc.

As variáveis categóricas são fundamentais em análise de dados porque permitem a classificação e o agrupamento dos dados, análises estatísticas e visualizações dos dados por meio de gráficos categóricos.

Leia também: Como criar categorias no Pandas – Variáveis Categóricas

Utilizando a Função Crosstab – Parâmetros da Função

A função crosstab possui vários parâmetros que permitem personalizar a saída de acordo com as necessidades específicas da análise. Alguns dos principais parâmetros incluem:

  • Index: Colunas que serão usadas como índice das linhas da tabela.
  • Columns: Colunas que serão usadas como cabeçalhos das colunas da tabela.
  • Values: Coluna cujos valores serão agregados.
  • Aggfunc: Função de agregação a ser usada (por exemplo, soma, média, etc.).
  • Margins: Adiciona margens com os totais das linhas e colunas.
  • Normalize: Normaliza os valores na tabela para mostrar proporções em vez de contagens absolutas.

Vamos considerar nossa base de dados de vendas e gerar uma tabela de contingência básica, passando como index o df[“regiao”] e como columns o df[“produto”].

O primeiro parâmetro indica a coluna do nosso DataFrame que será utilizada como índice da tabela cruzada, enquanto o segundo parâmetro será utilizado como os rótulos das colunas.

# Calculando a tabela de contingência com contagens
pd.crosstab(df["regiao"], df["produto"])
tabela de contingência básica

Esse resultado mostra a contagem de vendas por região e produto, evidenciando quantas vezes cada produto foi vendido em cada uma das regiões.

Essa análise é fundamental para entender a distribuição de vendas e é comum no início dos estudos estatísticos.

Total de Vendas – Parâmetro Margins

É possível expandir essa análise passando diferentes parâmetros para a função crosstab, como o parâmetro margins, que nos permite visualizar o total de vendas.

Ao incluir esse parâmetro, o resultado apresenta os totais de vendas tanto por linha quanto por coluna, facilitando a visualização geral das vendas.

pd.crosstab(df["regiao"], df["produto"], margins=True, margins_name="Vendas")
Total de Vendas – Parâmetro Margins

Dessa forma, é possível visualizar o total de vendas por produto e região, além do total geral para todos os produtos nas diferentes regiões.

Percentual – Parâmetro Normalize

Até o momento, obtivemos os valores absolutos para a quantidade de vendas. No entanto, utilizando o parâmetro normalize, é possível calcular os percentuais das vendas.

pd.crosstab(
    df["regiao"], df["produto"], normalize=True, margins=True, margins_name="Total"
)
Percentual – Parâmetro Normalize

Após a normalização, obtemos as frequências relativas das vendas, como 15% para o produto A na região Centro-Oeste, ou 5% para o produto B na região Nordeste, e assim por diante.

Para melhorar a representação dessas porcentagens, podemos multiplicar os resultados da normalização por 100.

pd.crosstab(
    df["regiao"], df["produto"], normalize=True, margins=True, margins_name="Total"
).mul(100).round(1)
Percentual com Parâmetro Normalize

A tabela de contingência gerada até o momento mostra a contagem total de vendas de cada produto em cada região em porcentagem.

É importante notar que a quantidade vendida não necessariamente se traduz em maior receita, pois diferentes produtos podem ter preços variados dependendo da região.

O uso do parâmetro normalize permite analisar dados relativos tanto em relação ao total geral quanto por linha ou coluna específica.

Ao definir o parâmetro normalize como “index”, estamos obtendo os valores relativos a cada uma das regiões e não mais ao total de vendas.

pd.crosstab(
    df["regiao"], df["produto"], normalize="index", margins=True, margins_name="Total"
).mul(100).round(1)
parâmetro normalize como "index"

Agora temos os valores divididos pelo total de cada linha (região), não mais pelo total geral.

Dessa forma, conseguimos calcular o percentual de vendas para cada produto por região. Ou seja, o produto C representa 25% das vendas realizadas no Centro-Oeste.

Da mesma forma, é possível utilizar o normalize passando para ele as colunas (columns).

pd.crosstab(
    df["regiao"], df["produto"], normalize="columns", margins=True, margins_name="Total"
).mul(100).round(1)
parâmetro normalize com coluna

Assim, obtemos o percentual de cada região por produto. Por exemplo, a região Centro-Oeste representou 16,7% das vendas do produto C.

Utilizar o parâmetro normalize na função crosstab do Pandas é uma maneira eficaz de calcular e representar percentuais em tabelas de contingência.

Leia também: Padronização e Normalização em Ciência de Dados

Funções de Agregação na Função Crosstab

A função crosstab do Pandas permite não apenas contar frequências, mas também aplicar funções de agregação para sumarizar os dados de diferentes maneiras.

Algumas das funções de agregação mais comuns incluem soma (sum), média (mean), mínimo (min), máximo (max) e mediana (median).

Podemos usar a função sum para calcular o total da receita obtida para cada combinação de produto e região, com as margens indicando o total geral.

# agora vamos calcular a tabela de contingência com a receita total
pd.crosstab(
    df["regiao"],
    df["produto"],
    values=df["receita"],
    aggfunc="sum",
    margins=True,
    margins_name="Receita Total",
)
Funções de Agregação SUM na Função Crosstab

Com a função mean, podemos obter a média das receitas para cada combinação de produto e região, tendo nas margens a média geral.

# agora vamos calcular a tabela de contingência com a receita média
pd.crosstab(
    df["regiao"],
    df["produto"],
    values=df["receita"],
    aggfunc="mean",
    margins=True,
    margins_name="Receita Média",
).round(2)
Funções de Agregação mean na Função Crosstab

Também é possível combinar as funções de agregação com o parâmetro normalize para obter o percentual que cada valor representa da receita total vendida, assim como da receita por região ou produto.

pd.crosstab(
    df["regiao"],
    df["produto"],
    values=df["receita"],
    aggfunc="sum",
    normalize=True,
).mul(100).round(1)
Função de agregação e normalize

Assim, podemos analisar o percentual da receita das vendas. Por exemplo, a receita obtida pelo produto A na região Centro-Oeste representa 12,3% da receita total.

Ao alterar a referência do parâmetro normalize para index, utilizamos as regiões como referência.

pd.crosstab(
    df["regiao"],
    df["produto"],
    values=df["receita"],
    aggfunc="sum",
    normalize="index",
).mul(100).round(1)
Agregação com normalize para index

Podemos observar que 65,5% da receita do Centro-Oeste provém do produto A.

Alterando de index para columns, podemos ter uma nova perspectiva de análise, vendo qual a porcentagem cada região representa para a receita de um determinado produto.

pd.crosstab(
    df["regiao"],
    df["produto"],
    values=df["receita"],
    aggfunc="sum",
    normalize="columns",
).mul(100).round(1)
Agregação com normalize para coluna

Por exemplo, a região Centro-Oeste representa 43,6% da receita total obtida com as vendas do produto A.

Essa flexibilidade na escolha das referências (por região ou produto) facilita a análise conforme os objetivos específicos do usuário.

As funções de agregação na função crosstab do Pandas são ferramentas poderosas para realizar análises detalhadas de dados categóricos.

Elas permitem resumir os dados de maneiras diferentes, fornecendo insights valiosos sobre a relação entre variáveis categóricas e numéricas.

Compreender como e quando usar cada uma dessas funções é essencial para realizar análises de dados eficazes e obter uma compreensão mais profunda dos dados.

Comparação com GroupBy

Assim como utilizamos a função crosstab, é possível realizar análises semelhantes utilizando as funções groupby e pivot_table, mas cada uma delas tem seu contexto ideal de uso.

A função groupby é extremamente flexível e eficiente para realizar agrupamentos e agregações em dados. Ela pode ser usada em uma ampla variedade de contextos, não apenas para colunas categóricas, e permite agregações complexas.

Essa função também oferece uma vasta capacidade de personalização, permitindo um controle detalhado sobre o resultado da agregação.

A desvantagem do groupby é que ela pode ser mais complexa e exigir mais código para obter resultados semelhantes aos obtidos com a crosstab de forma mais rápida e prática.

Além disso, o tratamento de valores ausentes e a adição de margens precisam ser feitos manualmente.

Por exemplo, para criar a mesma tabela de contingência que fizemos com a crosstab, seria necessário este código:

# obtendo a contagem igual ao crosstab mas com a função groupby
df.groupby(["regiao", "produto"]).count().unstack().fillna(0).rename(
    columns={"receita": "vendas"}
)
tabela de contingência com groupby

O mesmo é válido para obter a receita total com o groupby.

df.groupby(["regiao", "produto"]).sum().unstack().fillna(0).rename(
    columns={"receita": "receita_total"}
)
receita total com o groupby

Avaliando o crosstab em relação ao groupby, vemos que o crosstab é mais direto e simples de usar para criar tabelas de contingência.

Ele também lida automaticamente com os valores ausentes e adiciona margens (totais) de maneira fácil e conveniente.

No entanto, o crosstab é menos flexível que o groupby para aplicar múltiplas agregações diferentes ou manipular dados de maneiras complexas. Além disso, ele oferece menos opções de personalização da tabela resultante.

Leia também: Como otimizar DataFrames do Pandas

Comparação com Pivot Table

A função pivot_table também pode ser usada para criar tabelas de contingência, oferecendo flexibilidade similar ao groupby, mas com uma sintaxe mais próxima ao crosstab.

Quando comparada ao crosstab, a pivot_table é muito mais flexível, permitindo aplicar múltiplas funções de agregação e manipular dados de várias maneiras.

Ela pode ser usada para uma ampla variedade de operações de agrupamento e agregação, não apenas para tabelas de contingência.

Além de poder aplicar múltiplas funções de agregação ao mesmo tempo, como sum, mean, count, etc.

A desvantagem em relação à crosstab é que a pivot_table pode ser mais complexa e requerer mais código para realizar operações simples que a crosstab faz facilmente.

Vamos gerar nossa tabela de contingência com a pivot_table.

df.pivot_table(
    index="regiao", columns="produto", values="receita", aggfunc="count", fill_value=0
)
tabela de contingência com pivot_table

E também calcular a receita total com ela.

df.pivot_table(
    index="regiao",
    columns="produto",
    values="receita",
    aggfunc="sum",
    fill_value=0,
    margins=True,
    margins_name="Receita Total",
)
receita total com pivot_table

Leia também: Reshaping no Pandas – Pivot, Pivot Table, Stack e Unstack

Conclusão – Função Crosstab do Pandas – Guia Completo

Nessa postagem, você aprendeu como funciona e como utilizar a função crosstab do Pandas. Essa função é uma ferramenta poderosa e simples para analisar relações entre colunas categóricas.

Embora o groupby e o pivot_table possam alcançar resultados semelhantes, o crosstab se destaca por sua simplicidade e eficiência em tarefas específicas de tabelas de contingência.

Compreender quando e como usar cada uma dessas funções é essencial para realizar análises de dados eficazes e profissionais, obtendo insights valiosos.

Hashtag Treinamentos

Para acessar outras publicações de Ciência de Dados, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?

Posts mais recentes de Ciência de Dados

Posts mais recentes da Hashtag Treinamentos