Этот пост посвящен изучению данных о продажах Bigmart и разработке модели машинного обучения для прогнозирования продаж определенного товара в конкретном магазине. Набор данных предоставляется как часть решения Analytics Vidhya’s Bigmart Sales Prediction Problem.

Введение

Данные о продажах Bigmart состоят из данных обучения (8523 строки) и данных тестирования (5681 строка) с 11 переменными признаков. Данные обучения дополнительно содержат цену продажи для всех товаров, и задача состоит в том, чтобы разработать модель для прогнозирования цены продажи всех товаров в данных тестирования. Первым шагом любого проекта машинного обучения является загрузка данных (read_csv из библиотеки pandas в python) и печать первых нескольких строк, чтобы понять различные функции и строки (headфункция). Кроме того, мы можем использовать функцию info в pandas, чтобы понять функции набора данных, и функцию describe, чтобы получить статистические величины для всех числовых переменных. Теперь, чтобы проанализировать набор данных в целом, мы можем объединить обучающий и тестовый наборы данных (установив цену продажи равной нулю). Объединенный набор данных имеет 14204 строки и 12 столбцов.

Отказ от ответственности: мы объединили набор данных для обучения и тестирования, и нам необходимо развернуть эти два набора данных после анализа на этапе прогнозирования. Поэтому важно, чтобы мы не перемешивали данные и не отслеживали, какие образцы принадлежат поезду, а какие — тесту. Это поможет нам легко разделить их позже.

Очистка данных

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

Проверка нулевых значений

Для проверки мы используем функции isnull и sum, чтобы идентифицировать и обнаружить, что есть два столбца, а именно Outlet_Size и Item_Weight с 2439 и 4016 пропущенными значениями. Теперь нам нужно поработать над заполнением этих недостающих значений, чтобы эти функции по-прежнему были полезны на этапе прогнозирования.

Вменение данных

Традиционный подход к заполнению (процесс заполнения пропущенных значений) для числовых столбцов заключается в использовании статистических показателей, таких как среднее значение, медиана или мода. Для этой задачи давайте сделаем что-то другое.

Вменение веса элемента

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

Теперь в двух торговых точках нет весов товаров. Но мы можем получить веса, используя другие выходы. Единственное предостережение: не должно быть предметов, доступных только в одном или обоих из OUT027 и OUT019. Поскольку для этих предметов у нас не будет информации из других торговых точек. К счастью, при проверке мы идентифицируем все предметы, найденные как минимум в трех торговых точках. Теперь мы можем просто использовать средний вес товара для товара (из других торговых точек) и заполнить недостающие значения в OUT027 и OUT019. Кроме того, мы также можем подтвердить, что в весах элементов больше нет пропущенных значений, снова проверив нулевые значения.

Применение размера торговой точки

Размер выхода в основном может принимать три значения, а именно Small, Medium и High. Мы знаем, что размер выхода имеет пропущенные значения. Теперь нам нужно проверить, какие розетки соответствуют этим пропущенным значениям. При проверке мы обнаруживаем, что только три выхода, а именно OUT045, OUT017 и OUT010, ответственны за отсутствующие значения в размере выхода. Напротив, мы замечаем, что в торговых точках OUT019 и OUT010 гораздо меньше товаров по сравнению с другими торговыми точками, что указывает на то, что эти торговые точки меньше. Коробчатая диаграмма продаж товаров для каждой из торговых точек, показанная на рисунке 2, ясно показывает, что в торговых точках OUT019 и OUT010 также меньше продаж.

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

Из рисунка 3 видно, что продуктовые магазины обычно имеют более низкие объемы продаж и небольшие размеры. Розетки, относящиеся к Типу 2 и Типу 3, имеют средний размер, в то время как Тип 1 может иметь розетки всех размеров.

Из рисунка 4 видно, что магазины уровня 2 обычно имеют небольшие размеры. Также видно, что магазины уровня 1 могут быть как маленькими, так и средними, а магазины уровня 3 могут быть как среднего, так и большого размера.

Теперь мы можем определить размеры трех выпусков, OUT010, OUT045 и OUT017, взглянув на тип расположения и тип выхода и используя информацию, полученную на рисунках 3 и 4.

  • OUT010: продуктовый магазин уровня 3. Поскольку это продуктовый магазин, судя по рисунку 3, размер торговой точки для этого магазина невелик.
  • OUT045: это супермаркет типа 1 на уровне 2. Поскольку это магазин уровня 2, судя по рисунку 4, размер торговой точки для этого магазина мал.
  • OUT017: это супермаркет типа 1 на уровне 2. Поскольку это магазин уровня 2, судя по рисунку 4, размер торговой точки для этого магазина мал.

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

Исследовательский анализ данных

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

Мы также построили корреляционную матрицу для всех числовых столбцов, чтобы выявить любые избыточные переменные, как показано на рисунке 5b. Из рисунка видно, что ППМ по номенклатуре и продаж по номенклатуре на выходе имеют некоторую корреляцию со значением около 0,4. Но это недостаточно коррелировано, чтобы исключить любой из столбцов из обучения. Помимо этого, другие числовые столбцы имеют пренебрежимо малую корреляцию, и их можно с уверенностью считать независимыми.

На рис. 6а показаны точечные диаграммы зависимости ППМ от продаж товаров в торговых точках, сгруппированные по типу торговых точек, а на рис. 6б показан аналогичный график для видимости товаров. Эти графики показывают, что продажи ниже в продуктовых магазинах и выше в супермаркетах, что ожидается, поскольку супермаркеты имеют большую популярность и соответствующий рост продаж.

Диаграммы разброса продаж товаров в торговых точках по сравнению с видимостью товаров, сгруппированные по идентификатору торговых точек, показаны на рисунке 7. На нем показано, что продажи OUT019 и OUT010 меньше по сравнению с другими торговыми точками, что указывает на то, что они могут быть меньше по размеру.

Теперь, чтобы лучше понять каждый магазин, мы визуализируем все переменные по магазинам. Так как размер, тип местоположения и тип имеют только один уровень, мы можем оставить их здесь. Поскольку дисперсия года создания равна нулю, мы также можем удалить этот столбец. Мы будем отображать вес товара, видимость товара, MRP товара, продажи товара в торговых точках в виде одномерных графиков распределения, наблюдая за продажами в магазинах и типом товара в виде коробчатой ​​диаграммы для каждого магазина. Один образец участка показан на рисунке 8 для выхода 18.

Разработка функций

Теперь, когда очистка и исследование данных завершены, мы можем работать над созданием новых функций, которые могут быть полезны для прогнозирования продажной цены товаров. Анализируя столбец Item Fat Content, мы определяем несколько повторяющихся категорий, которые удаляются и заменяются правильной категорией. Точно так же мы также наблюдаем, что некоторые типы продуктов не содержат жира. Для этих видов продуктов мы вводим и исчисляем новую категорию жирности None.

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

На рис. 9 показано одномерное распределение столбца ППМ по номенклатуре. Из рисунка видно, что мы можем разделить цену на 4 категории, а не числовое значение. Таким образом, мы создаем категориальный столбец MRP_Level, чтобы указать, к какой ячейке принадлежит MRP товара. Точно так же существует множество идентификаторов предметов, вместо этого мы можем просто использовать первые две буквы, которые дают нам три группы: еда, напитки и непродовольственные товары. Кроме того, сохранение первых трех букв дает нам большую детализацию, но для этого проекта давайте придерживаться более простого случая двух букв.

Обработка выбросов

На рис. 10показанакоробочная диаграмма продаж товаров в торговых точках в зависимости от типа товара. Из графика видно, что в столбце «Продажи товаров на выходе» присутствует много выбросов. Одним из методов обработки выбросов является нормализация столбца. Для этой цели мы создаем новый столбец с именем ratio путем деления Item_Outlet_Sales на Item_MRP. На рис. 11 показана диаграмма зависимости столбца Курируемое соотношение от типа элемента. Можно видеть, что наш новый столбец, полученный путем деления продаж на MRP, действительно уменьшает количество выбросов
, а также подчеркивает различия между различными типами магазинов.

Горячее кодирование

Чтобы иметь дело со всеми категориальными переменными, как описано в этой предыдущей статье, мы применяем горячее кодирование, используя встроенную функцию pandas get_dummies. Мы также устанавливаем для переменной drop_first значение True, чтобы убедиться, что мы получаем только k-1 столбцов для столбца с k категориями, исключающими первую категорию. После выполнения одного горячего кодирования мы получаем 46 столбцов как в обучающих, так и в тестовых наборах данных. Кроме того, мы сохраняем целевой столбец в отдельную переменную и удаляем его из наборов данных для обучения/тестирования.

Еще один важный совет: перед обучением моделей сохраняйте предварительно обработанные данные в отдельный CSV-файл. Иногда данные могут быть огромными, и сохранение файлов позволяет избежать длительной предварительной обработки для подготовки данных к обучению. Поэтому рекомендуется сохранять данные после предварительной обработки и перед обучением моделей.

Масштабирование данных

Чтобы во время обучения всем столбцам придавалось одинаковое значение, важно масштабировать разные столбцы. Таким образом, масштабирование данных становится жизненно важным шагом в каждом конвейере обработки данных. Мы используем MinMaxScaler из scikit-learn для масштабирования и стандартизации обоих наборов данных.

MinMax Scaler определяет минимальные и максимальные значения всех столбцов в обучающем наборе данных (на этапе подбора). Он использует идентифицированное минимальное и максимальное значение для преобразования всех значений в столбце в диапазон от 0 до 1 (на этапе преобразования). Этот процесс выполняется как для обучения, так и для тестирования набора данных. Таким образом, все столбцы стандартизированы в обоих наборах данных.

Объединение разных моделей

На обучающем наборе данных были обучены пять различных моделей, а именно регрессор Ridge, регрессор GradientBoosting, XGBRegressor, регрессор Bayesian Ridge и StackingRegressor. Все модели были инициализированы с параметрами по умолчанию. Для тестирования производительности этих моделей мы отправили тестовые прогнозы и получили публичный рейтинг лидеров. Линейная комбинация этих 5 моделей была определена как лучшая модель в этом наборе данных на основе полученной оценки таблицы лидеров.

Заключение

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

Рекомендации

Код этой статьи: https://github.com/abishekarun/Bigmart-Sales-Data/blob/master/bigmart_sales.ipynb

Набор данных: https://www.kaggle.com/datasets/brijbhushannanda1979/bigmart-sales-data

Другие блокноты Kaggle: https://www.kaggle.com/datasets/shivan118/big-mart-sales-prediction-datasets/code

Вы можете получить полный доступ ко всем историям на Medium менее чем за 1 доллар в неделю, зарегистрировавшись по этой ссылке.

Подпишитесь на DDIntel Здесь.

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate