Есть согласованный план расходов на все маагазины. Есть фактические данне по прошлым продажам в магазинах.
Распределить сумму плана по магазинам - фактически создать прогноз на будущие месяцы с ограничением плана по продажам
Выйти за рамки плана - рассмотреть отклонение плана от реальных продаж и создать прогноз без ограничений. Сравнить результаты прогнозирования с планом в олап.
Решение :
С помощью методов ARIMA/ SARIMA, а также распределения Лоренца попробовать рассчитать долю от плана, приходящийся на каждый магазин помесячно. Спрогнозировать этот коэффициент на месяц с помощью моделей временного ряда и оценить распределение.
Не ограничиваться пргнозом. Использовать нейросеть 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$`Атрибут - Магазин - Номер магазина`)
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")