Определяем ключевые товары с помощью линейной регрессии +3


Ритейл, все-таки, штука интересная. Особенно, если разрабатываешь сервис для его аналитики. Каждый поход в магазин превращается в мини-исследование. Идешь себе вдоль полок и думаешь:
“С чем лучше сосиски коррелируются с кетчупом или мариноваными огурцами? А черт, ладно, беру и то, и то!”
“Hoegaarden почти раскупили, а ведь до вечера пятницы еще целых полдня. Эх, че ж так плохо спрос то спрогнозировали? ”

Интересно, а что применяют управляющие для прогнозирования продаж?

А иногда приходишь с этим вопросом к ритейлерам, а тебе в ответ люди говорят «Нууууу, обычно как-то так ...» и начинают делать широкие жесты руками. Да вот, приблизительно, такие, как на картинке.

image


Так вот, мы в Datawiz.io, решительно не согласны с таким подходом.

В предыдущей статье о корреляции в ритейле мы рассмотрели возможности определения влияния продаж категорий товаров на другие, и на общий оборот магазина.

Но возможно ли более точно найти ключевые товары? Какова значимость продаж определенных категорий товаров и как именно они влияют на оборот магазина?

Помогут линейные модели. Построим простое уравнение которое опишет структуру продаж магазина и которое легко смоделировать.

Использовать будем все те же исходные данные по двум магазинам: Гастроном и Универсам:
  • объем продаж товаров определенной категории;
  • количество упоминаний в чеках товаров определенной категории.


Составляем таблицы:
ряды — недели;
колонки — категории;
ячейки -количество проданных товаров или упоминаний в чеках.

image


Применяем:

feature_selection <- function(df){
  drops <- c('Непродовольственные.товары','Фрукты','Непродовольственные.товары')
  df <- df[,!names(df) %in% drops]
  control <- rfeControl(functions=rfFuncs, method="cv", number=10)
  results <- rfe(df[1:ncol(df)-1], 
                 df$sum, 
                 sizes=c(1:ncol(df)-1), 
                 rfeControl=control)
  return(results)
}
results <- feature_selection(df=Gastronom_df)
predictors(results)
plot(results, type=c("g", "o"))
output


Получаем список товарных категорий по Гастроному:
  1. Хлеб и хлебобулочные изделия
  2. Снеки
  3. Молоко и молочная продукция
  4. Кофе, какао, чай
  5. Бакалея
  6. Колбасные изделия
  7. Консервация
  8. Кондитерские изделия
  9. Безалкогольные напитки
  10. Мясо
  11. Диабетическое питание
  12. Табачные изделия
  13. Сопутствующие продовольственные товары
  14. Заморозка
  15. Растительное масло

Определяем нужное количество фичей для анализа объема продаж Гастронома.

image


Мы можем определить наиболее эффективное количество фичей для построения модели. Как видим, оптимальным является использование 9, но удобным для нас будет использовать топ-6.

create formula
Gastronom_formula <- sum~
  Хлеб и хлебобулочные изделия+
  Снеки+
  Молоко и молочная продукция+
  Кофе, какао, чай+
  Бакалея+
  Колбасные изделия

Используем линейную регрессию:

Gastronom_lm <- linear_models(Gastronom_formula,Gastronom_df)
coefplot(Gastronom_lm, intercept=FALSE, outerCI=1.96, lwdOuter=1.5)


В модели представлены коэффициенты значения, чем коэффициент выше 0, тем более он влияет на результат.

image


cv.lm(df=Gastronom_df, Gastronom_lm, m=10)    #run cross validation test
> sqrt(1629697)  #mse
[1] 1277 #square root from mse
Print coefficients
>Gastronom_lm$coefficients
(Intercept) 5.53e+02 
Хлеб и хлебобулочные изделия 3.20e+00                         
Снеки 4.60e+00
Молоко и молочная продукция 1.18e+00           
Кофе, какао, чай 9.34e-03                      
Бакалея 1.23e+00 
Колбасные изделия  3.58e+00  


Используя данные Гастронома получаем такую формулу:
Оборот +- 1277 = 5530 + 3.2 *Хлеб и хлебобулочные изделия + 4.6 *Снеки +1.18 *Молоко и молочная продукция +0.0934* Кофе, какао, чай + 1.23 *Бакалея +3.58* Колбасные изделия
Проанализировав ее, видим, что категория “Кофе, какао, чай” имеет слишком слабое влияние на результат, а значит мы можем ее исключить без потери точности.
Получаем:
Оборот +- 1277 = 5530 + 3.2 *Хлеб и хлебобулочные изделия + 4.6 *Снеки +1.18 *Молоко и молочная продукция + 1.23 *Бакалея +3.58* Колбасные изделия

Итак, теперь мы видим товары каких категорий значительно влияют на оборот выбранного магазина. Любые колебания их продаж значительно отразятся на конечном результате.

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

Определяем нужное количество фичей для анализа количества чеков Гастронома
  1. Хлеб и хлебобулочные изделия
  2. Снеки
  3. Бакалея
  4. Молоко и молочная продукция
  5. Кондитерские изделия
  6. Колбасные изделия
  7. Кофе, какао, чай
  8. Консервация
  9. Табачные изделия
  10. Безалкогольные напитки
  11. Мясо
  12. Сопутствующие продовольственные товары
  13. Диабетическое питание
  14. Алкоголь

image


Используем 6 переменных.

Gastronom_formula <- sum~
  Хлеб и хлебобулочные изделия+
  Снеки+
  Бакалея+
  Молоко и молочная продукция+
  Кондитерские изделия+  
  Колбасные изделия


image


> sqrt(1033597)
[1] 1017
> Gastronom_lm$coefficients
(Intercept)     840.105   
Хлеб и хлебобулочные изделия   3.792                      
Снеки   3.283                                          
Бакалея   0.741 
Молоко и молочная продукция  0.924       
Кондитерские изделия  0.142                                               
Колбасные изделия 2.358 

Получаем такое уравнение
receipt_qty+-1017 = 840 + 3.79 *Хлеб и хлебобулочные изделия + 3.29 *Снеки + 0.7*Бакалея + 0.92 *Молоко и молочная продукция +0.14*Кондитерские изделия +2.358 *Колбасные изделия

Сравним 2 уравнения Оборота и Количества упоминаний в чеках по Гастроному

Оборот +- 1277 = 5530 + 3.2 *Хлеб и хлебобулочные изделия + 4.6 *Снеки +1.18 *Молоко и молочная продукция + 1.23 *Бакалея +3.58* Колбасные изделия
и
receipt_qty+-1017 = 840 + 3.79 *Хлеб и хлебобулочные изделия + 3.29 *Снеки + 0.7*Бакалея + 0.92 *Молоко и молочная продукция +0.14*Кондитерские изделия +2.358 *Колбасные изделия

Коэффициенты в первом уравнении значительно выше, чем во втором, это значит, что увеличение продаж данных категорий товаров больше повлияет на оборот магазина, чем на количество чеков. Но в тоже время на количество чеков может повлиять увеличение продаж Кондитерских изделий, хотя и с небольшим коэффициентом. Полученные данные можно и нужно активно использовать.

В это же время ситуация в другом магазине может значительно отличатся.

Проанализируем результаты Универсама
Выбираем товары для анализа оборота по Универсаму.
  1. Диабетическое питание
  2. Хлеб и хлебобулочные изделия
  3. Консервация
  4. Молоко и молочная продукция
  5. Кофе, какао, чай
  6. Бакалея
  7. Колбасные изделия
  8. Сопутствующие продовольственные товары
  9. Пирожные и торты
  10. Товары для животных
  11. Яйца
  12. Заморозка
  13. Безалкогольные напитки
  14. Табачные изделия
  15. Товары без НДС
  16. Кондитерские изделия
  17. Алкоголь
  18. Растительное масло
  19. Снеки
  20. Рыба и морепродукты
  21. Мясо

image


Используем 3 фичи.

universam_formula = sum ~  
  Диабетическое питание+
  Хлеб и хлебобулочные изделия +
  Консервация+

image

> sqrt(9591095)
[1] 3097
> universam_lm$coefficients
                (Intercept)       -1612.10  
Диабетическое питание    27.77 
Хлеб и хлебобулочные изделия      5.24 
Консервация 1.44 


Оборот +- 3097 = -1612.10 + 27.77 *Диабетическое питание + 5.24 *Хлеб и хлебобулочные изделия + 1.44 *Консервация
Интересный выбор товаров, что он значит рассмотрим ниже.

Данные по количеству упоминаний товаров в чеках в Универсаме
  1. Хлеб и хлебобулочные изделия
  2. Молоко и молочная продукция
  3. Диабетическое питание
  4. Кондитерские изделия
  5. Колбасные изделия
  6. Консервация
  7. Кофе, какао, чай
  8. Бакалея
  9. Яйца
  10. Пирожные и торты
  11. Сопутствующие продовольственные товары
  12. Заморозка
  13. Снеки
  14. Табачные изделия
  15. Безалкогольные напитки
  16. Растительное масло
  17. Алкоголь
  18. Товары без НДС
  19. Товары для животных
  20. Мясо
  21. Рыба и морепродукты

image

universam_formula = sum ~  
 Хлеб и хлебобулочные изделия+
  Молоко и молочная продукция+
  Диабетическое питание+
  Кондитерские изделия+
  Колбасные изделия

image

> sqrt(3382240)
[1] 1839

> universam_lm$coefficients
                (Intercept)     270.43  
Хлеб и хлебобулочные изделия       2.24  
Молоко и молочная продукция     1.37                    
Диабетическое питание   14.81      
Кондитерские изделия    1.21             
Колбасные изделия  1.31 


Eсли мы взглянем на ситуацию по Универсаму, то увидим ситуацию явно отличную от Гастронома.

Оборот +- 3097 = -1612.10 + 27.77 *Диабетическое питание + 5.24 *Хлеб и хлебобулочные изделия + 1.44 *Консервация
и
Receipt_qty+-1839 = 270.43 + 2.24 *Хлеб и хлебобулочные изделия + 1.37 *Молоко и молочная продукция + 14.81*Диабетическое питание + 1.21*Кондитерские изделия + 1.31 *Колбасные изделия

Всего 3 категории товаров влияют на оборот магазина, и Диабетическое питание особенно, практически в 5 раз больше чем Хлеб и хлебобулочные изделия. Как такое могло получится? Нам тоже стало интересно. Мы копнули глубже, заглянув в список товаров входящих в Универсаме в эту категорию. Оказалось все очень просто Универсам в категорию Диабетического питания включил всю линейку детского питания, что, естественно, значительно повысило продажи именно этой категории.

А вот на количество чеков по Универсаму влияет уже 5 категорий товаров. Но, например, Консервация влияет на оборот магазина, но не отражается на количестве чеков. Кондитерка и Колбасы влияют на количество чеков, но слабее на общий оборот магазина.

В чем, собственно, суть? Все использованные в статье примеры достаточно просты, но практическое их применение дает большой простор для анализа, прогноза продаж, планирования работы ритейлера, организации акций,… Не обязательно только одного или двух магазинов, но и торговой сети в целом.

Так давайте подходить к процессу прогнозирования в ритейле не только творчески, но и аналитически. С уважением, Datawiz.io.




К сожалению, не доступен сервер mySQL