library(rmarkdown)
library(readr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(readxl)
library(tidyr)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(knitr)
vendas <- read_excel("Vendas2024.xlsx")
salario <- read_excel("Salario_base2024.xlsx")
glimpse(vendas)
## Rows: 113,202
## Columns: 5
## $ vendedor <dbl> 101101, 101101, 101101, 101101, 101101, 101101, 101101, 1…
## $ dias <dttm> 2018-01-01, 2018-01-01, 2018-01-01, 2018-01-01, 2018-01-…
## $ venda_diaria <dbl> 371.97, 138.59, 353.93, 240.73, 122.54, 165.06, 252.70, 3…
## $ ano <dbl> 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 201…
## $ mes <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
colnames(vendas)
## [1] "vendedor" "dias" "venda_diaria" "ano" "mes"
glimpse(salario)
## Rows: 22
## Columns: 7
## $ `Número de Inscrição` <dbl> 101101, 101102, 201101, 301101, 101103, 101104, …
## $ Nome <chr> "Nome1", "Nome2", "Nome14", "Nome18", "Nome3", "…
## $ Sobrenome <chr> "Sobrenome1", "Sobrenome2", "Sobrenome14", "Sobr…
## $ Setor <chr> "Operação", "Operação", "Apoio", "Administrativo…
## $ Cargo <chr> "Operador", "Operador", "Aux Sev Gerais", "Aux A…
## $ Contrato <dttm> 2018-01-01, 2018-01-02, 2018-04-01, 2018-04-01,…
## $ Salario_base <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, …
colnames(salario)
## [1] "Número de Inscrição" "Nome" "Sobrenome"
## [4] "Setor" "Cargo" "Contrato"
## [7] "Salario_base"
salario <- salario %>%
select(numero_de_inscricao = `Número de Inscrição`,
nome = `Nome`,
sobrenome = `Sobrenome`,
setor = `Setor`,
cargo = `Cargo`,
contrato = `Contrato`,
salario_base = `Salario_base`)
vendas <- vendas %>%
mutate(vendedor = as.factor(vendedor),
venda_diaria = as.numeric(venda_diaria)
)
sum(is.na(vendas))
## [1] 0
Obs: Foi identificado que não há linha sem registro em nenhuma variável.
str (vendas)
## tibble [113,202 × 5] (S3: tbl_df/tbl/data.frame)
## $ vendedor : Factor w/ 12 levels "101101","101102",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ dias : POSIXct[1:113202], format: "2018-01-01" "2018-01-01" ...
## $ venda_diaria: num [1:113202] 372 139 354 241 123 ...
## $ ano : num [1:113202] 2018 2018 2018 2018 2018 ...
## $ mes : num [1:113202] 1 1 1 1 1 1 1 1 1 1 ...
summary(vendas)
## vendedor dias venda_diaria ano
## 101102 :14604 Min. :2018-01-01 00:00:00 Min. : 9.79 Min. :2018
## 101101 :13742 1st Qu.:2020-09-19 00:00:00 1st Qu.:133.27 1st Qu.:2020
## 101103 :12779 Median :2022-02-03 00:00:00 Median :254.06 Median :2022
## 101104 :10493 Mean :2021-11-21 03:43:43 Mean :260.38 Mean :2021
## 101105 :10419 3rd Qu.:2023-03-15 00:00:00 3rd Qu.:373.85 3rd Qu.:2023
## 101106 : 9997 Max. :2024-03-30 00:00:00 Max. :838.42 Max. :2024
## (Other):41168
## mes
## Min. : 1.000
## 1st Qu.: 3.000
## Median : 7.000
## Mean : 6.548
## 3rd Qu.:10.000
## Max. :12.000
##
estatistica_complexa <- vendas %>%
group_by(vendedor) %>% # grup_by é o comando para agrupar os registros
summarise(vendas_total = sum(na.omit(venda_diaria)), # sum é o comando de somatório
media_vendas = mean(na.omit(venda_diaria)), # mean é o comando de média
mediana_venda = median(na.omit(venda_diaria)), # median é o comendo de mediana
desv_padrao_venda_diaria = sd(na.omit(venda_diaria)), # sd é o comando de desvio padrão
quantidade_vendas = n() # n é o comando para totalizar registros por vendedor
) %>%
arrange(desc(vendas_total))
print(estatistica_complexa)
## # A tibble: 12 × 6
## vendedor vendas_total media_vendas mediana_venda desv_padrao_venda_diaria
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 101102 4031176. 276. 268. 161.
## 2 101101 3489519. 254. 249. 146.
## 3 101103 3433923. 269. 265. 155.
## 4 101105 2694622. 259. 251. 150.
## 5 101104 2491491. 237. 232. 138.
## 6 101108 2473665. 271. 265. 157.
## 7 101106 2458056. 246. 241. 143.
## 8 102111 2441308. 245. 241. 141.
## 9 101107 2201441. 250. 243. 147.
## 10 102112 1338667. 290. 283. 167.
## 11 101109 1296194. 304. 298. 174.
## 12 101110 1125154. 256. 252. 146.
## # ℹ 1 more variable: quantidade_vendas <int>
vendas %>%
group_by(mes) %>%
summarise(venda = sum(na.omit(venda_diaria)))
## # A tibble: 12 × 2
## mes venda
## <dbl> <dbl>
## 1 1 2386425.
## 2 2 1997638.
## 3 3 2465693.
## 4 4 2164830.
## 5 5 2661291.
## 6 6 2439277.
## 7 7 2057659.
## 8 8 2091707.
## 9 9 2109516.
## 10 10 2511229.
## 11 11 3013742.
## 12 12 3576212.
vendas %>%
group_by(mes,vendedor) %>%
summarise(venda = sum(na.omit(venda_diaria)))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by mes and vendedor.
## ℹ Output is grouped by mes.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(mes, vendedor))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
## # A tibble: 144 × 3
## # Groups: mes [12]
## mes vendedor venda
## <dbl> <fct> <dbl>
## 1 1 101101 304997.
## 2 1 101102 358326.
## 3 1 101103 256951.
## 4 1 101104 222662.
## 5 1 101105 243602.
## 6 1 101106 190748.
## 7 1 101107 131992.
## 8 1 101108 144379.
## 9 1 101109 130293.
## 10 1 101110 102221.
## # ℹ 134 more rows
ggplot(estatistica_complexa, aes(x=vendedor, y=quantidade_vendas, fill=vendedor)) +
geom_bar(stat="identity") + # 'identity' porque o Y já é a contagem
labs( # Adiciona títulos e rótulos
title = "Total de Vendas por Vendedor",
x = "Vendedor",
y = "Quantidade de Vendas"
)
# Criando o gráfico de linhas
vendas_processado <- vendas %>%
group_by(mes) %>%
summarise(venda = sum(na.omit(venda_diaria)))
print(vendas_processado)
## # A tibble: 12 × 2
## mes venda
## <dbl> <dbl>
## 1 1 2386425.
## 2 2 1997638.
## 3 3 2465693.
## 4 4 2164830.
## 5 5 2661291.
## 6 6 2439277.
## 7 7 2057659.
## 8 8 2091707.
## 9 9 2109516.
## 10 10 2511229.
## 11 11 3013742.
## 12 12 3576212.
ggplot(vendas_processado) +
aes(x = mes, y = venda) +
geom_line(color = "steelblue", size = 1) +
scale_x_continuous(breaks = 1:12) + # FORÇA O EIXO X A MOSTRAR INTEIROS DE 1 A 12
labs(
title = "Vendas Mensais",
x = "Mês",
y = "Quantidade de Vendas",
color = "Vendedores"
) +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Ignoring unknown labels:
## • colour : "Vendedores"
# 1. Consolidar os dados (Criando a coluna 'Total_Vendas_Mensais')
vendas_vendedor_mes <- vendas %>%
group_by(vendedor, ano, mes) %>%
summarise(
Total_Vendas_Mensais = sum(venda_diaria, na.rm = TRUE), # Soma as vendas diárias
.groups = "drop"
) %>%
# Junta Ano e Mês para criar uma linha do tempo contínua e cronológica
mutate(data_mensal = as.Date(paste(ano, mes, "01", sep = "-")))
# 2. Criar o conjunto de gráficos facetados com eixos Y livres
ggplot(vendas_vendedor_mes, aes(x = data_mensal, y = Total_Vendas_Mensais, color = as.factor(vendedor))) +
geom_line(linewidth = 0.3) + # Desenha a linha de evolução
geom_point(size = 0.8) + # Adiciona pontos nos meses para facilitar a leitura
# Finalmente divide em painéis por vendedor com escala Y livre
facet_wrap(~ vendedor, scales = "free_y") +
# Formata o eixo X para mostrar o padrão "Mês/Ano" de forma limpa (ex: Jan 2024)
scale_x_date(date_labels = "%b %Y", date_breaks = "6 months") +
labs(
title = "Evolução do Total de Vendas Mensais por Vendedor",
subtitle = "Gráficos facetados com escalas independentes no eixo Y (scales = 'free_y')",
x = "Linha do Tempo (Mês/Ano)",
y = "Total de Vendas Mensais (R$)"
) +
theme_minimal() +
theme(
legend.position = "none", # Oculta a legenda lateral, pois o topo de cada painel já diz quem é o vendedor
axis.text.x = element_text(angle = 45, hjust = 1) # Inclina as datas do eixo X para não sobrepor o texto
) +
# Altere o 'date_breaks' para o intervalo que preferir ("3 months", "6 months", "1 year")
scale_x_date(date_labels = "%b %Y", date_breaks = "1 year")
## Scale for x is already present.
## Adding another scale for x, which will replace the existing scale.
# Criar o histograma
ggplot(vendas, aes(x = venda_diaria)) +
# geom_histogram cria o gráfico.
# 'fill' é a cor interna das barras e 'color' é a cor da borda.
# 'bins = 30' é o padrão, mas você pode aumentar ou diminuir esse número.
geom_histogram(fill = "steelblue", color = "white", bins = 30) +
labs(
title = "Distribuição dos Valores de Vendas Diárias",
subtitle = "Frequência de valores das vendas",
x = "Valor da Venda Diária (R$)",
y = "Frequência (Quantidade de vezes)"
) +
theme_minimal()
# 2. Criar o Boxplot
# Usamos as.factor(mes) no eixo X para o R separar um bloco para cada mês
# Usamos fill = as.factor(mes) para dar uma cor diferente para cada mês
ggplot(vendas, aes(x = as.factor(mes), y = venda_diaria, fill = as.factor(mes))) +
geom_boxplot() +
labs(
title = "Variação e Distribuição de Vendas Diárias por Mês",
subtitle = "Análise de quartis, medianas e valores atípicos (outliers)",
x = "Mês",
y = "Valor da Venda Diária (R$)"
) +
theme_minimal() +
theme(legend.position = "none") # Esconde a legenda lateral porque os meses já estão no eixo X
# Criar o Boxplot por Vendedor
# Usamos as.factor(vendedor) no eixo X e no fill para separar e colorir cada vendedor
ggplot(vendas, aes(x = as.factor(vendedor), y = venda_diaria, fill = as.factor(vendedor))) +
geom_boxplot() +
labs(
title = "Distribuição e Variação de Vendas Diárias por Vendedor",
subtitle = "Comparação de desempenho, medianas e dispersão entre os vendedores",
x = "Código do Vendedor",
y = "Valor da Venda Diária (R$)"
) +
theme_minimal() +
theme(
legend.position = "none", # Remove a legenda lateral pois os códigos já estão no eixo X
axis.text.x = element_text(angle = 45, hjust = 1) # Inclina os códigos dos vendedores caso sejam muito longos
)
# 1. Ler as duas planilhas
# Substitua pelos nomes exatos dos seus arquivos
vendas <- read_excel("Vendas2024.xlsx")
funcionarios <- read_excel("Salario_base2024.xlsx")
# 2. Consolidar as vendas mensais de cada vendedor
vendas_mensais <- vendas %>%
group_by(vendedor, ano, mes) %>%
summarise(total_vendas = sum(venda_diaria, na.rm = TRUE), .groups = "drop")
# 3. Cruzar as planilhas e calcular os salários
folha_pagamento <- vendas_mensais %>%
# O left_join conecta as duas tabelas.
# Ele entende que 'vendedor' da tabela 1 é a mesma coisa que 'Número de Inscrição' da tabela 2.
left_join(funcionarios, by = c("vendedor" = "Número de Inscrição")) %>%
# 4. Aplicar a fórmula do Salário
mutate(
# Calcula a comissão (5% sobre as vendas)
comissao = total_vendas * 0.05,
# Soma Base + Comissão para termos o Salário Bruto
salario_bruto = Salario_base + comissao,
# Calcula os descontos (Assumindo que incidem sobre o Salário Bruto)
desconto_fgts = salario_bruto * 0.08,
desconto_inss = salario_bruto * 0.11,
# Salário Final (Líquido)
salario_final = salario_bruto - desconto_fgts - desconto_inss
) %>%
# 5. Organizar as colunas para a tabela ficar bonita e fácil de ler
select(
vendedor, Nome, Sobrenome, Cargo, ano, mes,
Salario_base, total_vendas, comissao, salario_bruto,
desconto_fgts, desconto_inss, salario_final
)
# Visualizar as primeiras linhas da nova tabela
head(folha_pagamento)
## # A tibble: 6 × 13
## vendedor Nome Sobrenome Cargo ano mes Salario_base total_vendas comissao
## <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 101101 Nome1 Sobrenome1 Oper… 2018 1 2000 40682. 2034.
## 2 101101 Nome1 Sobrenome1 Oper… 2018 2 2000 41948. 2097.
## 3 101101 Nome1 Sobrenome1 Oper… 2018 3 2000 39753. 1988.
## 4 101101 Nome1 Sobrenome1 Oper… 2018 4 2000 40270. 2014.
## 5 101101 Nome1 Sobrenome1 Oper… 2018 5 2000 60735. 3037.
## 6 101101 Nome1 Sobrenome1 Oper… 2018 6 2000 37627. 1881.
## # ℹ 4 more variables: salario_bruto <dbl>, desconto_fgts <dbl>,
## # desconto_inss <dbl>, salario_final <dbl>