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

1.はじめに

アソシエーション分析は、あるアイテムとあるアイテムの関連性を分析することです。POSデータなどから、この商品を購入するとこの商品も同時に購入されやすい。などを分析して商品の陳列等に役立てます。バスケット(買い物かご)の中身を分析することに似ているので、バスケット分析とも呼ばれます。

アソシエーション分析では、次のような評価指標があります。

  • 前提確率
    全体の中で商品Aを含むトランザクションの比率
  • 支持度(support)
    全てのデータを分母として、商品Aと商品Bが共に含まれるデータを分子とする割合です。
  • 確信度(confidence)
    商品Aを含むデータ数を分母として、商品Aと商品Bを共に含まれるデータを分子とした割合です。
  • リフト値(lisft)
    商品Bを含むデータ数で確信度を割ったものです。確信度は、商品Aと商品Bを同時に買う確率であり、リフト値は商品Bを含むデータの中にどれだけ商品Aとの同時購入が含まれるかを示します。

これらの支持度、確信度、リフト値について所定の値を上回るものは”一緒に買われる商品”ということになります。

2.パッケージ、データ

Rでは、arulesパッケージで分析できます。今回は、このパッケージに含まれるGroceriesというデータセットを使います。これは、ある食料品店で収集した30日間のPOSデータで、169品目の9835件のトランザクションデータらしいです。

library(arules)
data(Groceries)
summary(Groceries)
transactions in sparse format with
 9835 transactions (rows) and
 169 items (columns)

3.アソシエーション分析

3.1 データの確認

まず、summary関数で要約を見てみます。

> summary(Groceries)
transactions as itemMatrix in sparse format with
 9835 rows (elements/itemsets/transactions) and
 169 columns (items) and a density of 0.02609146 

most frequent items:
      whole milk other vegetables       rolls/buns             soda           yogurt          (Other) 
            2513             1903             1809             1715             1372            34055 

element (itemset/transaction) length distribution:
sizes
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23 
2159 1643 1299 1005  855  645  545  438  350  246  182  117   78   77   55   46   29   14   14    9   11    4    6 
  24   26   27   28   29   32 
   1    1    1    1    3    1 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   3.000   4.409   6.000  32.000 

includes extended item information - examples:
       labels  level2           level1
1 frankfurter sausage meat and sausage
2     sausage sausage meat and sausage
3  liver loaf sausage meat and sausage

各アイテムの出現頻度をitemFrequencyPlot関数で見てみます。

itemFrequencyPlot(Groceries, horiz=1)

inspect関数で、各トランザクションを見ることができます。最初の5つのトランザクションを表示してみます。

inspect(Groceries[1:5])
    items                                                                
[1] {citrus fruit,semi-finished bread,margarine,ready soups}             
[2] {tropical fruit,yogurt,coffee}                                       
[3] {whole milk}                                                         
[4] {pip fruit,yogurt,cream cheese ,meat spreads}                        
[5] {other vegetables,whole milk,condensed milk,long life bakery product}

3.2 分析してみる

アソシエーションルールの抽出は、apriori関数で行います。デフォルトのパラメータで実行すると、次のようになります。

grule1 <- apriori(Groceries)
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 TRUE

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

Absolute minimum support count: 983 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.01s].
sorting and recoding items ... [8 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 done [0.00s].
writing ... [0 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].

最後の方に、writing … [0 rule(s)]とあります。つまり、そのようなルールはないということです。デフォルトでは、確信度0.8、支持度0.1ですが、これを超えるルールはなかったということです。

支持度を0.001に、確信度を0.001に、長さを3にしてみます。

grule2 <- apriori(Groceries, parameter = list(support = 0.001, confidence = 0.001, minlen = 3, maxlen = 3))
Apriori

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

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

Absolute minimum support count: 9 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.01s].
sorting and recoding items ... [157 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 done [0.01s].
writing ... [20493 rule(s)] done [0.05s].
creating S4 object  ... done [0.01s].

すると、20493個のルールが抽出されました。リフト値が高い順に表示すると、

inspect(head(sort(grule2, by="lift"), 3))
    lhs                              rhs                     support     confidence coverage    lift     count
[1] {bottled beer,red/blush wine} => {liquor}                0.001931876 0.3958333  0.004880529 35.71579 19   
[2] {hamburger meat,soda}         => {Instant food products} 0.001220132 0.2105263  0.005795628 26.20919 12   
[3] {ham,white bread}             => {processed cheese}      0.001931876 0.3800000  0.005083884 22.92822 19   

1番目の結果から、ビールと赤ワインを買うとリカーも一緒に買う。
2番目の結果から、ハンバーガーの肉とソーダを買うとインスタントフードを買う。
3番目の結果からハムとパンを買うとチーズも一緒に買うことが分かります。

3.3 可視化

もう少し確信度と支持度を緩めて、支持度0.01、確信度0.01でルールを抽出します。

grule3 <- apriori(Groceries, parameter = list(support = 0.01, confidence = 0.01, minlen = 3, maxlen = 3))
Apriori

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

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

Absolute minimum support count: 98 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.01s].
sorting and recoding items ... [88 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [96 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].

すると、96個のルールが抽出されました。これをグラフで見ています。arulesVizパッケージのplot関数を用います。

library(arulesViz)
plot(grule3, method="graph")

各アイテムとどのような関連性があるかわかります。また、次のようにengine='interactive' を指定するとインタラクティブなグラフを得ることができ、より分かりやすいです。

plot(grule3, method="graph", engine = 'interactive')

3.4 クラスタリング分析

この結果をクラスタリング分析してみます。aruleパッケージのdissimilarity関数を利用します。各ルール同士の距離dを算出し、ウォード法にて階層化クラスタリングを行います。

d<-dissimilarity(grule3)
ward <- hclust(d, "ward.D2")
plot(ward)

これによって、クラスターに分けられたので、商品のレコメンド等に利用できそうです。最後にトランザクションの詳細を表示してみます。

inspect(grule3)
     lhs                                         rhs                     support    confidence coverage   lift    
[1]  {curd,yogurt}                            => {whole milk}            0.01006609 0.5823529  0.01728521 2.279125
[2]  {whole milk,curd}                        => {yogurt}                0.01006609 0.3852140  0.02613116 2.761356
[3]  {whole milk,yogurt}                      => {curd}                  0.01006609 0.1796733  0.05602440 3.372304
[4]  {pork,other vegetables}                  => {whole milk}            0.01016777 0.4694836  0.02165735 1.837394
[5]  {pork,whole milk}                        => {other vegetables}      0.01016777 0.4587156  0.02216573 2.370714
[6]  {other vegetables,whole milk}            => {pork}                  0.01016777 0.1358696  0.07483477 2.356750
[7]  {other vegetables,butter}                => {whole milk}            0.01148958 0.5736041  0.02003050 2.244885
[8]  {whole milk,butter}                      => {other vegetables}      0.01148958 0.4169742  0.02755465 2.154987
[9]  {other vegetables,whole milk}            => {butter}                0.01148958 0.1535326  0.07483477 2.770630
[10] {other vegetables,domestic eggs}         => {whole milk}            0.01230300 0.5525114  0.02226741 2.162336
[11] {whole milk,domestic eggs}               => {other vegetables}      0.01230300 0.4101695  0.02999492 2.119820
[12] {other vegetables,whole milk}            => {domestic eggs}         0.01230300 0.1644022  0.07483477 2.591178
[13] {other vegetables,fruit/vegetable juice} => {whole milk}            0.01047280 0.4975845  0.02104728 1.947371
[14] {whole milk,fruit/vegetable juice}       => {other vegetables}      0.01047280 0.3931298  0.02663955 2.031756
[15] {other vegetables,whole milk}            => {fruit/vegetable juice} 0.01047280 0.1399457  0.07483477 1.935816
[16] {yogurt,whipped/sour cream}              => {other vegetables}      0.01016777 0.4901961  0.02074225 2.533410
[17] {other vegetables,whipped/sour cream}    => {yogurt}                0.01016777 0.3521127  0.02887646 2.524073
[18] {other vegetables,yogurt}                => {whipped/sour cream}    0.01016777 0.2341920  0.04341637 3.267062
[19] {yogurt,whipped/sour cream}              => {whole milk}            0.01087951 0.5245098  0.02074225 2.052747
[20] {whole milk,whipped/sour cream}          => {yogurt}                0.01087951 0.3375394  0.03223183 2.419607
[21] {whole milk,yogurt}                      => {whipped/sour cream}    0.01087951 0.1941924  0.05602440 2.709053
[22] {other vegetables,whipped/sour cream}    => {whole milk}            0.01464159 0.5070423  0.02887646 1.984385
[23] {whole milk,whipped/sour cream}          => {other vegetables}      0.01464159 0.4542587  0.03223183 2.347679
[24] {other vegetables,whole milk}            => {whipped/sour cream}    0.01464159 0.1956522  0.07483477 2.729417
[25] {pip fruit,other vegetables}             => {whole milk}            0.01352313 0.5175097  0.02613116 2.025351
[26] {pip fruit,whole milk}                   => {other vegetables}      0.01352313 0.4493243  0.03009659 2.322178
[27] {other vegetables,whole milk}            => {pip fruit}             0.01352313 0.1807065  0.07483477 2.388775
[28] {other vegetables,pastry}                => {whole milk}            0.01057448 0.4684685  0.02257245 1.833421
[29] {whole milk,pastry}                      => {other vegetables}      0.01057448 0.3180428  0.03324860 1.643695
[30] {other vegetables,whole milk}            => {pastry}                0.01057448 0.1413043  0.07483477 1.588261
[31] {citrus fruit,root vegetables}           => {other vegetables}      0.01037112 0.5862069  0.01769192 3.029608
[32] {citrus fruit,other vegetables}          => {root vegetables}       0.01037112 0.3591549  0.02887646 3.295045
[33] {root vegetables,other vegetables}       => {citrus fruit}          0.01037112 0.2188841  0.04738180 2.644626
[34] {citrus fruit,yogurt}                    => {whole milk}            0.01026945 0.4741784  0.02165735 1.855768
[35] {citrus fruit,whole milk}                => {yogurt}                0.01026945 0.3366667  0.03050330 2.413350
[36] {whole milk,yogurt}                      => {citrus fruit}          0.01026945 0.1833031  0.05602440 2.214725
[37] {citrus fruit,other vegetables}          => {whole milk}            0.01301474 0.4507042  0.02887646 1.763898
[38] {citrus fruit,whole milk}                => {other vegetables}      0.01301474 0.4266667  0.03050330 2.205080
[39] {other vegetables,whole milk}            => {citrus fruit}          0.01301474 0.1739130  0.07483477 2.101271
[40] {sausage,other vegetables}               => {whole milk}            0.01016777 0.3773585  0.02694459 1.476849
[41] {sausage,whole milk}                     => {other vegetables}      0.01016777 0.3401361  0.02989324 1.757876
[42] {other vegetables,whole milk}            => {sausage}               0.01016777 0.1358696  0.07483477 1.446187
[43] {other vegetables,bottled water}         => {whole milk}            0.01077783 0.4344262  0.02480935 1.700192
[44] {whole milk,bottled water}               => {other vegetables}      0.01077783 0.3136095  0.03436706 1.620783
[45] {other vegetables,whole milk}            => {bottled water}         0.01077783 0.1440217  0.07483477 1.303085
[46] {tropical fruit,root vegetables}         => {other vegetables}      0.01230300 0.5845411  0.02104728 3.020999
[47] {tropical fruit,other vegetables}        => {root vegetables}       0.01230300 0.3427762  0.03589222 3.144780
[48] {root vegetables,other vegetables}       => {tropical fruit}        0.01230300 0.2596567  0.04738180 2.474538
[49] {tropical fruit,root vegetables}         => {whole milk}            0.01199797 0.5700483  0.02104728 2.230969
[50] {tropical fruit,whole milk}              => {root vegetables}       0.01199797 0.2836538  0.04229792 2.602365
[51] {root vegetables,whole milk}             => {tropical fruit}        0.01199797 0.2453222  0.04890696 2.337931
[52] {tropical fruit,yogurt}                  => {other vegetables}      0.01230300 0.4201389  0.02928317 2.171343
[53] {tropical fruit,other vegetables}        => {yogurt}                0.01230300 0.3427762  0.03589222 2.457146
[54] {other vegetables,yogurt}                => {tropical fruit}        0.01230300 0.2833724  0.04341637 2.700550
[55] {tropical fruit,yogurt}                  => {whole milk}            0.01514997 0.5173611  0.02928317 2.024770
[56] {tropical fruit,whole milk}              => {yogurt}                0.01514997 0.3581731  0.04229792 2.567516
[57] {whole milk,yogurt}                      => {tropical fruit}        0.01514997 0.2704174  0.05602440 2.577089
[58] {tropical fruit,rolls/buns}              => {whole milk}            0.01098119 0.4462810  0.02460600 1.746587
[59] {tropical fruit,whole milk}              => {rolls/buns}            0.01098119 0.2596154  0.04229792 1.411452
[60] {whole milk,rolls/buns}                  => {tropical fruit}        0.01098119 0.1938959  0.05663447 1.847835
[61] {tropical fruit,other vegetables}        => {whole milk}            0.01708185 0.4759207  0.03589222 1.862587
[62] {tropical fruit,whole milk}              => {other vegetables}      0.01708185 0.4038462  0.04229792 2.087140
[63] {other vegetables,whole milk}            => {tropical fruit}        0.01708185 0.2282609  0.07483477 2.175335
[64] {root vegetables,yogurt}                 => {other vegetables}      0.01291307 0.5000000  0.02582613 2.584078
[65] {root vegetables,other vegetables}       => {yogurt}                0.01291307 0.2725322  0.04738180 1.953611
[66] {other vegetables,yogurt}                => {root vegetables}       0.01291307 0.2974239  0.04341637 2.728698
[67] {root vegetables,yogurt}                 => {whole milk}            0.01453991 0.5629921  0.02582613 2.203354
[68] {root vegetables,whole milk}             => {yogurt}                0.01453991 0.2972973  0.04890696 2.131136
[69] {whole milk,yogurt}                      => {root vegetables}       0.01453991 0.2595281  0.05602440 2.381025
[70] {root vegetables,rolls/buns}             => {other vegetables}      0.01220132 0.5020921  0.02430097 2.594890
[71] {root vegetables,other vegetables}       => {rolls/buns}            0.01220132 0.2575107  0.04738180 1.400010
[72] {other vegetables,rolls/buns}            => {root vegetables}       0.01220132 0.2863962  0.04260295 2.627525
[73] {root vegetables,rolls/buns}             => {whole milk}            0.01270971 0.5230126  0.02430097 2.046888
[74] {root vegetables,whole milk}             => {rolls/buns}            0.01270971 0.2598753  0.04890696 1.412865
[75] {whole milk,rolls/buns}                  => {root vegetables}       0.01270971 0.2244165  0.05663447 2.058896
[76] {root vegetables,other vegetables}       => {whole milk}            0.02318251 0.4892704  0.04738180 1.914833
[77] {root vegetables,whole milk}             => {other vegetables}      0.02318251 0.4740125  0.04890696 2.449770
[78] {other vegetables,whole milk}            => {root vegetables}       0.02318251 0.3097826  0.07483477 2.842082
[79] {yogurt,soda}                            => {whole milk}            0.01047280 0.3828996  0.02735130 1.498535
[80] {whole milk,soda}                        => {yogurt}                0.01047280 0.2614213  0.04006101 1.873964
[81] {whole milk,yogurt}                      => {soda}                  0.01047280 0.1869328  0.05602440 1.072003
[82] {other vegetables,soda}                  => {whole milk}            0.01392984 0.4254658  0.03274021 1.665124
[83] {whole milk,soda}                        => {other vegetables}      0.01392984 0.3477157  0.04006101 1.797049
[84] {other vegetables,whole milk}            => {soda}                  0.01392984 0.1861413  0.07483477 1.067463
[85] {yogurt,rolls/buns}                      => {other vegetables}      0.01148958 0.3343195  0.03436706 1.727815
[86] {other vegetables,yogurt}                => {rolls/buns}            0.01148958 0.2646370  0.04341637 1.438753
[87] {other vegetables,rolls/buns}            => {yogurt}                0.01148958 0.2696897  0.04260295 1.933235
[88] {yogurt,rolls/buns}                      => {whole milk}            0.01555669 0.4526627  0.03436706 1.771563
[89] {whole milk,yogurt}                      => {rolls/buns}            0.01555669 0.2776770  0.05602440 1.509648
[90] {whole milk,rolls/buns}                  => {yogurt}                0.01555669 0.2746858  0.05663447 1.969049
[91] {other vegetables,yogurt}                => {whole milk}            0.02226741 0.5128806  0.04341637 2.007235
[92] {whole milk,yogurt}                      => {other vegetables}      0.02226741 0.3974592  0.05602440 2.054131
[93] {other vegetables,whole milk}            => {yogurt}                0.02226741 0.2975543  0.07483477 2.132979
[94] {other vegetables,rolls/buns}            => {whole milk}            0.01789527 0.4200477  0.04260295 1.643919
[95] {whole milk,rolls/buns}                  => {other vegetables}      0.01789527 0.3159785  0.05663447 1.633026
[96] {other vegetables,whole milk}            => {rolls/buns}            0.01789527 0.2391304  0.07483477 1.300082

4.さいごに

どの商品とどの商品が一緒に買われるかなどの情報がうまく分析できると、商品陳列やセット割、新たなコラボが生まれそうで、おもしろいですね。

Add a Comment

メールアドレスが公開されることはありません。