Python
R
パターンマイニング

PythonからRのCSPADEを使ってみる

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人の人に時系列に沿って次のように購入されたケースを考える。

  1. A → B → D → H → I → D
  2. B → H → A
  3. C → B → H
  4. 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