Исследование рыночной корзины на основе данных розничной торговли в Стамбуле

d2620565dcc8ba2a6e90e2156c897c57.jpg

deed1ec2279068171bc3357e9d9aac65.jpgАвтор статьи: Жанна Боташева

Выпускница курса Machine Learning. Basic

Всем привет! Вот и я добралась до Хабра :).
Хочу поделиться своей проектной работой, которую написала в рамках курса OTUS «Machine Learning.Basic».

Итак, нас ждет путешествие в увлекательный мир шопинга в Стамбуле!

Целью работы было получить представление о тенденциях и моделях покупок в Стамбуле и определить наиболее оптимальную модель для анализа данных.

Языком разработки выступил Python, средой — Jupyter Notebook (anaconda3).

Для данной работы я использовала информацию о покупках в 10 различных торговых центрах в период с 2021 по 2023 год. Датасет содержит данные различных возрастных групп и полов, что дает комплексное представление о покупательских привычках в Стамбуле. Набор данных включает в себя важную информацию, такую ​​как номера счетов, идентификаторы клиентов, возраст, пол, способы оплаты, категории продуктов, количество, цена, даты заказа и расположение торговых центров.

b46cdeaab2e84a9be5ecb1c8c718ce68.png

Посмотрим на полный список доступных признаков:

8822142081c71c768bad1afe537e5d71.png

  • invoice_no: Номер счета.

  • customer_id: Номер клиента.

  • gender: Пол.

  • age: Возраст клиентов.

  • category: Категории приобретаемого товара

  • quantity: Количество каждого продукта (элемента) на транзакцию.

  • price: Цена товара за единицу в турецких лирах (TL).

  • payment_method: Способа оплаты (наличными, кредитной картой или дебетовой картой), используемого для транзакции.

  • invoice_date: Дата выставления счета. День, когда была создана транзакция.

  • shopping_mall: Названия торгового центра, в котором была совершена транзакция.

Пропусков в данных нет, 6 категориальных (invoice_no,  customer_id,  gender,  category,  payment_method,  invoice_date,  shopping_mall) и 3 количественных признаков (age, quantity,  price).

Предобработка

А теперь рассмотрим уникальность значений:

472baef2150dbc4a84f27e225bc7a0de.png

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

2e713767b10be59cab9b58346a878298.png

Признак invoice_data  указан некорректно. Добавим дополнительно 3 столбца с указанием года, месяца и дня:

3ed6cc75274aab1d1d132528575db64e.png

Возраст клиентов анализируется от 18 до 69 лет, количество каждого продукта варьирует от 1 до 5, самая дешевая и дорогая покупка составляют 5,23 и 5250 TL соответственно. 

7e418cc2b7503e7b0d1b460e069eca12.png

Объединим age в возрастные группы и выведем общую сумму расходов (price*quantity):

e004dfb4678508503f5596c1e80090fc.png

Визуализация данных

Дальше можно приступить к визуализации данных.

Думаю, ни для кого не секрет и все согласны с тем фактом, что женщины тратят больше:) Построим гистограмму зависимости трат от пола покупателей:

b71227c6b1023e22ff8283b802d267ab.png

Код:

g_p = data.groupby('gender')[['price']].sum().reset_index()
sns.barplot(x='gender',y='price',data= g_p)
plt.ylabel('Общая сумма расходов')
plt.xlabel('Пол')
plt.title('Сумма расходов мужчин и женщин на покупки')
plt.ticklabel_format(style='plain',axis='y')
plt.show() 

Категория товара влияет на сумму покупки, причем наибольшее влияние оказывает категория «Technology», за которым следуют «Shoes» и «Clothing».

1ddf6bbc43ceb3aa6a231c2b91d6abba.png9af0c8f8851d82c9dd294e1eb0f1d149.png

Код:

cat_p =data.groupby('category')[['price']].sum().reset_index()
plt.figure(figsize=(10,5))
sns.barplot(x='category',y='price',data=cat_p)
plt.title('Траты по категориям')
plt.ylabel('Общая сумма')
plt.xlabel('Категория')
plt.ticklabel_format(style='plain',axis='y')
plt.show()

d57a11acf02a05df220c0534aa0a8acb.png

Код:

sns.boxplot(x='total', y='category', data=data)
plt.title('Box Plot продаж по категориям приобретаемого товара')
plt.ylabel('Категория товара')
plt.xlabel('Общая стоимость')
plt.show()

Признаки «gender», «payment method» существенно не влияют на покупательское поведение в этом наборе данных.

5fabed40eb6c41cdbfd5371e3189a183.png

Код:

pay_p =data.groupby('payment_method')[['price']].sum().reset_index()
sns.barplot(x='payment_method',y='price',data=pay_p)
plt.title('Соотношение платежей в зависимости от способа оплаты')
plt.ticklabel_format(style='plain',axis='y')
plt.ylabel('Общая сумма')
plt.xlabel('Способ оплаты')
plt.show()

169e9a8e9c5f1a4ffeee56603d69433f.png

 Код:

fig, ax = plt.subplots(figsize=(12, 8))
sns.countplot(data=data, x='payment_method', hue='gender', palette='Set1', ax=ax)
ax.set_title('Распределение продаж по способу оплаты и полу')
ax.set_xlabel('Способ оплаты')
ax.set_ylabel('Продажи')
plt.show()

 Представители возрастной группы 25 — 44 года тратят на покупки больше остальных:

c0b745bec75338978cfbfc89640f04a0.png

 Код:

sns.histplot(data=data, x='age_group')
plt.title('Распределение по возрасту и количеству покупок')
plt.ylabel('Покупки')
plt.xlabel('Возрастные группы')
plt.show()

 Наибольшее количество покупок наблюдается в торговых центрах «Istanbul», «Kanyon» и «Metrocity».

990af0cbf57841d1c50c42f4ba25e594.png

Код:

colors = ['red', 'orange', 'yellow', 'green','blue', 'purple','lightblue' ,'black', 'brown', 'lightgreen']
data_mall = data.groupby("shopping_mall")["total"].sum()
data_mall.plot(kind="bar",figsize=(14, 8),color=colors)
plt.title('Распределение доходов')
plt.ylabel('Доход')
plt.xlabel('Торговый центр')
plt.show()

3547f3fc7b77bf4a5fdac7e78ba4e279.png

Код:

data['invoice_date'] = pd.to_datetime(data['invoice_date'])
data.set_index('invoice_date', inplace=True)
mall_total = data.groupby(['shopping_mall', pd.Grouper(freq='M')])['total'].sum()
mall_total = mall_total.reset_index()
mall_total = mall_total.pivot(index='invoice_date', columns='shopping_mall', values='total')
mall_total.plot(figsize=(15, 5),color=colors)
plt.title('Ежемесячный доход торгового центра')
plt.ylabel('Доход')
plt.xlabel('Месяц')
plt.show()

 Как ни странно, больше всего продаж совершается по понедельникам:

c207c36546e2eee3967a9818587e268a.png

Код:

data_sorted_weekday = data.sort_values(['day'], ascending=True, axis=0, inplace=False)
ax = data_sorted_weekday['dayofweek'].value_counts()\
[data_sorted_weekday['dayofweek'].unique()]\
.plot(kind='line',figsize=(20,10),alpha=1.0)
ax.set_title('Самый прибыльный день в неделе')
ax.set_ylabel('Число оплат')
ax.set_xlabel('День')

Построение модели

Для сравнения были использованы четыре модели:

846497e9d0bfff9d7a6d2b3fdeff2a22.png

Таким образом, делаем следующие выводы:

  • Лучший целевой показатель продемонстрировала модель CatBoostRegressor.

  • Самый активный день для совершения покупок — понедельник.

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

  • Категория товара определяет сумму покупки, самые большие показатели в «Technology», «Shoes» и «Clothing».

  • Больше покупок обнаружено у представителей возрастной группы от 25 до 44 лет.

  • Самые популярные торговые центры в плане покупок: «Istanbul», «Kanyon» и «Metrocity».

Значит, мы можем использовать модель CatBoostRegressor для дальнейших прогнозов общего дохода, используя в качестве входных данных профиль целевых клиентов (пол, возрастная группа, категория покупаемых товаров).

Спасибо за внимание:)

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

© Habrahabr.ru