ノート/マイニング/バスケット
訪問者数 6836      最終更新 2008-05-12 (月) 16:36:02

図書データをRで

バスケット解析をRで

パッケージ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%であり、合っている。

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

サンプルデータを処理してみる

パッケージ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
Last-modified: 2008-05-12 (月) 16:36:02 (3506d)