Sıklıkla birlikte satın alınan öğeleri görselleştirme


10

Bir CSV dosyasına eklenen aşağıdaki yapıda bir veri kümesi var:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Her satır, birlikte satın alınan öğelerin bir koleksiyonunu gösterir. Örneğin, ilk satır öğeleri bu belirtmektedir Banana, Waterve Ricebirlikte satın alındı.

Aşağıdaki gibi bir görselleştirme oluşturmak istiyorum:

örnek görselleştirme

Bu temelde bir ızgara grafik ama ben giriş yapısını okuyabilir ve çıkış gibi yukarıdaki gibi bir grafik üretmek bazı araç (belki Python veya R) gerekir.

Yanıtlar:


6

Sanırım muhtemelen istediğiniz bir ısı haritasının ayrı bir versiyonu. Örneğin, aşağıya bakın. Kırmızı renkler en çok birlikte satın alınırken, yeşil hücreler asla birlikte satın alınmaz. sıcaklık haritası

Bu aslında Pandas DataFrames ve matplotlib ile bir araya getirilmesi oldukça kolaydır.

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

Çok teşekkürler :) Spark Mllib kullanarak bunu oluşturabilir miyim?
João_testeSW

@ João_testeSW Muhtemelen yapabilirsiniz, ancak Spark'ı bilmiyorum.
apnorton

bu kodu çalıştırmak için herhangi bir IDE önermiş miydiniz?
João_testeSW

@ João_testeSW Bunu bir dosyaya "somescript.py" olarak kaydederseniz, terminalde "python3 somescript.py" ile çalıştırabilirsiniz. IDE gerekmez, ancak Python özellikli bir IDE'ye yüklerseniz çalışmalıdır.
apnorton

teşekkürler;) Ben Pyspark içine kullanabilirsiniz, eğer evet sonra çözüm ile yazı düzenleyebilirsiniz;)
João_testeSW

3

İçin Rkitaplığı kullanabilirsiniz ArulesViz. Güzel belgeler var ve sayfa 12'de bu tür görselleştirmenin nasıl oluşturulacağına dair bir örnek var.

Bunun kodu şu kadar basit:

plot(rules, method="grouped")

OP'nin aradığı şey bu olmasa da, bu kütüphaneyi burada kullanarak harika bir örnek görselleştirme var: algobeans.com/2016/04/01/…
user35581

0

İle Wolfram Dili içinde Mathematica .

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

Çift sayıları alın.

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

Adlandırılmış keneler için endeksler alın.

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

MatrixPlotKullanarak çizim yapın SparseArray. Ayrıca kullanabilirsiniz ArrayPlot.

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

resim açıklamasını buraya girin

Üst üçgen olduğunu unutmayın.

Bu yardımcı olur umarım.


0

Bunu python'da (matplotlib üzerine inşa edilmiş) deniz dibindeki görüntüleme kütüphanesi ile yapabilirsiniz.

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

Son veri çerçevesi dfşuna benzer:

resim açıklamasını buraya girin

ve ortaya çıkan görselleştirme:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.