あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

Pythonでデータサイエンスを試す(7_アソシエーションルール)

今回はアソシエーションルールを扱います。
データマイニングで有名な「おむつとビール」の逸話を生み出した手法ですね。
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()}

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

アソシエーションルール分析

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を使うようになりました。

esu-ko.hatenablog.com

前回までの分析はこちら

esu-ko.hatenablog.com