一緒によく購入するアイテムを視覚化


10

次の構造のデータセットがCSVファイルに挿入されています。

Banana  Water   Rice
Rice    Water
Bread   Banana  Juice

各行は、一緒に購入されたアイテムのコレクションを示しています。例えば、最初の行は、アイテムがことを示しBananaWater、そしてRice一緒に購入しました。

次のような視覚化を作成したいと思います。

視覚化の例

これは基本的にグリッドチャートですが、入力構造を読み取って上記のようなチャートを出力として生成できるツール(おそらくPythonまたはR)が必要です。

回答:


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 2016年

このコードを実行するためにIDEを推奨しましたか?
João_testeSW

@João_testeSWこれを「somescript.py」としてファイルに保存すると、ターミナルで「python3 somescript.py」を使用して実行できます。IDEは不要ですが、Python対応のIDEにロードすれば実行できます。
apnorton 2016年

ありがとう;)Pysparkで使用できるかどうか確認します。使用できる場合は、ソリューションで投稿を編集できます;)
João_testeSW16年

3

Rあなたはライブラリを使用することができますArulesViz。すばらしいドキュメントがあり、12ページには、この種の視覚化を作成する方法の例があります。

そのためのコードは次のように単純です。

plot(rules, method="grouped")

:それはOPが探しているものはありませんが、ここではこのライブラリを使用した素晴らしい例の可視化がありますalgobeans.com/2016/04/01/...
user35581

0

ウォルフラム言語のMathematica

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

これは、pythonでseaborn可視化ライブラリー(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()

最終的なデータフレームdfは次のようになります。

ここに画像の説明を入力してください

結果の視覚化は次のとおりです。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.