Projeto 3 Fase - Análise de Dados

Prof: Adriano


Carregando os pacotes

library(readxl)     # Para ler arquivos originais do Excel (.xlsx)
library(dplyr)      # Para manipulação, filtros e cruzamento de dados
library(ggplot2)    # Para criação de todos os gráficos
library(knitr)      # Para gerar tabelas limpas no documento
library(kableExtra) # Para deixar as tabelas bonitas em formato HTML
library(lubridate)  # Para gerenciamento de formatos de datas
library(forecast)   # Para o modelo estatístico de previsão de vendas

##1. Carregamento e Preparação dos Dados

vendas_raw   <- read_excel("Vendas2024.xlsx", sheet = "Sheet1")
salarios_raw <- read_excel("Salario_base2024.xlsx", sheet = "Funcionarios")

vendas_limpo <- vendas_raw %>%
  mutate(
    vendedor = as.factor(vendedor),
    dias = as.Date(dias),
    venda_diaria = as.numeric(venda_diaria)
  ) %>%
  filter(!is.na(venda_diaria))

salarios_limpo <- salarios_raw %>%
  rename(vendedor = `Número de Inscrição`) %>%
  mutate(
    vendedor = as.factor(vendedor),
    Salario_base = as.numeric(Salario_base)
  )

str(vendas_limpo)
## 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        : Date[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 ...
head(vendas_limpo)
## # A tibble: 6 × 5
##   vendedor dias       venda_diaria   ano   mes
##   <fct>    <date>            <dbl> <dbl> <dbl>
## 1 101101   2018-01-01         372.  2018     1
## 2 101101   2018-01-01         139.  2018     1
## 3 101101   2018-01-01         354.  2018     1
## 4 101101   2018-01-01         241.  2018     1
## 5 101101   2018-01-01         123.  2018     1
## 6 101101   2018-01-01         165.  2018     1
summary(vendas_limpo)
##     vendedor          dias             venda_diaria         ano      
##  101102 :14604   Min.   :2018-01-01   Min.   :  9.79   Min.   :2018  
##  101101 :13742   1st Qu.:2020-09-19   1st Qu.:133.27   1st Qu.:2020  
##  101103 :12779   Median :2022-02-03   Median :254.06   Median :2022  
##  101104 :10493   Mean   :2021-11-21   Mean   :260.38   Mean   :2021  
##  101105 :10419   3rd Qu.:2023-03-15   3rd Qu.:373.85   3rd Qu.:2023  
##  101106 : 9997   Max.   :2024-03-30   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  
## 

2. Análise Estatística com dplyr.

2.1. Calculo total de venda, média diária, mediana diária, o desvio padrão e o número total de registros de vendas para cada vendedor.

estatisticas_por_vendedor <- vendas_limpo %>%
  group_by(vendedor) %>%
  summarise(
    Venda_Total = sum(venda_diaria),
    Media_Diaria = mean(venda_diaria),
    Mediana_Diaria = median(venda_diaria),
    Desvio_Padrao = sd(venda_diaria),
    Total_Registros = n()
  ) %>%
  arrange(desc(Venda_Total))

kable(estatisticas_por_vendedor, caption = "Indicadores Gerais de Desempenho por Vendedor", digits = 2)
Indicadores Gerais de Desempenho por Vendedor
vendedor Venda_Total Media_Diaria Mediana_Diaria Desvio_Padrao Total_Registros
101102 4031176 276.03 268.37 160.76 14604
101101 3489519 253.93 249.28 146.27 13742
101103 3433923 268.72 264.70 155.34 12779
101105 2694622 258.63 250.79 150.14 10419
101104 2491491 237.44 232.13 137.85 10493
101108 2473665 271.47 265.24 157.04 9112
101106 2458056 245.88 240.99 143.15 9997
102111 2441308 244.67 240.99 140.90 9978
101107 2201441 250.28 243.28 146.59 8796
102112 1338667 289.50 282.73 166.85 4624
101109 1296194 304.06 297.62 173.87 4263
101110 1125154 256.01 252.31 145.72 4395

2.2. Venda total mensal da empresa.

venda_mensal_geral <- vendas_limpo %>%
  group_by(ano, mes) %>%
  summarise(Venda_Mensal_Total = sum(venda_diaria)) %>%
  arrange(ano, mes)
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by ano and mes.
## ℹ Output is grouped by ano.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(ano, mes))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.
kable(venda_mensal_geral, caption = "Faturamento Mensal Geral da Organização", digits = 2)
Faturamento Mensal Geral da Organização
ano mes Venda_Mensal_Total
2018 1 101567.93
2018 2 84566.85
2018 3 85530.13
2018 4 98811.06
2018 5 120225.68
2018 6 97619.83
2018 7 83419.18
2018 8 124339.31
2018 9 120982.09
2018 10 127807.90
2018 11 155285.26
2018 12 187369.81
2019 1 136127.00
2019 2 98931.27
2019 3 114280.20
2019 4 126960.42
2019 5 171233.06
2019 6 149914.75
2019 7 107252.77
2019 8 141441.62
2019 9 129484.14
2019 10 288625.81
2019 11 355359.75
2019 12 468261.28
2020 1 271472.65
2020 2 222533.09
2020 3 382382.08
2020 4 421068.32
2020 5 517596.70
2020 6 416373.11
2020 7 351208.06
2020 8 331284.75
2020 9 400772.74
2020 10 387258.35
2020 11 505659.62
2020 12 595835.98
2021 1 360726.31
2021 2 301422.03
2021 3 385502.04
2021 4 430170.60
2021 5 483334.28
2021 6 476022.42
2021 7 400116.30
2021 8 392945.07
2021 9 375571.56
2021 10 441425.94
2021 11 503923.84
2021 12 608599.31
2022 1 398929.02
2022 2 344108.08
2022 3 366832.24
2022 4 479610.28
2022 5 669782.26
2022 6 616457.44
2022 7 540985.75
2022 8 530524.87
2022 9 510590.58
2022 10 614907.36
2022 11 736200.89
2022 12 817665.03
2023 1 568067.46
2023 2 477297.07
2023 3 577768.37
2023 4 608208.92
2023 5 699119.04
2023 6 682889.59
2023 7 574676.55
2023 8 571171.72
2023 9 572114.63
2023 10 651203.73
2023 11 757312.16
2023 12 898480.62
2024 1 549534.22
2024 2 468779.94
2024 3 553397.54

2.3. Venda mensal por vendendor.

venda_mensal_por_vendedor <- vendas_limpo %>%
  group_by(vendedor, ano, mes) %>%
  summarise(Venda_Mensal = sum(venda_diaria)) %>%
  arrange(vendedor, ano, mes)
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by vendedor, ano, and mes.
## ℹ Output is grouped by vendedor and ano.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(vendedor, ano, mes))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.
venda_mensal_por_vendedor %>% 
  head(15) %>% 
  kable(caption = "Demonstrativo das Vendas Mensais por Vendedor (Amostra)", digits = 2)
Demonstrativo das Vendas Mensais por Vendedor (Amostra)
vendedor ano mes Venda_Mensal
101101 2018 1 40681.80
101101 2018 2 41947.67
101101 2018 3 39753.13
101101 2018 4 40270.40
101101 2018 5 60735.17
101101 2018 6 37626.92
101101 2018 7 52441.26
101101 2018 8 34252.90
101101 2018 9 30023.94
101101 2018 10 41341.30
101101 2018 11 51040.47
101101 2018 12 39680.91
101101 2019 1 41224.85
101101 2019 2 29976.22
101101 2019 3 39335.37

3. Visualização de Dados com ggplot2

3.1 Gráfico de barras mostrando a venda total para cada vendedor.

ggplot(estatisticas_por_vendedor, aes(x = reorder(vendedor, -Venda_Total), y = Venda_Total, fill = vendedor)) +
  geom_col(show.legend = FALSE) +
  theme_minimal() +
  labs(title = "Faturamento Total Acumulado por Vendedor", x = "Vendedor", y = "Total Vendido (R$)") +
  scale_y_continuous(labels = scales::dollar_format(prefix = "R$ "))

3.2. Gráfico de linhas exibindo a tendência geral das vendas mensais da empresa.

venda_mensal_geral <- venda_mensal_geral %>%
  mutate(Data_Eixo = as.Date(paste(ano, mes, "01", sep = "-")))

ggplot(venda_mensal_geral, aes(x = Data_Eixo, y = Venda_Mensal_Total)) +
  geom_line(color = "darkblue", size = 1) +
  geom_point(color = "red", size = 2) +
  theme_minimal() +
  labs(title = "Tendência Histórica de Vendas Mensais da Empresa", x = "Período", y = "Vendas Totais Gerais (R$)") +
  scale_x_date(date_labels = "%m/%Y", date_breaks = "6 months") +
  scale_y_continuous(labels = scales::dollar_format(prefix = "R$ "))
## 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.

3.3. Gráficos de linhas facetados por vendedor com escalas do eixo Y independentes.

venda_mensal_por_vendedor <- venda_mensal_por_vendedor %>%
  mutate(Data_Eixo = as.Date(paste(ano, mes, "01", sep = "-")))

ggplot(venda_mensal_por_vendedor, aes(x = Data_Eixo, y = Venda_Mensal, color = vendedor)) +
  geom_line(size = 0.8, show.legend = FALSE) +
  geom_point(size = 1.2, show.legend = FALSE) +
  facet_wrap(~vendedor, scales = "free_y") +
  theme_light() +
  labs(title = "Evolução de Vendas Mensais por Funcionário (Eixo Y Livre)", x = "Período", y = "Faturamento Mensal (R$)") +
  scale_x_date(date_labels = "%m/%y")

3.4. Histograma para visualizar a distribuição dos valores da venda diaria.

ggplot(vendas_limpo, aes(x = venda_diaria)) +
  geom_histogram(bins = 8, fill = "seagreen", color = "white", alpha = 0.8) +
  theme_minimal() +
  labs(title = "Distribuição de Frequência das Vendas Diárias", x = "Valor da Venda (R$)", y = "Frequência") +
  scale_x_continuous(labels = scales::dollar_format(prefix = "R$ "))

3.5. Boxplot das Vendas por Mês.

ggplot(vendas_limpo, aes(x = factor(mes), y = venda_diaria, fill = factor(mes))) +
  geom_boxplot(show.legend = FALSE) +
  theme_minimal() +
  labs(title = "Dispersão e Variabilidade das Vendas Diárias por Mês", x = "Mês", y = "Valores de Venda Diária (R$)") +
  scale_y_continuous(labels = scales::dollar_format(prefix = "R$ "))

3.6. Boxplot das Vendas por Vendedor

ggplot(vendas_limpo, aes(x = vendedor, y = venda_diaria, fill = vendedor)) +
  geom_boxplot(show.legend = FALSE) +
  theme_minimal() +
  labs(title = "Análise de Outliers e Consistência de Vendas por Vendedor", x = "Vendedor", y = "Valores de Venda Diária (R$)") +
  scale_y_continuous(labels = scales::dollar_format(prefix = "R$ "))

# 4 Cálculo Salarial Real de Março de 2024 Regras de Negócio:Comissão: \(5\%\) sobre as vendas totais do mês.Desconto FGTS: \(8\%\)Desconto INSS: \(11\%\)Fórmula: \(\text{Salário Líquido} = \text{Salário Base} + \text{Comissão} - \text{FGTS} - \text{INSS}\)

vendas_marco_2024 <- vendas_limpo %>%
  filter(ano == 2024, mes == 3) %>%
  group_by(vendedor) %>%
  summarise(Venda_Total_Mes = sum(venda_diaria))

folha_marco_final <- vendas_marco_2024 %>%
  left_join(salarios_limpo, by = "vendedor") %>%
  filter(Cargo == "Vendedor") %>%
  mutate(
    Comissao = Venda_Total_Mes * 0.05,
    FGTS = (Salario_base + Comissao) * 0.08,
    INSS = (Salario_base + Comissao) * 0.11,
    Salario_Liquido = Salario_base + Comissao - FGTS - INSS
  ) %>%
  select(vendedor, Nome, Sobrenome, Salario_base, Venda_Total_Mes, Comissao, FGTS, INSS, Salario_Liquido)

kable(folha_marco_final, caption = "Folha de Pagamento com Dados Reais - Março/2024", digits = 2)
Folha de Pagamento com Dados Reais - Março/2024
vendedor Nome Sobrenome Salario_base Venda_Total_Mes Comissao FGTS INSS Salario_Liquido
101101 Nome1 Sobrenome1 2000 37178.72 1858.94 308.71 424.48 3125.74
101102 Nome2 Sobrenome2 2000 46217.34 2310.87 344.87 474.20 3491.80
101103 Nome3 Sobrenome3 2000 44313.81 2215.69 337.26 463.73 3414.71
101104 Nome4 Sobrenome4 2000 48342.67 2417.13 353.37 485.88 3577.88
101105 Nome5 Sobrenome5 2000 55186.72 2759.34 380.75 523.53 3855.06
101106 Nome6 Sobrenome6 2000 43376.99 2168.85 333.51 458.57 3376.77
101107 Nome7 Sobrenome7 2000 49625.06 2481.25 358.50 492.94 3629.81
101108 Nome8 Sobrenome8 2000 37490.39 1874.52 309.96 426.20 3138.36
101109 Nome9 Sobrenome9 2000 33693.06 1684.65 294.77 405.31 2984.57
101110 Nome10 Sobrenome10 2000 41738.19 2086.91 326.95 449.56 3310.40

Desafio 1 - Função Dinâmica para Qualquer Mês.

gerar_folha_dinamica_corporativa <- function(dados_vendas, dados_salarios, ano_alvo, mes_alvo) {
  dados_vendas %>%
    filter(ano == ano_alvo, mes == mes_alvo) %>%
    group_by(vendedor) %>%
    summarise(Venda_Total_Mes = sum(venda_diaria)) %>%
    left_join(dados_salarios, by = "vendedor") %>%
    filter(Cargo == "Vendedor") %>%
    mutate(
      Ano = ano_alvo, Mes = mes_alvo,
      Comissao = Venda_Total_Mes * 0.05,
      FGTS = (Salario_base + Comissao) * 0.08,
      INSS = (Salario_base + Comissao) * 0.11,
      Salario_Liquido = Salario_base + Comissao - FGTS - INSS
    ) %>%
    select(vendedor, Nome, Ano, Mes, Salario_base, Venda_Total_Mes, Comissao, FGTS, INSS, Salario_Liquido)
}

Desafio 2 - Geração Automatizada de Holerites (.txt).

if(!dir.exists("recibos_faturamento_2024")) dir.create("recibos_faturamento_2024")

for(row in 1:nrow(folha_marco_final)) {
  recibo <- folha_marco_final[row, ]
  
  estrutura_texto <- paste0(
    "==================================================\n",
    "               BILHETE DE PAGAMENTO               \n",
    "==================================================\n",
    "Funcionario: ", recibo$Nome, " ", recibo$Sobrenome, "\n",
    "Codigo Inscricao: ", recibo$vendedor, "     Competencia: 03/2024\n",
    "--------------------------------------------------\n",
    " Proventos:\n",
    "   (+) Salario Base Real: R$ ", round(recibo$Salario_base, 2), "\n",
    "   (+) Comissao (5%):     R$ ", round(recibo$Comissao, 2), " (Vendas: R$ ", round(recibo$Venda_Total_Mes, 2), ")\n",
    " Descontos:\n",
    "   (-) Retencao FGTS (8%):R$ ", round(recibo$FGTS, 2), "\n",
    "   (-) Retencao INSS (11%):R$ ", round(recibo$INSS, 2), "\n",
    "--------------------------------------------------\n",
    " TOTAL LIQUIDO DISPONIVEL: R$ ", round(recibo$Salario_Liquido, 2), "\n",
    "==================================================\n"
  )
  
  arquivo_saida <- paste0("recibos_faturamento_2024/recibo_vendedor_", recibo$vendedor, ".txt")
  writeLines(estrutura_texto, arquivo_saida)
}

DESAFIO FINAL - Previsão de Vendas (Próximos 6 Meses).

venda_mensal_geral <- venda_mensal_geral %>% arrange(ano, mes)

serie_vendas_totais <- ts(venda_mensal_geral$Venda_Mensal_Total, start = c(2018, 1), frequency = 12)

modelo_arima_vendas <- auto.arima(serie_vendas_totais)

previsao_futura_6m <- forecast(modelo_arima_vendas, h = 6)

plot(previsao_futura_6m, main = "Previsão de Faturamento Comercial - Próximos 6 Meses", xlab = "Anos", ylab = "Volume Total de Vendas (R$)", col = "blue", fcol = "red")

kable(as.data.frame(previsao_futura_6m), caption = "Projeção Volumétrica do Cenário Futuro")
Projeção Volumétrica do Cenário Futuro
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
Apr 2024 640477.5 576728.0 704227.1 542981.0 737974.0
May 2024 771324.3 692254.1 850394.5 650396.8 892251.7
Jun 2024 756612.1 670413.6 842810.7 624782.9 888441.4
Jul 2024 679514.9 589712.5 769317.3 542173.9 816855.9
Aug 2024 678775.7 587091.5 770459.8 538556.9 818994.5
Sep 2024 670983.0 578301.5 763664.5 529238.9 812727.1