Segmentando uma variável contínua em intervalos desiguais com Python/Pandas

António C. da Silva Júnior
gb.tech
Published in
3 min readNov 4, 2022
Fonte: https://www.pexels.com/photo/several-scissors-1319460/

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 np
df = 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.

Referências e links úteis

--

--