Introdução à Ciência de Dados

Prof. Washington Santos da Silva

IFMG - Campus Formiga

16 de maio de 2025

Diário de Bordo

O que vimos até hoje?

  • Aula 1 ✅

    • Introdução e Contextualização ✅
    • O que é Ciência de Dados? ✅
    • Papéis Profissionais na Área de Dados ✅
    • Áreas de Aplicações ✅
    • Habilidades Interpessoais e Analíticas ✅
    • Apresentação da Disciplina ✅
  • Aula 2 ✅

    • Metodologia CRISP-DM ✅

    • Tipos de Análise ✅

      • Descritiva ✅
      • Diagnóstica ✅
      • Preditiva ✅
      • Prescritiva ✅
    • Configurações: Git/GitHub ✅

  • Aula 3 ✅

    • Introdução ao RStudio ✅

      • Criação do seu Projeto RStudio da Disciplina ✅
  • Aula 4 ✅

    • Introdução ao Git e GitHub ✅

      • Criação do seu repositório do projeto RStudio da disciplina no GitHub ✅
  • Aula 5 ✅

    • Breve Revisão do IDE RStudio ✅

    • Introdução ao Sistema de Publicação Quarto ✅

    • Sessão Prática Guiada com Relatório 1 ✅

      • Execução dos comandos git essenciais ✅
  • Aula 6 ✅

    • Parte I ✅

      • O Relatório Junglivet e a Metodologia CRISP-DM ✅
      • Primeiro contato com a linguagem R por meio dos códigos do relatório ✅
    • Parte II ✅

      • Para alunos com projetos estruturados ✅
      • Atividade prática ✅
      • Para alunos com dificuldades técnicas ✅
      • Atendimento individualizado para estruturação de projetos ✅
  • Aula 7 ✅

    • Introdução ao sistema Quarto (continuação) ✅

      • Gerar relatório no formato pdf ✅
      • Gerar relatório no formato docx ✅
    • Introdução à Linguagem R (continuação) ✅

      • Conceitos: Variáveis e observações ✅
      • Estrutura tabular organizada de dados ✅
      • Tipos e classes de dados principais em R ✅
      • Estruturas de dados: vetores e data frames ✅
  • Aula 8 ✅

    • Início do estudo do pacote dplyr para manipulação de dados ✅

      • CRISP-DM: Fase 2 (Entendimento dos dados) e Fase 3 (Preparação dos dados) ✅
        de um projeto de análise ou ciência de dados ✅
      • O que é o dplyr? ✅
      • A Filosofia Tidy Data (Dados Organizados) ✅
      • Dados Organizados (Tidy Data) ✅
      • Por que usar o dplyr? ✅
      • Fluxo de trabalho com dplyr ✅
      • Boas Práticas com dplyr ✅
      • Função dplyr::select() ✅
      • Função dplyr::filter() ✅
  • Aula 9 ✅

    • Solução dos exercícios práticos sobre as funções select e filter ✅
    • Função dplyr::mutate() ✅
  • Aula 10 ✅

    • Soluções dos exercícios práticos sobre a função mutate ✅
    • funções dplyr::group_by(), dplyr::summarize() e dplyr::arrange() ✅
  • Aula 11 ✅

    • Metodologia CRISP-DM e Pacote dplyr ✅
    • Revisão sobre Dados Organizados (Tidy Data) ✅
    • Exemplos de Dados Desorganizados Comuns em Administração ✅
    • Pacote tidyr: Função pivot_longer ✅
  • Aula 12 ✅

    • Metodologia CRISP-DM e o tidyverse ✅
    • Dados Organizados: Potencializando Análises ✅
  • Aula 13 ✅

    • Avaliação 1 ✅

Nesta Aula

Tópicos

  • Tipos Básicos de joins

Arquivo para esta Aula

Instruções

  • Abra o RStudio e o seu Projeto da Disciplina

  • Crie a subpasta 07-relatorio dentro da pasta relatorios.

  • Acesse o site da disciplina e baixe o arquivo 07-relatorio.zip

  • Descompacte o arquivo, copie/recorte o arquivo 07-relatorio.qmd e cole dentro da subpasta 07-relatorio.

Diretrizes para Aulas Mais Produtivas

🔊 Mantenha conversas em volume baixo

⌨️ Código com método:

95% dos erros são evitáveis com:

  • Atenção na digitação
  • Respeitar a sequência lógica de etapas
  • Revisão antes de pedir ajuda

🤝 Inteligência colaborativa:

  • Compartilhe conhecimento
  • Resolva questões técnicas simples com colegas próximos
  • Reserve ao professor as dúvidas conceituais complexas

💪 Capacidade de Resolver Problemas

Cada erro resolvido é uma evolução da sua habilidade analítica

Pacote dplyr: Tipos Básicos de joins

O Problema da Fragmentação de Dados

A Realidade dos Dados Empresariais

  • Dados corporativos raramente estão em uma única tabela ou sistema:

    • Informações de clientes em um CRM
    • Dados de vendas em outro sistema
    • Informações de produtos em um ERP
    • Dados de RH em um sistema específico
  • A tomada de decisão gerencial exige integração desses dados

  • Exemplo: Para analisar a rentabilidade por cliente, precisamos combinar:

    • Perfil do cliente (tabela de clientes)
    • Histórico de compras (tabela de vendas)
    • Margens dos produtos (tabela de produtos)
  • Joins são operações fundamentais para esta integração

CRISP-DM e Joins

Joins na Fase 3 (Preparação dos Dados) do CRISP-DM

  • Joins são operações fundamentais na Fase 3 (Preparação dos Dados) de CRISP-DM, permitindo:

  • Integrar dados fragmentados que estão distribuídos em múltiplas tabelas relacionadas entre si

  • Consolidar informações de diferentes fontes ou sistemas para análise (vendas + produtos + clientes)

  • Enriquecer dados principais com informações contextuais adicionais (ex: adicionar categoria de produto aos dados de vendas)

  • Completar o ciclo de preparação iniciado com:

    • Importação de dados (read_csv(), read_xlsx())
    • Organização de dados (pivot_longer()) para análise
    • Limpeza de dados (rename()``,as.___()`)
    • Filtragem (filter()) e seleção (select()) de dados relevantes
    • Transformação de dados (mutate()) para criar novas variáveis
    • Manipulação de dados ( group_by(), summarize() e arrange())
    • Joins: integrando múltiplas fontes em um arquivo de dados coeso
  • Dados bem integrados facilitam as Fases 4 e 5 (Modelagem e Avaliação) por fornecerem uma visão completa do problema

Joins no dplyr

O que são joins?

  • Joins são operações que combinam duas tabelas de dados

  • Em termos simples, joins são como “colar” duas tabelas lado a lado, combinando linhas que têm valores em comum, como um “código de cliente” ou “código de produto”

  • No pacote dplyr, temos funções específicas para cada tipo de join:

    • left_join(): Mantém todas as linhas da tabela da esquerda
    • inner_join(): Mantém apenas correspondências entre as tabelas
    • full_join(): Mantém todas as linhas de ambas as tabelas
    • right_join(): Mantém todas as linhas da tabela da direita
  • São essenciais quando precisamos combinar informações que estão separadas

Dados de Exemplo para Aula

Tabela produtos

# Cria a tabela de produtos
produtos <- tribble(
  ~codigo_produto, ~nome_produto,      ~preco_unitario, ~categoria,
  "P001",         "Notebook Pro",      4500,           "Eletrônicos",
  "P002",         "Smartphone X",      2800,           "Eletrônicos",
  "P003",         "Monitor 24pol",     1200,           "Informática",
  "P004",         "Mouse Gamer",       250,            "Informática",
  "P005",         "Cadeira Ergonômica", 950,           "Mobiliário"
)

# exibe a tabela
produtos
# A tibble: 5 × 4
  codigo_produto nome_produto       preco_unitario categoria  
  <chr>          <chr>                       <dbl> <chr>      
1 P001           Notebook Pro                 4500 Eletrônicos
2 P002           Smartphone X                 2800 Eletrônicos
3 P003           Monitor 24pol                1200 Informática
4 P004           Mouse Gamer                   250 Informática
5 P005           Cadeira Ergonômica            950 Mobiliário 

Dados de Exemplo para Aula

Tabela vendas

# Cria a tabela de vendas
vendas <- tribble(
  ~id_venda, ~codigo_produto, ~id_cliente, ~data_venda,  ~quantidade,
  1,         "P001",          "C001",      "2025-04-15", 1,
  2,         "P002",          "C002",      "2025-04-16", 2,
  3,         "P003",          "C001",      "2025-04-18", 2,
  4,         "P002",          "C003",      "2025-04-20", 1,
  5,         "P006",          "C002",      "2025-04-22", 3,
  6,         "P004",          "C004",      "2025-04-23", 4
)

# exibe a tabela
vendas
# A tibble: 6 × 5
  id_venda codigo_produto id_cliente data_venda quantidade
     <dbl> <chr>          <chr>      <chr>           <dbl>
1        1 P001           C001       2025-04-15          1
2        2 P002           C002       2025-04-16          2
3        3 P003           C001       2025-04-18          2
4        4 P002           C003       2025-04-20          1
5        5 P006           C002       2025-04-22          3
6        6 P004           C004       2025-04-23          4

Dados de Exemplo para Aula

Tabela Clientes

# Crian a tabela de clientes 
clientes <- tribble(
  ~id_cliente, ~nome_cliente,     ~cidade,
  "C001",      "Empresa Alpha",   "São Paulo",
  "C002",      "Empresa Beta",    "Rio de Janeiro",
  "C003",      "João Silva",      "Belo Horizonte",
  "C005",      "Maria Oliveira",  "Recife"
)

# exibe a tabela
clientes
# A tibble: 4 × 3
  id_cliente nome_cliente   cidade        
  <chr>      <chr>          <chr>         
1 C001       Empresa Alpha  São Paulo     
2 C002       Empresa Beta   Rio de Janeiro
3 C003       João Silva     Belo Horizonte
4 C005       Maria Oliveira Recife        

Dados de Exemplo para Aula

Dados dos Exemlos

produtos
# A tibble: 5 × 4
  codigo_produto nome_produto       preco_unitario categoria  
  <chr>          <chr>                       <dbl> <chr>      
1 P001           Notebook Pro                 4500 Eletrônicos
2 P002           Smartphone X                 2800 Eletrônicos
3 P003           Monitor 24pol                1200 Informática
4 P004           Mouse Gamer                   250 Informática
5 P005           Cadeira Ergonômica            950 Mobiliário 
vendas
# A tibble: 6 × 5
  id_venda codigo_produto id_cliente data_venda quantidade
     <dbl> <chr>          <chr>      <chr>           <dbl>
1        1 P001           C001       2025-04-15          1
2        2 P002           C002       2025-04-16          2
3        3 P003           C001       2025-04-18          2
4        4 P002           C003       2025-04-20          1
5        5 P006           C002       2025-04-22          3
6        6 P004           C004       2025-04-23          4
clientes
# A tibble: 4 × 3
  id_cliente nome_cliente   cidade        
  <chr>      <chr>          <chr>         
1 C001       Empresa Alpha  São Paulo     
2 C002       Empresa Beta   Rio de Janeiro
3 C003       João Silva     Belo Horizonte
4 C005       Maria Oliveira Recife        

Observe que há dados “imperfeitos”:

  • Produto “P006” está nas vendas, mas não na tabela de produtos
  • Cliente “C004” está nas vendas, mas não na tabela de clientes
  • Cliente “C005” está na tabela de clientes, mas não tem vendas

Chaves em Joins - Conceito Básico

Como tabelas se relacionam

  • Chaves são as colunas usadas para combinar as tabelas

  • Na prática:

    • A tabela de clientes tem um “codigo_cliente” único para cada cliente

    • A tabela de vendas usa esse mesmo “codigo_cliente” para indicar qual cliente fez cada compra

    • O “codigo_cliente” é a “chave” que permite combinar as informações das duas tabelas

  • Nas funções de join do dplyr, as chaves são especificadas pelo argumento by

Tipos de Chaves em Bancos de Dados Relacionais

Chaves Primárias e Estrangeiras

  • Chave primária: Identificador único para cada registro em uma tabela

    • Ex: codigo_cliente na tabela de clientes identifica unicamente cada cliente
    • Não pode conter valores duplicados ou nulos
  • Chave estrangeira: Coluna que referencia a chave primária de outra tabela

    • Ex: codigo_cliente na tabela de vendas é uma chave estrangeira
    • Estabelece relações entre tabelas e mantém a integridade referencial
  • Analogia: Pense em chaves como um sistema de CPF

    • A chave primária é como o CPF único de cada pessoa
    • A chave estrangeira é como mencionar o CPF de alguém em um documento
    • Os joins são como reunir documentos diferentes sobre a mesma pessoa usando seu CPF

Diagrama de Relações com Chaves

Visualizando a relação entre tabelas

Tabela CLIENTES                 Tabela VENDAS
+--------------+            +---------------+
| codigo_cliente| <--------- |codigo_cliente |  
| nome_cliente  |            | id_venda      |
| cidade        |            | data_venda    |
+--------------+            +---------------+
   Chave Primária             Chave Estrangeira
  • Integridade referencial: Garante que relações entre tabelas permaneçam válidas
    • Impede a criação de vendas para clientes inexistentes
    • Fundamental para a confiabilidade dos dados em sistemas empresariais

Exemplos Comuns de Chaves

Chaves em sistemas empresariais

Exemplos comuns de chaves em sistemas de informação empresariais:

  • “codigo_produto” para relacionar produtos e vendas
  • “codigo_funcionario” para relacionar funcionários e departamentos
  • “numero_pedido” para relacionar pedidos e itens de pedido
  • “codigo_fiscal” para relacionar notas fiscais e itens fiscais
  • “matricula_aluno” em sistemas educacionais
  • “numero_prontuario” em sistemas de saúde

A identificação correta das chaves é fundamental para o sucesso de joins e para garantir a integridade das análises de dados.

Desafios com Chaves em Joins

Problemas comuns ao trabalhar com chaves

  • Chaves duplicadas:

    • Podem gerar múltiplas linhas no resultado (multiplicação de dados)
    • Exemplo: Um cliente vinculado a várias vendas resulta em múltiplas linhas
  • Chaves ausentes:

    • Resultam em valores NA quando usando left, right ou full joins
    • Exemplo: Vendas sem cliente cadastrado ou produtos sem vendas
  • Inconsistência de tipos:

    • Problemas quando a mesma chave tem tipos diferentes em tabelas distintas
    • Exemplo: código armazenado como texto em uma tabela e número em outra
  • Diferenças de nomenclatura:

    • Quando a mesma informação tem nomes diferentes em sistemas distintos
    • Requer especificação explícita: by = c("codigo_produto" = "codigo")

Sintaxe Básica dos Joins

Como usar joins no dplyr (simplificado)

# Formato básico (simples)
resultado <- x %>% 
  tipo_join(y, by = "coluna_comum")

# Exemplo com nossas tabelas
vendas_com_produtos <- vendas %>%
  left_join(produtos, by = "codigo_produto")

O que cada parte significa:

  • vendas: A primeira tabela (tabela da esquerda)
  • produtos: A segunda tabela (tabela da direita)
  • by = "codigo_produto": A coluna comum que existe em ambas as tabelas
  • left_join: O tipo de join que queremos usar
  • vendas_com_produtos: O resultado da combinação que salvaremos

Visão Geral dos Joins

Em resumo:

Tipo de Join Função no dplyr Quando usar
Left join left_join() Quando você precisa manter todos os registros da tabela principal (à esquerda)
Inner join inner_join() Quando você precisa apenas dos registros que existem em ambas as tabelas
Full join full_join() Quando você precisa de todos os dados, independentemente de correspondências
Right join right_join() Quando você precisa manter todos os registros da tabela secundária (à direita)

Left Join

Função left_join()

resultado <- x %>% 
  left_join(y, by = "chave")

Características do Left Join

  • Mantém todos os registros da tabela da esquerda (primeira tabela)

  • Para registros sem correspondência na tabela da direita, preenche com NA

  • Quando usar:

    • Quando a primeira tabela é sua tabela principal
    • Quando você precisa preservar todos os registros da primeira tabela
    • Quando você quer adicionar informações extras à sua tabela principal
  • Exemplo: Manter todas as vendas e adicionar dados dos produtos

Exemplo: Left Join

Left Join entre Vendas e Produtos

# Left join: todas as vendas, mesmo sem correspondência na tabela de produtos
# Passo 1: Pegamos a tabela 'vendas' 
# Passo 2: Mantemos TODAS as vendas e adicionamos dados de produtos quando existirem
vendas_produtos_left <- vendas %>%
  left_join(produtos, by = "codigo_produto")

# Visualizando o resultado
vendas_produtos_left
# A tibble: 6 × 8
  id_venda codigo_produto id_cliente data_venda quantidade nome_produto 
     <dbl> <chr>          <chr>      <chr>           <dbl> <chr>        
1        1 P001           C001       2025-04-15          1 Notebook Pro 
2        2 P002           C002       2025-04-16          2 Smartphone X 
3        3 P003           C001       2025-04-18          2 Monitor 24pol
4        4 P002           C003       2025-04-20          1 Smartphone X 
5        5 P006           C002       2025-04-22          3 <NA>         
6        6 P004           C004       2025-04-23          4 Mouse Gamer  
# ℹ 2 more variables: preco_unitario <dbl>, categoria <chr>

Observe que:

  • Agora a venda do produto “P006” (id_venda 5) aparece no resultado

  • Como esse produto não existe na tabela de produtos, a coluna de produtos contém NA

  • O left_join é o join mais comum - preserva todos os registros da tabela principal

Inner Join

Função inner_join()

resultado <- x %>% 
  inner_join(y, by = "chave")

Características do Inner Join

  • Mantém apenas os registros que possuem correspondência em ambas as tabelas

  • Descarta linhas que não têm correspondência

  • Quando usar:

    • Quando você precisa garantir que todos os registros tenham informações completas

    • Quando registros sem correspondência não são relevantes para sua análise

  • Exemplo: Relatório de vendas que precisa mostrar dados do produto

Exemplo: Inner Join

Inner Join entre Vendas e Produtos

# Inner join: apenas vendas de produtos que existem no cadastro
# Passo 1: Pegamos a tabela 'vendas'
# Passo 2: Combinamos com a tabela 'produtos' usando codigo_produto
vendas_produtos <- vendas %>%
  inner_join(produtos, by = "codigo_produto")

# Visualizando o resultado
vendas_produtos
# A tibble: 5 × 8
  id_venda codigo_produto id_cliente data_venda quantidade nome_produto 
     <dbl> <chr>          <chr>      <chr>           <dbl> <chr>        
1        1 P001           C001       2025-04-15          1 Notebook Pro 
2        2 P002           C002       2025-04-16          2 Smartphone X 
3        3 P003           C001       2025-04-18          2 Monitor 24pol
4        4 P002           C003       2025-04-20          1 Smartphone X 
5        6 P004           C004       2025-04-23          4 Mouse Gamer  
# ℹ 2 more variables: preco_unitario <dbl>, categoria <chr>

Observe que:

  • A venda do produto “P006” (id_venda 5) não aparece no resultado
  • Isso acontece porque esse produto não existe na tabela de produtos
  • O inner_join mantém apenas as vendas de produtos que existem no cadastro

Full Join

Função full_join()

resultado <- x %>% 
  full_join(y, by = "chave")

Características do Full Join

  • Mantém todos os registros de ambas as tabelas

  • Para registros sem correspondência em qualquer tabela, preenche com NA

  • Quando usar:

    • Quando você precisa de uma visão completa de todos os dados
    • Quando quer identificar inconsistências entre tabelas
    • Quando é importante não perder nenhum registro de nenhuma tabela
  • Exemplo: Relatório completo de produtos e vendas

Exemplo: Full Join

Full Join entre Vendas e Produtos

# Full join: todas as vendas e todos os produtos
# Passo 1: Pegamos a tabela 'vendas'
# Passo 2: Combinamos com produtos mantendo TUDO de ambas as tabelas
completo_vendas_produtos <- vendas %>%
  full_join(produtos, by = "codigo_produto")

# Visualizando o resultado
completo_vendas_produtos
# A tibble: 7 × 8
  id_venda codigo_produto id_cliente data_venda quantidade nome_produto      
     <dbl> <chr>          <chr>      <chr>           <dbl> <chr>             
1        1 P001           C001       2025-04-15          1 Notebook Pro      
2        2 P002           C002       2025-04-16          2 Smartphone X      
3        3 P003           C001       2025-04-18          2 Monitor 24pol     
4        4 P002           C003       2025-04-20          1 Smartphone X      
5        5 P006           C002       2025-04-22          3 <NA>              
6        6 P004           C004       2025-04-23          4 Mouse Gamer       
7       NA P005           <NA>       <NA>               NA Cadeira Ergonômica
# ℹ 2 more variables: preco_unitario <dbl>, categoria <chr>

Observe que:

  • A venda do produto “P006” que não existe na tabela de produtos aparece com NAs

  • O produto “P005” que não tem vendas também aparece com NAs

  • O full_join é útil para ver “tudo junto” e identificar inconsistências

Right Join

Função right_join()

resultado <- x %>% 
  right_join(y, by = "chave")

Características do Right Join

  • Mantém todos os registros da tabela da direita (segunda tabela)

  • Para registros sem correspondência na tabela da esquerda, preenche com NA

  • Quando usar:

    • Quando a segunda tabela é sua tabela principal

    • Quando você precisa garantir que todos os registros da segunda tabela estejam presentes

    • Na prática, muitas vezes é mais fácil usar left_join invertendo a ordem das tabelas

  • Exemplo: Ver todos os produtos, mesmo os que não foram vendidos

Exemplo: Right Join

Right Join entre Vendas e Produtos

# Right join: todos os produtos, mesmo sem vendas
# Passo 1: Pegamos a tabela 'vendas'
# Passo 2: Combinamos com TODOS os produtos, mesmo os sem vendas
produtos_vendas_right <- vendas %>%
  right_join(produtos, by = "codigo_produto")

# Visualizando o resultado
produtos_vendas_right
# A tibble: 6 × 8
  id_venda codigo_produto id_cliente data_venda quantidade nome_produto      
     <dbl> <chr>          <chr>      <chr>           <dbl> <chr>             
1        1 P001           C001       2025-04-15          1 Notebook Pro      
2        2 P002           C002       2025-04-16          2 Smartphone X      
3        3 P003           C001       2025-04-18          2 Monitor 24pol     
4        4 P002           C003       2025-04-20          1 Smartphone X      
5        6 P004           C004       2025-04-23          4 Mouse Gamer       
6       NA P005           <NA>       <NA>               NA Cadeira Ergonômica
# ℹ 2 more variables: preco_unitario <dbl>, categoria <chr>

Observe que:

  • Agora o produto “P005” (Cadeira Ergonômica) aparece no resultado
  • Como esse produto não tem vendas, as colunas de vendas aparecem com NA
  • O right_join é útil para identificar produtos sem movimento

Exemplo: Combinando Três Tabelas

Combinando vendas, produtos e clientes

# Passo 1: Combinamos vendas com produtos
# Passo 2: Depois combinamos o resultado com clientes
relatorio_completo <- vendas %>%
  # Primeiro, adicionamos informações de produtos
  left_join(produtos, by = "codigo_produto") %>%
  # Depois, adicionamos informações de clientes
  left_join(clientes, by = "id_cliente") %>%
  # Selecionamos apenas as colunas mais importantes para o relatório
  select(
    id_venda, data_venda, 
    id_cliente, nome_cliente, cidade,
    codigo_produto, nome_produto, 
    quantidade, preco_unitario
  )

# Visualizando o resultado
print(relatorio_completo, n = Inf)
# A tibble: 6 × 9
  id_venda data_venda id_cliente nome_cliente cidade codigo_produto nome_produto
     <dbl> <chr>      <chr>      <chr>        <chr>  <chr>          <chr>       
1        1 2025-04-15 C001       Empresa Alp… São P… P001           Notebook Pro
2        2 2025-04-16 C002       Empresa Beta Rio d… P002           Smartphone X
3        3 2025-04-18 C001       Empresa Alp… São P… P003           Monitor 24p…
4        4 2025-04-20 C003       João Silva   Belo … P002           Smartphone X
5        5 2025-04-22 C002       Empresa Beta Rio d… P006           <NA>        
6        6 2025-04-23 C004       <NA>         <NA>   P004           Mouse Gamer 
# ℹ 2 more variables: quantidade <dbl>, preco_unitario <dbl>

Observe como:

  • Combinamos três tabelas em sequência
  • Usamos left_join para manter todas as vendas
  • Algumas informações têm NA quando não há correspondência

Dicas para Uso Eficiente de Joins

Dicas práticas para iniciantes

  1. Conheça seus dados antes de combinar:

    • Verifique se as tabelas têm as “chaves” correspondentes
    • Entenda o que significam valores ausentes (NAs)
  2. Filtre antes de combinar:

    • Se você só precisa de alguns dados, filtre-os antes de fazer joins
    • Isso torna a análise mais rápida e clara
  3. Verifique o resultado:

    • O número de linhas faz sentido?
    • Há valores NA inesperados?
    • Os totais parecem corretos?
  4. Na dúvida, use left_join:

    • É o mais comum e seguro para iniciantes
    • Mantém todos os registros da tabela principal

O Desafio dos Sistemas Reais

Situação Comum em Ambientes Empresariais

No mundo ideal, todos os sistemas usariam os mesmos nomes para as mesmas informações…

Mas na prática:

  • O sistema de Vendas pode usar codigo_produto
  • O Cadastro de Produtos pode usar codigo
  • O ERP pode usar cod_prod
  • O sistema legado pode usar id_produto

Resultado: Tentar unir estas tabelas com a sintaxe básica falha:

# Esta tentativa falha:
vendas %>% 
  left_join(produtos, by = "codigo_produto") 
  
# ERRO: 'codigo_produto' não encontrado em 'produtos'

Como resolver este problema comum?

A Solução

Sintaxe para Colunas com Nomes Diferentes

O dplyr permite especificar explicitamente quais colunas devem ser correspondidas:

# Sintaxe para colunas com nomes diferentes
tabela1 %>%
  left_join(tabela2, by = c("nome_na_tabela1" = "nome_na_tabela2"))

Como interpretar:

  • "nome_na_tabela1": Nome da coluna na primeira tabela (esquerda)
  • "nome_na_tabela2": Nome da coluna na segunda tabela (direita)
  • O operador = estabelece a correspondência entre as colunas

Analogia: Você está criando um “dicionário de tradução” entre os sistemas:

  • “Quando eu digo codigo_produto, você entende codigo

Exemplo

Cenário: Relatório de Vendas Integrado

# Sistema de Cadastro de Produtos (departamento de Compras)
produtos_cadastro <- tribble(
  ~codigo,       ~descricao,        ~valor_unitario, ~categoria,
  "P001",        "Notebook Pro",     4500,           "Eletrônicos",
  "P002",        "Smartphone X",     2800,           "Eletrônicos",
  "P003",        "Monitor 24pol",    1200,           "Informática"
)

# Sistema de Vendas (departamento Comercial)
vendas_sistema <- tribble(
  ~id_venda, ~cod_produto, ~data_venda,  ~qtd,
  1,         "P001",       "2025-04-15", 1,
  2,         "P002",       "2025-04-16", 2,
  3,         "P003",       "2025-04-18", 2
)

# Integrando os sistemas com diferentes nomenclaturas
relatorio_vendas <- vendas_sistema %>%
  left_join(produtos_cadastro, by = c("cod_produto" = "codigo")) %>%
  select(id_venda, data_venda, cod_produto, descricao, qtd, valor_unitario) %>%
  mutate(valor_total = qtd * valor_unitario) %>%
  arrange(data_venda)

# Resultado: um relatório integrado
relatorio_vendas
# A tibble: 3 × 7
  id_venda data_venda cod_produto descricao       qtd valor_unitario valor_total
     <dbl> <chr>      <chr>       <chr>         <dbl>          <dbl>       <dbl>
1        1 2025-04-15 P001        Notebook Pro      1           4500        4500
2        2 2025-04-16 P002        Smartphone X      2           2800        5600
3        3 2025-04-18 P003        Monitor 24pol     2           1200        2400

Observação: Esta situação é extremamente comum.

Exercício 1

Identifique o join mais adequado para cada cenário

Para cada situação abaixo, identifique qual tipo de join seria mais apropriado: left_join, inner_join, full_join ou right_join:

  1. Relatório de Vendas: Você precisa criar um relatório mostrando todas as vendas realizadas com detalhes dos produtos. Algumas vendas têm códigos de produtos que não existem no cadastro, mas você precisa manter TODAS as vendas no relatório.

  2. Análise de Estoque: O gerente de inventário solicitou uma lista de todos os produtos cadastrados, indicando quais foram vendidos no último mês. É importante que TODOS os produtos apareçam, mesmo os que não tiveram vendas.

  3. Auditoria de Qualidade: O auditor precisa verificar se há inconsistências entre vendas e produtos. Ele solicitou uma análise que mostre TODAS as vendas e TODOS os produtos, permitindo identificar vendas sem produtos cadastrados e produtos sem vendas.

  4. Dashboard de Performance: O diretor comercial pediu um dashboard que mostre apenas vendas confirmadas com informações completas de cliente e produto. Registros com informações incompletas devem ser excluídos.

Dica: Pense em quais tabelas são “obrigatórias” e quais são “opcionais” em cada cenário!

Exercício 2

Joins Simples - Lista de vendas com nome do produto

Você precisa criar uma lista simples que mostre, para cada venda, o nome do produto vendido:

  1. Una as tabelas de vendas e produtos
  2. Selecione apenas as colunas id_venda, data_venda, nome_produto e quantidade
  3. Ordene por data_venda
# Complete o código
lista_vendas_produtos <- vendas %>%
  # 1. Escolha o tipo de join adequado para manter todas as vendas
  ___(produtos, by = "codigo_produto") %>%
  # 2. Selecione apenas as colunas importantes
  select(
    id_venda, 
    data_venda, 
    nome_produto,
    quantidade
  ) %>%
  # 3. Ordene por data da venda
  arrange(___)

Dica: Pense em qual tipo de join deve usar. Você quer manter todas as vendas mesmo sem produto cadastrado ou apenas as vendas de produtos conhecidos?

Exercício 3

Relatório de clientes e suas compras

Crie um relatório que mostre todos os clientes, mesmo aqueles que não fizeram compras:

  1. Una as tabelas de clientes e vendas de forma a manter todos os clientes

  2. Selecione as colunas id_cliente, nome_cliente, cidade, id_venda e data_venda

  3. Ordene por nome_cliente

# Complete o código
relatorio_clientes <- clientes %>%
  # 1. Escolha o tipo de join adequado para manter todos os clientes
  ___(vendas, by = "id_cliente") %>%
  # 2. Selecione apenas as colunas importantes
  select(
    id_cliente,
    nome_cliente,
    cidade,
    id_venda,
    data_venda
  ) %>%
  # 3. Ordene por nome do cliente
  arrange(___)

Dica: Como queremos manter todos os clientes, mesmo os que não fizeram compras, qual tipo de join devemos usar?

Exercício 4

Relatório de Valor Total por Venda

  • Qual função de join e quais operações de manipulação de dados seriam necessárias para criar um relatório financeiro que mostre todas as vendas com o valor total calculado (quantidade × preço unitário), incluindo vendas de produtos que podem não estar cadastrados?

  • O diretor financeiro solicitou um relatório simplificado que mostre o valor total de cada venda:

# Complete o código para calcular o valor total de cada venda
relatorio_financeiro <- vendas %>%
  # Combine vendas com produtos usando left_join
  left_join(produtos, by = "___") %>%
  # Calcule o valor total da venda
  mutate(valor_total = ___) %>%
  # Selecione apenas as colunas relevantes para o relatório
  select(
    id_venda, 
    data_venda,
    codigo_produto, 
    nome_produto,
    quantidade, 
    preco_unitario,
    valor_total
  ) %>%
  # Ordene do maior valor total para o menor
  arrange(___)

Perguntas para reflexão:

  1. Qual foi a venda de maior valor?
  2. O que acontece com as vendas de produtos não cadastrados?
  3. Como este relatório poderia ajudar na tomada de decisões comerciais?

Resumo: Joins

Pontos-chave para lembrar

  1. Joins unem tabelas que estão separadas

    • Combinam dados de clientes, produtos, vendas, etc.
    • Permitem análises mais completas e informativas
  2. Os tipos mais importantes são:

    • left_join(): Mantém todos os registros da tabela principal (o mais usado)
    • inner_join(): Mantém apenas registros com correspondência em ambas tabelas
    • full_join(): Mantém todos os registros de ambas as tabelas
  3. Na prática, left_join é o mais comum:

    • Mantém todos os registros da tabela principal
    • Adiciona informações complementares quando disponíveis
    • Evita a perda de registros importantes
  4. Comece simples e avance gradualmente:

    • Primeiro faça joins entre duas tabelas
    • Depois adicione mais tabelas conforme necessário
    • Verifique os resultados a cada passo

Resumo dos Joins

Guia Rápido de Joins no dplyr

Tipo de Join Função Resultado Quando Usar Analogia de Negócios
Inner Join inner_join() Apenas registros com correspondência Análises que exigem dados completos Relatório com apenas vendas confirmadas
Left Join left_join() Todos os registros da tabela esquerda Manter a tabela principal intacta Relatório de todas as vendas (com ou sem produto cadastrado)
Right Join right_join() Todos os registros da tabela direita Quando a 2ª tabela é a principal Catálogo com todos os produtos (vendidos ou não)
Full Join full_join() Todos os registros de ambas as tabelas Análises completas e auditorias Verificação de inconsistências no sistema

Dica para lembrar: Pense no “lado” que você quer preservar:

  • Inner = Só o que está nos dois lados
  • Left = Tudo do lado esquerdo (1ª tabela)
  • Right = Tudo do lado direito (2ª tabela)
  • Full = Tudo de ambos os lados

Sintaxe Comparativa

Estrutura comum dos diferentes tipos de joins

# LEFT JOIN: todos os registros da tabela1

tabela1 %>% 
  left_join(tabela2, by = "coluna_comum")

# INNER JOIN: apenas registros com correspondência

tabela1 %>% 
  inner_join(tabela2, by = "coluna_comum")

# FULL JOIN: todos os registros de ambas as tabelas

tabela1 %>% 
  full_join(tabela2, by = "coluna_comum")

# RIGHT JOIN: todos os registros da tabela2

tabela1 %>% 
  right_join(tabela2, by = "coluna_comum")

Observe que:

  1. A estrutura básica é idêntica para todos os joins:

    • Comece com a primeira tabela
    • Use o operador pipe %>%
    • Aplique a função de join
    • Adicione a segunda tabela e a coluna comum
  2. Só muda o nome da função, que indica qual tipo de join realizar:

    • inner_join, left_join, right_join ou full_join
  3. Quando as colunas têm nomes diferentes, use esta sintaxe:

# Quando colunas têm nomes diferentes nas tabelas
vendas %>% 
  left_join(produtos, by = c("codigo_produto" = "codigo"))
#            ^ coluna na tabela vendas   ^ coluna na tabela produtos

Onde Aplicar Joins

Aplicações práticas em Administração

  • Finanças:

    • Unir dados de vendas com custo de produtos para calcular margens
    • Combinar pagamentos com faturas para análise de fluxo de caixa
  • Marketing:

    • Relacionar campanhas com vendas para medir eficácia
    • Unir dados de clientes com comportamento de compra para segmentação
  • Recursos Humanos:

    • Combinar dados de funcionários com departamentos
    • Unir registros de treinamento com avaliações de desempenho
  • Logística:

    • Integrar pedidos com status de entrega
    • Combinar dados de produtos com níveis de estoque
  • Vendas:

    • Unir vendas com produtos e clientes para relatórios completos
    • Combinar metas com desempenho real para análise de performance

Joins: Bibliografia Recomendada

Atualizando os Repositórios

Instruções

  1. No terminal do RStudio, verifique quais arquivos/pastas foram modificados ou criados com:
git status
  1. Você pode adicionar todos os arquivos de uma vez com:
git add .
  1. Execute git status novamente para confirmar que todos os arquivos foram adicionados (aparecerão em verde sob “Changes to be committed”):
git status
  1. Se tudo estiver em verde, faça um commit com uma mensagem descritiva:
git commit -m "atualizacoes aula 14"
  1. Se algum arquivo ou pasta ainda aparecer em vermelho após o segundo git status, adicione as pastas/arquivos um por um:
git add relatorios/04-relatorio/04-relatorio.qmd
  1. Execute git status novamente e faça o commit quando todos os arquivos estiverem em verde:
git commit -m "atualizacoes aula 14"
  1. Envie o repositório local atualizado para o GitHub:
git push origin main