Почему анализ корзины рынка? (Теоретический аспект):

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

Вот что сделали с вами размещение правильных продуктов и перекрестные продажи. :)

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

Есть 2 основных причины:

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

Для тех, кто не знает слова "перекрестные продажи", перекрестные продажи - это практика продажи дополнительного продукта или услуги существующему покупателю.

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

Основная концепция:

Если есть пара предметов X и Y, которые часто покупаются вместе: тогда

  1. И X, и Y можно разместить на одной полке, чтобы покупателям одного товара предлагалось купить другой.
  2. Бизнес также может применять рекламные скидки только к одному из двух товаров.
  3. Рекламные объявления на X могут быть нацелены на покупателей, которые покупают Y.
  4. X и Y могут быть объединены в новый продукт, например, имеющий Y вкусов X.

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

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

Есть три способа измерить ассоциацию:

Поддержка: частота появления товара. Это говорит о том, насколько популярен элемент / набор предметов, сколько раз он появляется в общем количестве транзакций.

Уверенность: он сообщает нам, насколько вероятно, что товар B будет приобретен, когда товар A будет приобретен, выраженный как {A - ›B}. Это измеряется долей транзакций с товаром A, в котором также присутствует товар B.

Рост: он покажет нам, насколько вероятно, что товар B будет куплен, когда товар A будет куплен. Значение подъема больше 1 означает, что предмет B вероятно будет куплен, если предмет A куплен, а значение меньше 1 означает, что предмет B маловероятно, чтобы быть купленным. если куплен товар А.

Теперь, когда мы закончили теоретический аспект анализа рыночной корзины, давайте узнаем, как актуальный код машинного обучения помог магазину в этом!

Код (Практический аспект):

Правила связывания обычно записываются следующим образом: {A} - ›{B}, что означает, что между покупателями, купившими A, и покупателями B в рамках одной транзакции, существует тесная связь. В приведенном выше примере {A} является антецедентом, а {B} - следствием. И антецеденты, и консеквенты могут иметь несколько элементов. Другими словами, {A, C} - ›{B, D} - допустимое правило.

ШАГ 1: Установите необходимые пакеты

! pip install mlxtend

Шаг 2: Загрузите необходимые пакеты

import pandas as pd
import numpy as np
#Packages for MBA
from mlxtend.frequent_patterns import apriori
from mlxtend .frequent_patterns import association_rules

Шаг 3. Загрузите набор данных

Ссылка на набор данных

df = pd.read_excel (r’C: \ Users \ Downloads \ Online Retail.xlsx ’)
df.head ()

Шаг 4: очистка данных

# Проверка разных значений для страны
df [‘Country’]. value_counts ()

# Поскольку данные довольно большие, а пространство ограничено, для упрощения обработки выбирается страна с минимальным количеством записей
df = df [df [' Страна '] == ”Саудовская Аравия”]

# Очистка данных:
# 1. Удаление лишних пробелов из описания
# 2. Удаление пустых номеров счетов

df ['Description'] = df ['Description']. Str.strip ()
df.dropna (axis = 0, subset = [ 'InvoiceNo'], inplace = True)
df ['InvoiceNo'] = df ['InvoiceNo']. Astype ('str')

Шаг 5: Создание корзины

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

корзина = (df.groupby ([‘InvoiceNo’, ‘Description’]) [‘Quantity’]. sum (). unstack (). reset_index (). fillna (0) .set_index (‘InvoiceNo’))

def encode_0_1 (x):
если x ‹= 0:
вернуть 0
если x› = 1:
вернуть 1

корзина_set = корзина.applymap (encode_0_1)

корзина_установки

Теперь, когда мы правильно структурировали данные, мы можем генерировать частые наборы элементов, поддерживающие не менее 1% (это число было выбрано, чтобы я мог получить достаточно полезных примеров).

Частые_элементы = априори (корзины_установки, min_support = 0,01, use_colnames = True)

Шаг 6: создание правил

Последний шаг - выработать правила с их соответствующей поддержкой, уверенностью и подъемом.

rules = association_rules (частые_элементы, метрика = "рост", min_threshold = 1)
rules.head ()

Вуаля !! Вот и все! Создайте частые элементы, используя алгоритм априори, затем создайте правила с помощью association_rules.

Необязательный шаг: визуализации

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

1. Облако слов:

импортировать matplotlib.pyplot как plt
импортировать seaborn как sns

из wordcloud импортировать WordCloud

plt.rcParams ['figure.figsize'] = (15, 15)
wordcloud = WordCloud (background_color = 'white', max_words = 121) .generate (str (df ['Description']))
plt.imshow (wordcloud)
plt.axis ('off')
plt.title ('Самые популярные элементы', fontsize = 20)
plt.show ()

2. Гистограмма

plt.rcParams ['figure.figsize'] = (18, 7)
color = plt.cm.copper (np.linspace (0, 1, 40))
df ['Описание']. value_counts (). head (40) .plot.bar (color = color)
plt.title ('частота самых популярных элементов', fontsize = 20)
plt.xticks (вращение = 90) < br /> plt.grid ()
plt.show ()

3. Графический график

импортировать networkx как nx
импортировать matplotlib.pyplot как plt

def draw_graph (rules, rules_to_show):
G1 = nx.DiGraph ()
color_map = []
N = 50
цветов = np.random.rand (N)
strs = ['R0', 'R1', 'R2', 'R3', 'R4', 'R5', 'R6', 'R7', 'R8', 'R9', 'R10', ' R11 ']

для i в диапазоне (rules_to_show):
G1.add_nodes_from ([«R» + str (i)])
для a в rules.iloc [i] ['антецеденты']:
G1.add_nodes_from ([a])
G1.add_edge (a, «R» + str (i), color = colors [i], weight = 2)
для c в rules.iloc [i ] ['следствие']:
G1.add_nodes_from ([c])
G1.add_edge («R» + str (i), c, color = colors [i], weight = 2)

для узла в G1:
found_a_string = False
для элемента в strs:
if node == item:
found_a_string = True
if found_a_string:
color_map .append ('желтый')
else:
color_map.append ('зеленый')

Edge = G1.edges ()
colors = [G1 [u] [v] ['color'] для u, v в краях]
weights = [G1 [u] [v] ['weight '] для u, v в ребрах]

pos = nx.spring_layout (G1, k = 16, scale = 1)
nx.draw (G1, pos, Edge = Edge, node_color = color_map, edge_color = colors, width = weights, font_size = 16,
with_labels = Ложь)

for p in pos: # увеличить позиции текста
pos [p] [1] + = 0,07
nx.draw_networkx_labels (G1, pos)
# plt.show ()

draw_graph (правила, 10)

Надеюсь, вам понравилась эта статья. Большое спасибо за чтение !!