はじめに
時系列パターン分析とは、バスケット分析に時系列における順序の要素を加えたものです。これは以下のような条件が満たされる場合には、有効な分析だと思います。
- 顧客IDが付与されている
- 購入順序を決めるデータ(購入日など)がある
cSPADE(Sequential Pattern Discovery using Equivalence classes)は、時系列パターン分析を行うためのアルゴリズムです。RからはarulesSequencesパッケージから利用することができます。arulesSequencesの使い方に関する記述があまり見当たらなかったので簡単にまとめておきます。
本記事では通常のデータフレームから適切なデータ形式に変更するところから紹介します。
コードはWindows7で実行しています。
時系列パターン分析の実行
本記事ではテストデータを作成し、このパターンを分析します。arulesSequencesにはテストデータが同梱されてますが、通常、手元にあるデータがそのような綺麗な形式になっていることはないからです。
ライブラリの読み込み
library(arulesSequences)
library(dplyr)
テストデータの作成
5人が商品A, B, Cを購入する簡単な例を作ってみます。
set.seed(12)
sequenceID <- c(rep(1, 5), rep(2, 5), rep(3, 5),rep(4, 5), rep(5,5))
Item <- sample(LETTERS[1:3], 25, replace=T)
df <- data.frame(sequenceID, Item)
sequenceID | Item |
---|---|
1 | A |
1 | C |
1 | C |
1 | A |
1 | A |
2 | A |
arulesSequencesにおいて、sequenceIDは顧客IDに対応します。
データの加工
時系列を表す列を追加します。
顧客ごとに、現在の順番で購入が行われたとしてIDを振ります。
df$orderID <- 1:nrow(df)
df <-
df %>% group_by(sequenceID) %>%
mutate(eventID = order(orderID)) %>%
select(sequenceID, eventID, Item)
sequenceID | eventID | Item |
---|---|---|
1 | 1 | A |
1 | 2 | C |
1 | 3 | C |
1 | 4 | A |
1 | 5 | A |
2 | 1 | A |
sequenceID、eventID共に整数型である必要があります。eventIDに該当するカラムが最初からあることはあまりないと思うので、加工する必要があります。
次にarulesSequencesが識別できる形、transaction形式に変形します。
直接transactionsに変形する方法もあるのですが、ここでは外部ファイルに書き出す方法を紹介します。
write.table(df, "temp.csv", sep = ",", row = F, col = F)
temp <- read_baskets("temp.csv", sep = ",", info = c("sequenceID", "eventID"))
行名、列名を取って出力するのがポイントです。
sequenceIDとeventIDの名称は固定で、この通りにする必要があります。
実行
s <- cspade(temp, parameter = list(support=0.2, maxlen=3))
cspadeにはいくつかパラメータがあります。
- support : 系列の発生確率の下限(デフォルトは0.1)
- maxsize : 系列に現れるアイテムの種類数の上限(デフォルトは10)
- maxlen : 系列の長さの上限(デフォルトは10)
- mingap, maxgap : 系列の連続性において許容するgapの下限と上限(デフォルトはNone)
結果の出力
rules <- ruleInduction(s, confidence=0.5)
sort(rules, by=c('lift', 'confidence')) %>% inspect
rule | support | confidence | lift |
---|---|---|---|
<{A}, {C}> => <{C}> | 0.4 | 1 | 1.66 |
<{C}, {B}> => <{B}> | 0.2 | 1 | 1.66 |
<{B}, {C}> => <{B}> | 0.2 | 1 | 1.66 |
<{B}, {B}> => <{B}> | 0.4 | 1 | 1.66 |
<{C}> => <{C}> | 0.4 | 0.67 | 1.11 |
ruleInductionは、confidenceが指定した値以上となるルールを抽出します。
ruleの右側は、系列の最後の値を取り出したものです。
念のため出力の各指標の意味をまとめておきます。
- support : 系列の発生確率。sequenceIDごとに発生有無を判定している。
- confidence : ルールの左辺を条件付けたときの右辺の発生確率。バスケット分析と異なり、右辺が時系列的に後に来る場合の確率を計算している。
- lift : confidenceを更に右辺の発生確率で割った値。左辺を条件付けると右辺の発生率が何倍になるかを計算している。
バスケット分析の自然な拡張であるため、同じ名前が使われているものと思われます。
おわりに
可視化等について詳しい人がいたら是非教えてください。