Segmentando uma variável contínua em intervalos desiguais com Python/Pandas
Quando lidamos com variáveis contínuas, frequentemente precisamos segmentá-las em faixas de valores. Para este propósito o Pandas possui duas funções interessantes: cut() e qcut(). Motivado pela dúvida de uma aluna do Desenvolve, um programa gratuito de formação e inclusão de talentos em tecnologia do Grupo Boticário, decidi postar este pequeno tutorial da função cut() em um contexto onde necessitamos dividir uma variável contínua em intervalos desiguais.
O primeiro passo é importar o Pandas e o Numpy, e carregar o famoso dataset do desafio do Titanic do Kaggle.
import pandas as pd
import numpy as npdf = pd.read_csv("https://drive.google.com/uc?id=1Hx5vWnhp-tW8ljpZY86UA4YYvTgWE4Lj").dropna()
Vamos dar uma olhadinha na variável Age, que representa a idade dos passageiros que embarcaram no navio:
df['Age'].describe()
Digamos que o objetivo agora seja dividir esta variável nas seguinte faixas:
- Criança (de 0 até 13 anos);
- Adolescente (de 14 até 17 anos);
- Adulto (de 18 até 59 anos);
- Idoso (a partir de 60 anos);
Uma forma de fazermos rapidamente esta segmentação é por meio da função cut() do Pandas, mencionada agora pouco, associada à função IntervalIndex.from_tuples().
O primeiro passo é criar uma lista de tuplas com os intervalos desejados:
lst_ranges = [(0, 14), (14, 18), (18, 60), (60, np.infty)]
Observe que a tupla seguinte sempre inicia repetindo o valor final da tupla anterior.
Em seguida criamos os intervalos de fato, por meio da função IntervalIndex.from_tuples():
ranges = pd.IntervalIndex.from_tuples(lst_ranges, closed = 'left')
Importante: por meio do argumento closed você pode especificar se os intervalos serão fechados à esquerda (left), direita (right), ambos (both) ou aberto em ambos (neither). A opção left selecionada implica que, por exemplo, a tupla (14, 18) representa o intervalo [14, 18).
Obs: se você não tem familiaridade com intervalos, recomendo esta breve leitura.
O próximo passo é criar a variável Age_range com os intervalos definidos:
df['Age_range'] = pd.cut(df['Age'], bins=ranges)
Vamos dar uma olhada como ficou a nova variável:
df[['Age', 'Age_range']].head()
df['Age_range'].dtype
Observe que temos agora uma variável qualitativa ordinal. Sendo assim, podemos incluir rótulos mais amigáveis para cada faixa:
labels = ['criança', "adolescente", "adulto", "idoso"]df['Age_range'] = df['Age_range'].cat.rename_categories(labels)
Vamos ver como ficou:
df['Age_range'].dtype
Missão cumprida! Na lista abaixo disponibilizo um notebook com todos os códigos.