Mestrado Profissional em Administração
IFMG - Campus Formiga
15 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 ✅
Aula 5 ✅
Tópicos Vistos
Tópicos Planejados
Introdução ao Pacote dplyr
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
Criando e transformando variáveis
A função mutate()
permite criar novas variáveis ou modificar variáveis existentes
Enquanto filter()
seleciona linhas e select()
seleciona colunas, mutate()
adiciona ou modifica colunas
É como ter uma “calculadora” que cria novas informações a partir dos dados existentes
Ideal para cálculos como: percentuais, totais, médias, categorias, etc.
Cria novas variáveis a partir das variáveis existentes
Como usar mutate() na prática
O que cada parte significa:
Cenário: Relatório de análise comercial
Imagine que a data frame gapminder
contém dados de vendas globais da sua empresa:
# Criando variáveis para análise de vendas
vendas_analise <- gapminder %>%
filter(year == 2007) %>% # Filtra dados somente de 2007
mutate(
# PIB total representa a receita total da região
receita_total = gdpPercap * pop,
# Receita em milhões (para facilitar a leitura)
receita_milhoes = receita_total / 1000000,
# Indicador de destaque (regiões com alta receita por pessoa)
destaque = gdpPercap > 20000
) %>%
# Vamos visualizar apenas algumas colunas e 5 linhas
select(country, receita_milhoes, gdpPercap, destaque) %>%
head(5)
vendas_analise
Interpretação administrativa: Este tipo de transformação é usado diariamente nas empresas para converter dados brutos em métricas de negócios úteis para tomada de decisão.
Transformações mais comuns: Operações aritméticas básicas
# Operações aritméticas básicas com mutate()
gapminder %>%
filter(country == "Brazil", year >= 2000) %>%
mutate(
# Adição: adiciona um valor fixo
pop_ajustada = pop + 1000000,
# Multiplicação: multiplica por um fator
gdp_reais = gdpPercap * 5.2, # Convertendo para reais
# Divisão: divide para mudar a escala
pop_milhoes = pop / 1000000 # População em milhões
) %>%
select(year, pop, pop_ajustada, pop_milhoes, gdpPercap, gdp_reais)
Dica: As operações mais utilizadas em análises de negócios são multiplicação (para fatores, taxas, conversões) e divisão (para mudar escalas e calcular proporções).
O que é a função ifelse()?
A função ifelse()
permite criar novas variáveis categóricas baseadas em condições:
Como funciona: ifelse(condição, valor_se_verdadeiro, valor_se_falso)
Criando KPIs com mutate() e ifelse()
gapminder %>%
filter(year == 2007) %>%
mutate(
pib_total = gdpPercap * pop, # PIB total
pib_percentual_global = (pib_total/sum(pib_total))*100, # % do PIB global
performance = ifelse(gdpPercap > mean(gdpPercap),
"Acima da média",
"Abaixo da média")
) %>%
select(country, pib_total, pib_percentual_global, performance)
Isso mostra como transformar dados brutos em informações gerenciais.
Quando precisamos de mais de duas categorias
case_when()
é como um “sistema de classificação” para criar categorias mais complexas:
# Exemplo de múltiplas categorias
paises_classificados <- gapminder %>%
filter(year == 2007) %>%
mutate(
classe_desenvolvimento = case_when(
gdpPercap < 2000 ~ "Baixo",
gdpPercap < 10000 ~ "Médio",
gdpPercap >= 10000 ~ "Alto"
)
) %>%
select(country, gdpPercap, classe_desenvolvimento) %>%
head(6)
paises_classificados
Como funciona:
condição ~ "valor a atribuir"
Escolhendo a função adequada
Função | Quando usar | Exemplo |
---|---|---|
ifelse() |
Para divisões simples em duas categorias | ifelse(vendas > meta, "Meta atingida", "Meta não atingida") |
case_when() |
Para múltiplas categorias ou condições complexas | Classificar clientes em “Bronze”, “Prata”, “Ouro” e “Platina” baseado em diferentes critérios |
Analogia de negócios:
ifelse()
é como uma decisão “sim/não” (aprovação de crédito simples)
case_when()
é como um sistema de classificação de clientes com várias categorias
Os erros que todos cometem no início
Usar o operador de atribuição errado
mutate(nova_var <- expressão)
❌mutate(nova_var = expressão)
✅Esquecer de salvar o resultado
dados %>% mutate(nova_var = x * 2)
❌ (resultado não salvo)dados_novos <- dados %>% mutate(nova_var = x * 2)
✅Tentar usar variáveis que acabou de criar sem manter os resultados
ERRADO:
CORRETO (Pipeline único):
O que você precisa lembrar
O que faz: mutate()
cria novas variáveis ou modifica existentes
Usos comuns no mundo dos negócios:
Como usar na prática:
Ferramentas complementares:
ifelse()
para classificações simples (sim/não)case_when()
para classificações múltiplasLembre-se de salvar o resultado em um novo objeto:
Exercícios Práticos
Nível 1: Começando com mutate()
Nível 2: Aplicando categorias
Usando ifelse()
, crie uma variável chamada economia_grande
que seja “Sim” quando a população for maior que 50 milhões e “Não” caso contrário.
Desafio: Usando dados de 2007, crie uma variável que classifique os países em três categorias baseadas na expectativa de vida:
Dica: Não se preocupe se não conseguir resolver todos. Foque em entender a lógica!
Agrupando e resumindo dados
A função group_by()
permite agrupar dados por uma ou mais variáveis categóricas
A função summarize()
(ou summarise()
) permite calcular estatísticas resumidas para cada grupo
Estas funções geralmente trabalham juntas como uma ferramenta poderosa para análise
É como criar “subtotais” ou “relatórios consolidados” por categorias (ex: vendas por região, despesas por departamento)
Sintaxe básica
Cenário: Relatório para executivos sobre desempenho regional
Imagine que você é um analista financeiro e precisa preparar um relatório executivo comparando regiões:
# Cria um relatório de PIB médio por continente
relatorio_continentes <- gapminder %>%
filter(year == 2007) %>% # Filtra para dados mais recentes
group_by(continent) %>% # Agrupa por continente
summarize(
PIB_medio = mean(gdpPercap), # Média do PIB per capita
Total_populacao = sum(pop), # População total
Paises_analisados = n(), # Número de países
PIB_minimo = min(gdpPercap), # PIB mínimo
PIB_maximo = max(gdpPercap) # PIB máximo
) %>%
arrange(desc(PIB_medio)) # Ordena do maior para o menor PIB médio
# Visualiza o resultado
relatorio_continentes
Interpretação Este tipo de relatório consolidado por região é crítico para análises comparativas entre mercados e para apresentações executivas. Mostra claramente as estatísticas-chave para cada grupo (continente), facilitando comparações e decisões estratégicas.
Funções Estatísticas da linguagem R
Função | O que calcula | Exemplo em R | Uso em Negócios |
---|---|---|---|
mean() |
Média | mean(vendas) |
Valor médio de vendas por região |
sum() |
Soma total | sum(receita) |
Receita total por categoria |
min() |
Valor mínimo | min(preco) |
Menor preço praticado |
max() |
Valor máximo | max(despesa) |
Maior despesa do período |
sd() |
Desvio padrão | sd(producao) |
Variabilidade da produção |
n() |
Contagem de linhas | n() |
Número de transações |
n_distinct() |
Contagem de valores únicos | n_distinct(cliente) |
Número de clientes únicos |
median() |
Mediana | median(vendas) |
Valor típico de vendas |
Dica para gestores: Sempre inclua tanto medidas de “tendência central” (média, mediana) quanto de “variação” (desvio padrão) para ter uma visão mais completa dos dados.
Análises mais detalhadas
# Análise de expectativa de vida por continente e ano
tendencias_por_continente <- gapminder %>%
group_by(continent, year) %>% # Agrupa por DUAS variáveis
summarize(
expectativa_vida_media = mean(lifeExp),
paises_analisados = n()
) %>%
arrange(continent, year)
# Mostra resultados parciais
tendencias_por_continente %>%
filter(continent == "Americas") %>%
head(3)
# A tibble: 3 × 4
# Groups: continent [1]
continent year expectativa_vida_media paises_analisados
<fct> <int> <dbl> <int>
1 Americas 1952 53.3 25
2 Americas 1957 56.0 25
3 Americas 1962 58.4 25
Contexto empresarial: Este tipo de análise é comum em:
Os erros que todos cometem no início
Erro | Errado | Correto |
---|---|---|
Não usar summarize após group_by | dados %>% group_by(regiao) |
dados %>% group_by(regiao) %>% summarize(...) |
Tentar agrupar antes de filtrar | group_by(regiao) %>% filter(mean(vendas) > 1000) |
Usar filter() ANTES de group_by()
|
Esquecer de desagrupar | Continuar usando dados agrupados | Usar ungroup() quando terminar com análises agrupadas |
Dica: group_by
por si não produz nenhum resultado.
O que você precisa lembrar
Para que servem:
group_by()
: Agrupa dados por categorias (como agrupar linhas em uma planilha)
summarize()
: Calcula estatísticas para cada grupo (como criar subtotais)
Sintaxe básica:
Funções estatísticas básicas:
Fluxo de trabalho típico:
filter()
)group_by()
)summarize()
)arrange()
)Lembre-se sempre de salvar o resultado:
Exercícios Práticos
Nível 1: Primeiros Passos
Nível 2: Análise de Negócios
Imagine que cada país representa uma filial da sua empresa. Crie um relatório que mostre, para cada continente:
Desafio: Crie um relatório que mostre a evolução da expectativa de vida média do continente americano ao longo dos anos (dica: agrupe por ano, filtre para mostrar apenas as Américas).
Dica: Lembre-se de salvar seus resultados em objetos com nomes descritivos e de usar arrange()
para organizar seus resultados de forma lógica.
Ordena resultados
A função arrange()
ordena as linhas (observações) de uma data frame com base nos valores de uma ou mais colunas (variáveis)
Por padrão, organiza em ordem crescente (do menor para o maior)
Use desc()
para ordenar em ordem decrescente (do maior para o menor)
Reordena as linhas de uma data frame segundo uma variável, por padrão em ordem crescente, com desc() em ordem decrescente
Como usar arrange() na prática
desc()
para ordem descrescente (do maior para o menor)Cenário: Relatório de análise de mercado
Imagine que você é um analista de mercado e precisa identificar rapidamente os países mais promissores para expansão:
# Criando um ranking de países por PIB per capita em 2007
ranking_paises <- gapminder %>%
filter(year == 2007) %>% # Filtra dados apenas de 2007
select(country, continent, gdpPercap) %>% # Seleciona colunas relevantes
arrange(desc(gdpPercap)) %>% # Ordena do maior para o menor PIB
head(6) # Mostra os 10 primeiros resultados
# Visualiza o resultado
ranking_paises
# A tibble: 6 × 3
country continent gdpPercap
<fct> <fct> <dbl>
1 Norway Europe 49357.
2 Kuwait Asia 47307.
3 Singapore Asia 47143.
4 United States Americas 42952.
5 Ireland Europe 40676.
6 Hong Kong, China Asia 39725.
Interpretação Este tipo de ordenação é relevante em análises de mercado para identificar rapidamente os países mais ricos (potenciais mercados premium) ou para encontrar as regiões que precisam de mais atenção (ordenando do menor para o maior).
Cuidados ao usar arrange()
Erro | Problema | Solução |
---|---|---|
Ordem incorreta |
arrange(dados, desc()) sem especificar a variável |
arrange(dados, desc(variavel)) |
Tentar ordenar por variável não existente |
arrange(vendas_por_regiao) quando a coluna não existe |
Verificar primeiro os nomes das colunas com names()
|
Não salvar o resultado ordenado | Ordenar mas não atribuir a um objeto | dados_ordenados <- dados %>% arrange(...) |
Lembre-se: A ordenação é temporária se você não salvar o resultado em um novo objeto!
O que você precisa lembrar
Para que serve: Ordenar as linhas (observações) com base nos valores de uma ou mais colunas
Sintaxe básica:
Usos comuns em negócios:
Lembre-se sempre:
desc()
para ordem decrescentearrange(var1, var2)
Exercícios Práticos
Nível 1: Primeiros Passos
Nível 2: Aplicação em Negócios
Imagine que você trabalha no departamento internacional de uma empresa. Crie uma lista dos países das Américas ordenados por população (do maior para o menor) em 2007.
Desafio: Crie um ranking dos continentes baseado na expectativa de vida média de seus países em 2007. Use group_by(), summarize() e arrange().
Dica: Lembre-se de usar head() para limitar o número de resultados quando necessário!
Resumo das seis funções principais
Função | Propósito |
---|---|
dplyr::filter() |
Seleciona linhas baseadas em condições |
dplyr::select() |
Seleciona colunas específicas |
dplyr::mutate() |
Cria ou modifica colunas |
dplyr::group_by() |
Agrupa dados por categorias |
dplyr::summarize() |
Calcula estatísticas resumidas |
dplyr::arrange() |
Ordena linhas |
Lembre-se: O poder do dplyr está em combinar estas funções com o operador pipe %>%
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.
Nota
# inicia com a df (gapminder) e salva o resultado final
relatorio_expectativa <- gapminder %>%
# Filtra apenas os dados de 2007
filter(year == 2007) %>%
# Agrupa por continente
group_by(continent) %>%
# Calcula estatísticas por continente
summarize(
expectativa_media = mean(lifeExp),
expectativa_minima = min(lifeExp),
expectativa_maxima = max(lifeExp),
) %>%
# Ordena do maior para o menor
arrange(desc(expectativa_media))
# Visualiza o resultado final
relatorio_expectativa
# A tibble: 5 × 4
continent expectativa_media expectativa_minima expectativa_maxima
<fct> <dbl> <dbl> <dbl>
1 Oceania 80.7 80.2 81.2
2 Europe 77.6 71.8 81.8
3 Americas 73.6 60.9 80.7
4 Asia 70.7 43.8 82.6
5 Africa 54.8 39.6 76.4
Limitações das Data Frames Brutas em Relatórios Profissionais
As data frames produzidas pelos pipelines do dplyr são excelentes para análise, mas não são adequadas para apresentação em relatórios profissionais.
A linguagem R oferece várias soluções para esta limitação:
Estes pacotes permitem transformar dados analíticos em tabelas com qualidade profissional, incluindo:
Transformando tabelas básicas em apresentações profissionais
O pacote kableExtra
estende as funcionalidades da função básica kable
do R, permitindo a criação de tabelas com qualidade de publicação.
Foi desenvolvido para trabalhar com tabelas em documentos HTML e PDF (LaTeX).
Permite formatar tabelas para relatórios profissionais, artigos acadêmicos e apresentações.
É extremamente útil na Fase 6 do CRISP-DM (Implantação), quando precisamos comunicar resultados de forma clara e atrativa.
Fluxo básico com kableExtra
# inicie com uma data frame
tabela_formatada <- dados %>%
# Transforme a data frame em tabela básica
kable(
caption = "Título da Tabela",
col.names = c("Nome1", "Nome2"), # Renomear colunas
digits = 2, # Casas decimais
format.args = list(decimal.mark = ",", big.mark = ".") # Define vírgula como separador decimal e ponto como separador de milhares
) %>%
# Adicionar estilos
kable_styling(
bootstrap_options = c("striped", "hover"),
full_width = FALSE,
position = "center"
)
%>%
)Pipeline para relatórios profissionais
Em projetos de análise de dados completos, o fluxo geralmente é:
tidyr
e dplyr
dplyr
(filter, select, group_by, etc.)ggplot2
(gráficos) e kableExtra
(tabelas)Um pipeline completo pode é similar com:
Este fluxo integrado representa as fases 3, 4 e 6 do CRISP-DM.
Pacote kableExtra
Para que serve: Transformar tabelas de dados simples em tabelas profissionais para relatórios, apresentações e publicações.
Sintaxe básica:
Funções principais:
kable()
: Converte data frame em tabela basekable_styling()
: Aplica estilos gerais à tabelacolumn_spec()
e row_spec()
: Personalizações específicasfootnote()
: Adiciona notas de rodapéIntegrações estratégicas:
Benefícios em Administração:
# inicia com a df contendo o resultado do pipeline
relatorio_expectativa %>%
# Converte a df em uma tabela kable (tabela básica HTML/LaTeX)
kable(
# Renomeia as colunas para português
col.names = c(
"Continente", "Expectativa Média", "Expectativa Mínima", "Expectativa Máxima"
),
# Formata os números com 1 casa decimal
digits = 1,
# vírgula como separador decimal
format.args = list(decimal.mark = ",")
) %>%
# Adiciona estilo à tabela para melhorar o visual
kable_classic(
# tamanho da fonte
font_size = 25,
# Impede que a tabela ocupe toda a largura disponível
full_width = FALSE,
# # Centraliza a tabela
position = "center"
) %>%
# Aplica formatação específica à coluna da expectativa média
column_spec(
# Aplica a formatação à segunda coluna (Expectativa Média)
2,
# Coloca o texto em negrito para melhor destaque
bold = TRUE,
# Define a cor dos números como branco
color = "white",
# Aplica um gradiente de cores ao fundo das células
background = spec_color(
# A expectativa_media determinar a intensidade das cores
relatorio_expectativa$expectativa_media,
# início do gradiente com intensidade alta
begin = 0.9,
# fim do gradiente com intensidade baixa
end = 0.1,
# paleta de cores "viridis" (azul-verde-amarelo)
option = "viridis",
# 1 = valores mais altos recebem cores mais intensas
direction = 1
)
)
relatorio_expectativa %>%
kable(
col.names = c("Continente", "Expectativa Média", "Expectativa Mínima", "Expectativa Máxima"),
digits = 1,
format.args = list(decimal.mark = ",")
) %>%
kable_classic(
font_size = 25,
full_width = FALSE,
position = "center"
) %>%
column_spec(
2,
bold = TRUE,
color = "white",
background = spec_color(
relatorio_expectativa$expectativa_media,
begin = 0.9,
end = 0.1,
option = "viridis",
direction = 1
)
)
Continente | Expectativa Média | Expectativa Mínima | Expectativa Máxima |
---|---|---|---|
Oceania | 80,7 | 80,2 | 81,2 |
Europe | 77,6 | 71,8 | 81,8 |
Americas | 73,6 | 60,9 | 80,7 |
Asia | 70,7 | 43,8 | 82,6 |
Africa | 54,8 | 39,6 | 76,4 |
Dados 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 |
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?
Instruções
Prof. Washington Silva - Introdução à Ciência de Dados