今回はアソシエーションルールを扱います。
データマイニングで有名な「おむつとビール」の逸話を生み出した手法ですね。
Pythonでは以外とアソシエーションルールの利用例がなかったので、
調べるのが大変でした・・・。
(一瞬自分で実装することになるかもかと思った)
(クリックするとamazonに飛びます)
準備
import numpy as np import pandas as pd import Orange import matplotlib.pyplot as plt % matplotlib inline
sklearnにはアソシエーションルール分析は実装されていないので、
Orangeを使用します。
データの準備
ec = pd.read_csv("ch9_2.txt",sep=" ") ec.head()
book cosmetics electronics food imported liquor magazine sake stationery toy travel 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 2 1 1 0 1 0 1 0 1 1 1 0 3 1 1 0 1 1 1 0 1 1 1 1 4 1 0 0 1 0 1 0 1 0 1 0
こんな感じで、行方向がユーザー、
列方向が購入実績のデータになっています。
Orangeでアソシエーションルールを試す場合は、
読み込むデータの形が
book,cosmetic liquor,toy,travel ...
という形で、ユーザーが買ったものを、
カンマでつないだデータ形式である必要があります。
また、ファイルの拡張子が.basketである必要があるので、
ファイルを変換するスクリプトを書いておきます。
with open("ch9_2.txt","rb") as f: with open("ec.basket","wb") as of: dat = f.read().splitlines() header = dat[0].split(" ") for line in dat[1:]: line = line.split(" ") tmp = [header[i] for i,l in enumerate(line) if l == "1"] print ",".join(tmp) of.write(",".join(tmp)+"\n")
データの可視化
教科書では出現個数を可視化していたので、
同様に可視化しておきます。
xticksのラベルが加算なら無いよう、rotationで向きを変えておきます。
cnt = ec.sum() x =range(len(cnt)) plt.bar(x,cnt.values) plt.xticks(x,cnt.index,rotation='vertical') plt.show()}
アソシエーションルール分析
Orangeではファイルからのデータの読み込みには
Orange.data.Table
を使用します。
また、アソシエーションルールの作成には
Orange.associate.AssociationRulesSparseInducer
を使用します。
作成時に、支持度や、信頼度を引数で渡し、
最低値を指定することが出来ます。
data = Orange.data.Table("ec.basket") rules = Orange.associate.AssociationRulesSparseInducer(data,support = 0.3)
この時生成されるインスタンスは、
ルールのリストになっています。
各ルールは、支持度などをアトリビュートとしてもっていて、
見にくいので、データフレームに変換します。
n_arr= np.array([(rule.confidence,rule.lift,rule.support,rule) for rule in rules]) result = pd.DataFrame(n_arr) result.columns = ["conf","lift","support","rule"] result.head()
conf lift support rule 0 0.691833 1.00411 0.336 sake -> food 1 0.487663 1.00411 0.336 food -> sake 2 0.676047 1.00353 0.328333 sake -> food book 3 0.977183 0.998144 0.328333 sake food -> book 4 0.690259 1.00183 0.328333 sake book -> food
こんな感じでルールが抽出出来ました。
DataFrameなのでpandasの機能で、
更に分析することが可能です。
▼また、ソート可能なテーブルを使えば探索もしやすくなります。 esu-ko.hatenablog.com
※Orangeが使えなくなったため、apyoriを使うようになりました。
前回までの分析はこちら