アソシエーション分析
アソシエーション分析は変数が多いと非常にメモリを消費するので、相関ルールを求める際、支持度または確信度は高目に設定したほうが無難。
より多くの相関ルールを求めたい場合、支持度または確信度を高目に設定して処理が正常に終了するのを確認した上で、設定を少しずつ下げて実行する。
1位を例に説明すると、
条件部:up_o1(前日始値上昇)、up_l1(前日安値上昇)、down_c1(前日終値下落)
結論部:up_c0(当日終値上昇)
支持度:0.08292557
確信度:0.5729537
リフト:1.139160
となる。
データ数は3883個あるので、支持度から逆算すると条件部の前日始値上昇、前日安値上昇、前日終値下落と結論部の当日終値上昇が同時に起きたケースは322回(3883*0.08292557=322)。
支持度は条件部と結論部が同時に起きる確率だから、支持度は0.08292557(322/3883=0.08292557)となる。
確信度から逆算すると、条件部の前日始値上昇、前日安値上昇、前日終値下落が起きたケースは562回(322/0.5729537=562)。
確信度は条件部が起きた場合に結論部が起きる確率だから、確信度は0.5729537(322/562=0.5729537)となる。
リフトから逆算すると、結論部の当日終値上昇が起きたケースは1953回(0.5729537/1.139160*3883=1953)。
結論部が起きる確率は0.5029616(1953/3883=0.5029616)で、リフトは確信度がその結論部が起きる確率の何倍になるかだから、リフトは1.139160(0.5729537/0.5029616=1.139160)となる。
要するにある事象が無条件で、ある確率で起きる場合、ある条件下ではその確率が何倍になるかがリフト。
ある条件下で当日終値が上昇する確率、つまり確信度が55%であったとしても、ちょうど上昇トレンドが起きていて、全体でも当日終値が上昇する確率が55%であったなら、条件が加わったことによって確率が上がったとは言えない。
この場合、リフトは1となる。
したがって、条件の働きを見るためには確信度の高さより、リフトが1よりどれくらい大きいかが重要となる。
全体での当日終値上昇の確率が偏らずにちょうど50%なら、ある条件下での確信度が55%のとき、リフトは1.1になる。
55%程度を期待するなら、確信度が55%を超えているかより、リフトが1.1を超えているかを見たほうがいい。
より多くの相関ルールを求めたい場合、支持度または確信度を高目に設定して処理が正常に終了するのを確認した上で、設定を少しずつ下げて実行する。
# ライブラリの読み込み
library(quantmod)
library(arules)
# 開始日
s_date <- as.Date("1999-01-01")
# 終了日
e_date <- as.Date("2013-11-22")
# バスケットの作成
temp <- window(merge(# 当日終値が上昇なら1、さもなければ0
data$EURUSD.Close>lag(data$EURUSD.Close,k=1),
# 当日終値が下落なら1、さもなければ0
data$EURUSD.Close<lag(data$EURUSD.Close,k=1),
# 前日始値が上昇なら1、さもなければ0
lag(data$EURUSD.Open,k=1)>lag(data$EURUSD.Open,k=2),
# 前日始値が下落なら1、さもなければ0
lag(data$EURUSD.Open,k=1)<lag(data$EURUSD.Open,k=2),
# 前日高値が上昇なら1、さもなければ0
lag(data$EURUSD.High,k=1)>lag(data$EURUSD.High,k=2),
# 前日高値が下落なら1、さもなければ0
lag(data$EURUSD.High,k=1)<lag(data$EURUSD.High,k=2),
# 前日安値が上昇なら1、さもなければ0
lag(data$EURUSD.Low,k=1)>lag(data$EURUSD.Low,k=2),
# 前日安値が下落なら1、さもなければ0
lag(data$EURUSD.Low,k=1)<lag(data$EURUSD.Low,k=2),
# 前日終値が上昇なら1、さもなければ0
lag(data$EURUSD.Close,k=1)>lag(data$EURUSD.Close,k=2),
# 前日終値が下落なら1、さもなければ0
lag(data$EURUSD.Close,k=1)<lag(data$EURUSD.Close,k=2)),
start=s_date,end=e_date)
# 列名の変更
colnames(temp) <- c("up_c0","down_c0","up_o1","down_o1","up_h1","down_h1",
"up_l1","down_l1","up_c1","down_c1")
# matrix型への変換
test <- as(temp,"matrix")
# transactions型への変換
test.tran <- as(test,"transactions")
# 支持度0.05、確信度0.5で相関ルールを求める
test.ap <- apriori(test.tran,parameter=list(supp=0.05,conf=0.5))
# 結論部を「up_c0」(当日終値上昇)として
# 確信度に基づき、相関ルールの上位10位を表示
test.ap2 <- subset(test.ap,subset=rhs %in% "up_c0")
inspect(head(sort(test.ap2,by="confidence"),n=10))
lhs rhs support confidence lift
1 {up_o1,
up_l1,
down_c1} => {up_c0} 0.08292557 0.5729537 1.139160
2 {up_o1,
down_h1,
down_c1} => {up_c0} 0.07004893 0.5631470 1.119662
3 {up_l1,
down_c1} => {up_c0} 0.09605975 0.5625943 1.118563
4 {up_o1,
down_h1} => {up_c0} 0.08215297 0.5576923 1.108817
5 {down_h1,
up_l1} => {up_c0} 0.07571465 0.5568182 1.107079
6 {up_h1,
up_l1,
down_c1} => {up_c0} 0.05150657 0.5509642 1.095440
7 {up_o1,
down_c1} => {up_c0} 0.14293072 0.5500496 1.093621
8 {up_o1,
up_h1,
down_c1} => {up_c0} 0.07210919 0.5447471 1.083079
9 {up_h1,
down_c1} => {up_c0} 0.08421324 0.5413907 1.076406
10 {down_h1,
down_c1} => {up_c0} 0.17795519 0.5398437 1.073330
1位を例に説明すると、
条件部:up_o1(前日始値上昇)、up_l1(前日安値上昇)、down_c1(前日終値下落)
結論部:up_c0(当日終値上昇)
支持度:0.08292557
確信度:0.5729537
リフト:1.139160
となる。
データ数は3883個あるので、支持度から逆算すると条件部の前日始値上昇、前日安値上昇、前日終値下落と結論部の当日終値上昇が同時に起きたケースは322回(3883*0.08292557=322)。
支持度は条件部と結論部が同時に起きる確率だから、支持度は0.08292557(322/3883=0.08292557)となる。
確信度から逆算すると、条件部の前日始値上昇、前日安値上昇、前日終値下落が起きたケースは562回(322/0.5729537=562)。
確信度は条件部が起きた場合に結論部が起きる確率だから、確信度は0.5729537(322/562=0.5729537)となる。
リフトから逆算すると、結論部の当日終値上昇が起きたケースは1953回(0.5729537/1.139160*3883=1953)。
結論部が起きる確率は0.5029616(1953/3883=0.5029616)で、リフトは確信度がその結論部が起きる確率の何倍になるかだから、リフトは1.139160(0.5729537/0.5029616=1.139160)となる。
要するにある事象が無条件で、ある確率で起きる場合、ある条件下ではその確率が何倍になるかがリフト。
ある条件下で当日終値が上昇する確率、つまり確信度が55%であったとしても、ちょうど上昇トレンドが起きていて、全体でも当日終値が上昇する確率が55%であったなら、条件が加わったことによって確率が上がったとは言えない。
この場合、リフトは1となる。
したがって、条件の働きを見るためには確信度の高さより、リフトが1よりどれくらい大きいかが重要となる。
全体での当日終値上昇の確率が偏らずにちょうど50%なら、ある条件下での確信度が55%のとき、リフトは1.1になる。
55%程度を期待するなら、確信度が55%を超えているかより、リフトが1.1を超えているかを見たほうがいい。
# 結論部を「down_c0」(当日終値下落)として
# 確信度に基づき、相関ルールの上位10位を表示
test.ap3 <- subset(test.ap, subset = rhs %in% "down_c0")
inspect(head(sort(test.ap3, by = "confidence"), n = 10))
lhs rhs support confidence lift
1 {down_o1,
up_h1,
up_c1} => {down_c0} 0.06901880 0.5548654 1.133970
2 {down_o1,
up_h1} => {down_c0} 0.07957765 0.5440141 1.111793
3 {up_h1,
up_c1} => {down_c0} 0.18645377 0.5423221 1.108335
4 {up_h1,
up_l1,
up_c1} => {down_c0} 0.15374710 0.5383228 1.100162
5 {up_o1,
up_h1,
up_l1,
up_c1} => {down_c0} 0.10713366 0.5374677 1.098414
6 {up_o1,
up_l1,
up_c1} => {down_c0} 0.11511718 0.5359712 1.095356
7 {up_o1,
up_h1,
up_c1} => {down_c0} 0.11588978 0.5325444 1.088353
8 {up_o1,
up_c1} => {down_c0} 0.12670616 0.5273312 1.077698
9 {up_l1,
up_c1} => {down_c0} 0.18181818 0.5260805 1.075142
10 {down_o1,
down_l1,
up_c1} => {down_c0} 0.06670100 0.5232323 1.069322