Постановка и условие задачи

Есть согласованный план расходов на все маагазины. Есть фактические данне по прошлым продажам в магазинах.

  1. Распределить сумму плана по магазинам - фактически создать прогноз на будущие месяцы с ограничением плана по продажам

  2. Выйти за рамки плана - рассмотреть отклонение плана от реальных продаж и создать прогноз без ограничений. Сравнить результаты прогнозирования с планом в олап.

Решение :

  1. С помощью методов ARIMA/ SARIMA, а также распределения Лоренца попробовать рассчитать долю от плана, приходящийся на каждый магазин помесячно. Спрогнозировать этот коэффициент на месяц с помощью моделей временного ряда и оценить распределение.

  2. Не ограничиваться пргнозом. Использовать нейросеть LSTM для прогнозирования продаж на 2-3 месяца, сравнить с планом и с реальными значениями на тестовой выборке.

Загрузка данных :

library(readxl)
sales <- read_excel("sales.xlsx", sheet = "Лист2")
head(sales)
## # A tibble: 6 × 9
##   Атрибут - Магазин …¹ Region Атриб…² Атриб…³ Атриб…⁴ Date   Sales Count count…⁵
##   <chr>                <chr>  <chr>   <chr>   <chr>   <chr>  <dbl> <dbl>   <dbl>
## 1 Москва(МР)           Влади… 000951  2022    1, 2022 01.0… 26400.   227     237
## 2 Москва(МР)           Влади… 000951  2022    1, 2022 01.0… 33235.   265     275
## 3 Москва(МР)           Влади… 000951  2022    1, 2022 01.0… 41466.   279     298
## 4 Москва(МР)           Влади… 000951  2022    2, 2022 01.0… 21783    210     221
## 5 Москва(МР)           Влади… 000951  2022    2, 2022 01.0… 23934    179     196
## 6 Москва(МР)           Влади… 000951  2022    2, 2022 01.0… 24816    177     180
## # … with abbreviated variable names ¹​`Атрибут - Магазин - Регион Управления`,
## #   ²​`Атрибут - Магазин - Номер магазина`, ³​`Атрибут - Год`,
## #   ⁴​`Атрибут - Квартал`, ⁵​count_initial
library(ggplot2)
# showing monthly return for single stock
ggplot(sales, aes(Date, Sales)) + geom_line()

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
sales$num_shop = as.factor(sales$`Атрибут - Магазин - Номер магазина`)
  1. Рассчитаем фактический процент продаж от суммы продаж за месяц по всем магазинам и посмотри, как она меняется из месяца в месяц:
sales= sales %>%
    group_by(Date) %>%
    mutate(percent = Sales/sum(Sales)*100) %>% 
    ungroup
library(plotly)
library(ggplot2)

fig <- plot_ly(data = sales, x = ~Date, y = ~percent, color = ~num_shop) %>% layout(title = 'Распределение доли от общей суммы продаж по месяцам', plot_bgcolor = "#e5ecf6")

fig

ARIMA -model - учитывая колебания долей распределения по магазинам можно составить прогноз для каждого магазина в отделдьности по месяцам :

model <- arima(sales$num_shop, order=c(2,0,1),fixed = c(NA,NA,NA,NA,NA),xreg=sales$percent)
model
## 
## Call:
## arima(x = sales$num_shop, order = c(2, 0, 1), xreg = sales$percent, fixed = c(NA, 
##     NA, NA, NA, NA))
## 
## Coefficients:
##          ar1     ar2     ma1  intercept  sales$percent
##       0.5397  0.4528  0.4544   509.9865       -15.6256
## s.e.  1.5009  1.4932  1.5045    51.3537         4.9059
## 
## sigma^2 estimated as 922.2:  log likelihood = -62059.15,  aic = 124130.3
library(tidyr)

data =sales %>% pivot_wider(names_from = Date, values_from = percent)
write.csv(data, "data.csv")