Visualizzazione degli articoli acquistati spesso insieme


10

Ho un set di dati nella seguente struttura inserito in un file CSV:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Ogni riga indica una raccolta di articoli acquistati insieme. Ad esempio, la prima riga indica che gli elementi Banana, Watere Ricesono stati acquistati insieme.

Voglio creare una visualizzazione come la seguente:

visualizzazione di esempio

Questo è fondamentalmente un grafico a griglia ma ho bisogno di alcuni strumenti (forse Python o R) in grado di leggere la struttura di input e produrre un grafico come il precedente come output.

Risposte:


6

Penso che ciò che probabilmente desideri sia una versione discreta di una mappa di calore. Ad esempio, vedi sotto. I colori rossi indicano i più comunemente acquistati insieme, mentre le celle verdi non vengono mai acquistate insieme. mappa di calore

Questo è in realtà abbastanza facile da mettere insieme a Pandas DataFrames e 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')

Mille grazie :) Posso creare questo usando Spark Mllib?
João_testeSW

@ João_testeSW Probabilmente puoi, ma non ho familiarità con Spark.
apnorton,

mi hai consigliato qualche IDE per eseguire questo codice?
João_testeSW

@ João_testeSW Se lo salvi in ​​un file come "somescript.py", puoi eseguirlo con "python3 somescript.py" sul terminale. Non è necessario alcun IDE, ma se lo si carica in qualche IDE compatibile con Python dovrebbe essere eseguito.
apnorton,

grazie;) Vedrò se posso usarlo in Pyspark, se sì allora posso modificare il post con la soluzione;)
João_testeSW

3

Per R, puoi usare la libreria ArulesViz. C'è una buona documentazione e nella pagina 12, c'è un esempio su come creare questo tipo di visualizzazione.

Il codice per questo è semplice come questo:

plot(rules, method="grouped")

Anche se non è quello che l'OP sta cercando, c'è una grande visualizzazione di esempio usando questa libreria qui: algobeans.com/2016/04/01/…
user35581

0

Con Wolfram Language in Mathematica .

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

Ottieni conteggi a coppie.

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

Ottieni indici per le zecche con nome.

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

Traccia con l' MatrixPlotutilizzo SparseArray. Potrebbe anche usare ArrayPlot.

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

inserisci qui la descrizione dell'immagine

Si noti che è triangolare superiore.

Spero che sia di aiuto.


0

Puoi farlo in Python con la libreria di visualizzazione Seaborn (costruita sopra 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()

Il frame di dati finale dfè simile al seguente:

inserisci qui la descrizione dell'immagine

e la visualizzazione risultante è:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.