アソシエーション分析(再び)-1

アソシエーション分析(再び)-1

>トレーニング用データはこちら

エクセルでアソシエーション分析は困難

アソシエーションの組み合わせ数

商品が「A、B、C」3種類で考えてみます。
{A}=>{B}、{B}=>{A}
{A}=>{C}、{C}=>{A}
{B}=>{C}、{C}=>{B}  これら6通り

{A・B}=>{C}
{A・C}=>{B}
{B・C}=>{A} これらの組み合わせもある

単純に1対1の関係で、さらに、裏表なし(連勝複式)のとき
3×2÷2=3通り

エクセルで計算
バスケット番号商品A商品B商品C
001111
00211
00311

1対1の関係でアソシエーション分析するとき

①行列の範囲を指定して「COUNTA」関数でバスケット数をカウントします。
・すべてのバスケット数
・商品{A}が入っているバスケット数
・商品{B}が入っているバスケット数
・商品{C}が入っているバスケット数
・商品{A・B}が入っているバスケット数
・商品{A・C}が入っているバスケット数
・商品{B・C}が入っているバスケット数

②商品組み合わせの列、または行をつくります。
{A・B}の組み合わせ
{A・C}の組み合わせ
{B・C}の組み合わせ

③それぞれの組み合わせのセルへカウントしたバスケット数をもとに、四則演算で次の結果を算出します。
・support
・confidence
・lift

④結果の値ごとに並び替えて確認します。

組み合わせsupportconfidencelift
{A}=>{B}
{A}=>{C}
{B}=>{C}
空欄には四則演算による値が入ります。

 このような手順で算出できるのだろうと思います。しかし、わずか3種類の商品であっても、さっそくチャレンジしようとは思いません・・・

 コンビニの一般的なアイテム数2000を連複で計算したとすると
 2,000×1,999÷2=1,999,000通り
 およそ200万の組み合わせになります。

データを整形します

トレーニング用データ

>トレーニング用データはこちら

バスケット,グループコード,グループ名称,sales,unit
20181101_00012733,1,青物,98,1
20181101_00012736,1,青物,98,1
20181101_00012742,1,青物,98,1
20181101_00012743,1,青物,98,1
20181101_00012747,1,青物,221,1
20181101_00012748,1,青物,158,1
20181101_00012749,1,青物,98,1
20181101_00012750,1,青物,98,1
20181101_00012751,1,青物,98,1
20181101_00012752,1,青物,98,1

データ形式:列指向形式
行数:93,760(列名を含む)
列数:5 データは商品ではなくグループ(サブカテゴリに相当)です。

列名内容形式データ数
バスケットバスケット番号文字列20,653
グループコードグループコード文字列20
グループ名称グループ名称文字列20
sales売上金額数値
unit売上数量数値
連単で計算すると
20×19=380通りの組み合わせになります。
列指向形式をクロス集計形式へ変換

<テキストファイルをエクセルで開く>

5列になります。

・テキスト形式ファイルをエクセルで開きます。
・区切り文字は「コンマ」です。

<パワークエリディタ>

セルA1へカーソルを合わせます。

・「データ」タブ
・「テーブルから」

<列を削除>

列を右クリックからでも削除できます。

・「グループ」列、「sales」列を削除します。

<列のピボット>

行から列へ、いわゆる逆ピボットします。

・「変換」タブ
・「グループ」の列を選択します。
・「列のピボット」
・窓が開き「列値」で「unit」を選択します。
・「OK」

バスケットの列+グループ名称の列(20列)になります。

・「ファイル」タブ
・「閉じて読み込む」

<シートをコピー>

もとのBookは名前を付けて保存します。

・シートを新しいBookへコピーします。

<CSVで保存>

Rへ読み込むデータはCSVかテキストが最適です。CSV形式で保存できるのは1シートだけです。

 データをコピーした新しいブックを名前を付けて保存します。
・ファイルの種類は「CSV(コンマ区切り)」です。

ファイルパスをつくります
窓へカーソルを合わせてクリックします。

 CSVファイルを保存したディレクトリをコピーしてテキストファイル(メモ帳など)へペーストします。

C:¥data

¥を/(スラッシュ)へ変換します
C:/data
これが「ディレクトリ名」です

「ディレクトリ名」の末尾へ/(スラッシュ)を追加しファイル名(拡張子も含めて)を記載します
C:/data/association.csv
これがファイルパスです

 7行目が「ファイルパス」です。

Rで計算する

パッケージ「arules」がないとき

Rへパッケージをインストールする方法
こちらの手順を参照してください。

Rコマンド

<データファイルを読み込み>

d<- read.table("ファイルパス",sep=",",fileEncoding="cp932",header=TRUE, na.strings="0", dec=".", strip.white=TRUE)

・コピーしてテキストエディタ等へペーストします。
・「ファイルパス」この部分を先に作成したファイルパス(例 C:/data/association.csv)へ書き換えます。

「sep=」以下のコマンドは文字化け等を防止するための呪文のようなものです。そのままコピペしてください。

・Rへペーストします
・エンターキーを押します

head(d)

・Rへペーストしエンターキーを押します。
 これは便利なコマンドです。覚えておくことをオススメします。

空欄のセルは「NA」になります。

 画像のように表示されればOKです。

<NAを変換>

d[is.na(d)]<-0

・Rへペーストしエンターキーを押します。

NAをゼロへ変換するコマンドです。

head(d)
 このコマンドで、データを確認します。
 画像のようにNAが0(ゼロ)へ変換されていればOKです。

<バスケット列を削除>

d1<-d[,-1]

・Rへペーストしエンターキーを押します。

「バスケット」列を削除したデータはd1です。

・head(d1)・・・カッコ内はdではなくてd1です!
 このコマンドで列を削除した後のデータを確認します。
 画像のように左1列目の「バスケット」列が削除されていればOKです。

<トランザクション形式へ変換>

library(arules)

・パッケージ「larules」を呼び出します。

d1<- as(as.matrix(d1),"transactions")

・Rへペーストしエンターキーを押します。

マトリクス形式(クロス集計形式)をトランザクション形式へ変換します。

 クロス集計形式のd1をトランザクション形式へ変換しました。
 本来は「0」か「1」の値のクロス集計表を使うべきところを、その他の値も入っているクロス集計表だったので警告メッセージが表示されます。しかし、問題はありません。

<アソシエーション分析>

d2<- apriori(d1,p=list(support=0,confidence=0,minlen=2,maxlen=2,ext=TRUE))

・Rへペーストしエンターキーを押します。

support=α,confidence=β,minlen=γ,maxlen=Δ
α、β、γ、Δはそれぞれ変数です。変更することができます。

 画像のように380通りのルールが算出できていればOKです。
20種類のグループなので裏表あり(連勝単式)
20×19=380通り

<結果の一部を表示>

d2_1<-inspect(head(sort(d2, by = "support"),n=10))

・Rへペーストしエンターキーを押します。

support降順で10個のルールを表示してみます。

 画像のように10通りの結果が表示されればOKです。

<結果を出力する>

write(d2,row.names=F,col.names=T,fileEncoding = "cp932",sep=',','ディレクトリ名/ファイル名.txt')

・コピーしてテキストエディタ等へペーストします。
・「ディレクトリ名」この部分を出力ファイルを保存するディレクトリ名(例 C:/data)へ書き換えます。
・「ファイル名」この部分を出力ファイル名(例 association_rules.txt)へ書き換えます。拡張子は.txtにしてください。

d2を出力します。
経験的に文字化けを防止するのには「fileEncoding = “cp932″」がよいような感じです。
指定したディレクトリを開きます。

 指定したディレクトリへファイルができていればOKです。

"rules","support","confidence","lhs.support","lift","count"
"{アイスクリーム} => {お米}",0.000871544085604997,0.036734693877551,0.0237253667748027,1.26236544534619,18
"{お米} => {アイスクリーム}",0.000871544085604997,0.0299500831946755,0.0290998886360335,1.26236544534619,18
"{アイスクリーム} => {お茶}",0.000629448506270275,0.026530612244898,0.0237253667748027,0.928706329989623,13
"{お茶} => {アイスクリーム}",0.000629448506270275,0.0220338983050847,0.0285672783614971,0.928706329989623,13
"{アイスクリーム} => {冷食}",0.00275988960441582,0.116326530612245,0.0237253667748027,2.59448362498347,57
"{冷食} => {アイスクリーム}",0.00275988960441582,0.0615550755939525,0.0448361012927904,2.59448362498347,57
"{アイスクリーム} => {寿司}",0.00121047789667361,0.0510204081632653,0.0237253667748027,0.775367542160352,25
"{寿司} => {アイスクリーム}",0.00121047789667361,0.0183958793230316,0.0658015784631773,0.775367542160352,25
"{アイスクリーム} => {鶏加工品}",0.00227569844574638,0.0959183673469388,0.0237253667748027,1.11167342357819,47
"{鶏加工品} => {アイスクリーム}",0.00227569844574638,0.026374859708193,0.0862828644748947,1.11167342357819,47

 テキストファイルを開くとこんな感じになっている思います。

まとめ

<手順1>
 列指向形式をクロス集計形式へ変換します。
 クロス集計形式ファイルをCSVで保存します。

<手順2>
 Rへ以下のコマンドをコピーして「ファイルパス」「ディレクトリ」「ファイル名」を自身のパソコンのものへ書き換えます。

#データ読込
d<- read.table("ファイルパス",sep=",",fileEncoding="cp932",header=TRUE, na.strings="0", dec=".", strip.white=TRUE)

#NAを0に変換
d[is.na(d)]<-0

#バスケット番号の列は使用しないので削除
d1<-d[,-1]

#arulesを呼び出し
library(arules)

#transactionsへ変換
d1<- as(as.matrix(d1),"transactions")

#アソシエーション計算
d2<- apriori(d1,p=list(support=0,confidence=0,minlen=2,maxlen=2,ext=TRUE))

#結果を出力
write(d2,row.names=F,col.names=T,fileEncoding = "cp932",sep=',','ディレクトリ/ファイル名.txt')

 コピーしてRへペーストして完成です。

 エクセルで頑張るよりも最適なアプリを使用する方がスマートなのだろうと思います。