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 * crescimento

Premissas:

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.