Rのarulesを使ってアソシエーション分析をしてみる

仕事でアソシエーション分析を使う案件にアサインされるようなので、事前勉強のためにRでアソシエーション分析をしてみたいと思います。

ちなみに以下の書籍を参考にしています。この本はアソシエーション分析をはじめ、実務で使うことが多いデータ分析の手法を解説しており、とてもわかりやすいのでデータ分析の実務について概要を理解したい、という人におすすめです。

アクセンチュアのプロフェッショナルが教える データ・アナリティクス実践講座

アソシエーション分析とは

アソシエーション分析(別名:マーケットバスケット分析)は、売上向上施策によく使われる分析手法です。具体的に言えば「商品Aを買った人は商品Bを買う確率が高い」という規則性を見つけ出す分析手法です。

前述の本に記載されていた内容がこちらの記事に載っているのでアソシエーション分析とはなんぞやという方はみてみてください。

【第二回】アソシエーション分析:購買分析からレコメンデーション応用まで
https://enterprisezine.jp/iti/detail/6084

アソシエーション分析の評価指標としては主に以下の4つがあります。

前提確率全体の中でXを含む購入の比率
(Xは条件なので複数アイテムもOK)
支持度
(Support,同時確率)
全体の中でXとYを含む購入の比率。つまり全体の購入回数の中でXとYを含む購入の比率。
確信度
(Confidence,条件付き確率)
Xを含む購入のうち、Yを含む確率。確信度が高いルール=良いルール
リフト値
(Lift,改善率)
確信度を前提確率で割ったもの。一般的には1より大きければ有効なルールとされる。XとYを同時に買う確率は、Yが購入される確率の何倍か。

Rによるアソシエーション分析

それではRでアソシエーション分析をしてみたいと思います。

Rにはarulesというアソシエーション分析のパッケージがあるのでそちらを使っていきます。

# arulesパッケージの読み込み
install.packages("arules")
library(arules)

続いてarulesに付属しているサンプルデータセットを読み込みます。今回はGroceriesという実在するスーパーの商品購入データを使います。

# arulesに付属しているサンプルデータセットを読み込む
data(Groceries)

サンプルデータセットは他にもあるので、他のデータセットを使ってみたい肩は以下をみてみてください。

データセットはいろいろあるので見てみてください

https://github.com/mhahsler/arules/tree/master/data

ちなみに自分で用意したファイルの場合は以下で読み込めます。

# 自分で用意したデータセットを利用する場合はread.transaction関数を使う
#Groceries <- read.transaction("Groceries.txt",format="basket",sep=",")

先ほど読み込んだデータセットの中身を確認します。

#データセットの確認
inspect(head(Groceries))

データを出力するにはinspect関数を使います。さらにhead関数を使うことで先頭の6行だけ表示することができます。

データを見ると購入のトランザクションデータが格納されています。([1]の購入データはcitrus fruits、semi-finished bread、margarine、ready soupsが一緒に購入されたことを表しています。

続いて購入回数のヒストグラムを表示してみます。

# ヒストグラムを表示
itemFrequencyPlot(Groceries,support=0.08,horiz=T)

商品数が多いので支持度が8%以上(support=0.08)のものだけ表示しました。horiz=Tは縦軸と横軸を反転させるために使っています。デフォルトは横軸が商品になるのですが、こっちのほうが見やすいかなと思いつけています。

あと、デフォルトでは相対度数となっています。絶対度数にしたい場合はパラメータに「type=”absolute”」を指定すれば絶対度数で表示できます。

続いて、本題であるアソシエーション分析を実行します。

arulesにあるapriori関数を実行することで、アプリオリアルゴリズムによるアソシエーション分析ができます。

# アプリオリアルゴリズムによるアソシエーション分析の実行
# support(支持度)が0.1%以上で、cofidence(確信度)が5%以上のルールを抽出する
rules <- apriori(Groceries,parameter = list(support=0.001,confidence=0.5))
# rulesの中身を見てみる
inspect(head(rules))

apriori関数を実行したあとのrulesには抽出されたアソシエーションルールが格納されています。[1]はhoneyが購入された場合、whole milkも購入されるというルールを表していて、そのルールの支持度、確信度、リフト値が記載されてます。

しかし、これだけだとよくわからないので、検出されたルールをビジュアル化してみます。ビジュアル化にはarulesVizというパッケージを使用します。

#arulesVizパッケージをインストール
install.packages("arulesViz")
library(arulesViz)
#散布図の出力
plot(rules)

X軸が支持度、Y軸が確信度の散布図を表示できました。

plot関数にmethod=”grouped”を指定すると、横軸がアソシエーションルールの条件部分、縦軸が結論部分を表すバブルチャートを作成することができます。

# バブルチャートを表示する
plot(rules,method="grouped",control=list(k=30))

横軸はk-means法でアソシエーションルールの条件部をクラスタリングしています。パラメータのk=30の部分はクラスタの数を指定してます。

バブルの大きさは支持度の大きさを表しており、大きいほどこのルールの証拠となっている買い物の件数が他と比較して多いということになります。色の濃さは確信度の大きさを表しており、色が濃いほどルールが的中していることになります。

たとえば、popcorn,sodaとsalty snack、instant foodとhamburger meatは色が濃いため、一緒に購入される確率が高く、instant foodとhamburger meatについてはサイズも大きいので多くのデータからそれが検証されていることを表しています。

最後に、アソシエーショングラフを表示してみます。

# リフト値の上位10項目を抽出し、有効グラフ形式でプロットする
rules_high_lift <- head(sort(rules,by="lift"),10)
plot(rules_high_lift,method="graph",control=list(type="items"),interactive=TRUE)

アソシエーショングラフを使うことで、より視覚的にアソシエーションルールを表現することができます。

たとえば、sodaとinstant food productを購入した場合、hamburger meatを購入する確率が高い(丸の色が濃い)ことがわかります。炭酸とインスタント食品とハンバーガーとはジャンキーですね。

アソシエーショングラフの見方については以下の記事がわかりやすいです。
https://exploratory.io/note/hideaki/Market-Basket-Analysis-igraph-6964588961181074