IFMG - Campus Formiga
9 de maio de 2025
O que vimos até hoje?
Aula 1 ✅
Aula 2 ✅
Metodologia CRISP-DM ✅
Tipos de Análise ✅
Configurações: Git/GitHub ✅
Aula 3 ✅
Introdução ao RStudio ✅
Aula 4 ✅
Introdução ao Git e 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 ✅
Aula 6 ✅
Parte I ✅
Parte II ✅
Aula 7 ✅
Introdução ao sistema Quarto (continuação) ✅
Introdução à Linguagem R (continuação) ✅
Aula 8 ✅
Início do estudo do pacote dplyr para manipulação de dados ✅
Aula 9 ✅
Aula 10 ✅
Aula 11 ✅
Tópicos - Continuação da Aula 11
Metodologia CRISP-DM e o tidyverse
Dados Organizados: Potencializando Análises
Exercícios
Instruções
Abra o RStudio e o seu Projeto da Disciplina
Crie a subpasta 06-relatorio dentro da pasta relatorios.
Acesse o site da disciplina e baixe o arquivo 06-relatorio.zip
Descompacte o arquivo, copie/recorte o arquivo 06-relatorio.qmd
e cole dentro da subpasta 06-relatorio.
Diretrizes para Aulas Mais Produtivas
🔊 Mantenha conversas em volume baixo
⌨️ 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: Principal Metodologia para Projetos de Ciência/Análise 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.
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 “organizado”
dplyr: Manipulação de dados com funções intuitivas (filter, select etc.)
ggplot2/gt: Visualização de dados baseada na gramática dos gráficos e das tabelas
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 as fases de CRISP-DM envolvendo dados (fases 2, 3, 4 principalmente), transformando princípios metodológicos em ferramentas computacionais que agilizam o processo científico de análise de dados
Fluxo de análise de dados com tidyverse
Importação de Dados (readr/readxl)
here()
: Definição de caminhos relativos dos arquivos de dadosread_csv()
, read_excel()
: Importação eficiente de arquivosOrganização dos Dados
tidyr::pivot_longer()
para transformar em dados organizadosTransformação/Análise de Dados (dplyr)
filter()
: Selecionar observações (linhas)select()
: Selecionar variáveis (colunas)mutate()
: Criar/modificar variáveisgroup_by()
+ summarize()
: Agrupar e calcular estatísticasarrange()
: Ordenar resultadosVisualização (ggplot2)
Comunicação (Sistema Quarto)
Vantagens
Com os dados organizados (formato longo), podemos facilmente, por exemplo:
Dados organizados permitem:
Finanças e Controladoria: Análise de tendências financeiras entre períodos, detecção de anomalias em despesas, comparação de desempenho entre unidades de negócio
Marketing: Avaliação de ROI por canal e campanha, análise de comportamento do consumidor, segmentação de clientes baseada em múltiplas variáveis
Operações e Cadeia de Suprimentos: Otimização de estoques baseada em tendências sazonais, previsão de demanda, monitoramento da cadeia de suprimentos
Recursos Humanos: Análise de desempenho ao longo do tempo, identificação de fatores de turnover, planejamento de capacitação
Estratégia de Negócios: Consolidação de KPIs de diversas áreas para tomada de decisão, identificação de correlações entre variáveis de negócio
Na prática: Administradores frequentemente recebem dados em formatos inadequados para análise (relatórios estáticos, planilhas “bonitas”). A capacidade de reorganizar esses dados rapidamente para análise representa uma vantagem competitiva significativa.
Figura 3: 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.
Dados (Amplos/Wide) de Vendas Mensais por Categoria e Produto
# formato típico de planilhas gerenciais
dados_vendas_wide <- tribble(
~produto, ~categoria, ~Jan, ~Fev, ~Mar, ~Abr, ~Mai, ~Jun,
"Notebook Pro", "Eletrônicos", 45000, 38000, 42000, 47000, 52000, 49000,
"Smartphone X", "Eletrônicos", 38000, 41000, 40000, 39000, 45000, 50000,
"Monitor 24pol", "Informática", 22000, 19000, 23000, 25000, 24000, 26000,
"Mouse Gamer", "Informática", 12000, 14000, 13500, 15000, 16000, 17500,
"Mesa Office", "Mobiliário", 28000, 25000, 24000, 26500, 27000, 29000,
"Cadeira Ergo", "Mobiliário", 35000, 32000, 38000, 36000, 39000, 42000
)
# Visualizando os dados no formato amplo (wide)
dados_vendas_wide
# A tibble: 6 × 8
produto categoria Jan Fev Mar Abr Mai Jun
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Notebook Pro Eletrônicos 45000 38000 42000 47000 52000 49000
2 Smartphone X Eletrônicos 38000 41000 40000 39000 45000 50000
3 Monitor 24pol Informática 22000 19000 23000 25000 24000 26000
4 Mouse Gamer Informática 12000 14000 13500 15000 16000 17500
5 Mesa Office Mobiliário 28000 25000 24000 26500 27000 29000
6 Cadeira Ergo Mobiliário 35000 32000 38000 36000 39000 42000
Aplicando pivot_longer para organizar os dados
# Transformando os dados para o formato longo (tidy)
dados_vendas_longo <- dados_vendas_wide %>%
pivot_longer(
cols = Jan:Jun, # colunas que serão transformadas em valores de mes
names_to = "mes", # nome da nova coluna
values_to = "valor_vendas" # nome de outra nova coluna para as vendas
)
# Visualizando o resultado
dados_vendas_longo
# A tibble: 36 × 4
produto categoria mes valor_vendas
<chr> <chr> <chr> <dbl>
1 Notebook Pro Eletrônicos Jan 45000
2 Notebook Pro Eletrônicos Fev 38000
3 Notebook Pro Eletrônicos Mar 42000
4 Notebook Pro Eletrônicos Abr 47000
5 Notebook Pro Eletrônicos Mai 52000
6 Notebook Pro Eletrônicos Jun 49000
7 Smartphone X Eletrônicos Jan 38000
8 Smartphone X Eletrônicos Fev 41000
9 Smartphone X Eletrônicos Mar 40000
10 Smartphone X Eletrônicos Abr 39000
# ℹ 26 more rows
Agora os dados estão organizados para análise:
Análise da Receita Bruta Mensa de Vendas
# pipeline de análise
receita_bruta_mes <- dados_vendas_longo %>%
group_by(mes) %>%
summarize(vendas_total = sum(valor_vendas)) %>%
arrange(desc(vendas_total))
# visualiza o resultado
receita_bruta_mes
# A tibble: 6 × 2
mes vendas_total
<chr> <dbl>
1 Jun 213500
2 Mai 203000
3 Abr 188500
4 Mar 180500
5 Jan 180000
6 Fev 169000
Análise das Vendas Mensais de um Produto Específico
# pipeline de análise
vendas_mensais_notebookpro <- dados_vendas_longo %>%
filter(produto == "Notebook Pro") %>%
select(produto, mes, valor_vendas) %>%
arrange(mes)
# visualiza o resultado
vendas_mensais_notebookpro
# A tibble: 6 × 3
produto mes valor_vendas
<chr> <chr> <dbl>
1 Notebook Pro Abr 47000
2 Notebook Pro Fev 38000
3 Notebook Pro Jan 45000
4 Notebook Pro Jun 49000
5 Notebook Pro Mai 52000
6 Notebook Pro Mar 42000
Análise das Vendas Totais por Categoria e Mês
# pipeline de análise
vendas_totais_categoria_mes <- dados_vendas_longo %>%
group_by(categoria, mes) %>%
summarize(vendas_totais = sum(valor_vendas)) %>%
arrange(desc(vendas_totais))
# visualiza o resultado
vendas_totais_categoria_mes
# A tibble: 18 × 3
# Groups: categoria [3]
categoria mes vendas_totais
<chr> <chr> <dbl>
1 Eletrônicos Jun 99000
2 Eletrônicos Mai 97000
3 Eletrônicos Abr 86000
4 Eletrônicos Jan 83000
5 Eletrônicos Mar 82000
6 Eletrônicos Fev 79000
7 Mobiliário Jun 71000
8 Mobiliário Mai 66000
9 Mobiliário Jan 63000
10 Mobiliário Abr 62500
11 Mobiliário Mar 62000
12 Mobiliário Fev 57000
13 Informática Jun 43500
14 Informática Abr 40000
15 Informática Mai 40000
16 Informática Mar 36500
17 Informática Jan 34000
18 Informática Fev 33000
Análise do Desempenho mensal por produto
# pipeline
desempenho_mensal_produto <- dados_vendas_longo %>%
group_by(produto) %>%
summarize(
vendas_total = sum(valor_vendas),
vendas_media = mean(valor_vendas),
vendas_min = min(valor_vendas),
vendas_max = max(valor_vendas)
) %>%
arrange(desc(vendas_total))
# visualiza o resultado
desempenho_mensal_produto
# A tibble: 6 × 5
produto vendas_total vendas_media vendas_min vendas_max
<chr> <dbl> <dbl> <dbl> <dbl>
1 Notebook Pro 273000 45500 38000 52000
2 Smartphone X 253000 42167. 38000 50000
3 Cadeira Ergo 222000 37000 32000 42000
4 Mesa Office 159500 26583. 24000 29000
5 Monitor 24pol 139000 23167. 19000 26000
6 Mouse Gamer 88000 14667. 12000 17500
# Formata a tabela de desempenho por produto com kableExtra
desempenho_mensal_produto %>%
kable(
# Renomeia as colunas para melhor apresentação
col.names = c(
"Produto",
"Vendas Totais (R$)",
"Média Mensal (R$)",
"Venda Mínima (R$)",
"Venda Máxima (R$)"
),
# Formata números com 2 casas decimais
digits = 2,
# Define vírgula como separador decimal e ponto como separador de milhares
format.args = list(decimal.mark = ",", big.mark = ".", nsmall = 2)
) %>%
# Aplica um estilo clássico e limpo
kable_classic_2(
# Ajusta o tamanho da fonte
font_size = 18,
# Define largura para se ajustar melhor ao slide
full_width = TRUE,
# Centraliza a tabela
position = "center"
) %>%
# Destaca as colunas de valores em negrito
column_spec(2:5, bold = TRUE) %>%
# Destaca as 3 primeiras linha da tabela
row_spec(1:3, bold = T, color = "white", background = "#011f4b")
Produto | Vendas Totais (R$) | Média Mensal (R$) | Venda Mínima (R$) | Venda Máxima (R$) |
---|---|---|---|---|
Notebook Pro | 273.000,00 | 45.500,00 | 38.000,00 | 52.000,00 |
Smartphone X | 253.000,00 | 42.166,67 | 38.000,00 | 50.000,00 |
Cadeira Ergo | 222.000,00 | 37.000,00 | 32.000,00 | 42.000,00 |
Mesa Office | 159.500,00 | 26.583,33 | 24.000,00 | 29.000,00 |
Monitor 24pol | 139.000,00 | 23.166,67 | 19.000,00 | 26.000,00 |
Mouse Gamer | 88.000,00 | 14.666,67 | 12.000,00 | 17.500,00 |
Identificando meses de pico de vendas para cada categoria
# Pipeline para identificar mês de melhor desempenho por categoria
meses_pico_categoria <- dados_vendas_longo %>%
# Agrupa por categoria e mês
group_by(categoria, mes) %>%
# Calcula as vendas totais
summarize(vendas_totais = sum(valor_vendas)) %>%
# Filtra para o mês de maior venda
filter(vendas_totais == max(vendas_totais)) %>%
# Ordena o resultado pelas vendas totais
arrange(desc(vendas_totais))
# visualiza o resultado
meses_pico_categoria
# A tibble: 3 × 3
# Groups: categoria [3]
categoria mes vendas_totais
<chr> <chr> <dbl>
1 Eletrônicos Jun 99000
2 Mobiliário Jun 71000
3 Informática Jun 43500
Identificando meses de pior venda para cada categoria
# Pipeline para identificar mês de pior desempenho por categoria
meses_pior_categoria <- dados_vendas_longo %>%
# Agrupa por categoria e mês
group_by(categoria, mes) %>%
# Calcula as vendas totais
summarize(vendas_totais = sum(valor_vendas)) %>%
# Filtra para o mês de menor venda
filter(vendas_totais == min(vendas_totais)) %>%
# Ordena o resultado pelas vendas totais
arrange(desc(vendas_totais))
# visualiza o resultado
meses_pior_categoria
# A tibble: 3 × 3
# Groups: categoria [3]
categoria mes vendas_totais
<chr> <chr> <dbl>
1 Eletrônicos Fev 79000
2 Mobiliário Fev 57000
3 Informática Fev 33000
Localizando posições de valores máximos e mínimos
As funções which.max()
e which.min()
são extremamente úteis em análise de dados:
which.max(x)
: Retorna a posição (índice) do valor máximo no vetor x
which.min(x)
: Retorna a posição (índice) do valor mínimo no vetor x
Exemplo simples:
# Vetor de valores
vendas_mensais <- c(120, 150, 140, 160, 110, 130)
# Qual a posição do valor máximo?
posicao_max <- which.max(vendas_mensais)
posicao_max
[1] 4
[1] 160
# Supondo que temos nomes para os meses
nomes_meses <- c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun")
# Em qual mês ocorreu a venda máxima?
mes_maior_venda <- nomes_meses[which.max(vendas_mensais)]
mes_maior_venda
[1] "Abr"
Estas funções são perfeitas para encontrar quando ocorreram eventos importantes nos seus dados (máximos, mínimos, picos) em vez de apenas quais foram os valores.
Identificando os Meses de Maior e Menor Venda por Produto
# Pipeline de análise para identificar os meses de pico e vale por produto
resumo_comparativo_produto <- dados_vendas_longo %>%
# Agrupa os dados por produto para analisar cada um separadamente
group_by(produto) %>%
# Para cada produto, calculamos:
summarize(
# 1. Qual o mês da maior venda:
# - which.max(valor_vendas) encontra a POSIÇÃO da maior venda
# - mes[which.max(valor_vendas)] seleciona o nome do mês de maior venda
melhor_mes = mes[which.max(valor_vendas)],
# 2. Qual foi o valor da maior venda
maior_venda = max(valor_vendas),
# 3. Qual o mês da menor venda (mesma lógica do melhor mês)
pior_mes = mes[which.min(valor_vendas)],
# 4. Qual foi o valor da menor venda
menor_venda = min(valor_vendas)
)
# Visualiza o resultado
resumo_comparativo_produto
# A tibble: 6 × 5
produto melhor_mes maior_venda pior_mes menor_venda
<chr> <chr> <dbl> <chr> <dbl>
1 Cadeira Ergo Jun 42000 Fev 32000
2 Mesa Office Jun 29000 Mar 24000
3 Monitor 24pol Jun 26000 Fev 19000
4 Mouse Gamer Jun 17500 Jan 12000
5 Notebook Pro Mai 52000 Fev 38000
6 Smartphone X Jun 50000 Jan 38000
Explicação do código:
Primeiro agrupamos por produto para realizar a análise para cada item
A função which.max(valor_vendas)
retorna a posição (índice) do valor máximo
Ao usar mes[which.max(valor_vendas)]
, extraímos o nome do mês na posição com valor máximo
Este tipo de análise é essencial para identificar padrões sazonais de produtos
Este relatório permite identificar rapidamente quais meses foram melhores e piores para cada produto - informação valiosa para planejamento de estoque e promoções.
Assim, esta análise permite otimizar o planejamento de estoque e ações promocionais sazonais.
# Formata a tabela comparativa com kableExtra
resumo_comparativo_produto %>%
kable(
# Renomeia as colunas para melhor apresentação
col.names = c(
"Produto",
"Melhor Mês",
"Maior Venda (R$)",
"Pior Mês",
"Menor Venda (R$)"
),
# Formata números com 2 casas decimais
digits = 2,
# Define vírgula como separador decimal e ponto como separador de milhares
format.args = list(decimal.mark = ",", big.mark = ".", nsmall = 2)
) %>%
# Aplica um estilo clássico e limpo
kable_paper(
# Ajusta o tamanho da fonte
font_size = 22,
# Define largura para se ajustar melhor ao slide
full_width = FALSE,
# Centraliza a tabela
position = "center"
) %>%
# Destaca as colunas de valores monetários em negrito
column_spec(c(3, 5), bold = TRUE) %>%
# Destaca a quarta linha da tabela
row_spec(4, bold = T, color = "white", background = "#D7261E")
Produto | Melhor Mês | Maior Venda (R$) | Pior Mês | Menor Venda (R$) |
---|---|---|---|---|
Cadeira Ergo | Jun | 42.000,00 | Fev | 32.000,00 |
Mesa Office | Jun | 29.000,00 | Mar | 24.000,00 |
Monitor 24pol | Jun | 26.000,00 | Fev | 19.000,00 |
Mouse Gamer | Jun | 17.500,00 | Jan | 12.000,00 |
Notebook Pro | Mai | 52.000,00 | Fev | 38.000,00 |
Smartphone X | Jun | 50.000,00 | Jan | 38.000,00 |
Exercício
dados_vendas_longo
, calcule o valor médio de vendas por categoria e ordene do maior para o menor.Exercício
dados_vendas_longo
, filtre apenas os produtos da categoria “Mobiliário” e mostre as vendas totais de cada produto desta categoria, ordenando do maior para o menor.Exercício
dados_vendas_longo
, analise o desempenho mensal por categoria de produto. Calcule o total de vendas, a média mensal, o valor mínimo e o valor máximo para cada categoria, ordenando do maior para o menor valor total.Reflexão
Considere os dados com os quais você já trabalha ou espera trabalhar em sua carreira:
Que tipos de dados desorganizados você encontra ou espera encontrar?
Como esses dados poderiam ser melhor organizados para análise?
Quais insights de negócio você poderia extrair se esses dados estivessem organizados adequadamente?
Como você aplicaria o conhecimento desta aula em um exemplo concreto do seu interesse profissional?
Benefícios de longo prazo para organizações
Ciclos de análise mais rápidos: Dados corretamnte organizados reduzem o tempo de preparação em análises de dados
Consistência em decisões baseadas em dados: Garante que diferentes analistas trabalhem com a mesma estrutura de dados
Integração com ferramentas modernas: Dados organizados são mais facilmente integrados com dashboards, ferramentas de BI e modelos preditivos
Cultura de dados: Promove uma cultura organizacional onde dados são vistos como ativos estratégicos
Mensagem-chave: O tempo investido em organizar dados adequadamente é compensado múltiplas vezes pela facilidade de análise, velocidade de insights e melhor qualidade das decisões de negócio baseadas nesses dados.
Instruções
Prof. Washington Silva - Introdução à Ciência de Dados