2015年6月7日日曜日

つまずかないR言語入門(アソシエーションルールのサポート、コンフィデンス、リフト)

アソシエーションルールは、マーケティングの世界では、マーケット・バスケット分析として、
筆者が想像していた以上に、かなり現場に近いところで使われていることがわかってきた。

さて、今まで記述するのを先送りしてきた、アソシエーションルールにおける、
サポート(support)、コンフィデンス(confidence)、リフト(lift)について、理解した
内容を備忘録として、記述します。

説明を簡単にするために、3回前の記事 で説明します。
サポートは、トランザクション中に、2つ以上の品目が発生する比率で、筆者が作成した例では
10トランザクション中3件肉とミルクの組み合わせが発生、同様に、人参と肉を買った場合、
ポテトを同時に買うケースが20%あったということになる。

コンフィデンス(confidence)は確信度の意で、条件付き確率ということで、
品目Aを含むトランザクションで品目Bを含む比率を指す。
confidenceの高いルールは良いルールと言われる(そうだ)。

リフトは、品目Aと品目Bが同時に現れる確率が、品目Aと品目Bが単独に買われる
確率の何倍かを示している。リフトが1以上であると有効なルールであると言われる。

事例が人口的なものなので、lift=10となっているが、正直少々不安ではある。

精進します。


----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------

2015年5月30日土曜日

つまずかないR言語入門(実際のアソシエーションルール当てはめ)

前回まで、アソシエーションルールに関するパッケージや
ツールについて、自分なりに理解が出来た。
前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月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順にルールを表記させると

 lhs rhssupportconfidencelift
1{meat}=>{} 0.400.81.142857
2{cabbage} =>{meat}0.251.02.000000
3{butter} =>{bread}0.201.02.500000
4{butter} =>{}0.201.01.428571
5{cabbage} =>{}0.200.81.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は誰でも使えますよ」風の講習会はいかがなものかと思った次第です。


----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------

2015年4月25日土曜日

つまずかないR言語入門(アソシエーションルール、バスケット分析)

ようやく、通常の仕事に近い領域が扱えそうになってきた。

「いまさら」といわれそうだが、データマイニングという単語が広く
知られ始めたころに、オムツとビールの話が必ずと言ってよいほど、語られた。

"「商品Aを買うと商品Bも買う」のようなルールを簡潔に、{A}⇒{B}と
表すことにする。相関ルールは、通常X⇒Yの形式で表す。ルールの「⇒」
の左辺を条件部(antecedent: left-hand-side or LHS)、右辺を結論部
(consequent: right-hand-side or RHS)と呼ぶ。最も広く知られている
相関ルールを検出するアルゴリズムはAprioriである。"
同志社大学「R、R言語、R環境・・・・・・」より引用

以来、色々な論文を読んだりしたが、「apriori」という単語が出てきて、
もともとの意味は、「あらかじめ決められた」という意味らしいが、そう
いう文脈で使われたのは理解できたが、さらに調べると、IBMが
開発した、アソシエーションルールの関数であることがわかった。

まず、「arules」というパッケージをインストールする。
いつものように身近なミラーサイト(筆者の場合、TSUKUBA)を選び、

> install.packages("arules")
を実行。

URL 'http://cran.md.tsukuba.ac.jp/bin/windows/contrib/3.1/arules_1.1-6.zip' を試しています
Content type 'application/zip' length 1803031 bytes (1.7 MB)
開かれた URL
downloaded 1.7 MB

パッケージ ‘arules’ は無事に展開され、MD5 サムもチェックされました

ダウンロードされたパッケージは、以下にあります
C:\Users\xxxxx\AppData\Local\Temp\RtmpWs7VDR\downloaded_packages

と表示されインストール成功。

その前に、著作権に問題が起きないように、自分の日常生活でスーパーで
買いそうなアイテムを適当に作成し、basket1.csvtとして、作業フォルダーに
保存しておいた。
---2015年6月7日修正(basket1.csvのデータに空の行が入っていたためイタリック体の部分を以下修正します--

meat,potato,milk,carrot
bread,milk,jam,ham,lettuce
rice,potato,carrot,meat,milk
cheese,ham,beer,potato
cabbage,beef,carrot
juice,water,milk,potato
coffee,milk,bread,butter
beans,tomato,pasta
bread,meat,milk,juice
bread,cabbage,chicken,juice

> library(arules)

> b.bas<-read.transactions(file="basket1.csv",sep=",",format="basket")
以下にエラー asMethod(object) :
can not coerce list with transactions with duplicated items

重複したitemsがあるとのことで、rm.duplicate=TRUEとすることした。

> b.bas<-read.transactions(file="basket1.csv",sep=",",format="basket",rm.duplicate=TRUE)

ここで「apriori」を適用すると

> b.ap<-apriori(b.bas)

Parameter specification:
confidence minval smax arem aval originalSupport support minlen maxlen
0.8 0.1 1 none FALSE TRUE 0.1 1 10
target ext
rules FALSE

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

apriori(b.bas) 中で警告がありました:
You chose a very low absolute support count of 1. You might run out of memory! Increase minimum support.

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 ...[22 item(s), 10 transaction(s)] done [0.00s].
sorting and recoding items ... [22 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 done [0.00s].
writing ... [240 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].

> inspect(head(sort(b.ap,by="support"),n=5))
lhs rhs support confidence lift
1 {meat} => {milk} 0.3 1 1.666667
2 {carrot,
meat} => {potato} 0.2 1 2.500000
3 {meat,
potato} => {carrot} 0.2 1 3.333333
4 {carrot,
potato} => {meat} 0.2 1 3.333333
5 {carrot,
meat} => {milk} 0.2 1 1.666667

という結論で、肉を買うと牛乳を買う可能性が高いという結論になった。

それぞれの意味の解釈は次のエントリーで行います。


----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------

2015年4月23日木曜日

つまずかないR言語入門(時系列、自己相関関数について)

時系列解析について、もう少し理解したくて、この1週間ほど、本を読んだり、
関連するWebを検索していた。

移動平均については、SMAを使うことができたが、その先になかなか進めない。

ようやく一つだけ、「自己相関係数」について、意味するところと、使用方法が
わかった。

例として、従前の東京の平均気温データをつかうこととした。

> temp<-read.table("kion.txt",header=TRUE,row.names=1)
> temp.ts<-as.ts(temp$ave)
> class(temp.ts)
[1] "ts"

時系列データであることを確かめたので、acf関数なる、自己相関
すなわち、過去の値とどれほどの相関があるかを算出する便利な
関数を使ってみる。

> acf(temp.ts)
とすると、

というグラフが生成される。

一方、acfの典型的な事例として、例のイギリスのガス消費量「UKgas」で、同じくacfを
使ってみる。

> UKgas
> acf(UKgas)

とすると、

UKgasのデータは、四半期単位でガス消費量を捉えているので、4四半期ごとに
強い正の相関が見て取れるので、季節変動要素が明確であることが判る。

では、先に計算した東京都の平均気温は?

年が過ぎればすぎるほど、過去の気温に影響を受けることがなく、結果的に
相関関係が弱くなっている。と解釈した。
平均気温の変化を解釈するモデルとしては、「適切でない」。というのが
結論かもしれないと感じた次第。(ややお粗末だが、勉強にはなった)


----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------

2015年4月16日木曜日

つまずかないR言語入門(時系列オープンデータの移動平均)

前回まで、気象庁のオープンデータで、平均気温の可視化や、トレンドを除去した偏差に
ついて記述してきた。

株価なども時系列データの典型であるが、例えば「5日移動平均線」は直近5日分の終値を
合計して5で割った株価を結んだものである。
日々の細かい値動きより、滑らかな傾向値をプロットすることで、
過去の経緯から、今後の株価を推測することが良くある。

そこで、移動平均についてお勉強!
まず、CRANからパッケージをダウンロードします。ミラーサイトは
なるべく近隣のサイトから選択します。

> install.packages("TTR")

これで、つぎのような表示がでます。
URL 'http://cran.md.tsukuba.ac.jp/bin/windows/contrib/3.1/TTR_0.22-0.zip' を試しています
Content type 'application/zip' length 283023 bytes (276 KB)
開かれた URL
downloaded 276 KB

パッケージ ‘TTR’ は無事に展開され、MD5 サムもチェックされました

ダウンロードされたパッケージは、以下にあります
C:\Users\xxxxxx\AppData\Local\Temp\RtmpYZXkVr\downloaded_packages

これで、TTRパッケージをよびだします。
> library(TTR)
要求されたパッケージ xts をロード中です
要求されたパッケージ zoo をロード中です

次のパッケージを付け加えます: ‘zoo’

The following objects are masked from ‘package:base’:

as.Date, as.Date.numeric

次に、東京の平均気温データを呼び出します。

> temp<-read.table("kion.txt",header=TRUE,row.names=1)
先頭6行を確認。
> head(temp)
jan feb mar apr may jun jul aug sep oct dec nov ave
1876 1.6 3.4 8.1 12.2 16.9 18.4 24.3 26.7 22.6 14.8 9.1 4.8 13.6
1877 2.9 3.3 6.0 13.5 16.4 21.9 26.2 25.7 21.1 15.6 9.3 5.7 14.0
1878 2.1 2.2 7.0 11.4 18.0 19.9 25.9 24.4 22.6 15.5 9.5 5.0 13.6
1879 3.1 5.2 7.9 12.2 17.9 21.4 26.1 26.5 21.0 14.7 9.4 7.8 14.4
1880 2.3 5.6 8.2 12.1 17.4 19.7 24.1 25.3 22.1 16.4 9.9 3.6 13.9
1881 2.0 3.4 5.1 11.3 17.0 21.2 23.8 26.5 22.4 15.5 10.8 4.1 13.6

属性を確認すると
> class(temp)
[1] "data.frame"

次に、時系列データにするために、年平均気温(ave)を抜き出します。
> temp.ts<-as.ts(temp$ave)
> head(temp.ts)
[1] 13.6 14.0 13.6 14.4 13.9 13.6
> class(temp.ts)
[1] "ts"
ということで、時系列データであることが確認できました。

> plot(temp.ts)
> temp.ts5<-SMA(temp.ts,5)
> par(new=T)
> plot(temp.ts5,col="blue")

このままでは、y軸の表記がおかしいので、

> plot(temp.ts,xlab="year",ylab="temp",xlim=c(0,150),ylim=c(12,18))
> par(new=T)
> plot(temp.ts5,xlab="year",ylab="temp",xlim=c(0,150),ylim=c(12,18),col="red")

この作業で、一年ごとの平均気温と赤色で5年移動平均がグラフ化できました。

細かい作り込みは、いま一つですが、時系列解析における移動平均が
ようやく理解できました。

Rは奥が深い。


----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------

2015年4月9日木曜日

つまずかないR言語入門(何を目的として時系列解析をするのか)

イギリスのガスの消費量や、東京の過去平均気温を、主にtsオブジェクトという形式で、
扱えることはできるようになった。(心もとないが)

ところで、時系列データは何を目的として解析するのか??

時系列のデータは、常に変動している。その変動の様子を解析して、過去のデータから将来の変動を
予測することが目的と考えられる。
ここで、時系列データは、統計的な性質が一定な定常時系列と、性質が変化する非定常時系列に
分類される。
詳細は専門書に譲るとして、UKgasの時系列をプロットすると、下図の左側のようになる。
季節変動を含みながら、右肩上がりのトレンドを示している。
ここで、差分(階差)・・値⊿yt=yt-yt-1を操作することで、線形関係にあるトレンドを
除去することができる。

> par(mfrow=c(1,2))
> plot(UKgas)
> plot(diff(UKgas))
とすることで、下図右側のトレンドを除去したグラフを描くことが出来る。

同様に
> par(mfrow=c(1,2))
> plot(tokyo.kion.ts)
> plot(diff(tokyo.kion.ts))
といった操作で、東京の平均気温の右上がりトレンドを除去したグラフを描くことが出来る。


さらに深い考察は、すこし専門書を十分理解した段階で、改めて記述したいと思います。

----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------