Введение

Интеллектуальный анализ данных изменил то, как предприятия принимают решения, и индустрия электронной коммерции не является исключением. Мы рассмотрим три критически важных приложения интеллектуального анализа данных в электронной коммерции, используя набор данных из ювелирного интернет-магазина среднего размера на Kaggle. Набор данных содержит данные о покупках с декабря 2018 г. по декабрь 2021 г. (3 года) и включает информацию о каждом приобретенном продукте, такую ​​как order_id, цена, категория и бренд.

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

Обзор набора данных

Набор данных от Kaggle содержит данные о покупках за 3 года (с декабря 2018 года по декабрь 2021 года) в ювелирном интернет-магазине средних размеров. Каждая строка в файле представляла купленный продукт, причем несколько продуктов из одного заказа перечислены в отдельных строках и объединены полем order_id. Пример набора данных показан на рисунке 1.

Ссылка: https://www.kaggle.com/datasets/mkechinov/ecommerce-purchase-history-from-jewelry-store

Предварительная обработка данных

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

Сначала мы читаем файл CSV, содержащий набор данных, с помощью панд и отображаем первые несколько строк с помощью функции head(), чтобы получить начальное представление о структуре данных.

df = pd.read_csv('jewelry.csv')
df.head()

Затем мы заполняем любые отсутствующие значения в столбце «product_gender» значением по умолчанию «m/f», что можно интерпретировать как продукт унисекс.

df['product_gender'] = df['product_gender'].fillna('m/f')

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

df.dropna(inplace=True)

Мы удаляем столбец «SKU» из набора данных, так как он не имеет отношения к нашему анализу.

df.drop(['SKU'], axis=1)

Столбцы «order_id», «product_id», «category_id», «brand_id» и «user_id» преобразуются в строковый тип данных. Это сделано для обеспечения согласованности типов данных и предотвращения возможных ошибок при анализе.

df['order_id'] = df['order_id'].astype(str)
df['product_id'] = df['product_id'].astype(str)
df['category_id'] = df['category_id'].astype(int).astype(str)
df['brand_id'] = df['brand_id'].astype(str)
df['user_id'] = df['user_id'].astype(int).astype(str)

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

df.head()

Сегментация клиентов

В конкурентном мире электронной коммерции понимание ваших клиентов и их предпочтений имеет решающее значение для успеха. Одним из способов достижения этого является сегментация клиентов, процесс, который группирует клиентов на основе их покупательского поведения. Анализируя эти сегменты, компании могут создавать целевые маркетинговые кампании, оптимизировать предложения продуктов и повышать качество обслуживания клиентов. В этом разделе будет рассмотрена функция Python, которая использует кластеризацию k-средних для выполнения сегментации клиентов в наборе данных ювелирного магазина. Функция поможет нам определить группы клиентов на основе таких факторов, как цена, категория продукта и предпочтения бренда.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

def customer_segmentation(df):
    # Select relevant columns
    X = df[['price', 'category_id', 'brand_id']]

    # Scale the data
    scaler = StandardScaler()
    X = scaler.fit_transform(X)

    # Perform k-means clustering
    inertia = []
    k_range = range(1, 11)
    for k in k_range:
        kmeans = KMeans(n_clusters=k, random_state=0)
        kmeans.fit(X)
        inertia.append(kmeans.inertia_)

    # Plot the elbow curve
    plt.plot(k_range, inertia)
    plt.xlabel('Number of clusters')
    plt.ylabel('Inertia')
    plt.title('Elbow method for optimal k')
    plt.show()

    # Determine the optimal number of clusters using the elbow method
    k = 3  # change this to the elbow point determined by the elbow method
    
    # Fit k-means clustering model with optimal k
    kmeans = KMeans(n_clusters=k, random_state=0)
    kmeans.fit(X)

    # Add cluster labels to the dataframe
    df['cluster'] = kmeans.labels_

    # Plot the clusters
    fig, axs = plt.subplots(1, k, figsize=(20, 6))
    fig.suptitle('Customer Segmentation by Cluster')
    for i in range(k):
        cluster_df = df[df['cluster'] == i]
        axs[i].hist(cluster_df['category_name'], bins=20)
        axs[i].set_title(f'Cluster {i+1}')
        axs[i].set_xlabel('Category Name')
        axs[i].set_ylabel('Count')
        axs[i].tick_params(axis='x', labelrotation=45)


    plt.show()

    # Group users by cluster and display the mean values of each column
    grouped_df = df.groupby('cluster').mean()
    print(grouped_df)

    return df

Функция customer_segmentation позволяет компаниям сегментировать своих клиентов на основе покупательского поведения, выполняя кластеризацию k-средних в наборе данных. Процесс начинается с выбора соответствующих столбцов («цена», «идентификатор_категории» и «идентификатор_бренда») и масштабирования данных для обеспечения одинаковой важности различных функций. Чтобы определить оптимальное количество кластеров, кривая локтя строится, как показано на рисунке 2, а модель k-средних аппроксимируется оптимальным значением k (в данном случае k=3). Затем каждой точке данных присваивается метка кластера.

Результирующая сегментация клиентов визуализируется путем построения графика распределения имен категорий в каждом кластере, как показано на рисунке 3, который дает представление о предпочтениях клиентов в каждой группе. Кроме того, средние значения каждого столбца отображаются для каждого кластера, показывая характеристики каждого потребительского сегмента, такие как средняя цена, category_id и brand_id.

Кластер 1. Покупатели из этого кластера предпочитают подвески, серьги, кольца, броши, браслеты, часы и ожерелья. Эта группа проявляет большой интерес к различным видам украшений, а также к часам.
Кластер 2: Этот кластер отдает предпочтение серьгам, подвескам, ожерелья, кольца, браслеты, броши и сувениры. Эти клиенты имеют разные интересы, включая как традиционные украшения, так и сувениры.
Кластер 3. Покупатели в этом кластере преимущественно предпочитают кольца, подвески и ожерелья. Эта группа, по-видимому, больше сосредоточена на основных ювелирных изделиях, что позволяет предположить, что они могут быть заинтересованы в высококачественных, неподвластных времени дизайнах.

Рекомендации по продукту

Персонализированные рекомендации по продуктам играют важную роль в повышении качества обслуживания клиентов и стимулировании продаж в индустрии электронной коммерции. Анализируя историю покупок пользователей, компании могут рекомендовать продукты, соответствующие предпочтениям и интересам их клиентов, что увеличивает вероятность дополнительных покупок. В этом разделе мы представим функцию Python, которая генерирует персонализированные рекомендации по продуктам для данного пользователя с помощью библиотеки Annoy* , предназначенной в первую очередь для эффективного приблизительного поиска ближайших соседей. Он использует алгоритм k ближайших соседей для поиска ближайших соседей. В частности, он создает индекс точек данных, который позволяет быстро искать и извлекать k ближайших соседей заданной точки запроса —, что облегчает эффективный поиск сходства в многомерных пространствах.

from annoy import AnnoyIndex
import pandas as pd
from sklearn.preprocessing import StandardScaler

def product_recommendations(df, user_id, k=5):

    # Select relevant columns
    X = df[['price', 'category_id', 'brand_id', 'product_gender', 'product_color', 'material', 'material_2']]

    # One-hot encode the categorical features
    X = pd.get_dummies(X)

    # Scale the data
    scaler = StandardScaler()
    X = scaler.fit_transform(X)

    # Build the Annoy index
    num_trees = 100
    index = AnnoyIndex(X.shape[1], 'angular')
    for i, x in enumerate(X):
        index.add_item(i, x)
    index.build(num_trees)

    # Get the index of the user's purchases
    user_index = df[df['user_id'] == user_id].index[0]

    # Get the indices of the top k most similar purchases
    top_indices = index.get_nns_by_item(user_index, k, search_k=-1, include_distances=False)

    # Get the product information for the top k most similar purchases
    top_products = df.iloc[top_indices]

    return top_products

Функция product_recommendations создает персонализированные рекомендации по продукту для данного пользователя, выбирая соответствующие столбцы («цена», «идентификатор_категории» и «идентификатор_бренда»), масштабируя данные для обеспечения одинаковой важности различных функций и создавая индекс раздражения для эффективного поиска сходства. . Индекс заполняется масштабированными точками данных и используется для поиска k самых похожих покупок для данного пользователя на основе их прошлых транзакций. Результирующий DataFrame содержит наиболее похожие продукты, которые рекомендуются пользователю на основе таких факторов, как цена, категория и торговая марка, как показано на рис. 4.

Прогноз продаж

Точное прогнозирование продаж является жизненно важным компонентом успешного бизнес-планирования, поскольку оно позволяет компаниям прогнозировать будущий спрос и эффективно распределять ресурсы. Он играет решающую роль в управлении запасами, распределении ресурсов и разработке бизнес-стратегии. В этом разделе мы рассмотрим функцию Python, использующую метод Холта-Уинтерса** — расширениеэкспоненциального сглаживания, учитывающее как тенденцию, так и сезонность. . Он включает в себя разложение временного ряда на его трендовые, сезонные и остаточные компоненты, а затем прогнозирование будущих значений на основе закономерностей, наблюдаемых в каждом компоненте. Этот метод особенно полезен для данных временных рядов с тенденциями и сезонными закономерностями, которые сохраняются во времени.

В нашем примере мы будем использовать классExponentialSmoothing из библиотеки Statsmodels для реализации метода Холта-Уинтерса. Функция будет генерировать прогноз продаж на основе исторических данных о продажах с учетом тенденций и сезонных колебаний с помощью аддитивной модели.

import matplotlib.pylab as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing

def forecast_daily_sales(df, train_til='2021-11-16', train_extra_days=15):
    # Group the DataFrame by datetime and sum the sales for each time
    daily_sales = df.groupby('datetime')['order_id'].count().reset_index()
    daily_sales.set_index('datetime', inplace=True)

    # Resample the DataFrame to get the total daily sales data
    daily_sales = daily_sales.resample('D').sum()

    # Split the data
    train = daily_sales[:train_til]
    test = daily_sales[train_til:]

    # Fit Exponential Smoothing model
    model = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=365).fit()

    # Forecast sales for test set using the model
    forecast = model.forecast(len(test) + train_extra_days)

    # Plot actual vs predicted sales
    _ ,(ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))
    ax1.plot(daily_sales.index, daily_sales, label='Actual', color='green')
    ax1.plot(forecast.index, forecast, label='Predicted', color='orange')
    ax1.legend(loc='upper left', fontsize=12)
    ax1.set_ylabel('Sales', fontsize=12)
    ax1.set_title('Actual vs Predicted Sales', fontsize=16)

    ax2.plot(test.index, test, label='Actual', color='green')
    ax2.plot(forecast.index, forecast, label='Predicted', color='orange')
    ax2.set_xlabel('Date', fontsize=12)
    ax2.set_ylabel('Sales', fontsize=12)
    ax2.set_title('Actual vs Predicted Sales [close-up]', fontsize=16)
    ax2.legend(loc='upper left', fontsize=12)
    
    return forecast

Процесс прогнозирования продаж начинается с группировки DataFrame по дате и времени и суммирования продаж для каждого времени. Затем данные подвергаются повторной выборке для получения данных об общих ежедневных продажах. Набор данных разделен на обучающий и тестовый наборы: обучающий набор содержит данные до указанной даты (16 ноября 2021 г.), а тестовый набор содержит оставшиеся данные.

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

Фактические и прогнозируемые продажи визуализируются с помощью двух графиков. На первом графике показан весь набор данных: фактические продажи выделены зеленым цветом, а прогнозируемые — оранжевым. Второй график под названием «Фактические и прогнозируемые продажи [крупный план]» обеспечивает более целенаправленное представление тестовых данных и прогноза.

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

Заключение

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

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

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

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

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

Приложение

Индекс раздражения

Annoy (Approximate Nearest Neighbours Oh Yeah) — это библиотека, разработанная Spotify и предназначенная для эффективного поиска приблизительных ближайших соседей. Annoy особенно полезен для крупномасштабных многомерных наборов данных, где традиционные алгоритмы поиска могут стать дорогостоящими в вычислительном отношении. Это достигается путем построения леса деревьев (индекс раздражения), где каждое дерево представляет собой двоичное дерево поиска, представляющее разделение точек данных. Эти деревья построены таким образом, что время поиска значительно сокращается по сравнению с традиционными методами, сохраняя при этом высокий уровень точности поиска ближайших соседей.

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

Метод Холта-Уинтерса

Метод Холта-Уинтерса, также известный как экспоненциальное сглаживание, представляет собой метод прогнозирования временных рядов, который может учитывать различные типы шаблонов данных, например тенденции и сезонность. Это достигается путем применения экспоненциального сглаживания к различным компонентам данных временных рядов. Метод состоит из трех уравнений сглаживания: одно для уровня (среднее значение), одно для тренда (скорость изменения) и одно для сезонной составляющей.

Метод Холта-Уинтерса имеет два основных варианта: аддитивный и мультипликативный. Аддитивный метод используется, когда сезонные колебания примерно постоянны во временном ряду, а мультипликативный метод применяется, когда сезонные колебания изменяются пропорционально уровню временного ряда.

При использовании метода Холта-Уинтерса необходимо указать сезонный период, который представляет собой количество временных шагов в полном сезонном цикле (например, 12 для месячных данных с годовой сезонностью или 365 для суточных данных с годовой сезонностью). ). Этот метод можно легко применить к данным временных рядов с помощью функции ExponentialSmoothing из библиотеки Statsmodels в Python.

Авторы

*Этот блог посвящен Международному колледжу Университета Махидол
(интеллектуальный анализ данных ICCS361)

  1. Тантонг Чим-Онг 6280026
  2. Нучаполь Isariyapruit6281454
  3. Нирапорн Ковитая 6281504
  4. Чаяпол Буннаг 6380518

_____________________________________________________