前回まで、アソシエーションルールに関するパッケージや
ツールについて、自分なりに理解が出来た。
前2回は、自分で勝手に作成したデータなので。
とても実態を反映しているとはいえない。
そこで、ここ1週間ほど、リアルなデータで実証して
みたく、いろいろ悩んでいたところ、あるデータを
入手することができた。
得意先名などを特定できない、災害避難用品の購入データ
を入手出来たので、これで実証実験を行ってみた。
ところが、データを見ると、商品名の入力のバラつきが
大きく、aprioriを当てはめても、明確なルールが得られないことが
わかった。
一例を上げると、「乾パン」と「カンパン」、「乾パン20箱」などは
全て、別物として扱われるため、相関ルールとして
うまく当てはめが出来ないことがわかった。
このような場合、一般には、商品コードか中分類に立ち返って
再度ルールを適用するのだろうが、残念ながら今回はその
ようなデータがない。
仕方がないので、csvファイルを、出来るだけ製品のもつ
性格を変えないように名称を修正して実行した結果が
次のようなものになった。
データとしては23行、最大17アイテム、最小7アイテムがバスケットに
入っているとお考えください。
以下手順。
> library(arules)
要求されたパッケージ Matrix をロード中です
次のパッケージを付け加えます: ‘arules’
The following objects are masked from ‘package:base’:
%in%, write
> bs.bas<-read.transactions(file="saigai.csv",sep=",",
+ format="basket",rm.duplicate=TRUE)
distribution of transactions with duplicates:
items
1 2 4 7 8 9 10 11 12
1 1 1 2 1 11 3 1 1
参考にさせていただいているJIN'S PAGEに従って
「データを処理する際には、まずデータの概観を把握することが重要である。
パッケージarulesには、トランザクションデータのアイテムの頻度の棒グラフを
作成する関数itemFrequencyがある。」
となっていたので、納得して実行した結果は次の通り。
何が何だかわからないが、データを手作業で修正しても、このような
アイテム数なので、真の意味のビッグデータを扱うことの難しさを実感した。
それはさておき、aprioriを実行すると、
> bs2.ap<-apriori(bs.bas)
Parameter specification:
confidence minval smax arem aval originalSupport support minlen
0.8 0.1 1 none FALSE TRUE 0.1 1
maxlen target ext
10 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 ...[97 item(s), 23 transaction(s)] done [0.00s].
sorting and recoding items ... [18 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 done [0.00s].
writing ... [57 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
となり、
> inspect(head(sort(bs2.ap,by="confidence"),n=5))
lhs rhs support confidence lift
1 {保存用醤油せんべい} => {} 0.1304348 1 1.150000
2 {防災セット} => {乾パン} 0.1304348 1 1.642857
3 {防災セット} => {} 0.1304348 1 1.150000
4 {携帯AMラジオ} => {} 0.1304348 1 1.150000
5 {携帯充電器} => {} 0.1739130 1 1.150000
なんとなく、防災セットを買うひとは乾パンも買うのだろうと、
ごく自然なルールが導出されて、納得。
たまたま、本日2015年5月30日20時23分に小笠原沖で
マグニチュード8.5の巨大地震が起きて、筆者の地域も震度4で
かなり怖い思いをした。
たまたまデータをみて、改めて防災用品と備蓄食料を用意しなくては
ならないと、実感した。
support、confidence、liftについて触れようと思ったが、次の機会に
いたします。
p>
----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------
2015年5月30日土曜日
2015年5月13日水曜日
つまずかないR言語入門(アソシエーションルール再び)
前回のエントリーで、アソシエーションルールを試してみた。
テクニカルな部分さえ押さえれば、結果がでることは理解できたが、
元のデータが筆者の妄想の産物なので、いま一つ納得感に欠ける
結果となった。
そこで、前回のデータを膨らませて、件数も増やして、再度トライ
することとした。
データは、csv形式で、20レコードをもつ、”basket2.csv”という
データを作成した。
以下手順。
Rを立ち上げ、
> library(arules)
としてライブラリーを呼び出す。
次に、
> b2.bas<-read.transactions(file="basket2.csv",sep=",",format="basket",rm.duplicate=TRUE)
とするが、前回同様に、
distribution of transactions with duplicates:
1
5
という表記で、なにか叱られるが、とりあえずスルーする。
> b2.ap<-apriori(b2.bas)
を実行すると、10数行のコメントがでるが、なかに
writing ... [78 rule(s)] done [0.00s].
とあり、このような数量でも、78のルールが生成されたようだ。
さらに、
> inspect(head(sort(b2.ap,by="support"),n=5))
として、support順にルールを表記させると
キャベツを買うひとは肉を同時に買うということと、
バターを買う人はパンも同時に買い物バスケットに入れる
ということを明示してくれる。
ここで、先週来学んだことを備忘録的に記載すると、
aprioriアルゴリズムでは、confidence(信頼度)とsupport(支持度)、
lift(2つの事象の独立性をみる指標)で表される。
supportは、lhs(条件)とrhs(結論)を同時に満たすtransactionが、
全transactionにしめる割合をしめす。
また、confidenceは、lhs(条件)が発生したときに、rhs(結論)が
発生する割合を示す。
今回の適当な事例を無理やり解釈すると、全20トランザクションで
キャベツ⇒肉は25%、バター⇒パンは20%を占めている。
confidenceは2例とも、1.0でlhsとrhsの結びつきが強いことを示している。
liftは1より大きいと、そのルールは有効なルールと考えられる
(*www.itmedia.co.jpのサイトを参照)ので、理論的にも計算は正しいと理解した。
今更であるが、Rを使おうとする筆者のようなものは、Rをツールとして
操作出来ることはもとより、統計学の基礎もしくはそれ以上の知識を身に
つけないと、数値のもつ意味を捉え損なうおそれがあり、その意味で、
「Rは誰でも使えますよ」風の講習会はいかがなものかと思った次第です。
テクニカルな部分さえ押さえれば、結果がでることは理解できたが、
元のデータが筆者の妄想の産物なので、いま一つ納得感に欠ける
結果となった。
そこで、前回のデータを膨らませて、件数も増やして、再度トライ
することとした。
データは、csv形式で、20レコードをもつ、”basket2.csv”という
データを作成した。
以下手順。
Rを立ち上げ、
> library(arules)
としてライブラリーを呼び出す。
次に、
> b2.bas<-read.transactions(file="basket2.csv",sep=",",format="basket",rm.duplicate=TRUE)
とするが、前回同様に、
distribution of transactions with duplicates:
1
5
という表記で、なにか叱られるが、とりあえずスルーする。
> b2.ap<-apriori(b2.bas)
を実行すると、10数行のコメントがでるが、なかに
writing ... [78 rule(s)] done [0.00s].
とあり、このような数量でも、78のルールが生成されたようだ。
さらに、
> inspect(head(sort(b2.ap,by="support"),n=5))
として、support順にルールを表記させると
lhs | rhs | support | confidence | lift | ||
1 | {meat} | => | {} | 0.40 | 0.8 | 1.142857 |
2 | {cabbage} | => | {meat} | 0.25 | 1.0 | 2.000000 |
3 | {butter} | => | {bread} | 0.20 | 1.0 | 2.500000 |
4 | {butter} | => | {} | 0.20 | 1.0 | 1.428571 |
5 | {cabbage} | => | {} | 0.20 | 0.8 | 1.142857 |
キャベツを買うひとは肉を同時に買うということと、
バターを買う人はパンも同時に買い物バスケットに入れる
ということを明示してくれる。
ここで、先週来学んだことを備忘録的に記載すると、
aprioriアルゴリズムでは、confidence(信頼度)とsupport(支持度)、
lift(2つの事象の独立性をみる指標)で表される。
supportは、lhs(条件)とrhs(結論)を同時に満たすtransactionが、
全transactionにしめる割合をしめす。
また、confidenceは、lhs(条件)が発生したときに、rhs(結論)が
発生する割合を示す。
今回の適当な事例を無理やり解釈すると、全20トランザクションで
キャベツ⇒肉は25%、バター⇒パンは20%を占めている。
confidenceは2例とも、1.0でlhsとrhsの結びつきが強いことを示している。
liftは1より大きいと、そのルールは有効なルールと考えられる
(*www.itmedia.co.jpのサイトを参照)ので、理論的にも計算は正しいと理解した。
今更であるが、Rを使おうとする筆者のようなものは、Rをツールとして
操作出来ることはもとより、統計学の基礎もしくはそれ以上の知識を身に
つけないと、数値のもつ意味を捉え損なうおそれがあり、その意味で、
「Rは誰でも使えますよ」風の講習会はいかがなものかと思った次第です。
----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------
登録:
投稿 (Atom)