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:
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.
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
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.
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.
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
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
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:
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"])
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.
É 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")
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.
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" )
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)
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)
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)
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
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", )
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)
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)
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)
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)
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.
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"} )
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"} )
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
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 )
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", )
Leia também: Reshaping no Pandas – Pivot, Pivot Table, Stack e Unstack
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.
Para acessar outras publicações de Ciência de Dados, clique aqui!
Posts mais recentes de Ciência de Dados
Posts mais recentes da Hashtag Treinamentos
Expert em conteúdos da Hashtag Treinamentos. Auxilia na criação de conteúdos de variados temas voltados para aqueles que acompanham nossos canais.