関西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でどのように行うのかを紹介する

21

デシル分析(decile)decile)とは？
w 顧客毎に売上金額などを集計し、10に分ける
顧客毎に売上金額などを集計し、10に分ける手法。DECILEとは英語で1010分位の意味。
分位の意味。
手法。DECILEとは英語でw これにより顧客に10段階のランク付けを行い、これにより顧客に10段階のランク付けを行い、ランク別に売上が多い製品を求めたり、本当に「2:8」の法則が当てはまっているかを確認した
2:8」の法則が当てはまっているかを確認したりする事が可能。
w 各ランクの顧客の貢献度などを測る。金額だけの単純な手法であるが、簡単に算出が可能。
3

今回のサンプルデータ
w 今回は先のようなデータを利用した。
– 顧客番号（CUST_ID）
顧客番号（CUST_ID）– 買上日(買上日(DATE)– 商品区分(商品区分(SYOUHIN)– 金額(金額(PRICE)w 上記の変数で50万件の上記の変数で50万件のデータを利用してデシル分析を行っていく。
42

デシル分析：ステップ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

デシル分析：ステップ２
顧客ごとのランクを算出する
w 顧客ランクをRANK
プロシジャで算出し、売上が高い順に99〜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」
なおすと、順位を百分率で表します*/
なおすと、順位を百分率で表します*/63デシル分析：ステップ３
ランク別に売上金額の統計量を算出する/*RANK
毎の売上金額の統計量算出*/*//*RANK毎の売上金額の統計量算出
PROC MEANS DATA=dat2
DATA=dat2 N SUM MEAN MAX MIN MAXDEC=MAXDEC=2;
CLASS rank;
VAR price;
RUN;
RUN;

7Variable
price オブザーべション数
合計平均値最大値
最小値‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
0
1741
18590563.10
10678.09
11591.00
350.001
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
41742
35528189.50
20395.06
22253.50
18746.00
51742
42638689.50
24476.86
26948.00
22255.106174252335108.80
30043.12
33620.1026950.00
7174267711786.90
38870.14
45104.00
33639.00
81742
97642285.30
56051.83
71670.00
45110.00
91742295833554.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;

8RUN;
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 = PERCENTCBARS =BLUE;
RUN;
RUN;
製造業などでよく利用されているが、パレート図を用いると、データ加工処理もそれほど必要なく、ランク別の売上に対する貢献度をグラフで表示する事が出来る。

105デシル分析：ステップ5-1
ランクと商品の関係を見てみる
w ランクデータを明細トランザクションデータにマージ/*データのマージ*//*データのマージ*/

ランクデータ「dat2」DATA dat5(KEEP=cust̲iddat5(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;

126デシル分析：ステップ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 G100GROUP=rank
GROUP=rank NOZERO MAXIS=axis1;
MAXIS=axis1;
RUN;
RUN;QUIT;
QUIT;

13

デシル分析：ステップ5-4
ランクと商品の関係を見てみる
w ランクと商品の関係を度数集計で見てみる
ランク９

比較！！

ランク０

/*ランクと商品で度数集計
集計*/*//*ランクと商品で度数
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;

147

デシル分析：ステップ5-5
ランクと商品の関係を見てみる
w ランク別に売上金額に貢献している商品をパレート図で見つける。

PROC PARETO DATA=dat6;
BY ranK;
ranK;

ランク9

VBAR syouhin /ANCHOR=TC
WEIGHT=price
SCALE = PERCENTCBARS =BLUE;
RUN;
RUN;
ランク015

デシル分析：まとめ
w 今回は、SASデータステップやSASSASプロシジャを利用して顧プロシジャを利用して顧
今回は、SASデータステップや客を10分割し、各グループがどの程度売上に貢献している客を10分割し、各グループがどの程度売上に貢献しているかを分かるようにした。
w この場合、トップの2
この場合、トップの2〜3グループに対する依存度が高いが、このような『2:8の法則』はパレート原理とも呼ばれている。
このような『2:8の法則』はパレート原理とも呼ばれている。
w 顧客の属性データ等を利用すれば、各グループの特徴を知ることが可能になる。
w 今回は品質管理のソフトウェアであるSAS/QCに含まれる
今回は品質管理のソフトウェアであるSAS/QCに含まれる
PARETOプロシジャを利用したが、製造業における品質管PARETOプロシジャを利用したが、製造業における品質管理だけではなく、営業活動やマーケティング活動の管理を行う事もできる。

168RFM分析とは？
w RFMによる顧客ランキング
RFMによる顧客ランキング– 流通業やサービス業などで良く利用される分析手法。
– 優良顧客を定義するために履歴データの以下の指標を利用する

w R(RecencyR(Recency))・・・最終利用日
・・・最終利用日w F(Frequency)・・・
頻度
F(Frequency)・・・頻度
w M(Monetary)･･･
利用金額
M(Monetary)･･･利用金額– 上記の指標に対して、各企業で定めた指数を掛けて、ポイントを算出する

w EX.2週間前に購入は5ポイント、10回〜2020回は回は1010ポイント
ポイント
EX.2週間前に購入は5ポイント、10回〜、購入金額が10万円を超えると1010ポイント。
ポイント。55ポイント+10、購入金額が10万円を超えるとポイント+10ポイント+10ポイント＝2525ポイント
ポイント
ポイント+10ポイント＝– このようなRFMを使う事により、金額だけではなく他の指標を用いて、顧客このようなRFMを使う事により、金額だけではなく他の指標を用いて、顧客の分類を行える点でデシル分析より柔軟でもある。

17RFM分析を工夫する
w RFM分析は一般に広く知られているRFM分析は一般に広く知られている– Recency– Frequency– Monetary

直近の購買年月日
購買回数
購買金額

2000/9/1
20回
20回
10万円
10万円

分析者が重み付け！！

w 優良顧客は誰？

w 顧客ランク＝ αRm/R＊βF/FmF/Fm＊γ＊γM/MmM/Mm
Rm/R＊βあるターゲットの日から「何日前」にと考える
189

今回のサンプルデータ
w 今回は先のようなデータを利用した。
– 顧客番号（CUST_ID）
顧客番号（CUST_ID）– 買上日(買上日(DATE)– 商品区分(商品区分(SYOUHIN)– 金額(金額(PRICE)w 上記の変数で50万件の上記の変数で50万件のデータを利用してRFM分データを利用してRFM分析を行っていく。
19

RFM分析:ステップ１「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分析:ステップ２「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̲idm̲value)
SUM=
SUM=m̲value ;
RUN;
RUN;

2211

RFM分析:ステップ４「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分析：ステップ５「R」「F」「F」「M」「M」の中央値を算出しマクロ変数に格納
w 中央値を算出するのにUNIVARIATE
プロシジャを利用
中央値を算出するのにUNIVARIATEプロシジャを利用している。V8からはMEANSMEANSプロシジャでも算出可能。
プロシジャでも算出可能。
している。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̲rm̲r,,best.))SYMPUT('m̲r',put(best.)) ;CALL SYMPUT('m̲f',put(m̲fm̲f,,best.))SYMPUT('m̲f',put(best.)) ;CALL SYMPUT('m̲m',put(m̲mm̲m,,best.))SYMPUT('m̲m',put(best.)) ;
RUN;
RUN;

w24

マクロ変数に中央値に格納する事により、データセットとマージする必要も無く、この後の処理ですぐに活用できる。

12

RFM分析：ステップ６「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̲rf̲value/&m̲fm̲value/&m̲mLABEL

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分析：ステップ７「R」「F」「F」「M」「M」の値に主観的な指標をつける

w SASのフォーマットの機能を利用して、「F」と「MSASのフォーマットの機能を利用して、「と「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 「Ｆ」「Ｍ」の各ランクをグラフで「Ｆ」「Ｍ」の各ランクをグラフで表現している。他にも「Ｒ」表現している。他にも「Ｒ」や年齢などの属性と組み合わせることにより、色々な事が分かってくると思われる。
2814

RFM分析まとめw RFM分析自体は過去から使われてきているので、RFM分析自体は過去から使われてきているので、手法自体は最新のものではない。
w ただ、今回のサンプルデータのように「顧客ID」「日日ただ、今回のサンプルデータのように「顧客ID」「付」「商品」「値段」程度の情報からでも、何とかして顧客をセグメントするための値として活用する事が出来る。
w 履歴データとは今回のようなPOSデータだけでは履歴データとは今回のようなPOSデータだけではなく、Webログ関連のようなデータでも、SAS
SASデー
デー
なく、Webログ関連のようなデータでも、タセットに取り込めれば活用が可能。
2915

本日の資料・サンプルプログラム・サンプルデータ(小さく縮小してあります)は以下のURLから取得できます。(曜日の昼くらいから閲覧可能)

http://www.sas.com/japan
japan//usergroups/
http://www.sas.com/
usergroups/wg/archive/index.html
wg/archive/index.html

3116