Mestrado Profissional em Administração
IFMG - Campus Formiga
8 de maio de 2025
O que vimos até aqui?
Aula 1 ✅
Aula 2 ✅
Aula 3 ✅
Aula 4 ✅
Conceitos de Variáveis e Observações em Estatística ✅
Conceito de Dados Organizados (Tidy Data) ✅
Tipos atômicos e classes principais de dados da linguagem R ✅
Tipos de Dados Tradicionais em Finanças: ✅
Importação e Preparação de Dados Típicos de Finanças com exemplos práticos ✅
Tópicos
Diretrizes para Aulas Mais Produtivas
⌨️ Código com método:
95% dos erros são evitáveis com:
🤝 Inteligência colaborativa:
💪 Capacidade de Resolver Problemas
Cada erro resolvido é uma evolução da sua habilidade analítica
Figura 1: Fase 2 (Compreensão dos Dados) e Fase 3 (Preparação dos dados) consomem entre 60-80% do tempo de um projeto de análise ou ciência de dados
Descrição
O tidyverse é um ecossistema coerente de pacotes R para ciência de dados que compartilham uma filosofia de design e gramática comuns.
Desenvolvido por Hadley Wickham e mantido pela Posit, o tidyverse facilita todo o fluxo de trabalho de análise de dados através de pacotes integrados.
Alguns dos Principais Pacotes do tidyverse:
readr/readxl: Importação eficiente de dados retangulares
tidyr: Estruturação de dados no formato “tidy” (pivot_longer, pivot_wider)
dplyr: Manipulação de dados com verbos intuitivos (filter, select, mutate)
ggplot2/gt: Visualização de dados baseada na gramática dos gráficos
O tidyverse implementa o princípio de “tidy data”, criando um fluxo de trabalho coeso através do operador pipe (%>% ou |>).
Figura 2: Os pacotes do tidyverse implementam cada fase de CRISP-DM, transformando princípios metodológicos abstratos em ferramentas computacionais que agilizam o processo científico de análise de dados
Conceito de Dados Organizados (Tidy Data)
O conceito de Tidy Data (Dados Organizados) foi formalizado por Hadley Wickham.
Um arquivo de dados organizado possui a seguinte estrutura:
A Figura 1 ilustra o conceito de dados organizados visualmente.
Figura 3: Dados Organizados
Benefícios de Dados Organizados
Adequação para Ferramentas: Formato de armazenamento de dados adequado para análise em linguagens (R/Python) e softwares de análise de dados.
Consistência: Estrutura uniforme para todos os conjuntos de dados
Facilidade para operações comuns:
Dados Financeiros Desorganizados Típicos
Colunas contendo valores: Nomes de colunas contendo valores de uma ou mais variáveis.
Versão Organizada dos Dados Anteriores:
| Empresa | Ano | Valor |
|-----------|------|---------|
| Empresa A | 2020 | 350.000 |
| Empresa A | 2021 | 425.000 |
| Empresa A | 2022 | 510.000 |
| Empresa B | 2020 | 780.000 |
| Empresa B | 2021 | 815.000 |
| Empresa B | 2022 | 840.000 |
| Empresa C | 2020 | 540.000 |
| Empresa C | 2021 | 490.000 |
| Empresa C | 2022 | 620.000 |
Características:
Tipos de “Desorganização” Comuns em Administração
Múltiplas variáveis em uma coluna: Uma coluna contendo mais de uma variável
| Nome_Empresa (Ano) | Receita | Despesa |
|--------------------|---------------|---------------|
| Empresa A (2020) | R$ 350.000,00 | R$ 290.000,00 |
| Empresa A (2021) | R$ 425.000,00 | R$ 320.000,00 |
| Empresa B (2020) | R$ 780.000,00 | R$ 710.000,00 |
| Empresa B (2021) | R$ 815.000,00 | R$ 735.000,00 |
Múltiplas variáveis em uma coluna:
| Empresa | T1 2023 | T2 2023 | T3 2023 | T4 2023 |
|------------|---------|---------|---------|---------|
| TechSoft | 25.3 | 31.7 | 28.4 | 35.2 |
| VarejoMax | 12.8 | 15.4 | 19.3 | 22.7 |
| FinGroup | 41.6 | 38.9 | 45.2 | 51.8 |
Problemas:
Versão Organizada dos Dados:
| Empresa | Trimestre | Ano | Lucro_Liquido |
|-----------|-----------|------|---------------|
| TechSoft | T1 | 2023 | 25.3 |
| TechSoft | T2 | 2023 | 31.7 |
| TechSoft | T3 | 2023 | 28.4 |
| TechSoft | T4 | 2023 | 35.2 |
| VarejoMax | T1 | 2023 | 12.8 |
| VarejoMax | T2 | 2023 | 15.4 |
| VarejoMax | T3 | 2023 | 19.3 |
| VarejoMax | T4 | 2023 | 22.7 |
| FinGroup | T1 | 2023 | 41.6 |
| FinGroup | T2 | 2023 | 38.9 |
| FinGroup | T3 | 2023 | 45.2 |
| FinGroup | T4 | 2023 | 51.8 |
Tipos de “Desorganização” Comuns em Administração
Variáveis em linhas e colunas
Versão Organizada dos Dados:
| Empresa | Indicador | Valor |
|------------|---------------------|-------------|
| Empresa XYZ| ROE | 0.152 |
| Empresa XYZ| Liquidez Corrente | 1.8 |
| Empresa XYZ| Lucro Líquido | 2500000 |
| Empresa XYZ| Patrimônio Líquido | 16400000 |
| Empresa XYZ| Ativo Circulante | 3600000 |
| Empresa XYZ| Passivo Circulante | 2000000 |
Por que a absoluta maioria dos arquivos de dados são desorganizados?
Por que a maioria das pessoas que trabalham na área de negócios não está familiarizada com os princípios da organização de dados para análise e utilizam planilhas eletrônicas para trabalhar com dados.
Planilhas de dados são frequentemente organizadas pensando em apresentar os dados ou para tornar a entrada de dados mais simples, não em um formato adequado para armazenamento e análise.
Isso significa que, para a maioria das análises reais, cientistas e analistas de dados dispendem muito tempo e esforço organizando e preparando dados elaborados por terceiros.
A primeira etapa é sempre descobrir quais são as observações e as variáveis associadas a cada observação.
Benefícios para Dissertações e Artigos Científicos
Dados organizados viabilizam e facilitam a:
Reprodutibilidade: Formato padronizado que outros pesquisadores podem entender e utilizar
Visualizações avançadas: Estrutura ideal para a criação de diversos tipos de tabelas e gráficos.
Análise econométrica: Adequação imediata para estudos e modelos econométricos em (regressão linear, painel, logit, probit etc.)
Broman e Woo (2018): Riscos para Armazenamento de Dados
Planilhas eletrônicas têm alto risco de erros: Em 13 auditorias de planilhas reais, uma média de 88% continham erros (Broman e Woo, 2018).
Problemas comuns incluem:
Conversão automática de formatos (ex: nomes de genes interpretados como datas)
Armazenamento de datas de forma diferente entre sistemas operacionais
Cálculos incorporados que podem corromper dados originais
A mistura de análise, visualização e armazenamento no mesmo arquivo aumenta o risco de comprometer os dados brutos e os resultados.
Mas dada a ubiquidade de planilhas nas organizações, caso precise usar planilhas para armazenar dados, siga as seguintes boas práticas:
Recomendações práticas para organizar dados em planilhas.
Artigo de Broman e Woo (2018)
Crie planilhas organizadas (uma linha = uma observação, uma coluna = uma variável, uma célula = um valor)
Seja consistente e escolha bons nomes para as variáveis:
snake_case
ou CamelCase
Lucro Líquido (R$)
😱lucro_liquido
ou LucroLiquido
😃Escreva datas conforme a Norma ISO 8601:
YYYY-MM-DD
, exemplo: 2025-05-07
Recomendações práticas para organizar dados em planilhas.
Sem células vazias: use hífen (-
) e no caso de usar R, use NA
Crie um dicionário dos dados
NUNCA faça cálculos na planilha dos dados originais/brutos
NUNCA use unidades de medida (R$), cor ou realce como um dado.
R$ 50.000,00
😱50000
😃10 %
😱O.1
😃Faça backups
Use validação dos dados para evitar erros
Salve os dados em arquivos de texto simples (.csv
):
Pacote tidyr
Na próxima seção, vamos aprender sobre como o pacote tidyr do tidyverse pode ser usado para tornar alguns tipos de dados desorganizados em dados organizados para análise.
O pacote tidyr no ecossistema tidyverse
O tidyr é um pacote do tidyverse para organizar dados desorganizados
Seu nome vem de “tidy” (organizado) + “r” (R)
Foi criado para facilitar a transformação de dados desorganizados em dados organizados (tidy data) para análise
É muito útil para a preparação de dados na fase 3 do CRISP-DM (Preparação dos Dados)
Permite que dados em formatos comuns de planilhas e relatórios sejam transformados em formatos adequados para análise e visualização
Pacote tidyr e a Fase 3 da CRISP-DM (Preparação de Dados)
Na prática, muitos dados corporativos estão em formatos desorganizados:
O pacote tidyr permite transformar esses dados desorganizados em dados organizados, essenciais para as fases seguintes do CRISP-DM:
A Principal função do pacote tidyr para nós
pivot_longer()
: Converte dados do formato amplo (onde valores de uma ou mais variáveis são espalhadas por colunas) em um formato longo (onde cada variável está em uma única coluna).
Útil quando você precisa de de dados para análise ou visualização
Ex: Transformar colunas de trimestres (Q1, Q2, Q3, Q4) em uma única coluna “trimestre”
Iremos estudar somente a função pivot_longer()
, porque o foco deste módulo é a preparação de dados para análise.
Mas há diversas outras funções úteis para a organização de dados:
Situações comuns em Administração
Quando você tem planilhas financeiras com colunas para diferentes períodos (meses, trimestres, anos)
Quando você recebe planilhas Excel organizadas para visualização humana, mas não para análise de dados.
Quando precisa combinar dados de diferentes fontes que estão em formatos incompatíveis.
Quando precisa preparar dados para visualizações específicas com ggplot2 (gráficos de linhas, facetas, etc.)
Quando realiza análises temporais e precisa converter entre formatos de data/hora.
Ao final desta seção, você será capaz de:
Aplicar a função pivot_longer() com seus parâmetros essenciais: cols
, names_to
e values_to
Organizar/Transformar dados complexos extraindo múltiplas informações de colunas
Integrar pivot_longer() em pipelines de análise com dplyr
Implementar soluções para casos reais de análise de dados administrativos
Transformando dados de formato amplo para longo
A função pivot_longer()
converte dados do formato amplo (wide) para o formato longo (long)
É muito útil quando as colunas contêm valores em vez de variáveis
Geralmente, é o primeiro passo para transformar planilhas de negócios em dados organizados para análise (tidy data)
A Figura 4 ilustra o uso desta função
Figura 4: Aplicando a função pivot_longer()
Como usar pivot_longer() na prática
valores_de_uma_nova_coluna: as colunas que contêm valores de uma variável e serão transformadas.
nome_nova_coluna: nome da nova coluna/variável que conterá os nomes das colunas originais.
nome_outra_nova_coluna: nome da nova coluna/variável que conterá os valores originais.
Descrição
Característica | pivot_longer() |
---|---|
Transforma | Colunas → Linhas |
Formato resultante | Longo (mais linhas) |
Quando usar | Para análise e visualização |
Exemplo típico | Transformar colunas de anos em uma variável “ano” |
Descrição
A função tribble()
(abreviação de “transposed tibble”) é uma forma elegante de criar pequenas tibbles/data frames para exemplos ou testes:
# Criando uma data frame com tribble() - "tibble transposta"
produtos <- tribble(
~codigo, ~produto, ~preco, # Nomes das colunas começam com ~
"A123", "Notebook", 3500, # Cada linha é um registro
"B456", "Smartphone", 1800, # Os valores são separados por vírgulas
"C789", "Monitor", 950 # A formatação facilita a leitura
)
# Visualizando a data frame criada
produtos
# A tibble: 3 × 3
codigo produto preco
<chr> <chr> <dbl>
1 A123 Notebook 3500
2 B456 Smartphone 1800
3 C789 Monitor 950
Vantagens da função tribble():
Layout Visual: Cada linha do código corresponde a uma linha da data frame, tornando o código mais legível
Especificação direta: Os nomes das colunas são definidos com ~ (til)
Flexibilidade de tipos: Cada coluna pode conter diferentes tipos de dados
Ideal para exemplos: Perfeita para criar pequenas data frames para demonstrações ou testes.
Esta função faz parte do pacote tibble
, que é carregado automaticamente quando você carrega o tidyverse
.
Dados de receita trimestral (formato amplo/wide)
# Criando a data frame de exemplo
receitas <- tribble(
~produto, ~T1, ~T2, ~T3, ~T4,
"Produto A", 50000, 55000, 60000, 65000,
"Produto B", 30000, 32000, 35000, 37000,
"Produto C", 20000, 22000, 25000, 27000
)
# Visualizando a data frame original (formato amplo/wide)
receitas
# A tibble: 3 × 5
produto T1 T2 T3 T4
<chr> <dbl> <dbl> <dbl> <dbl>
1 Produto A 50000 55000 60000 65000
2 Produto B 30000 32000 35000 37000
3 Produto C 20000 22000 25000 27000
Este formato é para apresentação, não para armazenamento e análise.
Transformando para o formato longo
# Transformando para o formato longo usando pivot_longer
receitas_longas <- receitas %>%
pivot_longer(
cols = c("T1", "T2", "T3", "T4"), # colunas que serão valores da nova coluna
names_to = "trimestre", # nome da nova coluna
values_to = "receita" # nome de outra nova coluna
)
# Visualizando o resultado (formato longo/long)
receitas_longas
# A tibble: 12 × 3
produto trimestre receita
<chr> <chr> <dbl>
1 Produto A T1 50000
2 Produto A T2 55000
3 Produto A T3 60000
4 Produto A T4 65000
5 Produto B T1 30000
6 Produto B T2 32000
7 Produto B T3 35000
8 Produto B T4 37000
9 Produto C T1 20000
10 Produto C T2 22000
11 Produto C T3 25000
12 Produto C T4 27000
Agora os dados estão organizados:
Dados de desempenho financeiro
# Criando a data frame com múltiplas métricas por trimestre
desempenho <- tribble(
~empresa, ~receita_T1, ~receita_T2, ~despesa_T1, ~despesa_T2,
"Empresa A", 150000, 175000, 120000, 130000,
"Empresa B", 250000, 270000, 200000, 220000,
"Empresa C", 100000, 115000, 80000, 95000
)
# Visualizando a data frame original
desempenho
# A tibble: 3 × 5
empresa receita_T1 receita_T2 despesa_T1 despesa_T2
<chr> <dbl> <dbl> <dbl> <dbl>
1 Empresa A 150000 175000 120000 130000
2 Empresa B 250000 270000 200000 220000
3 Empresa C 100000 115000 80000 95000
Este formato é ainda mais desorganizado, pois mistura três variáveis (receita, despesa e trimestre) nos nomes das colunas.
Transformando para o formato longo com dois níveis
# Transformando para o formato longo usando pivot_longer com nomes separados
desempenho_longo <- desempenho %>%
pivot_longer(
cols = -empresa, # todas as colunas exceto "empresa"
names_to = c("indicador", "trimestre"), # nomes das duas novas colunas
names_sep = "_", # separador nos nomes das colunas
values_to = "valor" # nome de nova coluna para receber os valores
)
# Visualizando o resultado
desempenho_longo
# A tibble: 12 × 4
empresa indicador trimestre valor
<chr> <chr> <chr> <dbl>
1 Empresa A receita T1 150000
2 Empresa A receita T2 175000
3 Empresa A despesa T1 120000
4 Empresa A despesa T2 130000
5 Empresa B receita T1 250000
6 Empresa B receita T2 270000
7 Empresa B despesa T1 200000
8 Empresa B despesa T2 220000
9 Empresa C receita T1 100000
10 Empresa C receita T2 115000
11 Empresa C despesa T1 80000
12 Empresa C despesa T2 95000
Observação importante:
Os nomes das colunas originais (receita_T1
, receita_T2
, etc.) são divididos pelo separador “_” em exatamente duas partes.
A primeira parte (“receita” ou “despesa”) vai para a coluna “indicador” e a segunda parte (“T1” ou “T2”) vai para a coluna “trimestre”.
Este é um padrão comum em dados financeiros: quando os nomes de colunas seguem um formato consistente com separadores, podemos extrair as informações contidas neles para criar novas variáveis.
Indicadores financeiros por trimestre
# Exemplo mais gerenciável para slides
receita_trimestral <- tribble(
~empresa, ~`2022_T1_Receita`, ~`2022_T2_Receita`, ~`2023_T1_Receita`, ~`2023_T2_Receita`,
"ABC Ltda", 1200000, 1350000, 1500000, 1620000,
"XYZ S.A.", 2500000, 2700000, 2900000, 3100000
)
# Visualizando a data frame original
receita_trimestral
# A tibble: 2 × 5
empresa `2022_T1_Receita` `2022_T2_Receita` `2023_T1_Receita`
<chr> <dbl> <dbl> <dbl>
1 ABC Ltda 1200000 1350000 1500000
2 XYZ S.A. 2500000 2700000 2900000
# ℹ 1 more variable: `2023_T2_Receita` <dbl>
Organizando dados financeiros complexos
# Transformando para o formato longo usando pivot_longer com três níveis
receita_trimestral_organizada <- receita_trimestral %>%
pivot_longer(
cols = -empresa, # todas as colunas exceto "empresa"
names_to = c("ano", "trimestre"), # nomes de duas novas colunas
names_sep = "_", # separador nos nomes das colunas
values_to = "receita" # nome de nova coluna para receber os valores da receita
)
# Visualizando o resultado
receita_trimestral_organizada
# A tibble: 8 × 4
empresa ano trimestre receita
<chr> <chr> <chr> <dbl>
1 ABC Ltda 2022 T1 1200000
2 ABC Ltda 2022 T2 1350000
3 ABC Ltda 2023 T1 1500000
4 ABC Ltda 2023 T2 1620000
5 XYZ S.A. 2022 T1 2500000
6 XYZ S.A. 2022 T2 2700000
7 XYZ S.A. 2023 T1 2900000
8 XYZ S.A. 2023 T2 3100000
O que você precisa lembrar
Finalidade: Transformar dados do formato amplo (wide) para o formato longo (long), organizando-os conforme o princípio tidy data
Sintaxe básica:
cols
: Quais colunas serão transformadas em pares nome-valornames_to
: Nome da nova coluna que receberá os nomes das colunas originaisvalues_to
: Nome da nova coluna que receberá os valores
4. Caso avançado:
Quando os nomes de colunas contêm múltiplas informações, use:
names_to = c("variavel1", "variavel2", ...)
names_sep = "_"
(ou outro separador presente nos nomes)
5. Benefícios:
Organizando dados na prática
A seguir, aplicaremos os conceitos aprendidos em exercícios práticos que simulam situações reais na área de Administração.
Tente resolver os exercícios usando o que aprendemos sobre:
Ao resolver estes exercícios, imagine como você poderia aplicar estas técnicas em:
Lembre-se: No mundo real do trabalho, a capacidade de reorganizar dados rapidamente para extrair insights é uma habilidade crítica para administradores
Nível Básico
vendas_lojas <- tribble(
~loja, ~T1, ~T2, ~T3, ~T4,
"Shopping Central", 185000, 162000, 198000, 230000,
"Centro Comercial", 145000, 152000, 138000, 176000,
"Mall Express", 92000, 98000, 103000, 125000,
"Galeria Norte", 78000, 83000, 89000, 110000
)
# Visualizando os dados originais
vendas_lojas
# A tibble: 4 × 5
loja T1 T2 T3 T4
<chr> <dbl> <dbl> <dbl> <dbl>
1 Shopping Central 185000 162000 198000 230000
2 Centro Comercial 145000 152000 138000 176000
3 Mall Express 92000 98000 103000 125000
4 Galeria Norte 78000 83000 89000 110000
Transforme estes dados para o formato “longo” (tidy), criando as variáveis “trimestre” e “vendas”.
Nível Intermediário 1
investimentos_marketing <- tribble(
~plataforma, ~Jan, ~Fev, ~Mar,
"Google Ads", 12500, 13200, 15000,
"Facebook", 8700, 9300, 10500,
"Instagram", 7200, 8500, 9800,
"LinkedIn", 5400, 5800, 6500
)
# Visualizando os dados originais
investimentos_marketing
# A tibble: 4 × 4
plataforma Jan Fev Mar
<chr> <dbl> <dbl> <dbl>
1 Google Ads 12500 13200 15000
2 Facebook 8700 9300 10500
3 Instagram 7200 8500 9800
4 LinkedIn 5400 5800 6500
Seu gestor pediu para você transformar estes dados em um formato que permita:
Transforme estes dados para o formato adequado para estas análises.
Nível Intermediário 2
incidadores_dptos <- tribble(
~departamento, ~Jan_receita, ~Jan_despesa, ~Fev_receita, ~Fev_despesa, ~Mar_receita, ~Mar_despesa, ~Abr_receita, ~Abr_despesa, ~Mai_receita, ~Mai_despesa, ~Jun_receita, ~Jun_despesa,
"Vendas", 120000, 85000, 125000, 82000, 135000, 90000, 122000, 88000, 140000, 91000, 145000, 94000,
"Marketing", 45000, 38000, 52000, 46000, 48000, 42000, 55000, 49000, 58000, 52000, 62000, 54000,
"Produção", 180000, 152000, 185000, 158000, 192000, 160000, 195000, 162000, 210000, 170000, 215000, 175000,
"RH", 28000, 25000, 28000, 25000, 30000, 26000, 29000, 26000, 31000, 27000, 32000, 28000
)
# Visualizando os dados originais
incidadores_dptos
# A tibble: 4 × 13
departamento Jan_receita Jan_despesa Fev_receita Fev_despesa Mar_receita
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Vendas 120000 85000 125000 82000 135000
2 Marketing 45000 38000 52000 46000 48000
3 Produção 180000 152000 185000 158000 192000
4 RH 28000 25000 28000 25000 30000
# ℹ 7 more variables: Mar_despesa <dbl>, Abr_receita <dbl>, Abr_despesa <dbl>,
# Mai_receita <dbl>, Mai_despesa <dbl>, Jun_receita <dbl>, Jun_despesa <dbl>
Reorganize estes dados para o formato longo, separando corretamente as informações de mês, indicador (receita/despesa) e valor.
Recomendações práticas
Identifique as variáveis: Antes de transformar, identifique claramente quais são as observações e variáveis reais nos seus dados
Comece com subconjuntos: Para dados complexos, comece testando com um pequeno subconjunto de dados
Use nomes descritivos: Escolha bons nomes para as novas colunas criadas por pivot_longer()
Combine com dplyr: As transformações com tidyr geralmente são seguidas por operações com dplyr para análise
Verifique os resultados: Sempre confira se os dados transformados mantêm as mesmas informações dos dados originais
O que você precisa lembrar
O que faz: O pacote tidyr transforma dados entre os formatos amplo (wide) e longo (long)
Principal função:
pivot_longer()
: Converte de amplo (wide) para longo (long) (colunas para linhas)Quando usar:
pivot_longer()
quando colunas contiverem valores em vez de variáveisImportância na análise de dados:
É essencial para a preparação de dados (fase 3 do CRISP-DM)
Permite transformar dados comuns de negócios em formatos adequados para análise
Facilita a aplicação de funções do dplyr e criação de visualizações
Lembre-se sempre:
O pacote dplyr no ecossistema tidyverse
O dplyr é um dos pacotes principais do tidyverse, criado por Hadley Wickham
Seu nome vem de “data plier” (alicate para dados) - uma ferramenta para manipular dados
Foi projetado seguindo a filosofia “tidy data” (dados organizados) - cada variável é uma coluna, cada observação é uma linha
É escrito em C++ para performance otimizada
Permite manipulação de dados de forma consistente, clara e encadeada
Contexto do dplyr
O pacote dplyr é parte do tidyverse
Enquanto os pacotes readr e readxl ajudam na importação de dados, o dplyr é especializado na manipulação de dados
O dplyr foi otimizado para manipular sobre dados organizados, longos ou tidy data
O dplyr trabalha com uma estrutura de dados de R que já conhecemos: data frames/tibbles
As funções do dplyr foram projetadas para serem usadas com o operador pipe (%>%
), que já vimos brevemente no relatório Junglivet
O dplyr como uma “linha de produção”
Imagine o processo de análise de dados como uma linha de produção:
Os dados brutos são sua “matéria-prima”
Cada função do dplyr é uma “estação de trabalho” que realiza uma operação específica:
filter()
seleciona apenas os materiais que atendem a certos critériosselect()
separa apenas as partes que você precisamutate()
transforma ou cria novos componentesgroup_by()
+ summarize()
agrupam e calculam estatísticasarrange()
organiza o resultado finalO operador pipe (%>%
) é a “esteira” que move os dados de uma estação para outra
Operações rotineiras
Muitas vezes precisamos filtrar somente certas linhas (observações ) de uma data frame.
Muitas vezes precisamos selecionar somente certas colunas (variáveis) de uma data frame.
Muitas vezes precisamos agrupar os dados por uma determinada(s) variável(s) categórica.
Muitas vezes precisamos calcular estatísticas descritivas para esses subconjuntos de dados (função summarize
).
# pib per capita médio dos países do continente americano
mean(gapminder$gdpPercap[gapminder$continent == "Americas"])
[1] 7136.11
R base (aninhado):
Vantagens e Desvantagens
Base R: Funções aninhadas
Vantagens: Não requer pacotes adicionais, disponível em qualquer instalação do R
Desvantagens:
dplyr: Gramática da manipulação de dados
Vantagens:
Desvantagens:
Gramática da manipulação de dados
O fluxo típico de uma análise de dados com tidyverse segue este padrão:
joins
)filter
)select
)mutate
)group_by
)summarize
)arrange
)Informações sobre expectativa de vida por continente
# Um pipeline de análise com dplyr
relatorio_expectativa <- gapminder %>%
# Filtra apenas os dados de 2007
filter(year == 2007) %>%
# Agrupa por continente
group_by(continent) %>%
# Calcula estatísticas resumidas
summarize(
expectativa_media = mean(lifeExp),
expectativa_minima = min(lifeExp),
expectativa_maxima = max(lifeExp),
num_paises = n()
) %>%
# Ordena do maior para o menor
arrange(desc(expectativa_media))
# Visualiza o resultado final
relatorio_expectativa
Este exemplo demonstra como um conjunto de funções do dplyr pode ser combinado para transformar dados brutos organizados em um relatório informativo com apenas algumas linhas de código.
O que já vimos na prática
No relatório Junglivet, já utilizamos algumas funções do dplyr:
# Trecho do relatório Junglivet
dados_destilaria_limpos <- dados_destilaria %>%
# Remove a coluna MONTH
select(-MONTH) %>%
# Renomeia as colunas
rename(
dia = DAY,
mestre_responsavel = MANUFACTURER,
# ... outras colunas renomeadas
) %>%
# Converte cada variável para seu tipo adequado
mutate(
dia = as.numeric(dia),
# ... outras conversões
) %>%
# Remove linhas com valores ausentes
drop_na()
Agora vamos entender em detalhes cada uma dessas funções e como aplicá-las em diferentes contextos de análise de dados.
Pacote dplyr: Vantagens
O pacote dplyr fornece uma série de funções muito úteis para manipular data frames de uma maneira que:
Objetivos de Aprendizagem
Vamos aprender 5 das funções mais usadas do pacote dplyr,
Função | Descrição |
---|---|
dplyr::filter() |
para filtrar linhas (observações) |
dplyr::select() |
para selecionar colunas (variáveis ) |
dplyr::mutate() |
para criar novas variáveis |
dplyr::group_by() |
para operações “por grupo” |
dplyr::summarize() |
para calcular estatísticas |
dplyr::arrange() |
para ordenar resultados |
Além disso, veremos como como usar o operador pipe (%>%
) para combiná-las.
Recomendações para código eficiente e legível
Indentação consistente:
Nomeie seu código:
dados_filtrados
, relatorio_vendas_por_regiao
Comente seu código:
Dividir análises complexas em etapas:
Consistência de estilo:
Descrição
O pacote gapminder da linguagem R contém uma data frame também chamada gapminder.
A df gapminder fornece informações detalhadas sobre indicadores socioeconômicos reais de vários países ao longo do tempo.
Este conjunto de dados é muito utilizado no ensino da linguagem R e de métodos estatísticos.
Vamos utilizar a df gapminder para ilustrar as funções do pacote dplyr.
Fase 1 (CRISP-DM): Entendimento dos Dados
Para obter uma visão geral da estrutura da df gapminder, podemos usar a função glimpse do pacote dplyr:
Rows: 1,704
Columns: 6
$ country <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", …
$ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
$ year <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, …
$ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.8…
$ pop <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12…
$ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, …
Podemos também inspecionar as primeiras 6 linhas da data frame com a função head:
# A tibble: 6 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Afghanistan Asia 1952 28.8 8425333 779.
2 Afghanistan Asia 1957 30.3 9240934 821.
3 Afghanistan Asia 1962 32.0 10267083 853.
4 Afghanistan Asia 1967 34.0 11537966 836.
5 Afghanistan Asia 1972 36.1 13079460 740.
6 Afghanistan Asia 1977 38.4 14880372 786.
Dicionário dos dados
A data frame gapminder contida no pacote de mesmo nome, possui 1704 linhas (observações) e 6 colunas (variáveis).
Variável | Classe/Tipo | Descrição |
---|---|---|
country |
factor |
Nome do país (142 níveis/países) |
continent |
factor |
Continente ao qual o país pertence (5 níveis/continentes) |
year |
integer |
Ano da observação (1952 a 2007 em incrementos de 5 anos) |
lifeExp |
double |
Expectativa de vida ao nascer, em anos |
pop |
integer |
População total do país |
gdpPercap |
double |
PIB per capita em US$, ajustado pela inflação |
Selecionando variáveis (colunas) de uma data frame
A função select()
permite escolher quais variáveis (colunas) você quer manter ou remover de uma data frame
Enquanto select()
trabalha com colunas (variáveis), filter()
trabalha com linhas (observações),
É essencial para simplificar seus dados, focando apenas nas variáveis relevantes para sua análise
Cenário: Análise financeira de países
Imagine que você é um analista financeiro internacional e precisa preparar um relatório sobre PIB:
# Seleciona apenas as variáveis relevantes para análise financeira
dados_financeiros <- gapminder %>%
select(country, year, gdpPercap)
# Visualiza as primeiras linhas do resultado
head(dados_financeiros)
# A tibble: 6 × 3
country year gdpPercap
<fct> <int> <dbl>
1 Afghanistan 1952 779.
2 Afghanistan 1957 821.
3 Afghanistan 1962 853.
4 Afghanistan 1967 836.
5 Afghanistan 1972 740.
6 Afghanistan 1977 786.
Interpretação: Este código seria equivalente a extrair apenas os dados financeiros relevantes (país, ano e PIB per capita) de uma grande base de dados para uma análise específica de desempenho econômico.
Diversas formas de selecionar variáveis
# Selecionar variáveis por inclusão
gapminder %>% select(country, year, gdpPercap)
# Selecionar variáveis por exclusão (com sinal de menos)
gapminder %>% select(-continent, -lifeExp)
# Selecionar variáveis em sequência
gapminder %>% select(country:pop)
# Selecionar variáveis que começam com determinado texto
gapminder %>% select(starts_with("c"))
# Selecionar variáveis que terminam com determinado texto
gapminder %>% select(ends_with("p"))
# Selecionar variáveis que contêm determinado texto
gapminder %>% select(contains("exp"))
Aplicações práticas em negócios
Estas técnicas são muito úteis quando você trabalha com:
Os erros mais comuns com select()
Erro | Errado | Correto |
---|---|---|
Nomes de variáveis com aspas | select(gapminder, "country") |
select(gapminder, country) |
Tentar condições como em filter | select(gapminder, gdpPercap > 1000) |
Use filter() para isso, não select()
|
Não salvar o resultado | gapminder %>% select(country, year) |
dados_novos <- gapminder %>% select(country, year) |
Remover variáveis necessárias |
select(country) e depois tentar usar continent
|
Verifique se manteve todas as variáveis necessárias |
Dica importante:
Lembre-se: select()
é para escolher colunas (variáveis) e filter()
é para escolher linhas (observações)!
Seleção por Exclusão
# A tibble: 1,704 × 5
country year lifeExp pop gdpPercap
<fct> <int> <dbl> <int> <dbl>
1 Afghanistan 1952 28.8 8425333 779.
2 Afghanistan 1957 30.3 9240934 821.
3 Afghanistan 1962 32.0 10267083 853.
4 Afghanistan 1967 34.0 11537966 836.
5 Afghanistan 1972 36.1 13079460 740.
6 Afghanistan 1977 38.4 14880372 786.
7 Afghanistan 1982 39.9 12881816 978.
8 Afghanistan 1987 40.8 13867957 852.
9 Afghanistan 1992 41.7 16317921 649.
10 Afghanistan 1997 41.8 22227415 635.
# ℹ 1,694 more rows
%>%
Combinação de Operações com %>%
Nos slides anteriores, usamos a sintáxe ‘normal’ da linguagem R.
Mas o ponto forte do dplyr está na combinação de várias funções usando o operador pipe %>%
.
Vamos analisar a gramática do uso de funções do dplyr combinadas com o operador %>%
.
Atalho para inserir o operador pipe: Ctrl + shift + M
Significado conceitual do pipe %>%
O operador pipe pode ser lido como “então” ou “em seguida”
Fluxo da esquerda para a direita, similar à leitura natural
Transforma:
funcao(dados, arg1, arg2)
em
dados %>% funcao(arg1, arg2)
Analogia
Uma linha de montagem onde cada função faz uma operação nos dados
Nomeie os resumos calculados com summarize
gapminder %>% # Pegue os dados gapminder, então...
filter(year == 2007) %>% # Filtre para apenas o ano 2007, então...
group_by(continent) %>% # Agrupe por continente, então...
summarize( # Calcule resumos:
exp_vida_media = mean(lifeExp), # expectativa de vida média
populacao_total = sum(pop) # população total
)
Dica
Vamos entender o código:
Primeiro invocamos a df gapminder e a passamos, usando o operador pipe %>%
, para a próxima etapa, que é a função select().
Neste caso, não especificamos qual df usamos na função select(), porque que ela obtém essa informação do pipe anterior.
Salvamos o resultado no objeto variaveis_selecionadas
O que você precisa lembrar
Para que serve: Selecionar apenas as colunas (variáveis) que você deseja manter ou remover
Sintaxe básica:
select(país, ano, vendas)
select(-observações, -notas)
select(starts_with("venda"))
select()
trabalha com COLUNASfilter()
trabalha com LINHASExercícios Práticos com select()
Nível 1: Primeiros Passos
Nível 2: Técnicas Avançadas com select()
Desafio: Crie um código que selecione variáveis usando dois métodos diferentes na mesma instrução:
Dica: Lembre-se que você pode combinar seleções com vírgulas e use o atalho Ctrl+Shift+M para inserir o operador pipe (%>%).
Filtrando observações (linhas) de uma data frame
A função filter()
permite filtrar subconjuntos de observações (linhas) que atendem determinadas condições ou critérios.
É uma das funções mais utilizadas na análise de dados para criar subconjuntos específicos dos dados
Pense nela como um “filtro” que deixa passar apenas as observações que atendem aos critérios que você definir
Neste caso, duas linhas atendem às condições
Filtrando observações (linhas) de uma data frame
Imagine que você tem uma planilha de vendas e quer analisar apenas as vendas:
A função filter()
permite fazer essa filtragem de forma rápida e precisa
Operadores na linguagem dos negócios
Operador | Exemplo em Linguagem Natural | Código em R |
---|---|---|
== | Apenas os países europeus | continent == “Europe” |
!= | Todos, exceto os países europeus | continent != “Europe” |
> | Países com PIB per capita maior que 10.000 | gdpPercap > 10000 |
< | Países com menos de 1 milhão de habitantes | pop < 1000000 |
>= | Países a partir do ano 2000 | year >= 2000 |
& | Países europeus a partir de 2000 | continent == “Europe” & year >= 2000 |
| |
Países da Europa ou da Ásia | continent == “Europe” | continent == “Asia” |
Dica
Dica para memorizar:
Cenário: Análise de vendas por continente
Imagine que a data frame gapminder
representa dados de filiais de uma empresa multinacional:
# Filtra apenas países das Américas
# como se fossem filiais da região Américas
filiais_americas <- gapminder %>%
filter(continent == "Americas")
# Visualiza as primeiras 6 linhas do resultado
head(filiais_americas)
# A tibble: 6 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Argentina Americas 1952 62.5 17876956 5911.
2 Argentina Americas 1957 64.4 19610538 6857.
3 Argentina Americas 1962 65.1 21283783 7133.
4 Argentina Americas 1967 65.6 22934225 8053.
5 Argentina Americas 1972 67.1 24779799 9443.
6 Argentina Americas 1977 68.5 26983828 10079.
Interpretação: Este filtro seria equivalente a selecionar apenas dados de filiais localizadas nas Américas para uma análise regional de desempenho.
Perguntas de negócios traduzidas para filter()
Pergunta de Negócio | Código com filter() |
---|---|
Quais países tiveram PIB per capita acima de $20.000 em 2007? | filter(year == 2007 & gdpPercap > 20000) |
Quais países da Ásia tiveram expectativa de vida acima de 75 anos? | filter(continent == “Asia” & lifeExp > 75) |
Quais países tiveram população superior a 100 milhões em 2007? | filter(year == 2007 & pop > 100000000) |
Quais países não são da Europa nem da América? | filter(continent != “Europe” & continent != “Americas”) |
Dica prática: Comece sempre pensando na pergunta de negócio, depois traduza para o código
Combinando condições
Há duas maneiras principais de combinar condições:
Dica importante:
Com & (“E” lógico) ambas as condições precisam ser TRUE para que a linha seja mantida
Com | (“OU” lógico), apenas uma das condições precisa ser TRUE
Exemplos com diferentes operadores
Utilize operadores relacionais para:
A importância da ordem das operações
# Países europeus em 2007, mostrando apenas país e expectativa de vida
europeus_lifeExp_2007 <- gapminder %>%
filter(continent == "Europe" & year == 2007) %>%
select(country, lifeExp)
# Ordenando o resultado por expectativa de vida (decrescente)
europeus_lifeExp_2007_ordenado <- gapminder %>%
filter(continent == "Europe" & year == 2007) %>%
select(country, lifeExp) %>%
arrange(desc(lifeExp))
head(europeus_lifeExp_2007_ordenado)
Ordem correta das operações:
Lembre-se: primeiro filter(), depois select()!
Os 4 erros mais comuns com filter()
Erro | Errado | Correto |
---|---|---|
Usar = em vez de == | filter(continent = “Europe”) | filter(continent == “Europe”) |
Esquecer as aspas em nomes | filter(continent == Europe) | filter(continent == “Europe”) |
Não salvar o resultado | gapminder %>% filter(year == 2007) | dados_2007 <- gapminder %>% filter(year == 2007) |
Países europeus com alta expectativa de vida em 2007?
# Países europeus com expectativa de vida acima de 78 anos em 2007
resultado_final <- gapminder %>%
# Filtrar por continente, ano e expectativa de vida
filter(continent == "Europe" & year == 2007 & lifeExp > 78) %>%
# Selecionar variáveis de interesse
select(country, lifeExp, gdpPercap) %>%
# Ordenar por expectativa de vida (decrescente)
arrange(desc(lifeExp))
# Mostrar resultados
resultado_final
Observe o fluxo de análise:
O que você precisa lembrar
Para que serve: Selecionar apenas as linhas (observações) que atendem a determinadas condições
Sintaxe básica:
Comparações mais usadas:
Múltiplas condições:
filter(condição1 & condição2)
filter(condição1 | condição2)
Lembre-se sempre de salvar o resultado:
Exercícios Práticos
Nível 1: Primeiros Passos com filter()
Nível 2: Combinando Condições
Crie um filtro para encontrar países que atendam a TODAS estas condições:
Desafio: Encontre países com expectativa de vida acima de 75 anos, mas PIB per capita abaixo de 10.000 dólares em 2007.
Dica: Comece com um filtro simples e depois adicione condições gradualmente
Instruções
Prof. Washington Silva - Introdução à Ciência de Dados