【arules】Rでアソシエーション分析

Rの {arules} でアソシエーション分析を試してみました。
わかりやすい記事はすでに複数ありますので先に以下を参照することをオススメします。

[1] Rのアソシエーション分析結果をGephiでネットワーク描画(2)
[2] R {arules} によるアソシエーション分析をちょっと詳しく <1>
[3] Rによるアソシエーション分析
[4] [連載]フリーソフトによるデータ解析・マイニング第40回

アソシエーション分析

アソシエーション分析 (associations analysis)は, POSデータのようなトランザクションデータ中のアイテム間の関連性について分析を行う方法です。例えば{おむつ}と{ビール}は同時に買われやすいみたいな事を数値的に分析して相関ルールを抽出します。

評価指標

X : 条件 left hand side (lhs)
Y : 結論 right hand side (rhs)

として, 相関ルールは X⇒Yと記述する。以下の3つが代表的な評価指標。

支持度 (support)

X, Yの和集合を含むトランザクションが全データ中に占める比率。

確信度 (confidence)

Xが含まれる場合に, Yも含まれる比率。

リフト (lift)

ある相関ルールの基で起きたYの頻度が全体のYの頻度に対する比率。

Rでアソシエーション分析

Incomeデータセットは, 米サンフランシスコで調査された9409人の属性と収入に関するアンケートの結果です。

require(arules)

data(Income)

# Relative frequency
itemFrequencyPlot(Income)

# Extract association rules
rules <- apriori(Income)
inspect(head(sort(rules, by='support'), n=20))
summary(rules)

apriori()で相関ルール8664件が抽出されました。
支持度が高い上位20件を出力してみます。

> inspect(head(sort(rules, by='support'), n=20))
   lhs                                rhs                               support confidence      lift
1  {}                              => {language in home=english}      0.9128854  0.9128854 1.0000000
2  {ethnic classification=white}   => {language in home=english}      0.6595404  0.9847991 1.0787763
3  {number in household=1}         => {language in home=english}      0.6495055  0.9388270 1.0284171
4  {education=no college graduate} => {language in home=english}      0.6343805  0.8995669 0.9854106
5  {years in bay area=10+}         => {language in home=english}      0.6013671  0.9300495 1.0188020
6  {number of children=0}          => {language in home=english}      0.5801338  0.9328812 1.0219040
7  {income=$0-$40,000}             => {language in home=english}      0.5578825  0.8962617 0.9817899
8  {number of children=0}          => {number in household=1}         0.5532286  0.8896165 1.2858951
9  {type of home=house}            => {language in home=english}      0.5446481  0.9129693 1.0000919
10 {dual incomes=not married}      => {language in home=english}      0.5426120  0.9069033 0.9934470
11 {age=14-34}                     => {language in home=english}      0.5248691  0.8966460 0.9822109
12 {number in household=1,                                                                          
    number of children=0}          => {language in home=english}      0.5213787  0.9424290 1.0323629
13 {number of children=0,                                                                           
    language in home=english}      => {number in household=1}         0.5213787  0.8987215 1.2990559
14 {number in household=1,                                                                          
    language in home=english}      => {number of children=0}          0.5213787  0.8027318 1.2908287
15 {sex=female}                    => {language in home=english}      0.5122164  0.9246521 1.0128896
16 {income=$0-$40,000}             => {education=no college graduate} 0.5018906  0.8063084 1.1433649
17 {number in household=1,                                                                          
    ethnic classification=white}   => {language in home=english}      0.4941827  0.9880779 1.0823680
18 {number of children=0,                                                                           
    ethnic classification=white}   => {language in home=english}      0.4474985  0.9868505 1.0810235
19 {income=$0-$40,000,                                                                              
    education=no college graduate} => {language in home=english}      0.4454625  0.8875688 0.9722675
20 {education=no college graduate,                                                                  
    ethnic classification=white}   => {language in home=english}      0.4384817  0.9827249 1.0765041

例えば, 収入が$0-$40,000かつ大卒でない人(no college graduate)は全体に対して約50%を占めるようです。
続いてsummary()で概要を出力します。

> summary(rules)
set of 8664 rules

rule length distribution (lhs + rhs):sizes
   1    2    3    4    5    6    7    8 
   1   56  615 2287 3387 1925  385    8 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   4.000   5.000   4.888   6.000   8.000 

summary of quality measures:
    support         confidence          lift       
 Min.   :0.1001   Min.   :0.8000   Min.   :0.8971  
 1st Qu.:0.1101   1st Qu.:0.8436   1st Qu.:1.0813  
 Median :0.1241   Median :0.9027   Median :1.3297  
 Mean   :0.1393   Mean   :0.9021   Mean   :1.4099  
 3rd Qu.:0.1510   3rd Qu.:0.9574   3rd Qu.:1.5309  
 Max.   :0.9129   Max.   :1.0000   Max.   :4.3554  

mining info:
   data ntransactions support confidence
 Income          6876     0.1        0.8

eclat()は, 深さ優先(DFS)でアイテムをスキャンする頻出アイテム検索アルゴリズムです。
apriori()とは計算量的な違いなのかな。

# Equivalence CLAss Transformation
items <- eclat(Income)
inspect(head(sort(items, by='support'), n=20))
summary(items)

支持度, 上位20件の出力。

> inspect(head(sort(items, by='support'), n=20))
   items                             support
1  {language in home=english}      0.9128854
2  {education=no college graduate} 0.7052065
3  {number in household=1}         0.6918266
4  {ethnic classification=white}   0.6697208
5  {ethnic classification=white,            
    language in home=english}      0.6595404
6  {number in household=1,                  
    language in home=english}      0.6495055
7  {years in bay area=10+}         0.6465969
8  {education=no college graduate,          
    language in home=english}      0.6343805
9  {income=$0-$40,000}             0.6224549
10 {number of children=0}          0.6218732
11 {years in bay area=10+,                  
    language in home=english}      0.6013671
12 {dual incomes=not married}      0.5983130
13 {type of home=house}            0.5965678
14 {age=14-34}                     0.5853694
15 {number of children=0,                   
    language in home=english}      0.5801338
16 {income=$0-$40,000,                      
    language in home=english}      0.5578825
17 {sex=female}                    0.5539558
18 {number in household=1,                  
    number of children=0}          0.5532286
19 {type of home=house,                     
    language in home=english}      0.5446481
20 {dual incomes=not married,               
    language in home=english}      0.5426120

今回は手を動かして覚えるためにちょっとだけパッケージを試しただけなので, 実際には条件を絞り込み有用な相関ルールを抽出する工夫が必要だと思います。CodeはGithubにあります。