aprioriでルールを取得しても数が多すぎると全体が見通せないことがあります。
そこで、netoworkx
を使ってルールを可視化することにしました。
描画してみる
ルールをつくるところまでは、下記の記事のままです。
import networkx as nx #50パーセンタイル以上のみひとまず残す th = df['support'].median() tmp = df[df['support']>= th] #グラフをつくる G = nx.DiGraph() G.add_edges_from(tmp[['from','to']].values) # グラフを表示 pos=nx.spring_layout(G) nx.draw(G,pos=pos) #グラフを装飾 nx.draw_networkx_edges(G,pos=pos,width=tmp['support']) nx.draw_networkx_labels(G,pos=pos )
関数にまとめる
support以外も自由に選べるように、また閾値を変更できるようにしておきます。 このとき、残ったルールの最小値/最大値/中央値を把握して、さらにルールを減らすべきか考えられるようにしておきます。
def show_arule(df,metrics,th=None): if th is None: th = df[metrics].median() tmp = df[df[metrics]>= th] G = nx.DiGraph() G.add_edges_from(tmp[['from','to']].values) pos=nx.spring_layout(G) nx.draw(G,pos=pos) print( 'min:{0},50%:{1},max:{2}'.format( tmp[metrics].min(),tmp[metrics].median(),tmp[metrics].max() ) ) print('rule num:',tmp.shape[0]) metrics_value_for_disp = (tmp[metrics] / tmp[metrics].min()).values nx.draw_networkx_edges(G,pos=pos,width=metrics_value_for_disp) nx.draw_networkx_labels(G,pos=pos )
confidence
をデフォルト(中央値以上だけにすると、いかが出力されます)
min:0.5,50%:0.5357142857142857,max:0.7272727272727274 rule num: 19