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

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

Всем привет! Вот и я добралась до Хабра :).

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

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

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

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

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

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

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

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

  • gender: Пол.

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

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

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

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

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

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

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

Пропусков в данных нет, 6 категориальных (invoice_nocustomer_idgendercategorypayment_methodinvoice_dateshopping_mall) и 3 количественных признаков (age, quantityprice).

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

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

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

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

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

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

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

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

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

Код:

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».

Код:

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()

Код:

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

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

Код:

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()

 Код:

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 года тратят на покупки больше остальных:

 Код:

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

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

Код:

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()

Код:

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()

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

Код:

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('День')

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

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

  • линейная регрессия;

  • деревья решений;

  • LGBMRegressor;

  • CatBoostRegressor.

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

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

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

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

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

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

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

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

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

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

Комментарии (3)


  1. aborouhin
    20.10.2023 15:49

    я использовала информацию о покупках в 10 различных торговых центрах в период с 2021 по 2023 год

    Я правильно понимаю, что тот малозначительный факт, что инфляция в Турции с 2021 по 2023 год даже по официальным данным составила процентов 150, а реальный рост потребительских цен - явно больше 200%, в исследовании был проигнорирован? :)


  1. ishumitcu
    20.10.2023 15:49
    -1

    понедельник на турецком базарный день вроде


    1. aborouhin
      20.10.2023 15:49
      -1

      Pazartesi - "после базарного", а pazar, "базарный" - это воскресенье. Но вообще уличные базары тут скорее по пятницам, а в ТЦ в выходные ездят. Так что что за аномалия с понедельниками - это скорее вопрос к тому, а откуда вообще анализируемый датасет взялся и насколько он репрезентабелен.