规则较多,仍然使用数据表查看,这无疑是一种糟糕的策略。这时关联规则可视化就显得非常重要。在得到关联规则后,如何更加高效地查看关联规则之间的内容和关系?散点图和网络图等可视化方法无疑是分析规则的利器。
#找到关联规则,通过置信阈值发现新规则
rule2=association_rules(df_fre,metric="confidence",min_threshold=0.7)
rule2["antelen"]=rule2.antecedents.apply(lambda x:len(x))
rule2=rule2[(rule2.antelen==1)&(rule2.lift>1)]
print(rule2["support"])
1.散点图
针对关联每一条规则都有置信度和支持度这两个特征,可以使用散点图来分析它们之间的关系和取值范围
##绘制支持度和置信度的散点图
rule2.plot(kind="scatter",x="support",c="r",y="confidence",s=40,figsize=(8,5))
plt.grid("on")
plt.xlabel("支持度",fontproperties=fonts,size=12)
plt.ylabel("置信度",fontproperties=fonts,size=12)
plt.title("38个规则散点图",fontproperties=fonts)
plt.show()
2.关系网络图
针对一个个规则,如何和网络图联系起来?规则的前项指向后继的连线无疑是规则的一种很好的表达方式,并且根据规则的支持度大小,可以使用
不用类型的连线来区别。带方向的关系网络图是表示规则的最好方式。接下来是使用关系网络图绘制得到的38条规则。
#将部分关联规则使用网络图进行可视化
import networkx as nx
plt.figure(figsize=(12,12))
##生成网络图
G=nx.DiGraph()
#为图像添加边
print(rule2)
for ii in rule2.index:
G.add_edge(rule2.antecedents[ii],rule2.consequents[ii],weight=rule2.support[ii])
#定义三种边;
elarge=[(u,v)for(u,v,d)in G.edges(data=True)if d['weight']>0.6]
emidle=[(u,v)for(u,v,d)in G.edges(data=True)if(d['weight']<=0.6)&(d['weight']>=0.45)]
esmall=[(u,v)for(u,v,d)in G.edges(data=True)if d['weight']<=0.45]
#图的布局方式
pos=nx.circular_layout(G)
#根据规则的置信度设置节点的大小
nx.draw_networkx_nodes(G, pos,alpha=0.4)
#设置边的形式
nx.draw_networkx_edges(G,pos,edgelist=elarge,width=2,alpha=0.6,edge_color='r')
nx.draw_networkx_edges(G,pos,edgelist=emidle,width=2,alpha=0.6,edge_color='g',style='dashdot')
nx.draw_networkx_edges(G,pos,edgelist=esmall,width=2,alpha=0.6,edge_color='b',style='dashed')
#为节点添加标签
nx.draw_networkx_labels(G,pos,font_size=10)
plt.axis('off')
plt.title('38个规则使用支持度连接',fontproperties=fonts)
plt.show()