Исследование рыночной корзины на основе данных розничной торговли в Стамбуле
Выпускница курса 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_no
, customer_id
, gender
, category
, payment_method
, invoice_date
, shopping_mall
) и 3 количественных признаков (age
, quantity
, price
).
Предобработка
А теперь рассмотрим уникальность значений:
Каждый номер клиента и номер счета уникальный, значит, не было повторов, из чего следует, что невозможно анализировать покупки на основе клиентов. Удалим данные столбцы:
Признак 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('День')
Построение модели
Для сравнения были использованы четыре модели:
Таким образом, делаем следующие выводы:
Лучший целевой показатель продемонстрировала модель CatBoostRegressor.
Самый активный день для совершения покупок — понедельник.
Больше расходов наблюдается у покупателей прекрасного пола, однако здесь пол, так же, как и способ оплаты, особо не влияют на покупательское поведение.
Категория товара определяет сумму покупки, самые большие показатели в «Technology», «Shoes» и «Clothing».
Больше покупок обнаружено у представителей возрастной группы от 25 до 44 лет.
Самые популярные торговые центры в плане покупок: «Istanbul», «Kanyon» и «Metrocity».
Значит, мы можем использовать модель CatBoostRegressor для дальнейших прогнозов общего дохода, используя в качестве входных данных профиль целевых клиентов (пол, возрастная группа, категория покупаемых товаров).
Спасибо за внимание:)
Подробнее о курсе, в рамках которого я подготовила проект, можно узнать тут.