[[ノート/マイニング/バスケット]]~
訪問者数 &counter();      最終更新 &lastmod();

[[図書データをRで>ノート/マイニング/図書データをRで]]

***バスケット解析をRで [#f2ddced9]

パッケージarulesを使うと良いらしい。~
大元のありか~
http://r-forge.r-project.org/projects/arules/~
http://r-forge.r-project.org/R/?group_id=36

導入:~
http://cran.r-project.org/web/packages/arules/index.html~
から持ってきて導入。~
やりかたはR上で、RGuiのツールバー「パッケージ」でミラーサイトを選択後、
「パッケージのインストール」でarulesを選択。~
これだけでインストール終了するはず。

使い方は http://cran.r-project.org/web/packages/arules/vignettes/arules.pdf~
リファレンスマニュアルは http://cran.r-project.org/web/packages/arules/arules.pdf
手元の参考書では「Rによるデータサイエンス」(金明哲著)第17章「アソシエーション分析」(276ページ)~

まず、arulesライブラリをRワークスペースにロードする
 library("arules")
データを準備する。最初は簡単なデータから。使い方マニュアルvignettesの60ページ「Class transactions」の説明では~
 a_list <- list(
    c("a","b","c"),
    c("a","b"),
    c("a","b","d"),
    c("c","e"),
    c("a","b","d","e")
 )
なので、これを真似よう。
 > samplelist <- list(
 +  c("A", "C", "D"),
 +  c("B", "C", "E"),
 +  c("A", "B", "C", "E"),
 +  c("B", "E"))
----
《脱線》 データの形式を変換する関数としてasが使える。たとえば as(samplelist, "transactions") はデータsamplelistをtransactions形式に変換する。
 > samplelist.trans <- as(samplelist, "transactions")
transactions形式が何であるか詳しく見ていないが、
 > samplelist.trans
 transactions in sparse format with
  4 transactions (rows) and
  5 items (columns)
となっている。ここから更にmatrix形式
 > as(samplelist.trans,"matrix")
      A B C D E
 [1,] 1 0 1 1 0
 [2,] 0 1 1 0 1
 [3,] 1 1 1 0 1
 [4,] 0 1 0 0 1
や、data.frame形式
 > as(samplelist.trans,"data.frame")
       items
 1   {A,C,D}
 2   {B,C,E}
 3 {A,B,C,E}
 4     {B,E}
に変換することもできる。

また、transactions形式についてアイテムの出現頻度frequencyをグラフにプロットする関数は、
 > itemFrequencyPlot(samplelist.trans)
である。
《脱線終り》
----
では、samplelistをtransaction形式に変換した後、Apriori方式で処理してみよう。
 > samplelist.trans <- as(samplelist, "transactions")
 > samplelist.ap <-apriori(samplelist)
 
 parameter specification:
  confidence minval smax arem  aval originalSupport support minlen maxlen
         0.8    0.1    1 none FALSE            TRUE     0.1      1      5
  target   ext
   rules FALSE
 
 algorithmic control:
  filter tree heap memopt load sort verbose
     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
 
 apriori - find association rules with the apriori algorithm
 version 4.21 (2004.05.09)        (c) 1996-2004   Christian Borgelt
 set item appearances ...[0 item(s)] done [0.00s].
 set transactions ...[5 item(s), 4 transaction(s)] done [0.00s].
 sorting and recoding items ... [5 item(s)] done [0.00s].
 creating transaction tree ... done [0.00s].
 checking subsets of size 1 2 3 4 done [0.00s].
 writing ... [16 rule(s)] done [0.00s].
 creating S4 object  ... done [0.00s].
これで、関数aprioriを、パラメタ変更無し(デフォルトのまま)で呼び出してみたことになる。デフォルトではsupportが0.1以上、confidenceが0.8以上としている。処理結果を覗いて見よう。
 > summary(samplelist.ap)
 set of 16 rules
 
 rule length distribution (lhs + rhs):sizes
 2 3 4 
 5 8 3 
 
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.000   2.000   3.000   2.875   3.000   4.000 
 
 summary of quality measures:
     support         confidence      lift      
  Min.   :0.2500   Min.   :1    Min.   :1.333  
  1st Qu.:0.2500   1st Qu.:1    1st Qu.:1.333  
  Median :0.2500   Median :1    Median :1.333  
  Mean   :0.3594   Mean   :1    Mean   :1.417  
  3rd Qu.:0.5000   3rd Qu.:1    3rd Qu.:1.333  
  Max.   :0.7500   Max.   :1    Max.   :2.000 
ルールは16個あるが、その長さの分布はしかじかであり、support, confidence, liftの最小・中央地・平均・最大値などはしかじかである。

更に、ルールそのものは、
 > inspect(samplelist.ap)
    lhs    rhs support confidence     lift
 1  {D} => {A}    0.25          1 2.000000
 2  {D} => {C}    0.25          1 1.333333
 3  {A} => {C}    0.50          1 1.333333
 4  {B} => {E}    0.75          1 1.333333
 5  {E} => {B}    0.75          1 1.333333
 6  {A,                                   
     D} => {C}    0.25          1 1.333333
 7  {C,                                   
     D} => {A}    0.25          1 2.000000
 8  {A,                                   
     B} => {E}    0.25          1 1.333333
 9  {A,                                   
     E} => {B}    0.25          1 1.333333
 10 {A,                                   
     B} => {C}    0.25          1 1.333333
 11 {A,                                   
     E} => {C}    0.25          1 1.333333
 12 {B,                                   
     C} => {E}    0.50          1 1.333333
 13 {C,                                   
     E} => {B}    0.50          1 1.333333
 14 {A,                                   
     B,                                   
     E} => {C}    0.25          1 1.333333
 15 {A,                                   
     B,                                   
     C} => {E}    0.25          1 1.333333
 16 {A,                                   
     C,                                   
     E} => {B}    0.25          1 1.333333
のようになっている。念のため手で計算した結果と比較してみよう。[[ノート/マイニング/バスケット]]で手計算した結果によると(「ト数」=トランザクション数)、~
 conf({A}⇒{C})=(Aを含むトのうちCを含むト数)/(Aを含むト数)= 2/2 = 100%~
 support({A}⇒{C})=(AかCを含むト数)/(全ト数) = 3/4 = 50%~
これは上記3行目によるとsupport 50%, confidence 100%、~
 conf({A}⇒{D})=(Aを含むトのうちDを含むト数)/(Aを含むト数)= 1/2 = 50%~
 support({A}⇒{D})=(AかDを含むト数)/(全ト数) = 1/4 = 25%~
と~
 conf({A,C}⇒{D})=(AとCを含むトのうちDを含むト数)/(AとCを含むト数)= 1/2 = 50%~
 support({A,C}⇒{D})=((AとC)とDを含むト数)/(全ト数) = 1/4 = 25%~
はいずれもデフォルトの閾値(support 0.1以上、confidence 0.8以上)以下なので上記の表には含まれない。また、
 conf({C,D}⇒{A})=(CとDを含むトのうちAを含むト数)/(CとDを含むト数)= 1/1 = 100%~
 support({C,D}⇒{A})=((CとD)とAを含むト数)/(全ト数) = 1/4 = 25%~
は7行目によるとsupport 25%, confidence 100%であり、合っている。

というわけで、無事に計算できることがわかった。

***サンプルデータを処理してみる [#c77c6d55]
パッケージarulesに付いて来るバスケット解析用のサンプルデータ、食料品店での買物のトランザクションデータがある。これを解析してみる。(「Rによるデータサイエンス」(金明哲)286ページ)

データの読み出しは、Rではdata(データ名)で行う。
 data(Groceries)
データの概要を見ると
 9835 transactions (rows) and
 169 items (columns)
つまり、品目が169種類、買物の回数(バスケットの個数)が9835である。買物の品目の具体的な名前は、
 > head(as(Groceries, "matrix"), n=0)
     frankfurter sausage liver loaf ham meat finished products organic sausage chicken turkey
     pork beef hamburger meat fish citrus fruit tropical fruit pip fruit grapes berries
     nuts/prunes root vegetables onions herbs other vegetables packaged fruit/vegetables
     whole milk butter curd dessert butter milk yogurt whipped/sour cream beverages UHT-milk
     condensed milk cream soft cheese sliced cheese hard cheese cream cheese 
     processed cheese spread cheese curd cheese specialty cheese mayonnaise salad dressing
     tidbits frozen vegetables frozen fruits frozen meals frozen fish frozen chicken
     ice cream frozen dessert frozen potato products domestic eggs rolls/buns white bread
     brown bread pastry roll products  semi-finished bread zwieback potato products flour
     salt rice pasta vinegar oil margarine specialty fat sugar artif. sweetener honey mustard
     ketchup spices soups ready soups Instant food products sauces cereals organic products
     baking powder preservation products pudding powder canned vegetables canned fruit
     pickled vegetables specialty vegetables jam sweet spreads meat spreads canned fish
     dog food cat food pet care baby food coffee instant coffee tea cocoa drinks
     bottled water soda misc. beverages fruit/vegetable juice syrup bottled beer canned beer
     brandy whisky liquor rum liqueur liquor (appetizer) white wine red/blush wine prosecco
     sparkling wine salty snack popcorn nut snack snack products long life bakery product
     waffles cake bar chewing gum chocolate cooking chocolate specialty chocolate
     specialty bar chocolate marshmallow candy seasonal products detergent softener
     decalcifier dish cleaner abrasive cleaner cleaner toilet cleaner bathroom cleaner
     hair spray dental care male cosmetics make up remover skin care female sanitary products
     baby cosmetics soap rubbing alcohol hygiene articles napkins dishes cookware
     kitchen utensil cling film/bags kitchen towels house keeping products candles
     light bulbs sound storage medium newspapers photo/film pot plants flower soil/fertilizer
     flower (seeds) shopping bags bags
のようなものである。

これを、デフォルト設定(support 0.1以上、confidence 0.8以上)のままapriori処理をすると、結果はひとつも拾われない。
 > apriori(Groceries)
 
 parameter specification:
  confidence minval smax arem  aval originalSupport support minlen maxlen target   ext
         0.8    0.1    1 none FALSE            TRUE     0.1      1      5  rules FALSE
 
 algorithmic control:
  filter tree heap memopt load sort verbose
     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
 
 apriori - find association rules with the apriori algorithm
 version 4.21 (2004.05.09)        (c) 1996-2004   Christian Borgelt
 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].
 set of 0 rules 
パラメタを変更してみる。例えば「Rによるデータサイエンス(金明哲)」ではsupport=0.005, confidence=0.01に閾値を設定している。この場合、
 > Gr.ap <- apriori(Groceries, parameter=list(support=0.005, confidence=0.01))
 
 parameter specification:
  confidence minval smax arem  aval originalSupport support minlen maxlen target   ext
        0.01    0.1    1 none FALSE            TRUE   0.005      1      5  rules FALSE
 
 algorithmic control:
  filter tree heap memopt load sort verbose
     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
 
 apriori - find association rules with the apriori algorithm
 version 4.21 (2004.05.09)        (c) 1996-2004   Christian Borgelt
 set item appearances ...[0 item(s)] done [0.00s].
 set transactions ...[169 item(s), 9835 transaction(s)] done [0.02s].
 sorting and recoding items ... [120 item(s)] done [0.00s].
 creating transaction tree ... done [0.01s].
 checking subsets of size 1 2 3 4 done [0.00s].
 writing ... [2138 rule(s)] done [0.00s].
 creating S4 object  ... done [0.02s].
ということで、全部で2138ルールが書き出された。この結果をconfidenceでソート(SORT)し、その上位10ルールを取り出して(head(..., n=10))、見やすいように書き出す(inspect)すると、
 > inspect(head(SORT(Gr.ap, by="confidence"), n=10))
    lhs                     rhs                    support confidence     lift
 1  {tropical fruit,                                                          
     root vegetables,                                                         
     yogurt}             => {whole milk}       0.005693950  0.7000000 2.739554
 2  {pip fruit,                                                               
     root vegetables,                                                         
     other vegetables}   => {whole milk}       0.005490595  0.6750000 2.641713
 3  {butter,                                                                  
     whipped/sour cream} => {whole milk}       0.006710727  0.6600000 2.583008
 4  {pip fruit,                                                               
     whipped/sour cream} => {whole milk}       0.005998983  0.6483516 2.537421
 5  {butter,                                                                  
     yogurt}             => {whole milk}       0.009354347  0.6388889 2.500387
 6  {root vegetables,                                                         
     butter}             => {whole milk}       0.008235892  0.6377953 2.496107
 7  {tropical fruit,                                                          
     curd}               => {whole milk}       0.006507372  0.6336634 2.479936
 8  {citrus fruit,                                                            
     root vegetables,                                                         
     whole milk}         => {other vegetables} 0.005795628  0.6333333 3.273165
 9  {pip fruit,                                                               
     other vegetables,                                                        
     yogurt}             => {whole milk}       0.005083884  0.6250000 2.446031
 10 {pip fruit,                                                               
     domestic eggs}      => {whole milk}       0.005388917  0.6235294 2.440275
ルール1では、<熱帯果実・根野菜・ヨーグルトを買う人は普通の(低脂肪でない)ミルクを買う>というルールが、support=0.0057でconfidence=0.7だと言える、となっている。~
見てわかるとおり、~
 confidence(X={熱帯果実・根野菜・ヨーグルト}を含むトランザクションのうち、Y={ミルク}を含むものの割合)はそこそこ高いものが選ばれるが、~
 それに対するsupport(全トランザクションに対する、{熱帯果実・根野菜・ヨーグルト}∪{ミルク}を含むトランザクションの割合)の値は低い。~
それは、スーパーマーケットのバスケットの場合、品目の種類が、1回の買物の品数に比べて非常に大きい場合(つまりはそれぞれの品目についてみると、それを含むバスケットの数が少ない)、必然的に起こる現象だろう。

supportがどのぐらいだと、association(相関)を信用してよいのか、という議論はどこか探す必要がありそうだ。今のところちょっと考えると、このように1回の買物点数が少ないとsupport値は高くならないし、この程度の値同士を(ルール間で)比較してルールAがBよりsupportが大きいと主張しても、どれほどの意味があるのかわからない。誤差範囲のような気もする。もう少し調べてみる必要がありそうだ。~
また、supportに相当する、別の尺度がどこかに定義されているかもしれない。

ちなみに、supportの値がどうなっているかを、上記結果をsupportの順にソートしてみると、
 > inspect(head(SORT(Gr.ap, by="support"), n=10))
    lhs    rhs                   support confidence lift
 1  {}  => {whole milk}       0.25551601 0.25551601    1
 2  {}  => {other vegetables} 0.19349263 0.19349263    1
 3  {}  => {rolls/buns}       0.18393493 0.18393493    1
 4  {}  => {soda}             0.17437722 0.17437722    1
 5  {}  => {yogurt}           0.13950178 0.13950178    1
 6  {}  => {bottled water}    0.11052364 0.11052364    1
 7  {}  => {root vegetables}  0.10899847 0.10899847    1
 8  {}  => {tropical fruit}   0.10493137 0.10493137    1
 9  {}  => {shopping bags}    0.09852567 0.09852567    1
 10 {}  => {sausage}          0.09395018 0.09395018    1
となった。左辺が空のものばかりである。左辺が空のものは、アイテムの相関という意味では役に立たないような気がする。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS