アソシエーション分析(再び)-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 |
001 | 1 | 1 | 1 |
002 | 1 | 1 | |
003 | 1 | 1 |
1対1の関係でアソシエーション分析するとき
①行列の範囲を指定して「COUNTA」関数でバスケット数をカウントします。
・すべてのバスケット数
・商品{A}が入っているバスケット数
・商品{B}が入っているバスケット数
・商品{C}が入っているバスケット数
・商品{A・B}が入っているバスケット数
・商品{A・C}が入っているバスケット数
・商品{B・C}が入っているバスケット数
②商品組み合わせの列、または行をつくります。
{A・B}の組み合わせ
{A・C}の組み合わせ
{B・C}の組み合わせ
③それぞれの組み合わせのセルへカウントしたバスケット数をもとに、四則演算で次の結果を算出します。
・support
・confidence
・lift
④結果の値ごとに並び替えて確認します。
組み合わせ | support | confidence | lift |
{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通りの組み合わせになります。
列指向形式をクロス集計形式へ変換
<テキストファイルをエクセルで開く>
・テキスト形式ファイルをエクセルで開きます。
・区切り文字は「コンマ」です。
<パワークエリディタ>
・「データ」タブ
・「テーブルから」
<列を削除>
・「グループ」列、「sales」列を削除します。
<列のピボット>
・「変換」タブ
・「グループ」の列を選択します。
・「列のピボット」
・窓が開き「列値」で「unit」を選択します。
・「OK」
・「ファイル」タブ
・「閉じて読み込む」
<シートをコピー>
・シートを新しいBookへコピーします。
<CSVで保存>
データをコピーした新しいブックを名前を付けて保存します。
・ファイルの種類は「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)へ書き換えます。
・Rへペーストします
・エンターキーを押します
head(d)
・Rへペーストしエンターキーを押します。
これは便利なコマンドです。覚えておくことをオススメします。
画像のように表示されればOKです。
<NAを変換>
d[is.na(d)]<-0
・Rへペーストしエンターキーを押します。
head(d)
このコマンドで、データを確認します。
画像のようにNAが0(ゼロ)へ変換されていればOKです。
<バスケット列を削除>
d1<-d[,-1]
・Rへペーストしエンターキーを押します。
・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へペーストしエンターキーを押します。
画像のように380通りのルールが算出できていればOKです。
20種類のグループなので裏表あり(連勝単式)
20×19=380通り
<結果の一部を表示>
d2_1<-inspect(head(sort(d2, by = "support"),n=10))
・Rへペーストしエンターキーを押します。
画像のように10通りの結果が表示されればOKです。
<結果を出力する>
write(d2,row.names=F,col.names=T,fileEncoding = "cp932",sep=',','ディレクトリ名/ファイル名.txt')
・コピーしてテキストエディタ等へペーストします。
・「ディレクトリ名」この部分を出力ファイルを保存するディレクトリ名(例 C:/data)へ書き換えます。
・「ファイル名」この部分を出力ファイル名(例 association_rules.txt)へ書き換えます。拡張子は.txtにしてください。
指定したディレクトリへファイルができていれば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へペーストして完成です。
エクセルで頑張るよりも最適なアプリを使用する方がスマートなのだろうと思います。