Power BIとPycaretでかんたんクラスタリング

# はじめに

いま話題のかんたん機械学習ライブラリのPycaretをPower BI上で使用してみます。

<https://pycaret.org/>

![pycaretde_2022-03-04-17-30-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/61f66e2c-d5d2-6336-f146-1eed0c0ad85e.png)


## Pythonの環境セットアップ

Power BI DesktopでPythonを使用できるように設定します。環境はPower BI用に構築するのがいいと思います。

![pycaretde_2022-03-04-17-44-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e1d5d741-05f0-00ed-cd8d-73c342ba463f.png)

<https://docs.microsoft.com/ja-jp/power-bi/connect-data/desktop-python-scripts>

### anacondaを使用している場合

下記のように指定すればOKでした。

```python
C:\Anaconda3\envs\"環境名"
```

### venvを使用している場合

こちらは下記のように`Script`フォルダーを指定すればOKでした。

```python
C:\Users\PowerBI_Python\venv\Scripts
```

## サンプルデータ

Pycaretが用意してくれているファイルを使用します。

サンプルデータ/Jewelry

<https://raw.githubusercontent.com/pycaret/pycaret/master/datasets/jewellery.csv>

### Webから取得

`データを取得` -> `WEB`

![pycaretde_2022-03-04-21-05-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f68a628a-afb2-03a2-834b-4c402820bcc9.png)


## Pythonコードを記述

![pycaretde_2022-03-04-21-26-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e0b48eb2-69ea-309d-2aba-57eb37280fcf.png)

`# 'dataset' はこのスクリプトの入力データを保持しています`

と書いてある入力ボックスが出てきます。
先ほどとりこんだデータは`dataset`という変数名でpandas.DataFrameになっています。


![pycaretde_2022-03-04-22-22-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/91ba3b0d-829b-7839-4cb7-2322be9f52d6.png)

## Pycaretでクラスタリングをする

ここまできたら、Pycaretでクラスタリングをするコードを記述します。クラスタリングモジュールをインポートしたあとに、最低限ではありますが、1行記述するだけでOKです。

```python
from pycaret.clustering import *
dataset = get_clusters(data = dataset)
```

このコードを記述して、`OK`ボタンをおせばクラスタリングが実行されます。

Cluster列が作成されました。

![pycaretde_2022-03-04-22-48-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/7233bfe8-b05c-503d-e5b5-3c6c870eb0a1.png)


## 散布図を作成する

凡例にクラスターをいれるときれいに色分けされます。

![pycaretde_2022-03-05-08-53-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9895b015-2e31-3847-abc8-3037784adb51.png)


## Pycaretのデフォルト設定を調べる

`get_clusters()`はデフォルトでは、

- モデルはk-means
  - <https://ja.wikipedia.org/wiki/K%E5%B9%B3%E5%9D%87%E6%B3%95>
- クラスター数は4

となっています。

<details><summary>設定可能な項目一覧</summary>

<https://pycaret.readthedocs.io/en/latest/api/clustering.html#pycaret.clustering.get_clusters>

```python
pycaret.clustering.get_clusters(
    data,
    model: Union[str, Any] = 'kmeans',
    num_clusters: int = 4,
    ground_truth: Optional[str] = None,
    round: int = 4,
    fit_kwargs: Optional[dict] = None,
    preprocess: bool = True,
    imputation_type: str = 'simple',
    iterative_imputation_iters: int = 5,
    categorical_features: Optional[List[str]] = None,
    categorical_imputation: str = 'mode',
    categorical_iterative_imputer: Union[str, Any] = 'lightgbm',
    ordinal_features: Optional[Dict[str, list]] = None,
    high_cardinality_features: Optional[List[str]] = None,
    high_cardinality_method: str = 'frequency',
    numeric_features: Optional[List[str]] = None,
    numeric_imputation: str = 'mean',
    numeric_iterative_imputer: Union[str, Any] = 'lightgbm',
    date_features: Optional[List[str]] = None,
    ignore_features: Optional[List[str]] = None,
    normalize: bool = False,
    normalize_method: str = 'zscore',
    transformation: bool = False,
    transformation_method: str = 'yeo-johnson',
    handle_unknown_categorical: bool = True,
    unknown_categorical_method: str = 'least_frequent',
    pca: bool = False,
    pca_method: str = 'linear',
    pca_components: Optional[float] = None,
    ignore_low_variance: bool = False,
    combine_rare_levels: bool = False,
    rare_level_threshold: float = 0.1,
    bin_numeric_features: Optional[List[str]] = None,
    remove_multicollinearity: bool = False,
    multicollinearity_threshold: float = 0.9,
    remove_perfect_collinearity: bool = False,
    group_features: Optional[List[str]] = None,
    group_names: Optional[List[str]] = None,
    n_jobs: Optional[int] = - 1,
    session_id: Optional[int] = None,
    log_experiment: bool = False,
    experiment_name: Optional[str] = None,
    log_plots: Union[bool, list] = False,
    log_profile: bool = False,
    log_data: bool = False,
    profile: bool = False,
    **kwargs
)
```

</details>

## 引数を入れて、カスタマイズしてみる

Power Query Editorから詳細エディターを開きます。
PythonはPower Queryの`Python.Execute()`関数のなかで実行されていることがわかります。

https://www.powerquery.io/accessing-data/python/python.execute

<details><summary>詳細エディターの中身</summary>

```powerquery
let
    Source = Csv.Document(File.Contents("C:\Users\******\Documents\GitHub\pycaret\datasets\jewellery.csv"),[Delimiter=",", Columns=4, Encoding=932, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Age", Int64.Type}, {"Income", Int64.Type}, {"SpendingScore", type number}, {"Savings", type number}}),
    #"Run Python script" = Python.Execute("# 'dataset' はこのスクリプトの入力データを保持しています#(lf)#(lf)from pycaret.clustering import *#(lf)dataset = get_clusters(data = dataset,model='meanshift',num_clusters=5)",[dataset=#"Changed Type"]),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Run Python script", "Value", {"Age", "Income", "SpendingScore", "Savings", "Cluster"}, {"Age", "Income", "SpendingScore", "Savings", "Cluster"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded {0}",{{"Age", type number}, {"Income", type number}, {"SpendingScore", type number}, {"Savings", type number}, {"Cluster", type text}})
in
    #"Changed Type1"
```

</details>

`get_clusters()`関数の中身を下記のように書き換えて実行します :yawning_face:

クラスターの個数を5個に変更しています。

`python
get_clusters(data = dataset,num_clusters=5)
`
### 散布図の作成

クラスターが0~4までの5個に分かれました。

![pycaretde_2022-03-05-09-30-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/20c1a4b4-ee45-a14c-45a6-a57944f8a537.png)

## Power BIのデフォルト機能でクラスタリング

ここまでPycaretでクラスタリングをしていましたが、Power BI Desktopのデフォルトの機能にもクラスタリングがあります :+1:

### 散布図を作成

散布図を作成し、右上の三点リーダーをクリックすると、**クラスターの自動検索**というボタンが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/219ca35d-367d-3fd6-d3b2-aa35cd1f2c94.png)

### クラスターを作成

クラスターの数は自動検出してくれます。もちろん任意の数を指定することも可能。

![pycaretde_2022-03-05-09-39-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/aa047342-031c-5967-d6fd-5010fc0a54cb.png)

### 完成

これで完成。簡単ですね。Pycaretで作成した散布図よりもクラスターの分かれ方が直感的になっています。Power BI Desktop優秀 :smiley:

![pycaretde_2022-03-05-09-45-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ca434e31-0a39-f637-d730-d0cfefe7723c.png)

## まとめ

Pycaretを使えば、分類・回帰・異常検知などさまざまな機械学習モデルを簡単にPower BIに導入できそう :woman_farmer:
今回の実験ではPower BI Desktopのデフォルト機能のほうが直感的なクラスター分類をできましたが、暗黙的な処理が多いです。Pycaretを使用すれば説明可能な実装ができるというメリットもあるかなと :angel:
**Pythonでなにができるのか**、**デフォルトで何ができるのか**を知っておくのは重要 :thinking:

## 参考資料

https://docs.microsoft.com/ja-jp/learn/modules/perform-analytics-power-bi/5-clustering-techniques