Visualisasi barang yang sering dibeli bersama

10

Saya memiliki dataset dalam struktur berikut yang disisipkan dalam file CSV:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Setiap baris menunjukkan koleksi barang yang dibeli bersama. Misalnya, baris pertama menunjukkan bahwa item Banana, Waterdan Ricedibeli bersama-sama.

Saya ingin membuat visualisasi seperti berikut:

contoh visualisasi

Ini pada dasarnya adalah bagan kotak tetapi saya memerlukan beberapa alat (mungkin Python atau R) yang dapat membaca struktur input dan menghasilkan bagan seperti di atas sebagai output.

João_testeSW
sumber

Jawaban:

6

Saya pikir apa yang Anda inginkan adalah versi diskrit dari peta panas. Sebagai contoh, lihat di bawah. Warna merah menunjukkan yang paling umum dibeli bersama, sedangkan sel hijau tidak pernah dibeli bersama. peta panas

Ini sebenarnya cukup mudah untuk disatukan dengan Pandas DataFrames dan 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
sumber
Banyak terima kasih :) Dapatkah saya membuat ini menggunakan Spark Mllib?
João_testeSW
@ João_testeSW Anda mungkin bisa, tapi saya tidak terbiasa dengan Spark.
apnorton
apakah Anda merekomendasikan IDE untuk menjalankan kode ini?
João_testeSW
@ João_testeSW Jika Anda menyimpan ini dalam file sebagai "somescript.py", Anda dapat menjalankannya dengan "python3 somescript.py" di terminal. Tidak diperlukan IDE, tetapi jika Anda memuatnya ke beberapa IDE yang mampu Python, ia harus dijalankan.
apnorton
terima kasih;) Saya akan melihat apakah saya dapat menggunakannya ke Pyspark, jika ya maka saya dapat mengedit posting dengan solusinya;)
João_testeSW
3

Sebab R, Anda bisa menggunakan perpustakaan ArulesViz. Ada dokumentasi yang bagus dan di halaman 12, ada contoh cara membuat visualisasi semacam ini.

Kode untuk itu sesederhana ini:

plot(rules, method="grouped")
HonzaB
sumber
Meskipun bukan apa yang dicari OP, ada contoh visualisasi yang bagus menggunakan perpustakaan ini di sini: algobeans.com/2016/04/01/...
user35581
0

Dengan Bahasa Wolfram di Mathematica .

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

Dapatkan penghitungan berpasangan.

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

Dapatkan indeks untuk kutu bernama.

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

Plot dengan MatrixPlotmenggunakan SparseArray. Bisa juga digunakan ArrayPlot.

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

masukkan deskripsi gambar di sini

Perhatikan bahwa ini adalah segitiga atas.

Semoga ini membantu.

Edmund
sumber
0

Anda dapat melakukan ini dalam python dengan perpustakaan visualisasi seaborn (dibangun di atas 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()

Kerangka data akhir dfterlihat seperti ini:

masukkan deskripsi gambar di sini

dan visualisasi yang dihasilkan adalah:

masukkan deskripsi gambar di sini

AlexG
sumber