Визуализация предметов, часто покупаемых вместе

10

У меня есть набор данных в следующей структуре, вставленной в файл CSV:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Каждая строка указывает коллекцию предметов, которые были куплены вместе. Например, первая строка обозначает, что элементыBanana , Waterи Riceбыли приобретены вместе.

Я хочу создать визуализацию следующим образом:

пример визуализации

Это в основном сеточная диаграмма, но мне нужен какой-то инструмент (возможно, Python или R), который может прочитать структуру ввода и создать диаграмму, подобную приведенной выше, в качестве вывода.

João_testeSW
источник

Ответы:

6

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

На самом деле это довольно легко собрать вместе с Pandas DataFrames и matplotlib.

import numpy as np
from pandas import DataFrame
import matplotlib
matplotlib.use('agg') # Write figure to disk instead of displaying (for Windows Subsystem for Linux)
import matplotlib.pyplot as plt

####
# Get data into a data frame
####
data = [
  ['Banana', 'Water', 'Rice'],
  ['Rice', 'Water'],
  ['Bread', 'Banana', 'Juice'],
]

# Convert the input into a 2D dictionary
freqMap = {}
for line in data:
  for item in line:
    if not item in freqMap:
      freqMap[item] = {}

    for other_item in line:
      if not other_item in freqMap:
        freqMap[other_item] = {}

      freqMap[item][other_item] = freqMap[item].get(other_item, 0) + 1
      freqMap[other_item][item] = freqMap[other_item].get(item, 0) + 1

df = DataFrame(freqMap).T.fillna(0)
print (df)

#####
# Create the plot
#####
plt.pcolormesh(df, edgecolors='black')
plt.yticks(np.arange(0.5, len(df.index), 1), df.index)
plt.xticks(np.arange(0.5, len(df.columns), 1), df.columns)
plt.savefig('plot.png')
apnorton
источник
Большое спасибо :) Могу ли я создать это с помощью Spark Mllib?
João_testeSW
@ João_testeSW Вы, вероятно, можете, но я не знаком со Spark.
Апнортон
Вы рекомендовали какую-либо IDE для выполнения этого кода?
João_testeSW
@ João_testeSW Если вы сохраните это в файле как «somescript.py», вы можете запустить его с «python3 somescript.py» на терминале. IDE не требуется, но если вы загрузите ее в какую-либо Python-совместимую IDE, она должна работать.
Апнортон
спасибо;) Я посмотрю, смогу ли я использовать его в Pyspark, если да, тогда я могу отредактировать пост с решением;)
João_testeSW
3

Для R, вы можете использовать библиотеку ArulesViz. Есть хорошая документация, и на странице 12 есть пример, как создать этот вид визуализации.

Код для этого так просто:

plot(rules, method="grouped")
HonzaB
источник
Хотя это не то, что ищет OP, здесь есть отличный пример визуализации с использованием этой библиотеки: algobeans.com/2016/04/01/…
user35581
0

С Wolfram Language в Mathematica .

data = {{"Banana", "Water", "Rice"},
        {"Rice", "Water"},
        {"Bread", "Banana", "Juice"}};

Получить попарные счета.

counts = Sort /@ Flatten[Subsets[#, {2}] & /@ data, 1] // Tally
{{{"Banana", "Water"}, 1}, {{"Banana", "Rice"}, 1}, 
 {{"Rice", "Water"}, 2}, {{"Banana", "Bread"}, 1}, 
 {{"Bread", "Juice"}, 1}, {{"Banana", "Juice"}, 1}}

Получить индексы для названных тиков.

indices = Thread[# -> Range[Length@#]] &@Sort@DeleteDuplicates@Flatten[data]
{"Banana" -> 1, "Bread" -> 2, "Juice" -> 3, "Rice" -> 4, "Water" -> 5}

Участок с MatrixPlotиспользованием SparseArray. Можно также использовать ArrayPlot.

MatrixPlot[
 SparseArray[Rule @@@ counts /. indices, ConstantArray[Length@indices, 2]],
 FrameTicks -> With[{t = {#2, #1} & @@@ indices}, {{t, None}, {t, None}}],
 PlotLegends -> Automatic
 ]

введите описание изображения здесь

Обратите внимание, что это верхнетреугольный.

Надеюсь это поможет.

Эдмунд
источник
0

Вы можете сделать это на python с помощью библиотеки визуализации seaborn (построенной поверх matplotlib).

data = [
  ['Banana', 'Water', 'Rice'],
  ['Rice', 'Water'],
  ['Bread', 'Banana', 'Juice'],
]

# Pull out combinations
from itertools import combinations
data_pairs = []
for d in data:
    data_pairs += [list(sorted(x)) + [1] for x in combinations(d, 2)]
    # Add reverse as well (this will mirror the heatmap)
    data_pairs += [list(sorted(x))[::-1] + [1] for x in combinations(d, 2)]

# Shape into dataframe
import pandas as pd
df = pd.DataFrame(data_pairs)
df_zeros = pd.DataFrame([list(x) + [0] for x in combinations(df[[0, 1]].values.flatten(), 2)])
df = pd.concat((df, df_zeros))
df = df.groupby([0, 1])[2].sum().reset_index().pivot(0, 1, 2).fillna(0)

import seaborn as sns
from matplotlib.pyplot import plt
sns.heatmap(df, cmap='YlGnBu')
plt.show()

Конечный кадр данных dfвыглядит так:

введите описание изображения здесь

и полученная визуализация:

введите описание изображения здесь

AlexG
источник