Pythonでaprioriの結果を可視化したい

aprioriでルールを取得しても数が多すぎると全体が見通せないことがあります。 そこで、netoworkxを使ってルールを可視化することにしました。

描画してみる

ルールをつくるところまでは、下記の記事のままです。

esu-ko.hatenablog.com

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 )

f:id:esu-ko:20200909203626p:plain

関数にまとめる

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

f:id:esu-ko:20200909203749p:plain