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

Пример изучения правила ассоциации

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

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

Что такое правило ассоциации?

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

Ценность поддержки и ценность доверия

Вероятность увидеть товар А.

Вероятность покупки B при покупке A.

Предположим, что база данных содержит всего 1000 покупок. В 400 случаях в покупку входили наушники. Таким образом, поддержка наушников: 400/1000.

Вероятность покупки y при покупке x увеличит стоимость подъема в разы.

Давайте сделаем пример

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

Прежде всего, мы импортируем наш набор данных и необходимые библиотеки. Вы можете получить доступ к этому набору данных по ссылке (https://archive.ics.uci.edu/ml/datasets/Online+Retail+II). Набор данных содержит информацию о клиентах и ​​продажах компании электронной коммерции, которая продает сувениры. Мы будем работать с данными с 2010 по 2011 год.

import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 500)
pd.set_option('display.expand_frame_repr', False)
from mlxtend.frequent_patterns import apriori, association_rules
df_ = pd.read_excel("datasets\online_retail_II.xlsx",
                    sheet_name="Year 2010-2011")
df = df_.copy()
df.head()

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

def outlier_thresholds(dataframe, variable):
    quartile1 = dataframe[variable].quantile(0.01)
    quartile3 = dataframe[variable].quantile(0.99)
    interquantile_range = quartile3 - quartile1
    up_limit = quartile3 + 1.5 * interquantile_range
    low_limit = quartile1 - 1.5 * interquantile_range
    return low_limit, up_limit

def replace_with_thresholds(dataframe, variable):
    low_limit, up_limit = outlier_thresholds(dataframe, variable)
    dataframe.loc[(dataframe[variable] < low_limit), variable] = low_limit
    dataframe.loc[(dataframe[variable] > up_limit), variable] = up_limit

Этот набор данных содержит возвращенные товары, поэтому переменные «Количество» и «Цена» имеют отрицательные значения. Возвращенные продукты имеют букву «C» в начале переменной «Счет». Для их разделения определим следующую функцию.

def retail_data_prep(dataframe):
    dataframe.dropna(inplace=True)
    dataframe = dataframe[~dataframe["Invoice"].str.contains("C", na=False)]
    dataframe = dataframe[dataframe["Quantity"] > 0]
    dataframe = dataframe[dataframe["Price"] > 0]
    replace_with_thresholds(dataframe, "Quantity")
    replace_with_thresholds(dataframe, "Price")
    return dataframe

df = retail_data_prep(df)

Подготовка структуры данных ARL (матрица счета-продукта)

Здесь нам нужно создать матрицу «Счет-фактура», «Товар» и каждый «Счет-фактура» будет фактически означать корзину. В строке, если корзина есть в столбце, будут написаны наименования товаров, если в корзине есть тот товар, взамен будет записана 1, если нет, то будет записано 0. В следующем разделе мы продолжим работу только с клиентами во Франции.

df_fr = df[df['Country'] == "France"]

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

df_fr.groupby(['Invoice', 'Description']).agg({"Quantity": "sum"}).head(20)

Его нужно привести в матричный вид, для этого определим следующую функцию.

def create_invoice_product_df(dataframe, id=False):
    if id:
        return dataframe.groupby(['Invoice', "StockCode"])['Quantity'].sum().unstack().fillna(0). \
            applymap(lambda x: 1 if x > 0 else 0)
    else:
        return dataframe.groupby(['Invoice', 'Description'])['Quantity'].sum().unstack().fillna(0). \
            applymap(lambda x: 1 if x > 0 else 0)

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

fr_inv_pro_df = create_invoice_product_df(df_fr)
fr_inv_pro_df[0:10]

Здесь мы создали матрицу, которую хотим сделать, и посмотреть, какой продукт находится в 10 корзинах. Так как существует 1544 различных продукта, нормально увидеть больше 0.

Создание правил ассоциации

В этом разделе мы найдем продукты, связанные друг с другом.

Мы найдем опорные значения всех ассоциаций продуктов с помощью априорной функции.

frequent_itemsets = apriori(fr_inv_pro_df,
                            min_support=0.01,
                            use_colnames=True)
frequent_itemsets.sort_values("support", ascending=False)

Выше мы нашли значения поддержки продуктов с одним и разными продуктами.

Чтобы найти правила ассоциации, мы выполним следующие операции и отфильтруем их по определенным терминам.

rules = association_rules(frequent_itemsets,
                          metric="support",
                          min_threshold=0.01)
rules[(rules["support"]>0.05) & (rules["confidence"]>0.1) & (rules["lift"]>5)]. \
sort_values("confidence", ascending=False)

Спасибо, что прочитали этот текст.

Ресурсы:

миуул.ком

https://archive.ics.uci.edu/ml/datasets/Online+Retail+II