関西SASユーザー会

関西SASユーザー会
-SASの便利な使い方についてSAS Institute Japan Ltd.
Solution Planning Center
東 一成(Kazunari Azuma)
Kazunari.Azuma@
sas.com
.com
Kazunari.Azuma@sas
今回のユーザー会の内容
w 履歴データを用いた顧客ランクの算出
w 顧客の簡単な履歴データを用いて、一般的に流通業など
で使われている簡単な分析の例を紹介
– 「デシル分析」
– 「RFM分析」
RFM分析」
w 上記の分析をSAS
でどのように行うのかを紹介する。
。
上記の分析をSASでどのように行うのかを紹介する
2
1
デシル分析(decile)
decile)とは?
w 顧客毎に売上金額などを集計し、10
に分ける
顧客毎に売上金額などを集計し、10に分ける
手法。DECILE
とは英語で10
10分位の意味。
分位の意味。
手法。DECILEとは英語で
w これにより顧客に10
段階のランク付けを行い、
これにより顧客に10段階のランク付けを行い、
ランク別に売上が多い製品を求めたり、本当に
「2:8」の法則が当てはまっているかを確認した
2:8」の法則が当てはまっているかを確認した
りする事が可能。
w 各ランクの顧客の貢献度などを測る。金額だけ
の単純な手法であるが、簡単に算出が可能。
3
今回のサンプルデータ
w 今回は先のようなデータ
を利用した。
–
–
–
–
顧客番号(CUST_ID
)
顧客番号(CUST_ID)
買上日(
買上日(DATE)
商品区分(
商品区分(SYOUHIN)
金額(
金額(PRICE)
w 上記の変数で50
万件の
上記の変数で50万件の
データを利用してデシル
分析を行っていく。
4
2
デシル分析:ステップ1
データをサマリーする
w 顧客ごとの売上ランクを出すために顧客ごと売上高SUMMARY
プロシ
顧客ごとの売上ランクを出すために顧客ごと売上高SUMMARYプロシ
ジャで算出する。
DAT1
/*顧客ごとに売上金額をサマライズする
*/
/*顧客ごとに売上金額をサマライズする*/
PROC SUMMARY DATA=
DATA=k̲wg.
k̲wg.tran NWAY;
NWAY;
BY cust̲id;
cust̲id;
VAR price;
OUTPUT OUT=dat1(DROP=̲TYPE̲
OUT=dat1(DROP=̲TYPE̲ ̲FREQ̲) SUM=price;
SUM=price;
RUN;
RUN;
/*BY
では無くCLASS
CLASSで処理をすれば事前のソート処理が不要。
で処理をすれば事前のソート処理が不要。
/*BYでは無く
ただしCUST̲ID
はメモリ上に記憶されるので複数組み合わせる
ただしCUST̲IDはメモリ上に記憶されるので複数組み合わせる
と、メモリ不足になる場合があります。*/
と、メモリ不足になる場合があります。*/
5
デシル分析:ステップ2
顧客ごとのランクを算出する
w 顧客ランクをRANK
プロシジャで算出し、売上が高い順に9
9〜0のランクを
顧客ランクをRANKプロシジャで算出し、売上が高い順に
つける。ランクを格納する「RANK
」という変数を追加している。
つける。ランクを格納する「RANK」
DAT2
/*顧客を金額が多い順に
10分割する
分割する*/
*/
/*顧客を金額が多い順に10
PROC RANK DATA=dat1
DATA=dat1 GROUP=10
GROUP=10 OUT=dat2;
OUT=dat2;
RANKS rank;
VAR price;
RUN;
RUN;
/*「
」に置き
/*「GROUP=10」
GROUP=10」の部分を「PERCENT
の部分を「PERCENT」
なおすと、順位を百分率で表します*/
なおすと、順位を百分率で表します*/
6
3
デシル分析:ステップ3
ランク別に売上金額の統計量を算出する
/*RANK
毎の売上金額の統計量算出*/
*/
/*RANK毎の売上金額の統計量算出
PROC MEANS DATA=dat2
DATA=dat2 N SUM MEAN MAX MIN MAXDEC=
MAXDEC=2;
CLASS rank;
VAR price;
RUN;
RUN;
7
Variable
price オブザーべション数
合計
平均値
最大値
最小値
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
0
1741
18590563.10
10678.09
11591.00
350.00
1
1742
21892418.30
12567.40
13573.50
11592.00
2
1742
25542256.90
14662.60
15840.00
13574.00
3
1742
30007182.70
17225.71
18740.00
15845.00
4
1742
35528189.50
20395.06
22253.50
18746.00
5
1742
42638689.50
24476.86
26948.00
22255.10
6
1742
52335108.80
30043.12
33620.10
26950.00
7
1742
67711786.90
38870.14
45104.00
33639.00
8
1742
97642285.30
56051.83
71670.00
45110.00
9
1742
295833554.60
169824.08
6278049.30
71676.00
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
デシル分析:ステップ4-1
『2:8』
:8』の法則をグラフで確認する
w データ加工
/*RANK
別で売上金額を集計し、高い順にソートする*/
*/
/*RANK別で売上金額を集計し、高い順にソートする
PROC SUMMARY DATA=dat2
DATA=dat2 NWAY;
NWAY;
CLASS rank;
ランク別の売上集計と売上累計
VAR price;
OUTPUT OUT=dat3(DROP=̲FREQ̲
OUT=dat3(DROP=̲FREQ̲ ̲TYPE̲)
SUM=price;
SUM=price;
RUN;
RUN;
PROC SORT DATA=dat3;
DATA=dat3;
BY DESCENDING price;
RUN;
RUN;QUIT;
QUIT;
/*ランク別の売上金額を累計する
*/
/*ランク別の売上金額を累計する*/
DATA dat4;
SET dat3;
RETAIN;
RETAIN;
id=̲n̲;
amount+price;
FORMAT amount 12.0;
12.0;
8
RUN;
RUN;
4
デシル分析:ステップ4-2
『2:8』
:8』の法則をグラフで確認する
w SAS/GRAPHの
SAS/GRAPHのGCHARTプロシジャでグラフ作成
GCHARTプロシジャでグラフ作成
/*「
/*「2:8の法則」をグラフで確認
2:8の法則」をグラフで確認 */
OPTIONS DEVICE=GIF;
SYMBOL I=JOIN V=DOT;
PROC GPLOT DATA=dat4;
DATA=dat4;
PLOT amount * id/
VZERO /*軸を
0からスタートさせるために必要*/
/*軸を0
からスタートさせるために必要*/
HREF=
HREF=1 to 10 by 1
VREF=
VREF=0 to 700000000 by 70000000;
70000000;
RUN;
RUN;
QUIT;
QUIT;
今回のデモデータでは「2:8の法則」ではな
く、「5:8の法則」だった。
9
デシル分析:ステップ4-3
『2:8』
:8』の法則をグラフで確認する
w SAS/QCの
SAS/QCのPARETOプロシジャでグラフ作成
PARETOプロシジャでグラフ作成
PROC PARETO DATA=dat3;
VBAR rank /
ANCHOR=TC
WEIGHT=price
SCALE = PERCENT
CBARS =BLUE;
RUN;
RUN;
製造業などでよく利用されているが、パレート図を
用いると、データ加工処理もそれほど必要なく、
ランク別の売上に対する貢献度をグラフで表示す
る事が出来る。
10
5
デシル分析:ステップ5-1
ランクと商品の関係を見てみる
w ランクデータを明細トランザクションデータにマージ
/*データのマージ
*/
/*データのマージ*/
ランクデータ
「dat2」
DATA dat5(KEEP=cust̲id
dat5(KEEP=cust̲id syouhin price rank );
MERGE k̲wg.
k̲wg.tran(IN=in1)
tran(IN=in1) dat2(IN=in2);
BY cust̲id;
cust̲id;
IF in1=in2 THEN OUTPUT;
OUTPUT;
RUN;
RUN;
明細データ
「k̲wg.tran」
11
デシル分析:ステップ5-2
ランクと商品の関係を見てみる
w データをランク別・商品別に集計
PROC SUMMARY DATA=dat5
DATA=dat5 NWAY;
NWAY;
CLASS rank syouhin;
syouhin;
VAR price;
OUTPUT OUT=dat6(DROP=̲FREQ̲
OUT=dat6(DROP=̲FREQ̲ ̲TYPE̲) SUM=price
SUM=price N=freq;
ATTRIB freq LABEL=
LABEL="件数"
件数" ;
RUN;
RUN;QUIT;
QUIT;
12
6
デシル分析:ステップ5-3
ランクと商品の関係を見てみる
w ランクと商品の関係をグラフで確認する。
度数の累積
OPTIONS DEVICE=GIF;
/*パターン
1*/
/*パターン1*/
PROC GCHART DATA=dat5
DATA=dat5 ;
VBAR rank / SUBGROUP=
SUBGROUP=syouhin DISCRETE;
DISCRETE;
RUN;
RUN;
/*パターン
2*/
/*パターン2*/
AXIS1 VALUE=none
VALUE=none LABEL=none;
LABEL=none;
度数の%
PROC GCHART DATA=dat5;
DATA=dat5;
VBAR rank / TYPE=pct
TYPE=pct SUBGROUP=
SUBGROUP=syouhin G100
GROUP=rank
GROUP=rank NOZERO MAXIS=axis1;
MAXIS=axis1;
RUN;
RUN;QUIT;
QUIT;
13
デシル分析:ステップ5-4
ランクと商品の関係を見てみる
w ランクと商品の関係を度数集計で見てみる
ランク9
比較!!
ランク0
/*ランクと商品で
度数集計
集計*/
*/
/*ランクと商品で度数
PROC SORT DATA=dat6;
DATA=dat6;
BY rank DESCENDING price;
RUN;
RUN;
PROC FREQ DATA=dat6
DATA=dat6 order=freq;
order=freq;
BY rank;
WEIGHT freq;
TABLES syouhin;
syouhin;
RUN;
RUN;
14
7
デシル分析:ステップ5-5
ランクと商品の関係を見てみる
w ランク別に売上金額に貢献している商品をパレート図で見つける。
PROC PARETO DATA=dat6;
BY ranK;
ranK;
ランク9
VBAR syouhin /
ANCHOR=TC
WEIGHT=price
SCALE = PERCENT
CBARS =BLUE;
RUN;
RUN;
ランク0
15
デシル分析:まとめ
w 今回は、SAS
データステップやSAS
SASプロシジャを利用して顧
プロシジャを利用して顧
今回は、SASデータステップや
客を10
分割し、各グループがどの程度売上に貢献している
客を10分割し、各グループがどの程度売上に貢献している
かを分かるようにした。
w この場合、トップの2
この場合、トップの2〜3グループに対する依存度が高いが、
このような『2:8
の法則』はパレート原理とも呼ばれている。
このような『2:8の法則』はパレート原理とも呼ばれている。
w 顧客の属性データ等を利用すれば、各グループの特徴を知
ることが可能になる。
w 今回は品質管理のソフトウェアであるSAS/QC
に含まれる
今回は品質管理のソフトウェアであるSAS/QCに含まれる
PARETOプロシジャを利用したが、製造業における品質管
PARETOプロシジャを利用したが、製造業における品質管
理だけではなく、営業活動やマーケティング活動の管理を行
う事もできる。
16
8
RFM分析とは?
w RFMによる顧客ランキング
RFMによる顧客ランキング
– 流通業やサービス業などで良く利用される分析手法。
– 優良顧客を定義するために履歴データの以下の指標を利用する
w R(Recency
R(Recency))・・・最終利用日
・・・最終利用日
w F(Frequency)・・・
頻度
F(Frequency)・・・頻度
w M(Monetary)・・・
利用金額
M(Monetary)・・・利用金額
– 上記の指標に対して、各企業で定めた指数を掛けて、ポイントを算出する
w EX.2週間前に購入は
5ポイント、10
回〜20
20回は
回は10
10ポイント
ポイント
EX.2週間前に購入は5
ポイント、10回〜
、購入金額が10
万円を超えると10
10ポイント。
ポイント。5
5ポイント+10
、購入金額が10万円を超えると
ポイント+10
ポイント+10
ポイント=25
25ポイント
ポイント
ポイント+10ポイント=
– このようなRFM
を使う事により、金額だけではなく他の指標を用いて、顧客
このようなRFMを使う事により、金額だけではなく他の指標を用いて、顧客
の分類を行える点でデシル分析より柔軟でもある。
17
RFM分析を工夫する
w RFM分析は一般に広く知られている
RFM分析は一般に広く知られている
–
–
–
Recency
Frequency
Monetary
直近の購買年月日
購買回数
購買金額
2000/9/1
20回
20回
10万円
10万円
分析者が重み付け!!
w 優良顧客は誰?
w 顧客ランク= αRm/R
*βF/Fm
F/Fm*γ
*γM/Mm
M/Mm
Rm/R*β
あるターゲットの日から「何日前」にと考える
18
9
今回のサンプルデータ
w 今回は先のようなデータ
を利用した。
–
–
–
–
顧客番号(CUST_ID
)
顧客番号(CUST_ID)
買上日(
買上日(DATE)
商品区分(
商品区分(SYOUHIN)
金額(
金額(PRICE)
w 上記の変数で50
万件の
上記の変数で50万件の
データを利用してRFM
分
データを利用してRFM分
析を行っていく。
19
RFM分析:ステップ1
「R」の算出
w 履歴データからR
履歴データからR値を算出する。日付の列で最も大きい値の
ものを出力するようにする。
/* R値算出 */
PROC SUMMARY DATA=
DATA=k̲wg.
k̲wg.tran;
tran;
VAR date ;
BY cust̲id ;
OUTPUT OUT=r(KEEP=
cust̲id r) MAX=r;
OUT=r(KEEP=cust̲id
MAX=r;
RUN;
RUN;
20
10
RFM分析:ステップ2
「F」の算出
w 履歴データから、「F
履歴データから、「F」値を算出する。今回は出現頻度をそのまま利用し
ているが、本来であれば同一日であれば何回買い物をしても1
ているが、本来であれば同一日であれば何回買い物をしても1回とみな
した方が良いと思われる。その場合はSORT
プロシジャ等を利用して重
した方が良いと思われる。その場合はSORTプロシジャ等を利用して重
複行を削除する必要などがある。
/* F値算出 */
PROC SUMMARY DATA=
DATA=k̲wg.
k̲wg.tran;
tran;
BY cust̲id ;
OUTPUT OUT=f(KEEP=
cust̲id ̲freq̲
OUT=f(KEEP=cust̲id
RENAME=(̲freq̲=f̲value
));
RENAME=(̲freq̲=f̲value));
RUN;
RUN;
21
RFM分析:ステップ3
「M」の算出
w 履歴データから「M
履歴データから「M」値を算出する。顧客別に利用金額を集計している。本
来であれば「一定期間内」「6
来であれば「一定期間内」「6ヶ月以内」等の制限がつくと思われる。
/* M値算出 */
PROC SUMMARY DATA=
DATA=k̲wg.
k̲wg.tran;
tran;
VAR price ;
BY cust̲id ;
OUTPUT OUT=m(KEEP=
cust̲id m̲value)
OUT=m(KEEP=cust̲id
m̲value)
SUM=
SUM=m̲value ;
RUN;
RUN;
22
11
RFM分析:ステップ4
「R」「F
」「F」「M
」「M」の値の統合
「R」
/* RFM値算出
RFM値算出 */
DATA rfm ;
MERGE r f m ;
/* 全変数のラベル削除 */
ATTRIB ̲all̲ LABEL=
LABEL="" ;
「F」
BY cust̲id;
cust̲id;
r̲value=INTCK(
'DAY',r,
,r,'28FEB00'd
'28FEB00'd);
);
r̲value=INTCK('DAY'
DROP r;
RUN;
RUN;
「M」
w 「R」の値には最終購入日が入っているが、「XX
から何日
の値には最終購入日が入っているが、「XXから何日
前?」という基準で見るために、INTCK
関数を使い、ある
前?」という基準で見るために、INTCK関数を使い、ある
日付から何日前かを算出している。この場合は「F
日付から何日前かを算出している。この場合は「F」「M
」「M」と
違い、値が小さい方が価値があることに注意が必要。
23
RFM分析:ステップ5
「R」「F
」「F」「M
」「M」の中央値を算出しマクロ変数に格納
w 中央値を算出するのにUNIVARIATE
プロシジャを利用
中央値を算出するのにUNIVARIATEプロシジャを利用
している。V8
からはMEANS
MEANSプロシジャでも算出可能。
プロシジャでも算出可能。
している。V8からは
/* R値の中央値算出 */
/* F値の中央値算出 */
/* M値の中央値算出 */
PROC UNIVARIATE DATA=
DATA=rfm NOPRINT;
NOPRINT;
VAR r̲value f̲value m̲value ;
OUTPUT OUT=
OUT=tmp MEDIAN=
MEDIAN=m̲r m̲f m̲m;
m̲m;
/* R値中央値マクロに格納 */
/* F値中央値マクロに格納 */
/* M値中央値マクロに格納 */
RUN;
RUN;
DATA ̲NULL̲ ;
QUIT;
QUIT;
SET tmp ;
CALL SYMPUT('m̲r'
,put(m̲r
m̲r,
,best.))
SYMPUT('m̲r',put(
best.)) ;
CALL SYMPUT('m̲f'
,put(m̲f
m̲f,
,best.))
SYMPUT('m̲f',put(
best.)) ;
CALL SYMPUT('m̲m'
,put(m̲m
m̲m,
,best.))
SYMPUT('m̲m',put(
best.)) ;
RUN;
RUN;
w
24
マクロ変数に中央値に格納する事により
、データセットとマージする必要も無く、こ
の後の処理ですぐに活用できる。
12
RFM分析:ステップ6
「R」「F
」「F」「M
」「M」の値より顧客ランクを算出
w 最終的に算出する顧客ランクは大きい値の方が良いので、「R
最終的に算出する顧客ランクは大きい値の方が良いので、「R」の使い
方に注意が必要。また重視したい指標に重みを加えても良い。
/* R値、F
ポイントのデータセット完成 */
値、F値、M
値、M値、RFM
値、RFMポイントのデータセット完成
DATA rfm̲point ;
SET rfm ;
rfm̲value=(&
m̲r/
/r̲value * f̲value/&
m̲f * m̲value/&
m̲m)**
)**(
(1/3) ;
rfm̲value=(&m̲r
f̲value/&m̲f
m̲value/&m̲m
LABEL
cust̲id=
cust̲id=‘顧客番号’
顧客番号’ r̲value=
r̲value='R値
'R値'
f̲value=
f̲value=‘F値’
m̲value=
m̲value='M値
'M値'
rfm̲value=
';
rfm̲value='RFMポイント
'RFMポイント'
FORMAT rfm̲value 8.2;
8.2;
RUN ;
25
RFM分析:ステップ7
「R」「F
」「F」「M
」「M」の値に主観的な指標をつける
w SASのフォーマットの機能を利用して、
「F」と「M
SASのフォーマットの機能を利用して、「
と「M」に
対して、ランク付けを行う。
/*良く行われるランク付け
*/
/*良く行われるランク付け*/
PROC FORMAT;
FORMAT;
VALUE f̲rank LOW‑
;
LOW‑10=
10='F̲RANK1' 11‑
11‑18=
18='F̲RANK2' 19‑
19‑30=
30='F̲RANK3' 31‑
31‑60=
60='F̲RANK4' 61‑
61‑HIGH='F̲RANK5'
HIGH='F̲RANK5';
VALUE m̲rank LOW‑
LOW‑14487=
14487='M̲RANK1' 14488‑
14488‑21637=
21637='M̲RANK2' 21638‑
21638‑36260=
36260='M̲RANK3' 36261‑
36261‑68905=
68905='M̲RANK4'
68905‑
;
68905‑HIGH='M̲RANK5'
HIGH='M̲RANK5';
RUN;
RUN;
QUIT;
QUIT;
ポイントの切り口は、下記のような分布のグラフを書いて決定していく事も考えられる
26
13
RFM分析:ステップ8-1
フォーマットを利用して「F
フォーマットを利用して「F」「M
」「M」のランクの分布を見る
/*ランク付けのクロス集計表
*/
/*ランク付けのクロス集計表*/
PROC FREQ DATA=
DATA=rfm̲point;
rfm̲point;
FORMAT f̲value f̲rank.
f̲rank. m̲value m̲rank.
m̲rank.;
TABLES f̲value * m̲value;
m̲value;
RUN;
RUN;quit;
quit;
w 当然のことながら、「f_rank5
」
当然のことながら、「f_rank5」
「m_rank5」
m_rank5」の組み合わせの
人が最も良い顧客と想定でき
る。
27
RFM分析:ステップ8-2
フォーマットを利用して「F
フォーマットを利用して「F」「M
」「M」のランクの分布を見る
OPTIONS DEVICE=GIF;
PROC gchart DATA=
DATA=rfm̲point;
rfm̲point;
where m̲value ne .;
BLOCK f̲value/
f̲value/DISCRETE
GROUP=
GROUP=m̲value
COUTLINE=BLACK;
COUTLINE=BLACK;
FORMAT f̲value f̲rank.
f̲rank. m̲value m̲rank.
m̲rank.;
RUN;
RUN;
QUIT;
QUIT;
w 「F」「
M」の各ランクをグラフで
「F」「M」の各ランクをグラフで
表現している。他にも「R」
表現している。他にも「R」や年
齢などの属性と組み合わせる
ことにより、色々な事が分かっ
てくると思われる。
28
14
RFM分析まとめ
w RFM分析自体は過去から使われてきているので、
RFM分析自体は過去から使われてきているので、
手法自体は最新のものではない。
w ただ、今回のサンプルデータのように「顧客ID
」「日
日
ただ、今回のサンプルデータのように「顧客ID」「
付」「商品」「値段」程度の情報からでも、何とかし
て顧客をセグメントするための値として活用する事
が出来る。
w 履歴データとは今回のようなPOS
データだけでは
履歴データとは今回のようなPOSデータだけでは
なく、Web
ログ関連のようなデータでも、SAS
SASデー
デー
なく、Webログ関連のようなデータでも、
タセットに取り込めれば活用が可能。
29
15
本日の資料・サンプルプログラム・サンプルデータ(小さく縮小してあります)は
以下のURLから取得できます。(曜日の昼くらいから閲覧可能)
http://www.sas
.com/japan
japan/
/usergroups/
http://www.sas.com/
usergroups/wg/archive/index.html
wg/archive/index.html
31
16