Power BIを使ったバスケット分析

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/9e237009-a4ac-9601-ff68-e40b45863e7c.png)
参考：[Finance BI, Power BI: Basket Analysis, November 26, 2019](https://finance-bi.com/blog/power-bi-basket-analysis/)

# バスケット分析とは
- データマイニングの代表的な方法
- 購買データの分析により、一緒に購入されやすい商品を明らかにすること
- アソシエーション分析の手法の１つ

## ４つの指標
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/b6020404-076e-01fa-c24c-8e129d8a11b6.png)

### 支持度(Support)
　どれだけ一緒に買われているか

```math
     = \frac{同時購入者数}{購入者全体数}
```

### 信頼度(Confidence)
　商品Xを買う時に商品Yも一緒に買う割合

```math
= \frac{同時購入者数}{商品A購入者数}
```

### 期待信頼度(Expected Confidence)
　顧客全員のうち、商品Yを購入する割合

```math
=\frac{商品Y購入者}{購入者全体数}
```

### リフト値(Lift)
　リフト値が大きいほど、商品Xの購買が商品Yの購買を”持ち上げて”いる。小さい場合は、関連性が低い。

```math
=\frac{商品Xの信頼度}{商品Yの期待信頼度}\\
=\frac{\frac{同時購入者数}{商品A購入者数}}{\frac{商品B購入者数}{購入者数全体}}
```

# 元データの整形
　元のデータは、レシートごとに１行になっており、商品名が並んでいます。これを集計に使えるよう整形していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/8d5e0b3a-447e-9684-8b55-3135bcabe74c.png)

　まず、列の追加でインデックス列を追加して、レシート番号とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/f8211212-4292-2df8-c161-a8e509fb6d66.png)

　作成した列を選択し、その他の列のピボット解除を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/d9ea013e-c4ba-1386-b0de-d124f26e5f74.png)

　「属性」列の削除、「値」列の空の行の削除、列名の変更を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/0ab967fd-4b9b-8dbf-f26f-5500db4595b3.png)

# バスケット分析テーブルの作成

 元のgroceriesというテーブルを使って、Basket analysisというテーブルを作成していきます。

### 組み合わせの作成
　最初に、商品の組み合わせ表を作成します。

```:新しいテーブル
Basket analysis = 
// Itemのすべての組み合わせを作成
    FILTER(
        CROSSJOIN(
            VALUES(
                'groceries'[Item]
            ),
            SELECTCOLUMNS(
                VALUES(
                    'groceries'[Item]
                ),
                "Item2", 
                'groceries'[Item]
            )
        ),
        [Item]>[Item2]      // 重複の削除
    )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/5dd37bef-9d4b-efdb-d7f8-e2aee24a8bc8.png)

### 組み合わせ名称の作成
　組み合わせを表示する項目を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/b7b3944d-2397-5de3-44eb-c36165c712c8.png)

### 支持度(Support)の作成

```:Support
Support basket = // 支持度の計算

var item1='Basket analysis'[Item]   // 列名はテーブル名をつけましょう
var item2='Basket analysis'[Item2] 

var transactionsWithItem1 =         // Item1のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item1
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

var transactionsWithItem2 =         // Item2のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item2
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

var transactionsWithBothItems =     // ２つのテーブルの積
    INTERSECT(
        transactionsWithItem1,
        transactionsWithItem2
    )

RETURN 
    COUNTROWS(transactionsWithBothItems)        // Item1とItem2の両方が含まれるレシート数
    / 
    DISTINCTCOUNT(groceries[Transaction ID])    // すべてのレシートの数
```

### 信頼度(Confidence)の作成

```:Confidence1
Confidence Item1 -> basket = // Item1の信頼度
var item1='Basket analysis'[Item]
var item2='Basket analysis'[Item2]

var transactionsWithItem1 =         // Item1のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item1
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

var transactionsWithItem2 =         // Item2のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item2
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

var transactionsWithBothItems =     // ２つのテーブルの積
    INTERSECT(
        transactionsWithItem1,
        transactionsWithItem2
    )

RETURN 
    COUNTROWS(transactionsWithBothItems)        // Item1とItem2の両方が含まれるレシート数
    / 
    COUNTROWS(transactionsWithItem1)            // item1のレシートの数
```

```:Confidence2
Confidence Item 2 -> Basket = // Item2の信頼度
var item1=[Item]
var item2=[Item2]

var transactionsWithItem1 =         // Item1のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item1
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

var transactionsWithItem2 =         // Item2のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item2
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

var transactionsWithBothItems =     // ２つのテーブルの積
    INTERSECT(
        transactionsWithItem1,
        transactionsWithItem2
    )

RETURN 
    COUNTROWS(transactionsWithBothItems)        // Item1とItem2の両方が含まれるレシート数
    / 
    COUNTROWS(transactionsWithItem2)            // item2のレシートの数
```

### リフト値(Lift)の作成

```:lift
Lift = // リフト値

var item1='Basket analysis'[Item]
var item2='Basket analysis'[Item2]

var transactionsWithItem2 =         // Item2のTransaction ID表
    SELECTCOLUMNS(
        FILTER(
            'groceries',
            'groceries'[Item]=item2
        ),
        "transactionID",
        'groceries'[Transaction ID]
    )

RETURN 
    'Basket analysis'[Confidence Item1 -> basket]   // Item1の信頼度
    /
    (
        COUNTROWS(transactionsWithItem2)            // Item2のレシート数
        / 
        DISTINCTCOUNT(groceries[Transaction ID])    // 全レシート数
    )
```

# ビジュアルの作成
　支持度とリフト値を使って、散布図を作成します。
　そのままだと、数が多いので、支持度が0.6％以上、リフト値が2以上でフィルターをかけます。クラスターの自動検索を行うと、以下のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/e3cb9707-f7c2-d0c7-3d2b-89e94936284e.png)
　
　根菜に注目してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/b7ce916b-ae2b-3d7c-fbb6-542b90260906.png)