Візуалізація предметів, які часто купуються разом


10

Я маю набір даних у такій структурі, що вставлений у файл CSV:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Кожен рядок позначає колекцію предметів, які були придбані разом. Наприклад, перший рядок означає , що елементи Banana, Waterі Riceбули придбані разом.

Я хочу створити візуалізацію на зразок наступного:

Приклад візуалізації

Це в основному сіткова діаграма, але мені потрібен інструмент (можливо, Python або R), який може прочитати структуру введення та створити діаграму, як описано вище, як вихід.

Відповіді:


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')

Велике спасибі :) Чи можу я створити це за допомогою Spark Mllib?
João_testeSW

@ João_testeSW Ви, мабуть, можете, але я не знайомий зі Спарком.
apnorton

Ви рекомендували будь-яку IDE для виконання цього коду?
João_testeSW

@ João_testeSW Якщо ви збережете це у файлі як "somescript.py", ви можете запустити його з "python3 somescript.py" на терміналі. IDE не потрібен, але якщо ви завантажите його в якусь програму IDE, сумісну з Python, він повинен працювати.
apnorton

дякую;) Я побачу, чи зможу я використовувати його в Pyspark, якщо так, то я можу відредагувати публікацію за допомогою рішення;)
João_testeSW

3

Бо Rви можете використовувати бібліотеку ArulesViz. Є приємна документація, і на сторінці 12 є приклад, як створити подібну візуалізацію.

Код для цього такий же простий:

plot(rules, method="grouped")

Хоча це не те, що шукає ОП, є чудовий приклад візуалізації за допомогою цієї бібліотеки тут: algobeans.com/2016/04/01/…
користувач35581

0

З мовою Вольфрама в Математиці .

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 за допомогою бібліотеки візуалізації морських новонароджених (побудованої поверх 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виглядає приблизно так:

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

і отримана візуалізація:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.