可视化经常一起购买的物品


10

我在CSV文件中插入了以下结构的数据集:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

每行表示一起购买的物品的集合。例如,第一行表示的项目BananaWaterRice购在一起。

我想创建如下所示的可视化文件:

可视化示例

这基本上是一个网格图,但是我需要一些工具(可能是Python或R),该工具可以读取输入结构并生成类似于上述的图表作为输出。

Answers:


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您可能可以,但是我不熟悉Spark。
apnorton

您是否推荐任何IDE来执行此代码?
João_testeSW

@João_testeSW如果将其保存为“ somescript.py”文件,则可以在终端上使用“ python3 somescript.py”运行它。不需要IDE,但是如果将其加载到某些支持Python的IDE中,它应该可以运行。
apnorton '16

谢谢;)我会看看是否可以在Pyspark中使用它,如果可以的话,我可以使用解决方案编辑帖子;)
João_testeSW16-10-7

3

对于R,您可以使用库ArulesViz。这里有很好的文档,在第12页上,有示例如何创建这种可视化效果。

这样的代码很简单:

plot(rules, method="grouped")

虽然它不是什么OP是寻找,这里有使用这个库一个很好的例子,可视化:algobeans.com/2016/04/01/...
user35581

0

Mathematica中使用Wolfram语言

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

您可以使用seaborn可视化库(基于matplotlib构建)在python中执行此操作。

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如下所示:

在此处输入图片说明

得到的可视化效果是:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.