Python, networkxを利用した
アソシエーション分析の具体的な描画方法について教えていただければと思います。
特にエッジの太さを関係性の強さ(lift値)に比例して変化させる方法がわからずに苦慮しています。
[これまでの記載したコード]
# データの読み込み・整形
import pandas as pd
df = pd.read_csv('ファイル名.csv', index_col='Number')
from mlxtend.frequent_patterns import apriori, association_rules, fpgrowth
#aprioriでまずsupportが高い単品or組み合わせを選出
freq_items = apriori(df, min_support=0.1, use_colnames=1)
#上で選ばれた組み合わせの中でliftが高い組み合わせを選出
freq_items_top = association_rules(freq_items, metric = "lift", min_threshold = 1.0)
df2= freq_items_top
#図にして表示
import networkx as nx
import matplotlib.pyplot as plt
親ノードの抽出
ant = freq_items_top['antecedents'].values
ant = [tuple(x) for x in ant]
子ノードの抽出
con = freq_items_top['consequents'].values
con = [tuple(x) for x in con]
全ノードのリストアップ
both = list(set(ant + con))
both
関係グラフの初期化
G = nx.DiGraph()
ノードの追加
for n in both:
G.add_node(n)
エッジの追加
for i in range(len(freq_items_top)):
item = freq_items_top.loc[i]
ant = tuple(item['antecedents'])
con = tuple(item['consequents'])
G.add_edge(ant, con)
#エラー回避のためバージョンを変更
pip install decorator==4.3
#グラフの描画
pos = nx.spring_layout(G,seed=1)
plt.figure(figsize=(20, 15))
ネットワーク全体の次数の平均値を計算
average_deg = sum(d for n, d in G.degree()) / G.number_of_nodes()
ノードの次数に比例するようにサイズを設定
sizes = [1500*deg/average_deg for node, deg in G.degree()]
nx.draw_networkx_nodes(G, pos, node_color='b',alpha=0.4,node_size = sizes)
nx.draw_networkx_edges(G, pos, alpha=0.3, edge_color="c")
nx.draw_networkx_labels(G, pos,
horizontalalignment='left',
verticalalignment='center',font_family='Hiragino Maru Gothic Pro')
plt.axis('off')
plt.savefig('beautiful2.jpeg', dpi=1500, bbox_inches='tight')
plt.show()
あなたの回答
tips
プレビュー