PowerBI: Python Visual を使った箱ひげ

# 背景
箱ひげが必要になった
その選択肢を考えると以下で

- [追加のビジュアル](https://appsource.microsoft.com/en-us/marketplace/apps?product=power-bi-visuals) 
- カスタムビジュアル作る
- Python
- R

Python は勉強中でもあったので物は試しとやってみた。

# 概要
- 利用例二点
    - [簡単な利用例](#簡単な利用例)
    - [グルーピングしながら渡す例](#グルーピングしながら渡す例)
- [躓きと対処](#躓きポイントとか)

# SampleData

|height|age|binary|
|-|-|-|
|172|25|動物|
|170|22|人|
|169|42|動物|
|175|49|人|
|184|38|人|
|163|29|人|
|174|35|動物|
|172|22|人|
|189|21|人|
|179|43|人|
|171|44|動物|

# 簡単な利用例
1. age, height を渡したら<br>![利用例１引数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/98d3271e-b929-3846-88a6-7606b1b718d5.png)
1. 以下スクリプト書くだけで表示

```python:データをそのまま表示して、軸名渡すだけ
matplotlib.pyplot.boxplot(dataset, labels = dataset.columns)
matplotlib.pyplot.show()
```
:::note info
labels 渡さなければ配列添え字
:::
 
![利用例１python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/07b4ecbd-4671-2537-5607-2ff8aab8ad34.png)

こんな簡単に出せるならこれもありかな、と思うレベル
![利用例１図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/63aa8740-d39e-4f6c-dfe7-f5172184207c.png)

# グルーピングしながら渡す例
1. age, binary を渡して<br>![利用例２引数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/d9ff9083-71d7-f0b5-a579-bb2ab321c482.png)
1. 以下スクリプトで表示

```python:グルーピングして表示
matplotlib.pyplot.rcParams['font.family'] = 'Meiryo'
ages = [group['age'] for name, group in dataset.groupby('binary')] 
matplotlib.pyplot.boxplot(ages, labels=set(dataset['binary']), autorange=True, showmeans=True)
matplotlib.pyplot.show()
```
![利用例２図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/dbbead0c-1e38-1085-61c0-5f2e798977b1.png)

## python 補足
> matplotlib.pyplot.rcParams['font.family'] = 'Meiryo'

日本語表示用

> ages = [group['age'] for name, group in dataset.groupby('binary')] 

'binary' でグルーピングしたデータを用意

> set(dataset['binary']) 

keys ・・あ、グルーピングしたとこにkeys あったね・・groups.keys() でも

# 躓きポイントとか<br>
![EditorIcons.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/9b2a2585-a777-2290-c001-efc3c1e22412.png)

- 動かないときは、エディターで Python 実行させて確認するのが手っ取り早い
- Python 環境で動いたら、再度貼り付けて、再実行
- 出力場所は %userprofile%\PythonEditorWrapper_{uid} 
    - 後で勝手に削除されてるような感じ？
- エディタでなら import 済の部分は見られるように思うが、Preamble ではなさそう
    - Local Python 環境でDebugが出来るようにしてくれてのはありがたい<br>
![VSCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/203e1944-c5c9-cf64-3795-1fe5e27583ae.png)
- dataset として Preamble されてるものを編集は出来ないので、ものによっては Python 側で加工が必要
    - [グルーピングの例](#グルーピングしながら渡す例) のようにして、dataset から取得・整形すればOK
- 日本語が化けたら、フォント設定。pythonの話。

# 動作例
一呼吸置く感じで、ちょっと微妙。
ただ、キャッシュが効けば速くはなるみたい？
箱ひげが Python で、散布図とスライサーが標準のビジュアル
![箱ひげ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/cdc03aa1-0c16-4bdb-e0f2-6412f66475fe.gif)

# 参考

https://qiita.com/h_kobayashi1125/items/e10986ff223306ed9f2f

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

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

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.boxplot.html

# あとがき
データ点数減らせば速いのかなと考えていたので、あらかじめパーセンタイル計算しておけば速いんじゃね？と思ったわけだが・・
データ量よりも、Python との連携が重いって感じなので、使いどころ次第ですね。

あと、Python だと以下のように、barchart で書く方法もあるんだな、と勉強になった
このままじゃ Candlestick(箱ひげ) には似ても似つかないですが :laughing: 

![箱ひげ plotted by bar](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/fb4b21ff-3e79-13a3-225f-9504715972bd.gif)


https://www.statology.org/matplotlib-python-candlestick-chart/