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の併用便益: 組み合わせることで新規に生まれる便益
さらに、共通便益と併用便益の有無で、以下のように分類できます:
- 共通便益なし & 併用便益なし (例)おむつとビール、など殆どの組み合わせ
- 共通便益なし & 併用便益あり (例)おにぎりとお茶、カミソリ本体と刃
- 共通便益あり & 併用便益なし (例)お茶と牛乳、アメとガム
- 共通便益あり & 併用便益あり (例)なし
一般的に併用便益の魅力を消費者が理解できれば、同時購買が発生しやすく、
共通便益がある場合、同時購買が発生しにくいです。
バスケット分析を通して、消費者に併用便益の魅力を伝える施策を打つ必要があります。