Aula 3: Atributos Categóricos#

Objetivo da aula: Ao fim desta aula, o aluno será capaz de operar com atributos categóricos para encontrar segmentações do dataset.

Nesta aula, trabalharemos com dados de clientes do iFood. Esses dados foram disponibilizados pelo próprio iFood, e fazem (ou, ao menos, faziam) parte da dinâmica de contratação de pessoas para a equipe de análise de dados da empresa.

Texto introdutório#

Hoje em dia, é comum que empresas tenham dados de seus clientes. Esses dados servem para associar características como a renda ou a situação familiar ao comportamento dos clientes. O objetivo final dessa associação é tentar antecipar as compras que são potencialmente feitas por clientes de determinadas categorias, de forma a guiar ações de marketing como a exibição de propagandas ou a personalização de ofertas.

É possível usar Machine Learning para encontrar automaticamente essas associações, mas algoritmos de aprendizado automático podem encontrar viéses ou coincidências nos bancos de dados. Isso pode levar a situações indesejáveis, como a propagação de preconceitos. Além disso, algoritmos de aprendizado são tipicamente caixa-preta, isto é, são difíceis de explicar, o que impede que seus resultados sejam auditáveis e, portanto, torna-os pouco efetivos em ambientes em que alguém deve ser responsabilizado pelos resultados gerados.

Por isso, ainda é importante encontrar segmentos de bancos de dados e aprender com eles. Esse segmento que é escolhido manualmente para fazer alguma análise é chamado de recorte. Por exemplo, podemos separar clientes casados de clientes solteiros, e essas categorias compõem nosso recorte.

Nesta atividade, faremos recortes para descobrir características de clientes do iFood.

Exercício 1#

Objetivo: ler a base de dados e interpretar suas colunas

O código abaixo lê os dados do dataset do iFood. Após confirmar que a leitura funciona, procure no site-fonte dos dados uma explicação sobre o conteúdo de cada coluna. O que cada coluna significa?

import pandas as pd

df = pd.read_csv('dados/iFood/ml_project1_data.csv')
df.head()
ID Year_Birth Education Marital_Status Income Kidhome Teenhome Dt_Customer Recency MntWines ... NumWebVisitsMonth AcceptedCmp3 AcceptedCmp4 AcceptedCmp5 AcceptedCmp1 AcceptedCmp2 Complain Z_CostContact Z_Revenue Response
0 5524 1957 Graduation Single 58138.0 0 0 2012-09-04 58 635 ... 7 0 0 0 0 0 0 3 11 1
1 2174 1954 Graduation Single 46344.0 1 1 2014-03-08 38 11 ... 5 0 0 0 0 0 0 3 11 0
2 4141 1965 Graduation Together 71613.0 0 0 2013-08-21 26 426 ... 4 0 0 0 0 0 0 3 11 0
3 6182 1984 Graduation Together 26646.0 1 0 2014-02-10 26 11 ... 6 0 0 0 0 0 0 3 11 0
4 5324 1981 PhD Married 58293.0 1 0 2014-01-19 94 173 ... 5 0 0 0 0 0 0 3 11 0

5 rows × 29 columns

Exercício 2#

Objetivo: contar variáveis categóricas no dataset para caracterizar os seus elementos

O código abaixo mostra como contar o número de ocorrências de cada categoria em uma coluna de um dataframe.

  1. Qual é o nível educacional da maior parte dos clientes?

  2. Modifique o código para descobrir quantos clientes da base de dados são casados.

  3. Analisando a informação de estado civil dos clientes, você acredita que alguns dados podem não ser confiáveis? Caso afirmativo, remova-os do dataframe.

edu = df.value_counts('Education')
print(edu)
Education
Graduation    1127
PhD            486
Master         370
2n Cycle       203
Basic           54
dtype: int64

Exercício 3#

Ordenar colunas categóricas para evidenciar que tratam-se de níveis de uma progressão

Embora a “educação” seja uma variável categórica (uma vez que não tem valores numéricos), existe uma ordenação inerente às categorias. Podemos informar ao Pandas qual é essa ordenação usando o código abaixo.

  1. A ordenação das categorias foi informada manualmente. Seria possível, neste caso específico, automatizar completamente o processo? Por que?

  2. Por que é necessário informar o parâmetro sort=False na chamada de value_counts?

  3. Modifique o código para passar a mostrar o estado civil (marital status) dos usuários. Neste caso, a ordenação ainda faz sentido?

df['Education'] = pd.Categorical(df['Education'], ["Basic", "2n Cycle", "Graduation", "Master", "PhD"])
edu = df.value_counts('Education', sort=False)
print(edu)
Education
Basic           54
2n Cycle       203
Graduation    1127
Master         370
PhD            486
dtype: int64

Exercício 4#

Mostrar a contagem de variáveis categóricas em plots de barras

O código abaixo mostra como mostrar as contagens que calculamos em um gráfico de barras.

  1. “Gráfico de barras” é o mesmo que “histograma”? Por que?

  2. Modifique a chamada do gráfico para passar a mostrar as contagens de clientes de acordo com o estado civil.

import matplotlib.pyplot as plt
plt.style.use('default')
#import seaborn as sns


#sns.barplot(x=edu.index, y=edu, color='b')
edu.plot.bar(figsize=(7,3))
plt.ylabel('# of clients')
plt.xlabel('Education')
plt.show()
_images/b956955f225840ac5f26aea329e7bebcde4e070a7c95ad3747cfd8a0016c6b54.png

Exercício 5#

Objetivo: fazer contagens usando duas variáveis categóricas simultaneamente

A função crosstab do Pandas cria uma tabela relacionando contagens de duas variáveis categóricas.

  1. O que significa cada elemento da tabela que foi criada?

  2. O parâmetro normalize pode receber os valores False, True, index ou columns. O que cada um deles significa?

  3. Um cliente típico do iFood tem que combinação de nível de educação e estado civil?

df_ = pd.crosstab(index=df['Education'], columns=df['Marital_Status'])
print(df_)
Marital_Status  Absurd  Alone  Divorced  Married  Single  Together  Widow  \
Education                                                                   
Basic                0      0         1       20      18        14      1   
2n Cycle             0      0        23       81      37        57      5   
Graduation           1      1       119      433     252       286     35   
Master               1      1        37      138      75       106     12   
PhD                  0      1        52      192      98       117     24   

Marital_Status  YOLO  
Education             
Basic              0  
2n Cycle           0  
Graduation         0  
Master             0  
PhD                2  

Exercício 6#

Objetivo: analisar duas propostas de gráficos de barras para mostrar dados

No código abaixo, temos duas propostas de códigos de barras: um com barras lado-a-lado e outro com barras empilhadas.

  1. As cores das barras, suas larguras e suas cores estão permitindo uma boa visualização dos dados? Consulte a documentação e modifique os parâmetros que achar necessário.

  2. Que informações podemos ver no gráfico lado-a-lado que é mais difícil visualizar no gráfico de barras empilhadas?

  3. Que informações podemos ver no gráfico empilhado que é mais difícil visualizar no gráfico de barras lado-a-lado?

df_.plot.bar(stacked=False, figsize=(7,3))
plt.ylabel('# of clients')
plt.xlabel('Education')
plt.show()


df_.plot.bar(stacked=True, figsize=(7,3))
plt.ylabel('# of clients')
plt.xlabel('Education')
plt.show()
_images/4e437e234a303f0f7c23dde771dd782235b875e409f12071a4e858336adde826.png _images/ee7b2a99c7993bc170e053ef4d82b4c53df2476c5b913ab80bbe815ce7c16950.png

Exercício 7#

Objetivo: ler e entender documentação do Pandas. Transpor um dataframe e visualizar os resultados

O método transpose() inverte as linhas e colunas de um dataframe. Consulte a documentação do método e use-o para mostrar um gráfico de barras que evidencie os níveis educacionais de clientes casados, solteiros e divorciados.

# Espaço para resolver o exercício 7

Exercício 8#

Objetivo: mostrar dados bi-dimensionais em uma figura

Faz parte do senso comum pensar que, quanto maior o nível educacional de uma pessoa, maior será sua renda.

  1. Faça uma figura que responda à pergunta: “na base de clientes do iFood, pessoas de nível educacional maior têm a renda maior?”

  2. Usando as técnicas que aprendemos hoje, faça uma figura que evidencie a resposta à sua pergunta.

  3. Não esqueça de rotular eixos e colocar título na figura! No título, tanto a pergunta quanto a resposta devem ficar evidentes.

# Espaço para resolver o exercício 8