Blog

Postado em em 1 de abril de 2024

Como criar Categorias no Pandas – Variáveis Categóricas

Aprenda como criar categorias no Pandas! Entenda o que são categorias ou variáveis categóricas no Pandas, para que servem e como funcionam.

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:

Como criar Categorias no Pandas – Variáveis Categóricas

Na aula de hoje, eu quero te mostrar como criar categorias no Pandas! Você já ouviu falar em categorias ou variáveis categóricas no Pandas? Sabe o que são? Para que servem? Como funcionam?

Nessa aula, vou responder cada uma dessas perguntas sobre variáveis categóricas no Python, como fazer um reconhecimento da base de dados e a importância disso em uma análise exploratória.

O principal objetivo dessa aula é te mostrar como criar categorias no Pandas, ou seja, você aprenderá o passo a passo para categorizar seus dados, tornando mais fácil encontrar padrões ou até mesmo facilitar sua análise exploratória.

Então, faça o download do material disponível e vem comigo aprender como criar categorias no Pandas.

Informações da Base de Dados

A base de dados que iremos utilizar foi baixada do Kaggle e consiste em informações sobre gorjetas recebidas por garçons em dias de trabalho.

Vamos criar e visualizar as cinco primeiras linhas do nosso dataframe para saber quais dados iremos encontrar.

import pandas as pd

DADOS = "dados/tips.csv"

df = pd.read_csv(DADOS)
df.head()

Dentro dessa base de dados, teremos algumas informações sobre o pedido, como o valor total da conta, valor da gorjeta, gênero do cliente, se é fumante, qual dia da semana foi o atendimento, em qual horário (refeição) e quantas pessoas estavam na mesa.

Informações da Base de Dados

Reconhecimento da Base de Dados

Antes de partirmos para o foco da aula, que são as categorias no Pandas, precisamos primeiro fazer uma análise inicial da base de dados, um reconhecimento dela, para obtermos mais informações sobre ela e os dados presentes.

Para isso, começaremos utilizando o método info, que irá retornar informações gerais sobre a base de dados, como a quantidade de entradas, os tipos de dados de cada uma das colunas e a presença ou não de valores nulos.

df.info()

Reconhecimento da Base de Dados -info

Nesse caso não temos nenhum valor nulo e contamos com 244 entradas, sendo elas de elemento do tipo float, texto (object) e inteiro (int).

Como não temos valores nulos e os tipos de dados referentes às colunas estão corretos, não precisaremos nos preocupar em realizar nenhum tipo de tratamento inicial nessa base de dados.

Em seguida, podemos utilizar o método describe para termos algumas informações estatísticas do DataFrame, com contagem dos elementos não nulos (count), média (mean), desvio padrão (std), mínimo (min), quartis (25%, 50%, 75%) e máximos (max).

df.describe()

describe da base de dados

Podemos também verificar os valores não numéricos passando o parâmetro exclude=”number” para o método describe.

df.describe(exclude="number")

verificar os valores não numéricos

Nessa análise, podemos verificar a quantidade de valores únicos presentes nas colunas não numéricas (unique), qual valor mais aparece entre esses (top) e a quantidade em que aparece (freq).

Podemos verificar cada um dos valores únicos dessas colunas não numéricas através do método select_dtypes. Para isso, faremos um loop for, percorrendo cada uma das colunas do nosso DataFrame cujo tipo seja object.

Feito isso, iremos imprimir o nome da coluna e os tipos únicos presentes nelas.

for coluna in df.select_dtypes(include="object"):
    print(f"{coluna}: {df[coluna].unique()}")

imprimindo o nome da coluna e os tipos únicos presentes nelas

Como nosso foco principal é nas gorjetas recebidas, podemos explorar a coluna tip, criando um histograma para que possamos visualizar e compreender como se deu a distribuição dessas gorjetas.

df["tip"].hist()

histograma

É possível observar a partir desse gráfico que a maior parte das gorjetas se encontra entre 2 e 3 dólares.

Podemos verificar isso também através do método value_counts definindo a distribuição em 10 intervalos.

df["tip"].value_counts(bins=10).sort_index()

método value_counts

Até aqui, já temos uma ideia da distribuição dessas gorjetas em categorias automáticas geradas pelo histograma ou pelo método value_counts. Mas além disso, podemos criar categorias manualmente com base em critérios específicos.

Pandas Cut – Categorias no Pandas

A categorização das variáveis é essencial para compreendermos melhor a distribuição dos dados, além de nos permitir separá-los de acordo com critérios específicos.

Esse processo facilita a análise dos dados e permite uma melhor visualização das informações contidas na nossa base de acordo com os objetivos da nossa análise.

Uma das formas que temos de categorizar uma coluna é através do método cut do Pandas. Com esse método, podemos cortar uma faixa de dados contínua e criar categorias personalizadas para eles.

Para isso, precisamos primeiro definir as faixas de valores nas quais iremos segmentar os dados, classificando os valores como baixos, médios ou altos.

Para as nossas faixas, vamos definir que de 0 até 2 será baixo, de 2 até 5 será médio e de 5 para cima, ou seja, 5 ao infinito (float(“inf”)) será alto.

faixas = [0, 2, 5, float("inf")]

categorias = ["baixo", "medio", "alto"]

Na primeira lista temos os intervalos, e na segunda lista temos as categorias. Vamos utilizar o método cut do Pandas para criar uma nova coluna chamada categoria_tip.

O método cut do Pandas precisa primeiro receber a coluna de referência, a qual ele irá segmentar os valores, no caso a coluna tip (df[“tip”]). Em seguida, precisamos passar os limites definidos em faixas (bins=faixas) e, por fim, os rótulos especificados (labels=categorias).

faixas = [0, 2, 5, float("inf")]

categorias = ["baixo", "medio", "alto"]

df["categoria_tip"] = pd.cut(df["tip"], bins=faixas, labels=categorias)

df.head()

Executando esse código, podemos visualizar uma nova coluna chamada categoria_tip que classifica as gorjetas em baixo, médio ou alto.

coluna chamada categoria_tip

Perceba que ele organiza as faixas de valores de acordo com a quantidade de categorias definidas.

Podemos ler os intervalos criados da seguinte forma:

  • Baixo: (0, 2]
  • Médio: (2, 5]
  • Alto: (5, inf]

Essa simbologia é a mesma que temos na matemática para representar um intervalo aberto () e um intervalo fechado []. No intervalo aberto, não consideramos o valor, ou seja, é acima ou abaixo dele, e no intervalo fechado, consideramos aquele valor, sendo até ou a partir dele.

Análise das Categorias – Análises Importantes

Com essas variáveis categóricas criadas, podemos começar a analisá-las mais detalhadamente. Por exemplo, podemos verificar a quantidade de valores em cada uma.

df["categoria_tip"].value_counts()

verificar a quantidade de valores

Essa verificação já nos mostra que a maioria dos valores se enquadra na categoria média, seguida pela baixa e com poucos valores na alta.

Podemos considerar a porcentagem de cada categoria, utilizando o parâmetro normalize=True.

df["categoria_tip"].value_counts(normalize=True)

verificar a porcentagem dos valores

Apesar de termos a mesma constatação, podemos verificar essa informação em porcentagem. Ou seja, temos que 60% das gorjetas se encontram na categoria médio, seguidas por 31% na categoria baixo.

Essas são informações que já havíamos conseguido verificar antes, mas com a categorização das variáveis, podemos ter novas perspectivas e até mesmo classificar melhor esses dados, destacando alguns padrões que não eram tão evidentes.

Dados do Tipo Categórico

Se verificarmos novamente as informações do nosso dataframe, veremos que essa coluna categoria_tip será do tipo categórico (category).

df.info()

coluna categoria_tip do tipo categórico (category)

Ou seja, ela é uma coluna de um tipo específico que é reconhecido pelo Pandas, e compreendê-la é muito importante para entendermos melhor os dados e construirmos uma análise eficiente.

Se analisarmos os valores presentes nessa coluna, veremos que, além de informar cada um dos valores, o Pandas reconhece a ordem e a quantidade de categorias presentes. Ele identifica o padrão nas categorias e a ordem delas.

df["categoria_tip"]

coluna categoria_tip

Isso facilita a manipulação e compreensão dos dados. Visto que o Pandas reconhece qual categoria é maior do que a outra, podemos ordenar os dados a partir dessas categorias criadas.

df["categoria_tip"].sort_values()

coluna categoria_tip ordenada

Ou seja, mesmo representadas visualmente como strings, as categorias são interpretadas pelo Pandas como intervalos que possuem valores numéricos associados que permitem que elas sejam ordenadas e manipuladas dessa forma.

Por ser do tipo category, podemos acessar os tipos das categorias através do atributo .cat.categories, que retorna os rótulos únicos das categorias presentes na coluna.

df["categoria_tip"].cat.categories

acessar os tipos das categorias

Também podemos acessar os valores únicos dessa coluna que, além de retornar quais são as categorias existentes, também exibe a ordem delas.

df["categoria_tip"].unique()

acessar os valores únicos

Outro atributo que pode ser usado com categorias é o .cat.ordered, que verifica se as categorias de uma coluna têm ou não uma ordem definida.

df["categoria_tip"].cat.ordered

Verifica se as categorias possuem uma ordem

O Pandas trabalha com essas categorias associando números internamente a elas. Essa representação numérica das categorias permite ao Pandas realizar operações mais eficientes e ocupar menos espaço em memória, pois ele não armazena o texto, mas sim os números associados.

Para verificar qual número é associado a cada categoria, basta utilizar o atributo .cat.codes.

df["categoria_tip"].cat.codes

verificar qual número é associado a cada categoria

Basicamente, o Pandas associou e armazenou o número 0 como baixo, 1 como médio e 2 como alto.

Colunas Categóricas – Análise Exploratória

Vamos criar categorias para outras colunas. Dentro da nossa base de dados ainda temos as colunas total_bill, tip, sex, smoker, day, time e size.

As colunas sex, smoker, day e time são colunas com poucos valores únicos. Sempre que temos colunas com poucos valores, essas colunas podem ser transformadas em categóricas para facilitar agrupamentos e análises exploratórias.

Isso porque essas colunas já são naturalmente categóricas, elas já são divididas em categorias que nos ajudam a compreender a relação delas com a quantidade de gorjetas. Portanto, podemos transformá-las definitivamente em do tipo categórica.

Para transformá-las em variáveis categóricas, vamos criar uma nova lista de colunas chamada colunas_categoricas onde iremos atribuir os nomes das colunas que queremos transformar no tipo category.

Em seguida, vamos criar um novo DataFrame como cópia do DataFrame original, para evitar alterações indesejadas nos dados originais.

Feito isso, vamos iterar sobre cada coluna na lista colunas_categoricas e converter cada coluna iterada para o tipo de dados categóricos usando o método astype (“category”).

colunas_categoricas = ["sex", "smoker", "day", "time"]

df_categorizado = df.copy()

for coluna in colunas_categoricas:
    df_categorizado[coluna] = df_categorizado[coluna].astype("category")

df_categorizado.head()

Visualizando a tabela após converter cada coluna iterada para o tipo de dados categóricos

Perceba que visualmente não tivemos nenhuma alteração na exibição das informações, mas iremos verificar o impacto disso no uso de memória do Pandas.

Vantagens das Variáveis Categóricas

A transformação das colunas de texto em categorias reduz significativamente o tamanho do DataFrame, melhorando a eficiência e economizando memória. Podemos verificar isso através do método info().

df_categorizado.info()

Verificando tamanho do DataFrame

Além das categorias agora serem identificadas como tipo category, o uso de memória que antes era de 13kb caiu para 7kb. Essa é uma redução de quase 50%.

Para o tamanho desse DataFrame pode não ter um impacto muito grande, mas pense nisso em um DataFrame maior, com um volume de dados muito maior.

Essa abordagem resulta em um código mais rápido e que consumirá menos da memória do seu computador, sendo bastante vantajoso quando estamos trabalhando com bases de dados grandes.

Análise dos Dados Categorizados

Agora, vamos passar por cada uma dessas colunas categóricas e extrair algumas informações delas.

Vamos exibir o nome das colunas categorizadas, os valores únicos presentes nelas, os rótulos de cada uma dessas categorias e se são categorias ordenadas ou não.

for coluna in df_categorizado.select_dtypes(include="category"):
    print(f"{coluna}: {df_categorizado[coluna].unique()}")
    print(f"{coluna}.cat.categories: {df_categorizado[coluna].cat.categories}")
    print(f"{coluna}.cat.ordered: {df_categorizado[coluna].cat.ordered}")
    print()

Exibindo informações das colunas categorizadas

Repare que as categorias, com exceção da categoria_tip, vieram todas não ordenadas. Isso porque ao convertermos as colunas para o tipo category não definimos nenhum parâmetro de ordenação.

Algumas colunas com valores categóricos como sex e smoker, não possuem uma ordem implícita, então podemos deixá-las por padrão como não ordenadas.

Por outro lado, ao considerarmos variáveis como os dias da semana, que possuem uma ordem natural (segunda, terça, quarta, etc.), pode ser relevante definirmos categorias ordenadas para facilitar análises futuras.

A decisão entre categorias ordenadas e não ordenadas depende do contexto da análise e das relações lógicas entre as diferentes categorias envolvidas.

Quando utilizamos o cut para transformar uma variável numérica em categórica, geralmente o resultado será uma categoria ordenada, como houve com categoria_tip.

Categorias Ordenadas no Pandas

A escolha entre ordenar ou não as categorias no Pandas impacta diretamente na interpretação dos dados e das informações resultantes das análises realizadas sobre eles.

Cabe a você decidir de acordo com o contexto da análise e os objetivos dela, quais relações de ordenação as categorias envolvidas podem ter.

Vamos analisar a coluna day referente aos dias, começando com uma contagem dos valores ordenadas pelo índice.

df_categorizado["day"].value_counts().sort_index()

Analisando a coluna day

Repare que o Pandas reconheceu e ordenou as informações dos dias em ordem alfabética. No entanto, faria mais sentido se ele organizasse de acordo com os dias da semana: quinta (Thur), sexta (Fri), sábado (Sat) e domingo (Sun).

Para isso, vamos criar uma lista chamada de dias_da_semana e vamos defini-los na ordem que estamos acostumados.

A partir dessa lista, vamos utilizar a funcionalidade de set_categories para definir nossas novas categorias para a coluna day, substituindo as categorias existentes pelas categorias definidas na lista.

O argumento ordered=True indica que essas categorias são ordenadas, garantindo que o Pandas entenda que a organização delas dentro da lista é a ordenação desejada.

dias_da_semana = ["Thur", "Fri", "Sat", "Sun"]

df_categorizado["day"] = df_categorizado["day"].cat.set_categories(dias_da_semana, ordered=True)

df_categorizado.head()

Visualizando o dataframe

Visualmente não há mudanças significativas no nosso DataFrame. Mas se visualizarmos os valores delas ordenados pelo índice agora, poderemos reparar na diferença.

df_categorizado["day"].value_counts().sort_index()

Categoria day ordenada

Isso é importante por apresentar as informações em uma ordem lógica dos dias, facilitando a compreensão e leitura dos dados. Inclusive, poderíamos plotar essas informações em um gráfico de forma que faça mais sentido.

df_categorizado["day"].value_counts().sort_index().plot(kind="bar")

Histograma

Visualizando agora as informações das nossas categorias, veremos que o Pandas agora reconhece a ordem da coluna day.

for coluna in df_categorizado.select_dtypes(include="category"):
    print(f"{coluna}: {df_categorizado[coluna].unique()}")
    print(f"{coluna}.cat.categories: {df_categorizado[coluna].cat.categories}")
    print(f"{coluna}.cat.ordered: {df_categorizado[coluna].cat.ordered}")
    print()

Exibindo informações das colunas categorizadas

Conclusão – Como criar Categorias no Pandas – Variáveis Categóricas

Nessa aula, você aprendeu como criar categorias no Pandas e trabalhar com variáveis categóricas! Vimos o que são as variáveis categóricas, como funcionam, para que servem e como são importantes, podendo facilitar suas análises de dados.

Passamos por cada etapa, fazendo o reconhecimento da base de dados, criando as variáveis categóricas e visualizando como elas são importantes para uma análise exploratória completa e precisa dos seus dados.

Com esse importante conhecimento na área de análise de dados, você conseguirá encontrar padrões mais facilmente e realizar suas análises de forma muito mais eficiente e fácil.

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?

Quer sair do zero no Python e virar uma referência na sua empresa? Inscreva-se agora mesmo no Python Impressionador