「Pythonで系列パターンマイニング」を行うのにRのCSPADEを使った手順をまとめる。 そもそもPythonのライブラリでパターンマイニングを行える物があればそれを使えばいいのだが、見つけることができなかったため、Rのライブラリを利用したというのが本音。
環境
- MacBook Pro13
- macOS Sierra(10.12.6)
- メモリ 8GB
Pythonのインストール
https://qiita.com/shizuma/items/027167c6257f1c9d2a6f
を参考にインストール
Rのインストール
https://qiita.com/azzeten/items/1031c788ed093d3b3946
を参考にインストール
PypeRのインストール
今回はPythonとRの連携を考えるため、PythonからRを利用するPypeRをインストールする。
インストールに関してはhttps://qiita.com/ynakayama/items/f84dc659f1337d71dd9e
などを参考にした。
系列パターンマイニングとは
系列パターンマイニングは、ある時系列に沿った系列データの中から共通のパターンを見つけ出す手法です。例えば、[A, B, C, D, E, F, G, H, I, J]という10個のアイテムがあるとする。この10個のアイテムが4人の人に時系列に沿って次のように購入されたケースを考える。
- A → B → D → H → I → D
- B → H → A
- C → B → H
- D → B → B → H
矢印(→)が時間の経過を示す。この4人の購買履歴から共通のパターンを見出すのが系列パターンマイニングになります。この例だと、4人全員の購買履歴に「B → H」というパターンが含まれていることがすぐに分かる。つまり「Bを購入した人はその後(直後とは限らない)にHを購入するらしい」と言える事になります。
この記事では、アルゴリズムの詳細については触れないが、代表的な系列パターンマイニングのアルゴリズムとして「SPADE」がある。SPADEをRで実装したものが今回利用する「CSPADE」です。CSPADEはRのライブラリである「arulesSequences」に含まれている。
Rのライブラリの準備
Rのライブラリ「arules」, 「arulesSequences」のインストール
> install.packages("arules")
> install.packages("arulesSequences")
インプットファイルの作成
CSPADEを動かすためには当然インプットファイルが必要となる。インプットファイルは次のような形をしている必要があり、/usr/local/lib/R/site-library/arulesSequences/misc/にtextファイルでおいておけば良い。(ここである必要はないと思うが、正確に理解できていない)
# input.txt
1 10 2 C D
1 15 3 A B C
1 20 3 A B F
1 25 4 A C D F
2 15 3 A B F
2 20 1 E
3 10 3 A B F
4 10 3 D G H
4 20 2 B F
4 25 3 A G H
まずいちばん左のカラムの番号はシーケンスIDと呼ばれるもので、上の例で言うところの各人に当たる。左から二番目のカラムは実施した時刻(時系列を区別するラベル)であり、値に意味はない。三番めのカラムは同時に購入したアイテムの数である。つまり一番上の行は、『「1」という人が、「10」という時系列に「CとD」を二つ同時に購入した』ということを意味する。
参考 : https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Sequence_Mining/SPADE
RとPythonコード
- PythonからRを呼び出すプログラム
import pandas as pd
import pypeR
def runningR(fileName):
#Rのインスタンスを作る
r = pyper.R(use_pandas='True')
r.assign("fileName", fileName) #fileNameとし引数のfileNameを渡す
r("source(file='Pattern.R')") #実際のRファイルを実行する
df = pd.DataFrame(r.get("results")) #結果をDataFrameに格納
print(df)
if __name__ == '__main__':
runningR("input.txt")
- CSPADEの実行プログラム(R)
#Pattern.R
#ライブラリの宣言
library(Matrix)
library(arules)
library(arulesSequences)
x <- read_baskets(con = system.file("misc", fileName, package = "arulesSequences"), info = c("sequenceID","eventID","SIZE"))
as(x, "data.frame")
s1 <- cspade(x, parameter = list(support = 0.5), control = list(verbose = TRUE))
summary(s1)
results = as(s1, "data.frame")
参考文献
SPADE : https://link.springer.com/content/pdf/10.1023/A:1007652502315.pdf