kaeken(嘉永島健司)Techブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

Rによるバスケット分析まとめ

概要

Rによるバスケット分析方法をまとめました。

Rのバスケット分析パッケージを使えば、

すぐに詳細なバスケット分析ができます。

書籍『リテールデータ分析入門』のデータを使って、実際に分析してみます。

準備

データの準備

まず、商品カテゴリ(例:おにぎり、お茶など)一覧を定義します。

Cate1,Cate2,Cate3,...
おにぎり,お茶,弁当,...

以後、

つぎに、実際の購買データを準備します。

レシート番号,購買商品
1,おにぎり&お茶
2,お茶&弁当
3,弁当
4,...

このままでは、Rで処理しづらいので、以下のように、 各カテゴリが

購入されていれば 1

購入されていなければ 0

とダミー変数に変換しておきます。

ReceiptNo,Cate1,Cate2,Cate3,Cate4,Cate5,Cate6,Cate7,Cate8,Cate9,Cate10
1,0,0,1,1,0,0,1,0,0,0
2,1,0,0,0,0,0,1,0,0,0
3,0,1,0,0,1,0,1,0,0,0
...

cf.ダミー変数への変換方法は、別途記事にします。

Rパッケージの準備

Rパッケージのarulesをインストールします。 https://www.rdocumentation.org/packages/arules/versions/1.6-2

install.packages("arules")

バスケット分析の実施

パッケージを読み込みます。

library("arules")

上記で準備しておいたダミー変数のcsvファイルを読み込みます。

data_set <- read.csv("~/Downloads/Receipt1000.csv", header = T, row.names = 1)
// 引数の説明:
// header 有り: header = T
// header 無し: header = F
// 1列目を行名として使う場合: row.names = 1
// 1列目を行名として使う場合: row.names削除

行列形式に変換します

data_set_matrix = as(data_set, "matrix")

バスケット分析を実行しルールを生成します

rules <- apriori(data_set_matrix, parameter = list(supp = 0.06, conf = 0.2, maxlen = 2))
// 引数の説明:
// supp: support値下限を指定
// conf: confidence値下限を指定
// maxlen: 条件部個数の最大値を指定

ルールの概要を確認します

summary(rules)
set of 36 rules

rule length distribution (lhs + rhs):sizes
 1  2 
 7 29 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   2.000   1.806   2.000   2.000 

summary of quality measures:
    support          confidence          lift           count       
 Min.   :0.06300   Min.   :0.2030   Min.   :0.760   Min.   : 63.00  
 1st Qu.:0.08075   1st Qu.:0.2593   1st Qu.:1.000   1st Qu.: 80.75  
 Median :0.09900   Median :0.3676   Median :1.083   Median : 99.00  
 Mean   :0.13458   Mean   :0.3610   Mean   :1.131   Mean   :134.58  
 3rd Qu.:0.14850   3rd Qu.:0.4316   3rd Qu.:1.231   3rd Qu.:148.50  
 Max.   :0.43800   Max.   :0.6201   Max.   :1.742   Max.   :438.00  

mining info:
         data ntransactions support confidence
rules          1000    0.06        0.2

生成されたルール先頭行を表示します

// 引数の説明:
// by: ソート項目を指定(supp=support, conf=confidence, lift)

// 表の説明:
// lhs: 条件部 空の場合は、各カテゴリの購買確率
// rhs: 結論部

> inspect(head(rules, by = "supp"))
    lhs    rhs     support confidence lift count
[1] {}  => {Cate1} 0.438   0.438      1    438  
[2] {}  => {Cate2} 0.391   0.391      1    391  
[3] {}  => {Cate3} 0.263   0.263      1    263  
[4] {}  => {Cate4} 0.229   0.229      1    229  
[5] {}  => {Cate8} 0.212   0.212      1    212  
[6] {}  => {Cate7} 0.205   0.205      1    205  

> inspect(head(rules, by = "conf"))
    lhs         rhs     support confidence lift     count
[1] {Cate4}  => {Cate1} 0.142   0.6200873  1.415725 142  
[2] {Cate10} => {Cate1} 0.080   0.5925926  1.352951  80  
[3] {Cate9}  => {Cate1} 0.103   0.5786517  1.321123 103  
[4] {Cate3}  => {Cate1} 0.140   0.5323194  1.215341 140  
[5] {Cate5}  => {Cate1} 0.099   0.4876847  1.113435  99  
[6] {Cate6}  => {Cate1} 0.085   0.4696133  1.072176  85

> inspect(head(rules, by = "lift"))
    lhs         rhs     support confidence lift     count
[1] {Cate9}  => {Cate4} 0.071   0.3988764  1.741818  71  
[2] {Cate4}  => {Cate9} 0.071   0.3100437  1.741818  71  
[3] {Cate4}  => {Cate1} 0.142   0.6200873  1.415725 142  
[4] {Cate1}  => {Cate4} 0.142   0.3242009  1.415725 142  
[5] {Cate10} => {Cate1} 0.080   0.5925926  1.352951  80  
[6] {Cate9}  => {Cate1} 0.103   0.5786517  1.321123 103 

ルール全体を表示します

inspect(sort(rules, by="supp"))
// 引数の説明:
// by: ソート項目を指定(supp=support, conf=confidence, lift)
     lhs         rhs     support confidence lift      count
[1]  {}       => {Cate1} 0.438   0.4380000  1.0000000 438  
[2]  {}       => {Cate2} 0.391   0.3910000  1.0000000 391  
[3]  {}       => {Cate3} 0.263   0.2630000  1.0000000 263  
[4]  {}       => {Cate4} 0.229   0.2290000  1.0000000 229  
[5]  {}       => {Cate8} 0.212   0.2120000  1.0000000 212  
[6]  {}       => {Cate7} 0.205   0.2050000  1.0000000 205  
[7]  {}       => {Cate5} 0.203   0.2030000  1.0000000 203  
[8]  {Cate2}  => {Cate1} 0.168   0.4296675  0.9809761 168  
[9]  {Cate1}  => {Cate2} 0.168   0.3835616  0.9809761 168  
[10] {Cate4}  => {Cate1} 0.142   0.6200873  1.4157245 142  
[11] {Cate1}  => {Cate4} 0.142   0.3242009  1.4157245 142  
[12] {Cate3}  => {Cate1} 0.140   0.5323194  1.2153411 140  
[13] {Cate1}  => {Cate3} 0.140   0.3196347  1.2153411 140  
[14] {Cate3}  => {Cate2} 0.115   0.4372624  1.1183180 115  
[15] {Cate2}  => {Cate3} 0.115   0.2941176  1.1183180 115  
[16] {Cate9}  => {Cate1} 0.103   0.5786517  1.3211226 103  
[17] {Cate1}  => {Cate9} 0.103   0.2351598  1.3211226 103  
[18] {Cate5}  => {Cate1} 0.099   0.4876847  1.1134355  99  
[19] {Cate1}  => {Cate5} 0.099   0.2260274  1.1134355  99  
[20] {Cate4}  => {Cate2} 0.097   0.4235808  1.0833268  97  
[21] {Cate2}  => {Cate4} 0.097   0.2480818  1.0833268  97  
[22] {Cate7}  => {Cate1} 0.094   0.4585366  1.0468872  94  
[23] {Cate1}  => {Cate7} 0.094   0.2146119  1.0468872  94  
[24] {Cate5}  => {Cate2} 0.087   0.4285714  1.0960906  87  
[25] {Cate2}  => {Cate5} 0.087   0.2225064  1.0960906  87  
[26] {Cate6}  => {Cate1} 0.085   0.4696133  1.0721764  85  
[27] {Cate8}  => {Cate1} 0.081   0.3820755  0.8723184  81  
[28] {Cate10} => {Cate1} 0.080   0.5925926  1.3529511  80  
[29] {Cate7}  => {Cate2} 0.077   0.3756098  0.9606388  77  
[30] {Cate4}  => {Cate3} 0.077   0.3362445  1.2784964  77  
[31] {Cate3}  => {Cate4} 0.077   0.2927757  1.2784964  77  
[32] {Cate9}  => {Cate4} 0.071   0.3988764  1.7418184  71  
[33] {Cate4}  => {Cate9} 0.071   0.3100437  1.7418184  71  
[34] {Cate6}  => {Cate2} 0.068   0.3756906  0.9608455  68  
[35] {Cate9}  => {Cate2} 0.064   0.3595506  0.9195667  64  
[36] {Cate8}  => {Cate2} 0.063   0.2971698  0.7600251  63

以上でRによるバスケット分析ができました。

応用

カテゴリの粒度

カテゴリの粒度は、データによって異なります。

カテゴリを集約しすぎると、施策へ反映しづらくなり、

カテゴリを分割しすぎると、分析結果の解釈が難しくなります。

出現頻度に応じて、集約したり分割することで調整します。

カテゴリの追加

カテゴリに商品だけでなく、

時間情報・曜日など追加したり、

購入者属性を追加することで、

異なる種類のカテゴリ同士のルールを生成できます。

同時購買を生み出す消費者心理

バスケット分析の結果で、同時購買を生み出す消費者心理を推測することは可能ですが、本当に有効な打ち手かどうか検討する必要があります。

一般的に、複数の商品の組み合わせによって得られる便益は、以下のように分類できます:

  • 商品A単体の便益
  • 商品Aだけがもつ固有便益
  • 商品B単体の便益
  • 商品Bだけがもつ固有便益
  • 商品A,Bの共通便益: 重複する便益
  • 商品A,Bの併用便益: 組み合わせることで新規に生まれる便益

さらに、共通便益と併用便益の有無で、以下のように分類できます:

  • 共通便益なし & 併用便益なし (例)おむつとビール、など殆どの組み合わせ
  • 共通便益なし & 併用便益あり (例)おにぎりとお茶、カミソリ本体と刃
  • 共通便益あり & 併用便益なし (例)お茶と牛乳、アメとガム
  • 共通便益あり & 併用便益あり (例)なし

一般的に併用便益の魅力を消費者が理解できれば、同時購買が発生しやすく、

共通便益がある場合、同時購買が発生しにくいです。

バスケット分析を通して、消費者に併用便益の魅力を伝える施策を打つ必要があります。