Case Grupo Soma
1. Onde estamos hoje? Diagnóstico de desempenho atual.
Realize a sumarização da receita nível loja/mês. Quais são as lojas com maior e menor volume de receita, lucro e rentabilidade?
Sumarize também uma visão de produtos e marcas
Calcular mês
library(readxl)
library(dplyr)
library(lubridate)
library(flextable)
library(ggplot2)
library(fable)
library(tsibble)
library(forecast)
df <- readxl::read_excel("C:/Users/eduar/Downloads/base_dados_case_off_premium.xlsx", sheet = "base_dados") %>%
mutate(
mes = format(as.Date(data_venda_ok), "%Y-%m"),
lucro = receita - cmv,
rentabilidade = ifelse(receita != 0, (receita - cmv) / receita, NA))Sumarizar por loja e mês
resumo_loja_mes <- df %>%
group_by(nome_filial, mes) %>%
summarise(
receita_total = sum(receita, na.rm = TRUE),
lucro_total = sum(lucro, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))
summary(resumo_loja_mes)## nome_filial mes receita_total lucro_total
## Length:152 Length:152 Min. : 4343 Min. :-11432
## Class :character Class :character 1st Qu.: 209663 1st Qu.: 88658
## Mode :character Mode :character Median : 324188 Median :125614
## Mean : 354954 Mean :129532
## 3rd Qu.: 383946 3rd Qu.:159742
## Max. :2191309 Max. :470881
## rentabilidade_media
## Min. :-513.3429
## 1st Qu.: -4.8835
## Median : 0.0709
## Mean : -14.0321
## 3rd Qu.: 0.2991
## Max. : 0.4618
Quais são as lojas com maior e menor volume de receita, lucro e rentabilidade?
Receita
Ficou evidenciado que a loja com maior volume de receita foi a de Salvador em novembro de 2024 e com menor volume foi de Downtown em maio de 2024.
resumo_receita <- resumo_loja_mes %>%
group_by(nome_filial) %>%
summarise(receita_total = sum(receita_total)) %>%
arrange(desc(receita_total))
summary(resumo_receita)## nome_filial receita_total
## Length:13 Min. : 1252615
## Class :character 1st Qu.: 3601014
## Mode :character Median : 4086554
## Mean : 4150233
## 3rd Qu.: 4290804
## Max. :10555306
Lucro
Ficou evidenciado que a loja com maior volume de lucro foi a de Salvador em maio de 2024 e com menor volume foi de Downtown em novembro de 2024.
resumo_lucro <- resumo_loja_mes %>%
group_by(nome_filial) %>%
summarise(lucro_total = sum(lucro_total)) %>%
arrange(desc(lucro_total))
summary(resumo_lucro)## nome_filial lucro_total
## Length:13 Min. : 317541
## Class :character 1st Qu.:1423003
## Mode :character Median :1588180
## Mean :1514523
## 3rd Qu.:1808642
## Max. :2790202
Rentabilidade
Ficou evidenciado que a loja com maior volume de rentabilidade foi a de Tambore em maio de 2024 e com menor volume foi de Palladium em março de 2024.
resumo_rentab <- resumo_loja_mes %>%
group_by(nome_filial) %>%
summarise(rentabilidade_media = mean(rentabilidade_media, na.rm = TRUE)) %>%
arrange(desc(rentabilidade_media))
summary(resumo_rentab)## nome_filial rentabilidade_media
## Length:13 Min. :-45.1708
## Class :character 1st Qu.:-22.2098
## Mode :character Median : -8.7899
## Mean :-13.6666
## 3rd Qu.: -2.1565
## Max. : 0.2235
Sumarize também uma visão de produtos e marcas
Por marca/mês
Ficou evidenciado também que:
A marca com maior volume de receita: Animale em novembro de 2024
A marca com maior volume de lucro: Animale em novembro de 2024
A marca com maior volume de rentabilidade: A.Brand em setembro de 2024
A marca com menor volume de receita: FYI em março de 2024
A marca com menor volume de lucro: BYNV em novembro de 2024
A marca com menor volume de rentabilidade: Animale em março de 2024
resumo_marca <- df %>%
group_by(nome_marca, mes) %>%
summarise(
receita_total = sum(receita, na.rm = TRUE),
lucro_total = sum(lucro, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))
summary(resumo_marca)## nome_marca mes receita_total lucro_total
## Length:110 Length:110 Min. : 6 Min. :-121391.9
## Class :character Class :character 1st Qu.: 13882 1st Qu.: 319.3
## Mode :character Mode :character Median : 106033 Median : 27535.5
## Mean : 490482 Mean : 178989.1
## 3rd Qu.: 505341 3rd Qu.: 134017.2
## Max. :5677131 Max. :1863181.2
## rentabilidade_media
## Min. :-240.7930
## 1st Qu.: -1.8987
## Median : 0.0326
## Mean : -4.7395
## 3rd Qu.: 0.2347
## Max. : 0.9987
Por produto/mês
Ficou evidenciado também que:
O código do produto com maior volume de receita: 26.02.0003 em novembro de 2024
O código do produto com maior volume de lucro: 26.02.0003 em novembro de 2024
O código do produto com maior volume de rentabilidade: 000031 em setembro de 2024
O código do produto com menor volume de receita: 25.34.0843 em julho de 2024
O código do produto com menor volume de lucro: V241702 em novembro de 2024
O código do produto com menor volume de rentabilidade: 12.04.0691 em março de 2024
resumo_produto <- df %>%
group_by(cod_produto, mes) %>%
summarise(
receita_total = sum(receita, na.rm = TRUE),
lucro_total = sum(lucro, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))
summary(resumo_produto)## cod_produto mes receita_total lucro_total
## Length:54475 Length:54475 Min. : -6627.5 Min. : -24147.5
## Class :character Class :character 1st Qu.: 114.6 1st Qu.: 9.2
## Mode :character Mode :character Median : 312.1 Median : 87.1
## Mean : 990.4 Mean : 361.4
## 3rd Qu.: 918.5 3rd Qu.: 305.8
## Max. :1156189.9 Max. :1141492.6
##
## rentabilidade_media
## Min. :-641961.6
## 1st Qu.: 0.1
## Median : 0.3
## Mean : -40.4
## 3rd Qu.: 0.5
## Max. : 1.0
## NA's :130
2 - Qual a média de markup e rentabilidade por loja? E por marca? Existe alguma marca ou loja com espaço para aumento de markup?
Calcular markup e rentabilidade
Filtrar registros válidos
dados_validos <- df %>%
filter(cmv != 0, receita != 0) %>%
mutate(
markup = ((receita - cmv) / cmv) * 100,
rentabilidade = ((receita - cmv) / receita) * 100)
summary(dados_validos)## data_venda data_venda_ok nome_marca
## Length:225063 Min. :2024-01-02 00:00:00.00 Length:225063
## Class :character 1st Qu.:2024-05-02 00:00:00.00 Class :character
## Mode :character Median :2024-07-24 00:00:00.00 Mode :character
## Mean :2024-07-22 06:59:45.26
## 3rd Qu.:2024-10-24 00:00:00.00
## Max. :2024-12-31 00:00:00.00
## nome_filial cod_produto cod_cor receita
## Length:225063 Length:225063 Length:225063 Min. :-5080.55
## Class :character Class :character Class :character 1st Qu.: 90.66
## Mode :character Mode :character Mode :character Median : 183.54
## Mean : 239.70
## 3rd Qu.: 329.83
## Max. :30848.10
## pecas cmv mes lucro
## Min. : -5.150 Min. :-4073.12 Length:225063 Min. :-6567.909
## 1st Qu.: 1.030 1st Qu.: 64.05 Class :character 1st Qu.: -0.365
## Median : 1.030 Median : 123.85 Mode :character Median : 45.559
## Mean : 1.079 Mean : 152.12 Mean : 87.582
## 3rd Qu.: 1.030 3rd Qu.: 215.83 3rd Qu.: 122.241
## Max. :436.720 Max. : 6567.92 Max. :30089.435
## rentabilidade markup
## Min. :-64196162 Min. : -2932.2
## 1st Qu.: 10 1st Qu.: 11.2
## Median : 31 Median : 45.3
## Mean : -1284 Mean : 148.2
## 3rd Qu.: 47 3rd Qu.: 89.8
## Max. : 287 Max. :953217.2
head(dados_validos) %>% flextable() %>% theme_vader()data_venda | data_venda_ok | nome_marca | nome_filial | cod_produto | cod_cor | receita | pecas | cmv | mes | lucro | rentabilidade | markup |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
2024-01-02 | 2024-01-02 00:00:00 | ANIMALE | BH | 25.05.3010 | 22132 | 220.1711 | 1.03 | 84.85792 | 2024-01 | 135.31320 | 61.45819 | 159.45853 |
2024-01-02 | 2024-01-02 00:00:00 | ANIMALE | BH | 39.02.0018 | 03335 | 490.2695 | 1.03 | 220.36016 | 2024-01 | 269.90936 | 55.05326 | 122.48556 |
2024-01-02 | 2024-01-02 00:00:00 | ANIMALE | BH | 52.15.1016 | 04337 | -232.6529 | -1.03 | -137.45546 | 2024-01 | -95.19748 | 40.91824 | 69.25697 |
2024-01-02 | 2024-01-02 00:00:00 | ANIMALE | BRASILIA | 03.01.1362 | 1100 | -413.8951 | -1.03 | -360.39129 | 2024-01 | -53.50381 | 12.92690 | 14.84603 |
2024-01-02 | 2024-01-02 00:00:00 | ANIMALE | BRASILIA | 03.01.1434 | 1978 | -413.8951 | -1.03 | -218.02058 | 2024-01 | -195.87452 | 47.32468 | 89.84222 |
2024-01-02 | 2024-01-02 00:00:00 | ANIMALE | BRASILIA | 26.02.0003 | 2030 | 4,000.3210 | 29.87 | 32.05648 | 2024-01 | 3,968.26452 | 99.19865 | 12,378.97617 |
Analisar por loja
A média de markup por loja foi de 161.88 referente a loja de BH e a média de rentabilidade por loja foi de -724.50 referente a de Salvador
media_loja <- dados_validos %>%
group_by(nome_filial) %>%
summarise(
markup_medio = mean(markup, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))
summary(media_loja)## nome_filial markup_medio rentabilidade_media
## Length:13 Min. : 43.11 Min. :-4538.48
## Class :character 1st Qu.:132.67 1st Qu.:-2623.87
## Mode :character Median :161.88 Median : -724.50
## Mean :178.46 Mean :-1324.68
## 3rd Qu.:194.57 3rd Qu.: -191.70
## Max. :443.52 Max. : 18.93
Gráfico por loja
O gráfico de markup médio por loja mostra que as lojas com % de markup maior e em vermelho possuem rentabilidade negativa, tendo apenas a de Downtown com a rentabilidade positiva, mas com a % de markup abaixo de 100.
ggplot(media_loja, aes(x = reorder(nome_filial, markup_medio), y = markup_medio, fill = rentabilidade_media < 0)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Markup Medio por Loja", x = "Loja", y = "Markup (%)") +
scale_fill_manual(values = c("FALSE" = "steelblue", "TRUE" = "red"), name = "Rentabilidade Negativa") +
theme_minimal()Analisar por marca
media_marca <- dados_validos %>%
group_by(nome_marca) %>%
summarise(
markup_medio = mean(markup, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))Gráfico por marca
O gráfico por marca evidencia que a A.Brand tem maior % de markup, mas com rentabilidade negativa, sendo apenas Farm, Maria Filo e Mas Animale com rentabilidade positiva aepsar do baixo índice de markup.
ggplot(media_marca, aes(x = reorder(nome_marca, markup_medio), y = markup_medio, fill = rentabilidade_media < 0)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Markup Medio por Marca", x = "Marca", y = "Markup (%)") +
scale_fill_manual(values = c("FALSE" = "forestgreen", "TRUE" = "red"), name = "Rentabilidade Negativa") +
theme_minimal()Existe alguma marca ou loja com espaço para aumento de markup?
Média geral
O markup médio na média geral é de 148.1639 e rentabilidade média de -1284.28
media_geral <- dados_validos %>%
summarise(
markup_medio = mean(markup, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))Identificar marcas com markup abaixo da média geral
As marcas com markup abaixo dessa média são Fabula, Animale Jeans, Farm, Maria Filo, Foxton, BYNV, Cris Barros, Mas Animale e FYI
oportunidade_marcas <- media_marca %>%
filter(markup_medio < media_geral$markup_medio)
ggplot(oportunidade_marcas, aes(x = reorder(nome_marca, markup_medio), y = markup_medio, fill = rentabilidade_media < 0)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Marcas com Markup abaixo da media", x = "Marca", y = "Markup (%)") +
scale_fill_manual(values = c("FALSE" = "steelblue", "TRUE" = "red"), name = "Rentabilidade Negativa") +
theme_minimal()Identificar lojas com markup abaixo da média geral
As lojas com markup abaixo dessa média são Novo Hamburgo, Palladium, Salvador e Downtown.
oportunidade_lojas <- media_loja %>%
filter(markup_medio < media_geral$markup_medio)
ggplot(oportunidade_lojas, aes(x = reorder(nome_filial, markup_medio), y = markup_medio, fill = rentabilidade_media < 0)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Lojas com Markup abaixo da media", x = "Loja", y = "Markup (%)") +
scale_fill_manual(values = c("FALSE" = "steelblue", "TRUE" = "red"), name = "Rentabilidade Negativa") +
theme_minimal()3 - Existe alguma marca que pode ser descontinuada ou repensada por baixa performance?
F.Y.I é a principal candidata à descontinuação por operar consistentemente no prejuízo. BYNV, CRIS BARROS, ANIMALE JEANS, e FOXTON devem ser repensadas ou reestruturadas.
Agregar por nome
resumo_marca <- dados_validos %>%
group_by(nome_marca) %>%
summarise(
markup_medio = mean(markup, na.rm = TRUE),
rentabilidade_media = mean(rentabilidade, na.rm = TRUE))
summary(resumo_marca)## nome_marca markup_medio rentabilidade_media
## Length:12 Min. : -13.50 Min. :-2639.84
## Class :character 1st Qu.: 21.22 1st Qu.: -330.83
## Mode :character Median : 50.37 Median : -78.72
## Mean : 516.71 Mean : -363.34
## 3rd Qu.: 87.69 3rd Qu.: -21.01
## Max. :5495.40 Max. : 17.89
Algumas marcas são mais lucrativas em determinadas lojas?
Sim, algumas marcas tendem a ter uma rentabilidade alta em diferentes lojas.
Cálculo cruzado: marca x loja
rentab_loja_marca <- dados_validos %>%
group_by(nome_filial, nome_marca) %>%
summarise(
rentabilidade_media = mean(rentabilidade, na.rm = TRUE),
markup_medio = mean(markup, na.rm = TRUE),
receita_total = sum(receita, na.rm = TRUE),
.groups = "drop")
summary(rentab_loja_marca)## nome_filial nome_marca rentabilidade_media markup_medio
## Length:119 Length:119 Min. :-9914.975 Min. : -50.87
## Class :character Class :character 1st Qu.: -127.498 1st Qu.: 22.54
## Mode :character Mode :character Median : -0.082 Median : 45.75
## Mean : -428.583 Mean : 867.98
## 3rd Qu.: 19.546 3rd Qu.: 77.50
## Max. : 99.883 Max. :85698.55
## receita_total
## Min. : -1714
## 1st Qu.: 3111
## Median : 61045
## Mean : 453339
## 3rd Qu.: 350599
## Max. :5474450
Ver marcas com grande variação de rentabilidade entre lojas
variabilidade_marca <- rentab_loja_marca %>%
group_by(nome_marca) %>%
summarise(
rent_min = min(rentabilidade_media, na.rm = TRUE),
rent_max = max(rentabilidade_media, na.rm = TRUE),
rent_sd = sd(rentabilidade_media, na.rm = TRUE),
lojas_positivas = sum(rentabilidade_media > 0),
lojas_negativas = sum(rentabilidade_media <= 0),
.groups = "drop") %>%
arrange(desc(rent_sd))Visualização (heatmap) (onde a marca é mais lucrativa ou deficiária)
ggplot(rentab_loja_marca, aes(x = nome_filial, y = nome_marca, fill = rentabilidade_media)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "red", high = "green", mid = "white", midpoint = 0, name = "Rentabilidade (%)") +
labs(
title = "Rentabilidade por Marca e Loja",
x = "Loja",
y = "Marca") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))4 - Utilizando a base de dados de venda, realize o previsão de receita de 2025 (nivel mês) em um cenário realista e um otimista.
Pre-processamento dos dados
Converter a data
df <- df %>%
mutate(data_venda_ok = as.Date(data_venda_ok),
mes = floor_date(data_venda_ok, "month")) %>%
group_by(mes) %>%
summarise(receita_mensal = sum(receita, na.rm = TRUE))Modelagem e Previsão com um modelo de series temporais
Converter em serie temporal
ts_receita <- ts(df$receita_mensal, start = c(2024, 1), frequency = 12)Ajustar modelo ARIMA
modelo <- auto.arima(ts_receita)Previsão para 12 meses
forecast_realista <- forecast(modelo, h = 12)
plot(forecast_realista)Cenário Otimista
Aplicar crescimento de 15% sobre o cenario realista
crescimento <- 1.05
forecast_otimista <- forecast_realista$mean * crescimentoPremissas:
Cenário realista: Tendência segue o comportamento passado (2024), com sazonalidade baseado em tendências históricas (modelo estatístico ARIMA).
Cenário otimista: Melhoria operacional, marketing e expansão geram crescimento de 15% a.a.