Pythonでアソシエーション分析を行う(apyoriを使う)

過去にアソシエーション分析を書いたときはOrangeを用いました。 このパッケージ内からアソシエーション分析が消えたため、代替を探してみました。

esu-ko.hatenablog.com

apyoriの基本

導入

!pip install apyori

基本的な使い方

from apyori import apriori
import random

# --------
# テスト用のデータをつくる
# --------
# 五つのアイテム
items = ['a','b','c','d','e']

# レコードに対して、アイテムがそれぞれ1/2で格納される
# 例:[['a','c'],['b','c','d']...]
records = []
for i in range(100):
  buf = []
  for j in items:
    if random.random() >= 0.5:
      buf.append(j)
  if buf:
    records.append(buf)

#----
# ルールを抽出する
#----
#上記の形のリストをaprioriに渡すだけ。ジェネレータっぽいのでlist()でリストにしておいた
a_rules = list(apriori(records))

ルールの中身は

RelationRecord(
  items=frozenset({'a'}),
  support=0.5151515151515151,
  ordered_statistics=[
    OrderedStatistic(
      items_base=frozenset(), 
      items_add=frozenset({'a'}), 
      confidence=0.5151515151515151,
      lift=1.0
    )
  ]
)

のような形

そのあとの分析処理に使う

実務だとデータフレームの形の方がいいので、変換するコードも書きました。

#ルールの中身を行列にする
data = []
for row in a_rules:
  for i in row.ordered_statistics:
    buf = [
      row.support,
      ','.join(i.items_base),
      ','.join(i.items_add),
      i.lift,
      i.confidence
    ]
    data.append(buf)

# データフレームにする
import pandas as pd

df = pd.DataFrame(data)
df.columns = ["support","from","to","lift","confidence"]

▼また、ソート可能なテーブルを使えば探索もしやすくなります。 esu-ko.hatenablog.com