Fundamentos do Machine Learning com Python

0/25 aulas0%
pratica

Visualização Básica de Dados para Exploração

Aprenda sobre visualização básica de dados para exploração

60 min
Aula 5 de 5

📊 Visualização Básica de Dados para Exploração com Pandas

Olá, futuros cientistas de dados! 👋 Nesta aula prática, vamos mergulhar no mundo da visualização de dados, uma habilidade crucial para qualquer profissional de Machine Learning. A visualização nos permite entender a estrutura dos nossos dados, identificar padrões, anomalias e relações de forma intuitiva e rápida.

Usaremos o Pandas e sua integração com o Matplotlib para criar gráficos básicos que nos ajudarão na fase exploratória da análise de dados (EDA - Exploratory Data Analysis).

🎯 Objetivos da Aula

Ao final desta aula, você será capaz de:

  • Compreender a importância da visualização na exploração de dados.
  • Criar gráficos básicos como histogramas, box plots, scatter plots, bar plots e line plots usando Pandas.
  • Interpretar as informações apresentadas por esses gráficos.
  • Utilizar as funcionalidades de plotagem integradas do Pandas de forma eficaz.

1. 🚀 Introdução: Por que Visualizar Dados?

Imagine que você tem uma tabela cheia de números. É difícil tirar conclusões ou identificar tendências apenas olhando para eles, certo? É aí que a visualização entra! 🖼️

A visualização de dados transforma números brutos em representações gráficas compreensíveis, revelando insights que seriam invisíveis de outra forma. É a nossa "lupa" para entender o que os dados estão nos dizendo antes mesmo de construirmos um modelo de Machine Learning.

No Pandas, a magia acontece através do método .plot(), que é diretamente integrado aos DataFrames e Series. Ele atua como um wrapper para a biblioteca Matplotlib, simplificando muito a criação de gráficos comuns.

Vamos começar configurando nosso ambiente!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns # Usaremos para um dataset de exemplo, mas o foco é Pandas.
 
# Configurações básicas para melhorar a visualização dos gráficos
%matplotlib inline
plt.style.use('seaborn-v0_8-darkgrid') # Um estilo mais agradável
plt.rcParams['figure.figsize'] = (10, 6) # Tamanho padrão para os gráficos
plt.rcParams['font.size'] = 12 # Tamanho da fonte padrão

2. 📈 Explicação Detalhada com Exemplos

Para nossos exemplos, vamos criar um DataFrame fictício que simula dados de vendas de diferentes produtos ao longo do tempo. Isso nos dará uma boa variedade de tipos de dados para explorar.

# Criando um DataFrame de exemplo
np.random.seed(42) # Para reprodutibilidade
 
# Dados de tempo (últimos 30 dias)
dates = pd.date_range(start='2023-10-01', periods=30, freq='D')
 
# Dados de produtos e vendas
products = ['Produto A', 'Produto B', 'Produto C', 'Produto D']
sales_data = {
    'Data': np.repeat(dates, len(products)),
    'Produto': np.tile(products, len(dates)),
    'Vendas': np.random.randint(50, 200, size=len(dates) * len(products)),
    'Preco_Unitario': np.random.uniform(10, 100, size=len(dates) * len(products)).round(2),
    'Regiao': np.random.choice(['Norte', 'Sul', 'Leste', 'Oeste'], size=len(dates) * len(products))
}
 
df = pd.DataFrame(sales_data)
 
# Adicionar uma coluna de 'Receita'
df['Receita'] = df['Vendas'] * df['Preco_Unitario']
 
# Adicionar algumas anomalias para box plot
df.loc[df['Produto'] == 'Produto A', 'Vendas'] = df.loc[df['Produto'] == 'Produto A', 'Vendas'] + np.random.randint(-20, 50, size=len(df.loc[df['Produto'] == 'Produto A']))
df.loc[df['Produto'] == 'Produto C', 'Vendas'].iloc[5] = 500 # Outlier
df.loc[df['Produto'] == 'Produto C', 'Vendas'].iloc[10] = 10 # Outlier
 
print("Nosso DataFrame de exemplo:")
print(df.head())
print("\nInformações do DataFrame:")
df.info()

2.1. 📊 Histograma (.plot(kind='hist'))

Para que serve? Mostra a distribuição de uma única variável numérica. Ele divide os dados em "caixas" (bins) e conta quantos valores caem em cada caixa. É excelente para entender a forma, o centro e a dispersão dos dados.

Exemplo: Vamos ver a distribuição das Vendas.

print("Histograma da coluna 'Vendas':")
df['Vendas'].plot(kind='hist', bins=20, title='Distribuição de Vendas', edgecolor='black')
plt.xlabel('Vendas')
plt.ylabel('Frequência')
plt.show()
 
print("\nHistograma da coluna 'Receita':")
df['Receita'].plot(kind='hist', bins=30, title='Distribuição de Receita', color='skyblue', edgecolor='black')
plt.xlabel('Receita')
plt.ylabel('Frequência')
plt.show()

Interpretação:

  • Podemos ver se os dados são simétricos, assimétricos (skewed), bimodais, etc.
  • A altura das barras indica a frequência de ocorrência dos valores dentro daquele intervalo.
  • No exemplo de Vendas, podemos notar que a maioria das vendas está concentrada em um determinado intervalo, mas há alguns valores mais altos (possíveis outliers ou eventos de alta demanda).

2.2. 📦 Box Plot (.plot(kind='box'))

Para que serve? Exibe a distribuição de uma variável numérica através de seus quartis. É ótimo para identificar a mediana, a dispersão (intervalo interquartil) e a presença de outliers (valores atípicos).

Exemplo: Vamos visualizar a distribuição das Vendas e Receita.

print("Box Plot da coluna 'Vendas':")
df['Vendas'].plot(kind='box', title='Box Plot de Vendas')
plt.ylabel('Vendas')
plt.show()
 
print("\nBox Plot das colunas 'Vendas' e 'Receita' juntas:")
# Para plotar múltiplas colunas, selecione-as ou use o DataFrame completo
df[['Vendas', 'Receita']].plot(kind='box', title='Box Plot de Vendas e Receita')
plt.ylabel('Valores')
plt.show()
 
print("\nBox Plot das Vendas por Produto:")
# Para box plots por categoria, precisamos de um agrupamento ou usar bibliotecas como Seaborn.
# Com Pandas nativo, podemos fazer subsets ou usar o parâmetro `by`.
df.boxplot(column='Vendas', by='Produto', figsize=(10, 7))
plt.title('Box Plot de Vendas por Produto')
plt.suptitle('') # Remove o título padrão extra do Pandas
plt.ylabel('Vendas')
plt.xlabel('Produto')
plt.show()

Interpretação:

  • A linha central na caixa é a mediana (50º percentil).
  • As bordas da caixa são o 1º quartil (Q1 - 25º percentil) e o 3º quartil (Q3 - 75º percentil).
  • Os "bigodes" (whiskers) se estendem até 1.5 vezes o intervalo interquartil (IQR = Q3 - Q1) a partir das bordas da caixa, ou até os valores mínimo/máximo se não houver outliers.
  • Os pontos fora dos bigodes são considerados outliers. No nosso exemplo, podemos ver alguns outliers para o Produto C, que foram inseridos artificialmente.

2.3. ↔️ Scatter Plot (.plot(kind='scatter'))

Para que serve? Mostra a relação entre duas variáveis numéricas. Cada ponto no gráfico representa um par de valores (x, y). É excelente para identificar correlações, clusters e padrões.

Exemplo: Vamos ver a relação entre Preco_Unitario e Vendas.

print("Scatter Plot de Preço Unitário vs. Vendas:")
df.plot(kind='scatter', x='Preco_Unitario', y='Vendas',
        title='Relação entre Preço Unitário e Vendas', alpha=0.7, color='purple')
plt.xlabel('Preço Unitário')
plt.ylabel('Vendas')
plt.show()
 
print("\nScatter Plot de Preço Unitário vs. Receita:")
df.plot(kind='scatter', x='Preco_Unitario', y='Receita',
        title='Relação entre Preço Unitário e Receita', alpha=0.7, color='green')
plt.xlabel('Preço Unitário')
plt.ylabel('Receita')
plt.show()

Interpretação:

  • Se os pontos formarem uma linha ascendente, há uma correlação positiva.
  • Se formarem uma linha descendente, há uma correlação negativa.
  • Se os pontos estiverem espalhados sem um padrão claro, pode não haver correlação linear.
  • No nosso exemplo, para Preco_Unitario vs Vendas, não parece haver uma correlação linear forte, o que é esperado com dados aleatórios. Já para Preco_Unitario vs Receita, vemos uma tendência de aumento, pois Receita é Vendas * Preco_Unitario.

2.4. 📊 Bar Plot (.plot(kind='bar'/'barh'))

Para que serve? Compara valores entre diferentes categorias. Pode ser usado para mostrar a contagem de ocorrências de cada categoria (para variáveis categóricas) ou a agregação de uma variável numérica por categoria.

Exemplo: Vamos ver as vendas totais por Produto e por Regiao.

print("Vendas Totais por Produto (Bar Plot):")
# Primeiro, agrupamos os dados e somamos as vendas por produto
vendas_por_produto = df.groupby('Produto')['Vendas'].sum().sort_values(ascending=False)
vendas_por_produto.plot(kind='bar', title='Vendas Totais por Produto', color='teal', edgecolor='black')
plt.xlabel('Produto')
plt.ylabel('Total de Vendas')
plt.xticks(rotation=45) # Rotaciona os rótulos do eixo x para melhor leitura
plt.show()
 
print("\nReceita Média por Região (Bar Plot Horizontal):")
receita_media_por_regiao = df.groupby('Regiao')['Receita'].mean().sort_values()
receita_media_por_regiao.plot(kind='barh', title='Receita Média por Região', color='salmon', edgecolor='black')
plt.xlabel('Receita Média')
plt.ylabel('Região')
plt.show()

Interpretação:

  • A altura ou comprimento das barras representa o valor da categoria.
  • É fácil comparar visualmente qual categoria tem o maior/menor valor.
  • No nosso exemplo, podemos ver qual produto teve o maior volume de vendas e qual região gerou a maior receita média.

2.5. 📈 Line Plot (.plot(kind='line'))

Para que serve? Mostra a tendência de uma variável numérica ao longo de uma sequência ordenada, geralmente tempo. É ideal para séries temporais.

Exemplo: Vamos ver as vendas diárias totais ao longo do tempo.

print("Vendas Diárias Totais (Line Plot):")
# Agrupamos por data e somamos as vendas
vendas_diarias = df.groupby('Data')['Vendas'].sum()
vendas_diarias.plot(kind='line', title='Vendas Diárias Totais', marker='o', linestyle='-', color='blue')
plt.xlabel('Data')
plt.ylabel('Total de Vendas')
plt.grid(True) # Adiciona um grid para facilitar a leitura
plt.show()
 
print("\nVendas Diárias por Produto (Múltiplas Linhas):")
# Para plotar múltiplas linhas, pivotamos os dados
df_pivot = df.pivot_table(index='Data', columns='Produto', values='Vendas', aggfunc='sum')
df_pivot.plot(kind='line', title='Vendas Diárias por Produto', figsize=(12, 7), marker='.')
plt.xlabel('Data')
plt.ylabel('Vendas')
plt.legend(title='Produto')
plt.grid(True)
plt.show()

Interpretação:

  • A linha conecta os pontos de dados em ordem, mostrando a progressão ou tendência.
  • Picos e vales indicam aumentos e quedas.
  • No exemplo, podemos observar a flutuação das vendas diárias e, com múltiplas linhas, comparar o desempenho de cada produto ao longo do tempo.

3. 🛠️ Integração Pandas e Matplotlib

Como você deve ter notado, o método .plot() do Pandas é muito poderoso porque ele utiliza o Matplotlib por baixo dos panos. Isso significa que você pode combinar a simplicidade do Pandas com a flexibilidade e o controle fino do Matplotlib.

Qualquer gráfico gerado pelo .plot() do Pandas retorna um objeto Axes do Matplotlib, permitindo que você adicione personalizações diretamente com matplotlib.pyplot (geralmente importado como plt).

Exemplo: Personalizando um scatter plot com Matplotlib.

print("Scatter Plot com Personalização Matplotlib:")
ax = df.plot(kind='scatter', x='Preco_Unitario', y='Vendas',
             title='Relação entre Preço Unitário e Vendas (Personalizado)',
             alpha=0.6, color='darkred', figsize=(10, 6))
 
# Adicionando texto e linha de tendência (exemplo simples, não é uma regressão real)
plt.text(x=80, y=180, s='Possível Outlier?', fontsize=10, color='red')
plt.axvline(x=50, color='gray', linestyle='--', label='Preço Médio') # Linha vertical
plt.legend() # Mostra a legenda para axvline
plt.grid(True, linestyle=':', alpha=0.7) # Grade mais suave
plt.show()

Isso demonstra como você pode usar plt.xlabel(), plt.ylabel(), plt.title(), plt.show() e outras funções do Matplotlib para refinar seus gráficos Pandas.


4. 📝 Exercícios/Desafios

Agora é a sua vez de colocar a mão na massa! 🚀

Vamos usar o famoso dataset tips do Seaborn, que contém informações sobre gorjetas dadas em um restaurante.

# Carregando o dataset tips do Seaborn
tips = sns.load_dataset('tips')
print("Dataset 'tips' carregado:")
print(tips.head())
print("\nInformações do dataset 'tips':")
tips.info()

Tarefas:

  • Tarefa 1: Distribuição do Total da Conta

    • Crie um histograma para a coluna total_bill.
    • Use 15 bins.
    • Adicione um título descritivo e rótulos aos eixos.
    • Qual a forma da distribuição? (Simétrica, assimétrica, etc.)
  • Tarefa 2: Distribuição da Gorjeta

    • Crie um box plot para a coluna tip.
    • Adicione um título e rótulos.
    • Identifique a mediana, os quartis e quaisquer outliers.
  • Tarefa 3: Relação entre Total da Conta e Gorjeta

    • Crie um scatter plot para visualizar a relação entre total_bill (eixo X) e tip (eixo Y).
    • Adicione um título e rótulos.
    • Existe alguma correlação aparente?
  • Tarefa 4: Gorjeta Média por Dia da Semana

    • Calcule a gorjeta média para cada dia da semana (day).
    • Crie um bar plot para visualizar essa média.
    • Ordene as barras do menor para o maior valor.
    • Qual dia da semana tem a maior gorjeta média?
  • Tarefa 5: Total da Conta ao longo do Tempo (por Hora do Dia)

    • Agrupe os dados pelo time (almoço/jantar) e, dentro de cada grupo, pelo day.
    • Calcule o total_bill médio para cada combinação.
    • Crie um line plot que mostre a tendência do total_bill médio ao longo dos dias da semana, separando por time. (Dica: Use pivot_table ou crie dois plots separados e sobreponha-os se preferir).
    • Adicione um título e rótulos.

5. 📝 Resumo e Próximos Passos

Parabéns! 🎉 Nesta aula, você aprendeu os fundamentos da visualização de dados exploratória usando o Pandas e sua integração com o Matplotlib. Cobrimos:

  • Histogramas para distribuições.
  • Box Plots para quartis e outliers.
  • Scatter Plots para relações entre variáveis.
  • Bar Plots para comparações categóricas.
  • Line Plots para tendências temporais.

A visualização é uma ferramenta indispensável no seu kit de ferramentas de Machine Learning, permitindo que você entenda rapidamente a estrutura e os padrões dos seus dados.

Próximos Passos:

  • Seaborn: Embora o Pandas seja ótimo para visualizações rápidas, bibliotecas como o Seaborn (que também é construído sobre o Matplotlib) oferecem gráficos estatísticos mais avançados e esteticamente agradáveis com menos código. Vale a pena explorar!
  • Plotly/Bokeh: Para visualizações interativas e dashboards, explore bibliotecas como Plotly ou Bokeh.
  • Pratique! A melhor forma de dominar a visualização é praticar com diferentes datasets e tentar responder a perguntas específicas com gráficos.

Continue explorando e visualizando! Até a próxima aula! 👋

© 2025 Escola All Dev. Todos os direitos reservados.

Visualização Básica de Dados para Exploração - Fundamentos do Machine Learning com Python | escola.all.dev.br