【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.さいごに
どの商品とどの商品が一緒に買われるかなどの情報がうまく分析できると、商品陳列やセット割、新たなコラボが生まれそうで、おもしろいですね。