Visualisierung von häufig zusammen gekauften Artikeln


10

Ich habe einen Datensatz in folgender Struktur in eine CSV-Datei eingefügt:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Jede Zeile zeigt eine Sammlung von Artikeln an, die zusammen gekauft wurden. Zum Beispiel zeigt die erste Zeile , dass die Elemente Banana, Water, und Ricezusammen gekauft wurden.

Ich möchte eine Visualisierung wie die folgende erstellen:

Beispiel Visualisierung

Dies ist im Grunde ein Rasterdiagramm, aber ich benötige ein Tool (möglicherweise Python oder R), das die Eingabestruktur lesen und ein Diagramm wie das obige als Ausgabe erstellen kann.

Antworten:


6

Ich denke, was Sie wahrscheinlich wollen, ist eine diskrete Version einer Heatmap. Zum Beispiel siehe unten. Die roten Farben zeigen die am häufigsten zusammen gekauften an, während grüne Zellen niemals zusammen gekauft werden. Wärmekarte

Dies ist eigentlich ziemlich einfach mit Pandas DataFrames und matplotlib zusammenzustellen.

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

Vielen Dank :) Kann ich das mit Spark Mllib erstellen?
João_testeSW

@ João_testeSW Das kannst du wahrscheinlich, aber ich bin mit Spark nicht vertraut.
Apnorton

Haben Sie eine IDE für die Ausführung dieses Codes empfohlen?
João_testeSW

@ João_testeSW Wenn Sie dies in einer Datei als "somescript.py" speichern, können Sie es mit "python3 somescript.py" auf dem Terminal ausführen. Keine IDE erforderlich, aber wenn Sie es in eine Python-fähige IDE laden, sollte es ausgeführt werden.
Apnorton

danke;) Ich werde sehen, ob ich es in Pyspark verwenden kann, wenn ja, dann kann ich den Beitrag mit der Lösung bearbeiten;)
João_testeSW

3

Für Rkönnen Sie Bibliothek verwenden ArulesViz. Es gibt eine schöne Dokumentation und auf Seite 12 finden Sie ein Beispiel für die Erstellung dieser Art von Visualisierung.

Der Code dafür ist so einfach:

plot(rules, method="grouped")

Obwohl es nicht das ist, wonach das OP sucht, gibt es hier eine großartige Beispielvisualisierung mit dieser Bibliothek: algobeans.com/2016/04/01/…
user35581

0

Mit Wolfram Language in Mathematica .

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

Holen Sie sich paarweise Zählungen.

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}}

Holen Sie sich Indizes für benannte Zecken.

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

Plotten Sie mit MatrixPlotusing SparseArray. Könnte auch verwenden ArrayPlot.

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

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass es ein oberes Dreieck ist.

Hoffe das hilft.


0

Sie können dies in Python mit der Seaborn-Visualisierungsbibliothek tun (die auf Matplotlib basiert).

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

Der endgültige Datenrahmen dfsieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

und die resultierende Visualisierung ist:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.