スーパーの買い物データを、Aの商品とBの商品を一緒に購入している客数という見方で分析したところ、ビールと紙おむつを一緒に買っている人の数が多かったので、売り場の位置を隣にしたら売上が上がって良かったね!バスケット分析だね、データマイニングの始まりだねって例の話です。
なんか事実かどうかは諸説あったりするらしいので興味のある方は調べてみて下さい。
今回はそういう同時に購入されている商品ペア(アイテムセット)の単純カウントの話です。
以前、メールで質問があって、
「いつも見てます。すみませんけど、売上データから、2つの商品を同時購入している件数を出したいです。支持度とか信頼度とかの計算はいいので、とりあえず件数を降順に出せればいいです。対象商品の種類は多くて15種類程度です。当方、SQLはわからないので使わないでください。IMLもありません。商品マスタは使わずに、売上データだけで、かつデータが更新されてもコードを変える必要がないものにしてください」(割と原文ママ)
という内容でした。
ちょっとその時期、時間が無かったので、一応ぱっと思いついたものを書きました。
まずは以下の感じで、売上データを作りました。
data Q1;
call streaminit(1234);
do NAME='A','B','C','D','E','F';
do i=1 to rand('table',0.1,0.1,0.3,0.3);
ITEM=choosec(rand('table',0.2,0.2,0.2,0.2),'オムツ','ビール','パン','牛乳','りんご');
output;
end;
end;
drop i;
run;
proc sort data=Q1 nodupkey;
by NAME ITEM;
run;
NAMEは顧客IDでITEMが購入商品です。
Aさんが買ったのは、[りんご]と[ビール]と[牛乳]です。
2つで1カウントのアイテムセットで考えると
[りんご,ビール] [りんご,牛乳] [ビール,牛乳]の3つになります。
さてこの顧客データから、一番多いアイテムセットは何でしょう?という問題です。
proc transpose data=Q1 out=Q2 prefix=I_;
var ITEM;
by NAME;
run;
data Q3;
set Q2;
array AI{*} $ I_:;
do i=1 to comb(dim(AI),2);
call allcomb(i, 2, of AI(*));
if I_1^='' and I_2^='' then output;
end;
keep NAME I_1 I_2;
run;
proc freq data=Q3 noprint;
tables I_1*I_2/out=A1(drop=PERCENT);
run;
proc sort data=A1;
by descending COUNT;
run;
で結果は
となって、良し、ビールと牛乳並べて売っとくか!ってことです。(データも結果の解釈も適当なのでそこは当てにしないでください)
この方法はとりあえず転置して、購入商品の情報を横持ちにしてから
call allcombで組み合わせを作成しています。
「n個の変数からm個の変数を選択する、組み合わせのデータセットを作成する方法」
http://sas-tumesas.blogspot.jp/2014/01/m.html
を参考にしてください。
しかし、このコードの最大の欠陥はcall allcombが引数を20個までしか持てないということです。
つまり売り上げデータにおいて商品の種類が20種類以内じゃないとダメなわけです。
ちょっと実践的じゃないですね。
で後日、調べてみると色んなプログラムが既に発表されていました。
2011年のSASユーザー総会で「SASによる頻出アイテムセットの抽出」とタイトルものが発表されていて、まさしくばっちりな内容でした。
著者の谷岡田出男さんが代表取締役をされているデータマインテック株式会社のWebページに
プログラム全てが公開されていました。
http://www.dataminetech.co.jp/soft/disallow/SAS_PGM20110613.sas
自分で書く前に調べとけばよかったです。
ちなみについ最近から、1982年から2013年までの全ての論文がPDF形式で閲覧可能になりました。
SASのプレミアムラウンジにユーザー登録して、「ダウンロード」タブから「SASユーザー総会資料」を選択すれば、なんと全部無料で見放題です。
素晴らしいですね。
この方法はとりあえず転置して、購入商品の情報を横持ちにしてから
call allcombで組み合わせを作成しています。
「n個の変数からm個の変数を選択する、組み合わせのデータセットを作成する方法」
http://sas-tumesas.blogspot.jp/2014/01/m.html
を参考にしてください。
しかし、このコードの最大の欠陥はcall allcombが引数を20個までしか持てないということです。
つまり売り上げデータにおいて商品の種類が20種類以内じゃないとダメなわけです。
ちょっと実践的じゃないですね。
で後日、調べてみると色んなプログラムが既に発表されていました。
2011年のSASユーザー総会で「SASによる頻出アイテムセットの抽出」とタイトルものが発表されていて、まさしくばっちりな内容でした。
著者の谷岡田出男さんが代表取締役をされているデータマインテック株式会社のWebページに
プログラム全てが公開されていました。
http://www.dataminetech.co.jp/soft/disallow/SAS_PGM20110613.sas
自分で書く前に調べとけばよかったです。
ちなみについ最近から、1982年から2013年までの全ての論文がPDF形式で閲覧可能になりました。
SASのプレミアムラウンジにユーザー登録して、「ダウンロード」タブから「SASユーザー総会資料」を選択すれば、なんと全部無料で見放題です。
素晴らしいですね。
0 件のコメント:
コメントを投稿