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
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")
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