axjack's blog

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.

とりあえずアソシエーション分析する

タイトル通りです。とりあえず動かしてみたい!という願望でやってみました。理解は後からついてくると信じて、まずは手を動かしたいという人向け?の記事です。

読み込むデータの準備

前処理なしのトランザクションデータを{arules}パッケージで読み込む方法 - 六本木で働くデータサイエンティストのブログ にあるデータに1行追加したものを利用します。gistにアップロードしました。

ところでどうやら、CSVの最終行に空行が無いと読み込みエラーになるっぽい?ので、エラーが出たら空行付け足してみてください。

dat_basket.csvはbasket形式のデータで、dat_single.csvは同データをsingle形式にしたものです。

gist.github.com

データの読み込み

read.transactionsの引数はどうなってるんじゃ?という人は?read.transactionsしてみましょう。冷静に読むと丁寧に説明が書かれております。

# load library #### 
library(arules)

# load CSV ####
# format = "basket" の場合
mytran_basket <- read.transactions(
  file = "dat/dat_basket.csv"
  , format = "basket"
  , sep = ","
  , cols = NULL
  , rm.duplicates = T
)

# format = "single" の場合
mytran_single <- read.transactions(
  file = "dat/dat_single.csv"
  , format = "single"
  , sep = ","
  , cols = c(1,2)
  , rm.duplicates = T
)

生成したtranデータの確認

mytran_basketmytran_singleも同じ内容なので、mytran_basketを使います。

> mytran_basket
transactions in sparse format with
 10 transactions (rows) and
 19 items (columns)
> summary(mytran_basket)
transactions as itemMatrix in sparse format with
 10 rows (elements/itemsets/transactions) and
 19 columns (items) and a density of 0.1842105 

most frequent items:
    ビール ソーセージ     柿ピー       牛肉     生野菜    (Other) 
         4          3          3          3          3         19 

element (itemset/transaction) length distribution:
sizes
2 3 4 5 
1 4 4 1 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    2.0     3.0     3.5     3.5     4.0     5.0 

includes extended item information - examples:
      labels
1     アイス
2     おむつ
3 こんにゃく

適当にピックアップすると、

transactions in sparse format with
 10 transactions (rows) and
 19 items (columns)

transactionsは10件あり、品目数は19件と云うことがわかります。dat_basket.csvは10行だしdat_single.csvのtransaction-IDは10個なので確かにあってそうです。

most frequent items:
    ビール ソーセージ     柿ピー       牛肉     生野菜    (Other) 
         4          3          3          3          3         19 

transactionに含まれる品目のうち、最も多いのはビールで次はソーセージで・・・と云うことがわかります。CSVの中を検索すると確かにあっています。

element (itemset/transaction) length distribution:
sizes
2 3 4 5 
1 4 4 1 

transactionの長さとはtransactionに含まれる品目の数だそうで、長さ2と長さ5が1件で長さ3と長さ4が4件だと云うことがわかります。目視で確認すると確かにあっています。

というわけで、ここまでは読み込んだtransactionについての情報でした。

いよいよアソシエーション分析

流れは、apriori関数にデータを突っ込んでrulesを生成→inspectで中身を見る、です。

> mytran_basket.apr <- apriori(mytran_basket, parameter = NULL)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target   ext
        0.8    0.1    1 none FALSE            TRUE       5     0.1      1     10  rules FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 1 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[19 item(s), 10 transaction(s)] done [0.00s].
sorting and recoding items ... [19 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.00s].
writing ... [136 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].

[136 rule(s)]ということで136の相関ルールが抽出されました。inspectしてみましょう。

> inspect( head(sort(mytran_basket.apr,by="support"),15) )
     lhs                    rhs            support confidence lift      count
[1]  {柿ピー}            => {ビール}       0.3     1           2.500000 3    
[2]  {じゃがいも}        => {牛肉}         0.2     1           3.333333 2    
[3]  {果物}              => {豆腐}         0.2     1           3.333333 2    
[4]  {果物}              => {生野菜}       0.2     1           3.333333 2    
[5]  {ソーセージ,柿ピー} => {ビール}       0.2     1           2.500000 2    
[6]  {ソーセージ,ビール} => {柿ピー}       0.2     1           3.333333 2    
[7]  {果物,豆腐}         => {生野菜}       0.2     1           3.333333 2    
[8]  {果物,生野菜}       => {豆腐}         0.2     1           3.333333 2    
[9]  {生野菜,豆腐}       => {果物}         0.2     1           5.000000 2    
[10] {チーズ}            => {ワイン}       0.1     1           5.000000 1    
[11] {チーズ}            => {ソーセージ}   0.1     1           3.333333 1    
[12] {おむつ}            => {ドレッシング} 0.1     1          10.000000 1    
[13] {ドレッシング}      => {おむつ}       0.1     1          10.000000 1    
[14] {おむつ}            => {ビール}       0.1     1           2.500000 1    
[15] {おむつ}            => {生野菜}       0.1     1           3.333333 1    
> 

とりあえず一行目のこれ↓

     lhs                    rhs            support confidence lift      count
[1]  {柿ピー}            => {ビール}       0.3     1           2.500000 3    

を解釈するには リフト値とは何? Weblio辞書 を読むと良いです。すると、一行目は

  • support : 全体の30%が柿ピーとビールを一緒に購入している。
  • confidence:柿ピー購入者の100%が柿ピーとビールを一緒に購入している。
  • lift:ビールをいきなり購入するよりも、柿ピーを買ってビールを購入する確率が2.5倍大きい。

と解釈できます。ちなみにcountの3をtransactions数の10で割るとsupportとなっています。

おわりに

とりあえず動かすことができたら、support(支持度)・confidence(確信度)・lift(リフト値)について調べて見ると良いかと思われます。自分もまさに調べているところですので参考URLをご参照あれ。併売率・購買率などの用語で調べてもだいたいアソシエーション分析についての記事が見つかるので併せてどうぞ。

参考