【Dataiku】シンプルなバスケット分析．前処理から可視化までを紹介．

注：本記事は筆者個人の見解であり，学習内容をまとめたものです．
# はじめに
## バスケット分析とは
　バスケット分析とは，名称の通り買い物かごについて分析するものである．顧客のバスケット（ECサイトではカート）にある商品の集まりを1つのサンプルとして併売品（何が同時に購入されるのか）の関係性を見つけ出す． 

 ![バスケット分析-basket.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/09387f5c-6b2f-7a99-a414-ad90a44fe10f.png)

　関係性について例を挙げると，1990年代の米国での典型的な分析事例「おむつとビール」があり，検索すると多数の記事がヒットする．この関係性の考察として，幼い子がいる家庭ではかさばる品であるおむつを父親が購入する際に自分用のビールを買っていたという話が示されている．  
　バスケット分析ではあくまで相関（関係性）を確認するため，因果関係とは分けて考える必要がある．因果関係の発見には，データから得た知見の他に業界特有の知識（ドメイン知識）を必要とする．そのため，データを分析した結果は往々にして現場の肌感覚と一致することがある．  
　バスケット分析の結果を活用するためには商品間の因果関係を明らかにて，事前に設定した目的を達成する施策を講じる必要がある．施策とは目的に対するアプローチ，小売りであれば売り場配置の変更（近づける，動線を考慮する）やレコメンド，セット値引きなどである．また，関係性は顧客層や季節などの要因で変化する可能性があるため，１度切りではなく継続的な分析が必要である．  

## 分析ツール
　バスケット分析は基礎の部分はシンプルであり， Excel でも可能である．しかしながら，大量の取引（トランザクション）や商品を分析するには不向きで，共有や整合性の管理が難しい．  
　ITのスキルがあれば，Python や R で大量のトランザクションに対して分析が可能であるが，ビジネスユーザには敷居が高く可視化が難しいという欠点がある．  
　これらの問題を解決し，ビジネスで分析結果を活用するための選択肢として， Tableau や Microsoft Power BI などのBIツールや DatRrobot, Dataiku といった機械学習プラットフォームが挙げられる．これらのツールでバスケット分析を実施することで，ビジネスユーザも利用しやすく，共有が容易でリッチな可視化が可能である．  
　今回は Dataiku [1] を用いてバスケット分析を実施する．Dataiku  はオールインワンのデータ分析プラットフォームで，データクレンジング（前処理）からダッシュボードによる可視化，運用管理までend to end の処理を実行できる．

# 理論
　基礎的なバスケット分析の仕組みについて述べる．詳細については文献[2]や[3]にて丁寧に説明されているため適宜参照されたい．
## ルール
　商品の集合$X$を買った場合，商品の集合 $Y$が購入されるルールを$X \to Y$と書き，$X$を条件部 (antecedent)，$Y$を結論部 (consequent) と呼ぶ．このルール（相関，関係性）を見つけ出すのがバスケット分析の目標である．

## 評価指標

バスケット分析では商品の集合やルールを評価する指標が用意されている．統計値であり，定義によっては様々な値があるが，多用されるのが支持度，信頼度，リフト値である．

### 支持度 (Support)
 
$X$か$Y$を含むトランザクションが全体に占める割合を指す．全体のうち，ルールに該当する商品の比であるから，該当商品が売れているかを評価し，ルールを施策に結び付けた際のインパクトを推し量ることができる．トランザクション総数が$N$の場合以下で求まり，範囲は 0~1 をとる．

```math
\begin{split}
\text{supp}(X \to Y) 
&= \frac{XないしYを買ったトランザクション数}{全体のトランザクション数} \\
&= \frac{ X \cup Y }{N} \qquad , [0,1].
\end{split}
```

### 信頼度 (Confidence)

　$X$を買ったうえで，$X$ないし$Y$を買ったトランザクションの比を指し，当然ながら，この値が大きいほど$X$を買った後$Y$を買う可能性が高まる．$\text{supp}(X)$は単純に$X$を購入したトランザクション比を指す．信頼度は$X$が買われたから$Y$を買っている，というルールの順序について評価する．$X$と$Y$が入れ替わった場合，例えば家電量販店で"スマホ $\to$アクセサリ"のルールはありうるが，"アクセサリ $\to$スマホ"のルールはほとんど無いだろうとすれば，信頼度は後者の方が低くなると想定され，同じ商品ペアであっても評価が異なる．範囲は0~1をとる．

$$
\text{conf}(X \to Y) = 
\frac{ \text{supp}(X\to Y)}{\text{supp}(X)} \qquad , [0,1].
$$


### リフト値 (Lift)
　$X$を購入したうえで$Y$を買う確率($\text{conf}(X\to Y)$) をトランザクション全体に対して$Y$を購入した比($\text{supp}(Y)$)で除したもの．$X$を購入し$Y$を購入している傾向にあるが，$Y$を買って$X$を買うとは限らないことを考慮している．  
　例えば，スーパーでいえば牛乳や納豆など日常的によく売れる品がルールの$Ｙ$にあるとする．この場合リフト値は小さくなり，$X$との関係よりも$Y$が何らかの理由によって単独で売れている可能性がある事を示唆している．既によく売れている商品は併売しても意味がないため，ルール（アソシエーション）の採用時にはリフト値も併せて参照する．高いほどルールが有用とみなせる．

$$
\text{lift}(X \to Y)=
\frac{\text{conf}(X\to Y)}{\text{supp}(Y)}=\frac{\text{supp}(X\to Y)}{\text{supp}(X)\text{supp}(Y)}
$$
 
## アプリオリアルゴリズム
　アプリオリアルゴリズムは上記の評価値などを基に，多数の商品から高速にルールを抽出するアルゴリズムである．BIツールやPythonのライブラリで実装する際には特に必要では無いが，簡単に仕組みを理解しておきたい． 
　アルゴリズムの詳細については文献[2]や[3]を参照するされたい．アプリオリアルゴリズムには頻出アイテムを検出してからルールを抽出する[3]．ここではアルゴリズムの中で基本の頻出アイテムアルゴリズムについてだけ触れる[4]．
　実際にルールを抽出する前に，単に$\text{supp}(X) \geq \text{minsupp}$(支持度の閾値)を満たす全てのアイテム集合$X$を取り出す事を考える[3]．頻出アイテム集合全体の集合$L$とし，$L$のうち，$k$個のアイテムを含むアイテム集合で構成されるものを$L_k$とする．(e.g. $L= \{ \{ \text{リンゴ，バナナ}\}, \{\text{リンゴ，みかん} \}... \}$)  
$L_1 \sim L_k$　が分かっているときに$F_{k+1}$を効率よく見つける事を考える．
$X_k$は$k$個のアイテムを持つ集合であるから，$X_{k+1}$は$X_{k}$に１つアイテムを付け加えたアイテム集合．よって，$X_{k+1}\supset X_{k}$であり，
$$
 \text{supp}(X_{k}) \geq \text{supp}(X_{k+1}),
$$

　であるから
$$
\text{supp}(X_{k}) \geq \text{minsupp},
$$
　なら
$$
\text{supp}(X_{k+1}) < \text{minsupp},
$$
である[3]．よって，$X_{k+1}$から１つアイテムを除外したアイテム集合が$L_{k}$の要素でなければ$X_{k+1}$は頻出アイテムではない．
$X$の代わりに頻出候補になりうる集合$C_{k+1}$，トランザクションの集合$D$とおくと，アプリオリ(頻出アイテム検出)のアルゴリズムは次である[4]．


**アルゴリズム**

=====  
// 最低限の支持度を持つアイテムの集合  
$L_1 = \{ \text{1-itemsets} \}$  

//$L_{k-1}$が空になるまでループ
for ($k=2$; $L_{k-1} \neq \emptyset $; $k++$ ) do  
　　//アイテム集合$L_{k-1}$から新しい$k$個のアイテムを持つ候補集合を生成  
　　$C_k = \text{apriori-gen} (L_{k-1})$    
　　for all $t \in D$ do  
　　　　//$C_k$とトランザクションの照合により**頻出**の$k$アイテム候補を生成  
　　　　$C_{kt} = \text{subset}(C_k, t)$  
　　　　for all $c \in C_t$ do  
　　　　　　//kアイテム候補の支持度数を計算  
　　　　　　compute $\text{supp}(c)|$    
　　　　end  
　　end  
　　$L_k =  \{ c \in C_k | \text{supp}(c) \geq \text{minsup} \}$  
end  

=====

　先に述べたようにルール検出アルゴリズムもあるが，今回は割愛する．

# 構築
　評価値やアルゴリズムの概要をさくっと把握したところで，実装に移る．
Dataiku `ver. 11.2.0`  
mlxtend `ver. 0.19.0`

## データセット

　今回はエジンバラにあるパン屋さんのデータセット "Bakery Sales Dataset" [5] を拝借してバスケット分析を行う．  
　データセットが持つ列は 年月日, 時間, トランザクションID，商品の４列である．バスケット分析で最低限必要なのは　いつ，どの取引で，何が買われたかの3点である．顧客属性や商品単価などがあればより詳細な分析が可能であるが，今回は商品に絞ってよりシンプルに，最小のデータで見ていく．  
　次にDataikuで確認したデータセットを示す．

![dataset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/19ac6918-a7ac-7ae6-772f-6a454d71f01d.png)

　上記のような取引データでバスケット分析を行うにはトランザクション数 x 商品数の下図のよなテーブルへ変換するのがベターである．

![バスケット分析-mart.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/4982e205-1715-15da-853f-de8ac83227c6.png)

## フロー
　Dataiku 上で作成したフロー（処理の流れ）を次に示す．青の四角アイコンがデータセット(テーブル形式のデータ)，丸アイコンがレシピ（処理単位）である．

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/e1f156b8-cbd7-e577-71f4-4c3a27c5e455.png)

　紫のエリアではデータの前処理を行っている．日付をISO基準に修正し，商品に含まれる異常値を除外している．異常値とは，商品名が"NONE"などとなっていて分析に必要ないデータである．その後，トランザクション数 x 商品数 のテーブルへ変換している．これらには特にコーディングなどは必要ない．
　赤のエリアでは実際にバスケット分析を行っている．オレンジの丸はPythonの処理を実行するレシピで，ここで Pythonライブラリの mlxtend [6]によりアプリオリアルゴリズムによるバスケット分析を実行し，下図のようなデータセットを得ている．  
上部の黄色いレシピが接続されている点ではダッシュボードのため対象商品の販売個数を集計している．
　緑のエリアは視覚的にわかりやすいよう，ダッシュボード描画用のデータセットを集めた区画である．

![rule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/7c931ef3-e0b7-4c22-9509-b785500a8527.png)

## ダッシュボード

　ただ分析しただけではインサイト，施策を導くことはできず，ビジネスユーザも使いづらいため，結果をダッシュボードとして提示する必要がある．  
　ここではダッシュボードのユーザとして個人店のパン屋の店長を想定する．例えば，店長はレジの人員配置やパンの仕込み数を決める必要がある．この時，日々の取引数や販売数で店の状態が確認できれば計画を考えやすくなるはずである．あるいは，新しい商品の開発や利益向上の施策を新たに打ち出したい場面があると思われる．この際は販売数に加えてバスケット分析の結果から商品の関係性を活かした施策のアイディアを得ることができるかもしれない．こういったケースを仮定し，ダッシュボードで可視化した．
　次の図は日別の商品の売れ行きを示したダッシュボードである．売れ行きの監視の他，インサイトとして最も下にあるの時刻別の販売数を示したグラフを見るとコーヒー，食パンが主力であるとわかる．また，ペストリーは朝，サンドイッチはお昼に売れる傾向にあること見てとれる．
また，１年もないデータですが，冬季は販売数が下降気味であるが安定して取引をいるため常連客層が多く，利益拡大には新規顧客を獲得しないといけないのではないかなど仮説が立てられる．

![dashboard_transaxtion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/c594b96c-7b64-9e03-bdf6-4ee63d56bd8a.png)

　バスケット分析で得られた商品のルールと評価値を可視化したダッシュボードを次の図に示す．
先の販売数とルールを見ると，多くの顧客はコーヒーと食パンを同時購入する傾向にあるようである．今回はユニークな組み合わせは残念ながら発見できなかったが，データを可視化することで明らかにコーヒー，紅茶，食パンの売れ行きがよいことが判明した．もしこのパン屋で利益拡大のため分析をするとすれば，コーヒー銘柄などより詳細なデータを取得，掘り下げて分析しおすすめ商品のを検討する．顧客情報を取得して分析し客層へのアプローチを検討するなどのアクションが考えられる．

![dashboard_basket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120544/52b8702d-fcd7-b0fe-6169-d4f41c017200.png)

# まとめ
　今回は自己学習のため Dataiku にてバスケット分析の基礎的な部分を実装し，バスケット分析の流れが掴めたので良い体験になった．  
　近頃はローコードで分析できるツールの活用により，分析（データ活用）自体は容易になっていると感じる．しかし，本稿で少々ぼやかして記載している箇所があるように，今回の場合はパン屋やその地域について特有の知見が無いとより具体的に分析出来ない．これはデータ活用の難しいところである．データサイエンティスト志向としては分析手法を注目しがちであるが，その前後，ゴールの設定と効果確認も同じく大切であり，継続的に取り組むべきものである．

# 参考
[1]: Dataiku 社HP, https://www.dataiku.com/ja, 2023-02.  
[2]: 同志社大学，データサイエンス研究室, https://mjin.doshisha.ac.jp/R/Chap_40/40.html  
[3]: 神嶌 敏弘，頻出パターンマイニング，https://www.kamishima.net/archive/freqpat.pdf  
[4]: AGRAWAL, Rakesh, et al. "Fast algorithms for mining association rules.", In: Proc. 20th int. conf. very large data bases, 1994, pp. 487-499.  
[5]: https://github.com/luis-alarcon/Kaggle_BreadBasket, 2023-02.
[6]: mlxtend, http://rasbt.github.io/mlxtend/, 2023-02