Hình dung các mặt hàng thường xuyên mua cùng nhau


10

Tôi có một tập dữ liệu theo cấu trúc sau được chèn trong tệp CSV:

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

Mỗi hàng chỉ ra một bộ sưu tập các mặt hàng đã được mua cùng nhau. Ví dụ, dòng đầu tiên biểu thị rằng các mục Banana, WaterRiceđược mua lại với nhau.

Tôi muốn tạo ra một hình ảnh như sau:

hình dung ví dụ

Đây về cơ bản là một biểu đồ lưới nhưng tôi cần một số công cụ (có thể là Python hoặc R) có thể đọc cấu trúc đầu vào và tạo ra một biểu đồ như trên như đầu ra.

Câu trả lời:


6

Tôi nghĩ những gì bạn có thể muốn là một phiên bản rời rạc của bản đồ nhiệt. Ví dụ, xem bên dưới. Các màu đỏ biểu thị phổ biến nhất được mua cùng nhau, trong khi các ô màu xanh lá cây không bao giờ được mua cùng nhau. bản đồ nhiệt

Điều này thực sự khá dễ dàng để kết hợp với Pandas DataFrames và 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')

Rất cám ơn :) Tôi có thể tạo cái này bằng Spark Mllib không?
João_testeSW

@ João_testeSW Có lẽ bạn có thể, nhưng tôi không quen với Spark.
apnorton

Bạn có đề xuất bất kỳ IDE nào để thực thi mã này không?
João_testeSW

@ João_testeSW Nếu bạn lưu tệp này trong một tệp dưới dạng "somescript.py", bạn có thể chạy nó với "python3 somescript.py" trên thiết bị đầu cuối. Không cần IDE, nhưng nếu bạn tải nó vào một số IDE có khả năng Python thì nó sẽ chạy.
apnorton

cảm ơn;) Tôi sẽ xem liệu tôi có thể sử dụng nó vào Pyspark không, nếu có thì tôi có thể chỉnh sửa bài đăng bằng giải pháp;)
João_testeSW

3

Đối với R, bạn có thể sử dụng thư viện ArulesViz. Có tài liệu hay và trên trang 12, có ví dụ về cách tạo ra loại trực quan này.

Mã cho điều đó là đơn giản như thế này:

plot(rules, method="grouped")

Mặc dù đó không phải là thứ mà OP đang tìm kiếm, nhưng có một ví dụ trực quan tuyệt vời khi sử dụng thư viện này tại đây: algobeans.com/2016/04/01/ Ấn
user35581 22/03/18

0

Với ngôn ngữ Wolfram trong Mathicala .

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

Nhận số lượng cặp.

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

Nhận chỉ số cho bọ ve được đặt tên.

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

Cốt truyện với MatrixPlotviệc sử dụng SparseArray. Cũng có thể sử dụng ArrayPlot.

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

nhập mô tả hình ảnh ở đây

Lưu ý rằng nó là hình tam giác trên.

Hi vọng điêu nay co ich.


0

Bạn có thể làm điều này trong python với thư viện trực quan Seaborn (được xây dựng trên đỉnh của 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()

Khung dữ liệu cuối cùng dftrông như thế này:

nhập mô tả hình ảnh ở đây

và kết quả trực quan hóa là:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.