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))
といった操作で、東京の平均気温の右上がりトレンドを除去したグラフを描くことが出来る。


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

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

2015年4月7日火曜日

つまずかないR言語入門(時系列について、その2)

前回までで、東京の1876年からの気温の変化を時系列オブジェクトtsを
使用して、平均気温の変化をプロットすることまで出来た。

ところで、Rをインストールした時に、UKgasといって、1960年から1986年
までのイギリスのガス消費量を四半期ごとに記録したデータが付随してくる。

> UKgas
と入力すると

 
Qtr1Qtr2Qtr3Qtr4
1960160.1129.784.8120.1
1961160.1124.984.8116.9
1962169.7140.989.7123.3

以下省略

と表示され、

> class(UKgas)
[1] "ts"
として、属性が時系列であることが判る。

> ts.plot(UKgas)
とすると、

ここで、疑問が起きる。

R付随のUKgasは、四半期単位(frequency=4)という条件で、グラフ化しても、
上記のように、Qtr単位で表示されている。

ところが、東京の平均気温を各月単位(frequency=12)で、時系列データとして
グラフ化しても、エラーが出て、出力できない。
平均気温単体なら、各年度ごとにグラフ化できるのはわかったが、UKgasのデータ
と同じように、月単位での出力ができないのはなぜか。

全然勉強たりないと痛感。

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

2015年4月3日金曜日

つまずかないR原語入門(時系列データの処理について)

前回までで、、国土交通省気象庁の過去の気象データを使用して、年間平均気温と、
各月の平均気温をapplyというコマンドで求めることが実証できた。

今回は、同じ気象データをつかって時系列の処理にトライしてみる。

Rでは時系列データの操作・分析用には何種類かのアプローチがある
ようだが、今回は時系列データをts(time seriesの略)オブジェクトという
形式で扱うことにした。
tsオブジェクトを生成するには、tsコマンドを使う。
明治からの東京の平均気温を再度求めてみる。

>b<-read.table("kion_b.txt",header=TRUE)
変数bに、1876年からの各月単位の気温を代入。
>year.means<-apply(b,1,mean)
applyコマンドで、各年の平均気温をもとめ、year.meansという変数に代入。
次に、これをtsオブジェクトとして生成する。
frequencyとは周期が1年単位であることによる。

>year.means.ts<-ts(year.means,frequency=1)
スタート年を明示するため、start=c(1876)として、グラフを描かせる。
>plot(year.means.ts<-ts(year.means,start=c(1876),frequency=1),ylab="temperature")

こうしてみると、ヒートアイランド現象と、地球温暖化の影響で
1960年以降、急激に東京の平均気温が上がっていることが、可視化できる。

本当は、各年の1月~12月と翌年の1月~12月以下同様と、連続して
描画したかったのだが、勉強不足で、そこまでたどり着きませんでした。

Rは奥が深い。でも深いから面白いし、勉強しがいがあるというものだ。

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

2015年4月2日木曜日

つまずかないR言語入門(applyの続き)

前回は、国土交通省気象庁の過去の気象データを使用して、
明治9年からの各月の平均気温から年間平均気温を算出するのに、applyを 使った。
表計算でいう、行単位の計算になる。

では、列単位の計算方法は。
列の場合は、applyの2番目の引数を2に帰るだけで実行できる。

> b<-read.table("kion_b.txt",header=TRUE)
> year2.means<-apply(b,2,mean)
> year2.means

janfebmaraprmayjun
4.1244604.764027.85251813.39136717.68705021.185612
julaugsepoctnovdec
25.02014426.41007222.77697816.96402911.6165476.599281

次回以降、時系列の見方について試行しようと思います。
----------------------
スマートテクノロジーネットワークのホームページはこちら
----------------------

2015年4月1日水曜日

つまずかないR言語入門(関数applyをつかったプログラム。applyは使い勝手が良い)

前回、R言語でのプログラミングの試行をしてみた。
今回は、「apply」をつかったプログラミングを試してみた。
データを持ってくるのに、著作権の問題などありそうなので、
国土交通省気象庁の過去の気象データが公開されていたので、
そこから、東京の日平均気温の月平均値(℃)の数値を使わせてもらうこととした。
データはなんと1876年(明治9年)から、途切れなく記録 されている。
気象庁の歴史によれば、 1875年明治8年6月1日から、東京府第2大区(のち赤坂区)
溜池葵町内務省地理寮構内で 気象業務を開始(気象庁の前身東京気象台)、
地震観測と1日3回の気象観測を開始。 とあるので、丁度その翌年明治9年からデータがあるのも納得できる。
日本人て、几帳面で、江戸時代からわずか8年で、このような記録をのこしていたとは
驚きと、賞賛の気持ちになる。
閑話休題。
気温データをコピーして、メモ帳に貼り付けます。
この際、以前も言い訳しましたが、ヘッダー行の漢字が面倒なので、
1月→jan、2月→feb以下同様としています。
また、applyの効果を確かめやすくするので、元データから年の値(平均値) を、
手作業で削除しています。 こうして手を加えたデータを、"kion_b.txt"として、
作業フォルダーに 格納します。
Rを立ち上げて、
> b<-read.table("kion_b.txt",header=TRUE)

として、138年間×12ヶ月分の各月の平均気温を
変数bとして格納します。

次に、
> year.means<-apply(b,1,mean)

これで、year.means というベクトルに 138年間の年間平均気温が計算され格納されます。
apply に渡す最初の引数はデータフレーム(この場合b)です。
2番目の引数 1 は、一行ごとにまとめて関数に渡すことを意味します。
3番目の引数は関数名で、この場合は 平均値を求めるための"mean" です。
実際に、どうなっているかというと。

> head(year.means)

187618771878187918801891
13.5750013.9666713.6250014.4333313.8916713.59167
と表示されてます。

apply関数は使いこなすとかなり便利だと思います。

次回は、縦方向の列の計算を試行してみます。

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