O objetivo desse projeto é prever a demanda de Vendas de Produtos Acabados/Industrializados.

Os resultados desse estudo fornece para a indústria uma parte das informações utilizadas na construção do MRP (Planejamento dos Recursos de Manufatura). Sabemos que essa informação prospectada de demanda de produtos acabados é uma das entradas do MRP, mas o intuito é apresentar a possibilidade de prospecção de informação baseada em dados históricos.

Estudo será realizado com base nos históricos das vendas dos anos entre 2010 à 2019 da empresa que chamarei a partir de agora de XYZ, em função da preservação do sigilo da informação.

Para tanto será analisada a base na procura pelos itens mais vendidos, dentro do período já citado, onde serão verificados os 10 itens mais vendidos. Em função do aprofundamento dos estudos irei escolher o item com maior volume de vendas para realizar um experimento utilizando Regressão Linear e Séries Temporais.

library(tidyverse)
library(readxl)

Leitura dos arquivo vendas.xlsx contendo vários dados das vendas.

Como já citado, não irei apresentar nenhuma parte desses dados em função do sigilo.

# Lendo a planilha do Excel
#?read_excel
vendas = read_excel("vendas.xlsx")

Convertendo os campos código de item e total das vendas para inteiro.

vendas$item = as.integer(vendas$item)
vendas$total = as.double(vendas$total)

Criando as colunas Ano, Mes, Dia e AnoMes para o processamento das Séries Temporais e Regressão Linear.

vendas <- vendas %>%
  mutate(
    Ano = substr(emissao,  1, 4),
    Mes = substr(emissao,  6, 7),
    Dia = substr(emissao, 9, 10),
    AnoMes = substr(emissao,  1, 7)
  )

Selecionando os produtos TOP 10 e limpando dados em branco.

Será criado um novo dataframe nomeado como “vendas1”, optei por criar novos dados, em função da preservação dos dados originais e facilitar o processo de análise conforme as mudanças e transformações que ocorrerem.

vendas1 <- vendas %>%
  select (AnoMes, item, quant, total) %>%
  filter (item != 0, quant != 0) %>%
  group_by(item) %>%
  summarise(total = sum(total)) %>%
  arrange(desc(total))

top10 <- head(vendas1$item, 10)
top10
##  [1]    5  548 1496  867    6  894  952 1497  953  414

A váriavel top10 armazenou os 10 produtos mais vendidos no período. Como podemos verificar o item com código 5 é o mais vendido.

Como mencionado anteriormente, optei por escolher um item para apresentar as análises e prospecções. Isso não significa que não podemos no futuro realizar com os demais itens. Até porque as informações de entradas no MRP necessitam de todo o mix de produtos.

Iremos agora processar o dataframe “vendas” criando o “vendas2”, selecionando os campos necessários para as análise e filtrando pelo item com código 5.

vendas2 <- vendas %>%
  select (Ano, Mes, item, quant, total) %>%
  filter (item != 0, quant != 0) %>%
  group_by(Ano, Mes, item) %>%
  summarise(total = sum(total)) %>%
  arrange(desc(total)) %>%
  filter (item == 5) 
## `summarise()` has grouped output by 'Ano', 'Mes'. You can override using the `.groups` argument.
vendas2
## # A tibble: 120 x 4
## # Groups:   Ano, Mes [120]
##    Ano   Mes    item   total
##    <chr> <chr> <int>   <dbl>
##  1 2018  07        5 156145.
##  2 2018  10        5 155348.
##  3 2018  08        5 151968.
##  4 2019  08        5 142695.
##  5 2019  01        5 136024.
##  6 2019  10        5 130637.
##  7 2019  12        5 126476.
##  8 2017  07        5 118812.
##  9 2016  06        5 108928.
## 10 2017  06        5 107450.
## # … with 110 more rows

Retirando a variável “item”, pois a mesma agora se tornou redundante, uma vez que estamos somente como o código 5. Será criado o dataframe “vendas3”.

Realizando uma ordenação pelas colunas “Ano” e “Mes” necessárias para as análises.

vendas3 <- vendas2 %>%
  ungroup() %>%
  select(-item) %>%
  arrange(Ano, Mes)

vendas3
## # A tibble: 120 x 3
##    Ano   Mes    total
##    <chr> <chr>  <dbl>
##  1 2010  01    40018.
##  2 2010  02    29501.
##  3 2010  03    57649.
##  4 2010  04    42504.
##  5 2010  05    41333.
##  6 2010  06    43057.
##  7 2010  07    50940.
##  8 2010  08    56906.
##  9 2010  09    47750.
## 10 2010  10    77107.
## # … with 110 more rows

A partir de agora iremos processar e apresentar a Série Temporal.

library(tsibble)
## 
## Attaching package: 'tsibble'
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, union
dados_series_temporais <- vendas3$total

SerieTemporal = ts(dados_series_temporais,start = c(2010, 01),end = c(2019, 12), frequency = 12)

SerieTemporal
##            Jan       Feb       Mar       Apr       May       Jun       Jul
## 2010  40018.26  29500.72  57648.97  42503.51  41332.83  43056.76  50940.43
## 2011  38040.72  28146.13  40636.76  35844.11  50551.82  35262.92  45007.83
## 2012  38097.94  29438.31  57013.37  38998.04  43868.40  56853.38  49772.29
## 2013  84787.80  28877.11  58810.48  56556.85  68686.45  54559.29  64740.08
## 2014  56189.83  59049.04  67677.19  52862.28  62067.86  62941.78  81880.26
## 2015  43992.38  53512.74  65586.52  75255.31  75164.45 102066.05  85995.43
## 2016  59613.50  87232.35  89433.27  95716.49  94669.46 108927.60 101738.30
## 2017  25052.61  89408.75  92823.27  78050.90 102595.93 107449.90 118812.13
## 2018  68086.63  73916.43  52288.15  89808.11  68768.75  81447.34 156144.59
## 2019 136024.36  70363.98  86676.23 103478.34  84933.81  84765.59  87985.26
##            Aug       Sep       Oct       Nov       Dec
## 2010  56905.92  47750.40  77107.02  62619.31  51988.01
## 2011  54865.45  49607.15  39340.94  42952.45  49197.31
## 2012  54927.48  50461.09  64596.80  84483.97  79364.33
## 2013  51648.96  68761.64  67050.86  56849.49  52430.61
## 2014  64436.17  63958.62  81283.56  80936.33  66506.05
## 2015  72222.93 100958.69  85294.36  89983.71  94800.20
## 2016  93368.95  97881.08 106180.97 102792.29 102358.30
## 2017  78441.06  81025.51 106421.27 106711.76 101928.78
## 2018 151968.13  76920.61 155348.10  64411.50  24368.85
## 2019 142695.27  43442.51 130636.70  97699.08 126475.62

Apresentação da Série Temporal na forma de um gráfico.

library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ggplot2)
autoplot(SerieTemporal, main = "Série Original")

Criando o modelo matemático ARIMA e processando a previsão de vendas para os próximos 24 meses. Maiores informações sobre o modelo utizado https://pt.wikipedia.org/wiki/ARIMA

modelo_serie_temporal = auto.arima(SerieTemporal)
previsao_serie_temporal = forecast(modelo_serie_temporal,h=24)

O gráfico apresenta uma simulação de dezembro de 2019 até dezembro de 2021

autoplot(previsao_serie_temporal, main="Previsão da Série")

A partir de agora iremos processar e apresentar a Regressão Linear.

Para tanto iremos reprocessar o dataframe “vendas3” criando o “vendas4” com as variáveis independente e dependentes “AnoMes” e “total” respectivamente.

vendas4 <- vendas3 %>%
  unite(AnoMes, Ano, Mes, sep = "")

vendas4$AnoMes = as.integer(vendas4$AnoMes)

vendas4
## # A tibble: 120 x 2
##    AnoMes  total
##     <int>  <dbl>
##  1 201001 40018.
##  2 201002 29501.
##  3 201003 57649.
##  4 201004 42504.
##  5 201005 41333.
##  6 201006 43057.
##  7 201007 50940.
##  8 201008 56906.
##  9 201009 47750.
## 10 201010 77107.
## # … with 110 more rows

Apresentação da correlação entre as variáveis. Atenção. Correlação não implica em Causalidade.

cor(vendas4)
##           AnoMes     total
## AnoMes 1.0000000 0.6618612
## total  0.6618612 1.0000000

Gráfico apresenta os valores do período e reta prospectada através da regressão linear.

ggplot(vendas4, aes(x = AnoMes, y = total)) +
  geom_line(aes(color = total), size = 2) +
  theme_bw() +
  geom_smooth(method="lm",se=FALSE) +
  scale_x_continuous(trans='log10') +
  scale_y_continuous(trans='log2')
## `geom_smooth()` using formula 'y ~ x'

Agora vamos processar o modelo matemático da Regressão Linear e gerar uma função que irá prospectar os valores futuros.

No exemplo abaixo iremos prospectar o valor das vendas para Janeiro de 2024.

Lembrando que a equação da reta é:

y = ax - b

onde:

y = Valor das Vendas Estimadas

a = Inclinação da reta (Slope)

x = Ano e Mês que iremos informar

b = Coeficiente Linear (Intercept)

modelo <- lm(vendas4$total ~ vendas4$AnoMes)

a <- modelo$coefficients[1]
a
## (Intercept) 
##   -13062892
b <- modelo$coefficients[2]
b
## vendas4$AnoMes 
##        65.2023
x <- 202401
x
## [1] 202401
y2 <- a + b*x
y2
## (Intercept) 
##      134120