Pythonコード5行でBIツールが作れる - PyGWalker -

# はじめに
この記事はNTTテクノクロス [Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ntt-tx)の15日目の記事です。

こんにちは！NTTテクノクロスの秋葉です。
普段は農業ICT関連の業務に携わっています。
案件以外では社内のデータサイエンティスト養成講座のサポーターや研修の講師なども担当しています！
今回アドベントカレンダー初投稿ということでテーマに悩んだのですが、
ちょうど最近知った可視化に便利なツールがあったのでご紹介します。

# 「ちょっとしたグラフを作る」とき、何を使ってますか？

私は本当に簡単な可視化であればエクセルで済ませてしまうこともありますが、
多くの場合は Pythonで読み込んでMatplotlib やPlotlyを使って可視化しています。

可視化って楽しいので、色々試しているうちにあっという間に結構な時間使っているんですよね。。
 

あまり時間をかけずにデータの概要を把握したい!という方は、ぜひ今回ご紹介するPyGWalkerを使ってみてください

# PyGWalkerとは

[公式](https://github.com/Kanaries/pygwalker)より
> Turn your pandas dataframe into a Tableau-style User interface for visual analysis

→PyGWalkerはDataFrameをTableauっぽく可視化することができるツールです。

> PyGWalker (pronounced like "Pig Walker", just for fun)

→読み方は「ピッグウォーカー」のようです。
　読み方わからなくてふわっと濁していることも多いので明言されているとありがたい..！

# はじめかた

実際に使ってみましょう！

(ご自身の環境に合わせて)インストールして...
```
% pip install pygwalker
% conda install -c conda-forge pygwalker
% rye add pygwalker
```


Jupyterを立ち上げたら、以下のコードを実行するだけ！

```python:jupyter lab
import pandas as pd
import pygwalker as pyg

df = pd.read_csv('./<your_csv_file_path>.csv')
walker = pyg.walk(df)
```

起動直後の画面は以下の通りです。

![1起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/895a8177-eee0-bc37-0b26-d8bbd185964d.png)
すごい！これだけで立派なBIツールです。:tada:

左側のField Listに読み込んだdataframeのカラムが出てきています。
上の欄が日付や文字列、下の欄が数値データで自動で分類してくれるようです。

# さっそく使ってみる！
普段の業務でよく使うグラフをいくつか作ってみます。

今回PyGWalkerには、複数のセンサで取得した温湿度の時系列データ読み込ませてみました。

## 散布図

X-Axis、Y-Axisそれぞれに数字データをドラッグ&ドロップすると散布図ができます。
(左上の集計ボタンがONになっていると集計値だけ表示されてしまうので注意!)

数値データとしては「温度」と「湿度」があるので、そちらを利用します。

![2散布図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/36de6365-8880-d5f8-0c95-f8992e79a3ef.png)


  
Color欄でセンサごとに色を変えたり、Filters欄では表示するデータを絞ることができます。

![3散布図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/290ea069-a006-9ec9-56a8-fd57307c6bda.png)

とっても簡単ですね:ok_woman:
## 時系列グラフ 
X-Axisに時間、Y-Axis数字データをドラック&ドロップすると時系列のグラフが表示されました。

Filtersには複数項目(キャプチャではtimeとsensor)を設定できるので、確認したい対象の範囲を細かく指定できます。

![4-1時系列グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/543a67cf-58e8-64d7-1ffc-6f732006313f.png)


他のデータ項目と比較するためにグラフを複数並べたり、X-Axisを時間ごとの集計列に差し替えることで、1時間単位の平均・最高・最低などを表示することも可能です！

  
![4時系列グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/7f9f5931-0183-ffee-ebeb-bfcb9bab98ed.png)


これがマウスをポチポチするだけでできるのはとってもありがたいです〜



## その他機能
データをX-Axis、Y-Axisに配置するとグラフの種類が自動選択されますが、他の形式も選べます。
![8その他.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/bb87a2b4-e504-5148-5540-abf5f5226fed.png)


試しに時系列データのときに使用した温度のデータを日毎で集計してボックスプロットにしてみました。

グラフを変えると同じデータでも違った発見ができたりするので楽しいですね！

![6その他.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/495e9270-650b-9adf-662f-ec90816f1214.png)


他にもDataタブでは読み込ませたデータを表形式で確認できますし、確認して不要なデータがあれば可視化の対象から除外することもできます。
![7その他.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/b632b194-60f4-b2f9-71e3-15f40df1a83d.png)


他にも色々な機能があるので、使いこなせば可視化にかかる時間がだいぶ削減できそうです！

# 事前にデータの加工が必要！
PyGWalkerはDataFrameを読み込むだけでBIツールとして使えてとても便利です！ 

ただし、PyGWalkerは1グラフにつきDataFrame2列分のデータをグラフ化するツールなので
この記事でご紹介したような1つのグラフに複数のセンサのデータ推移をプロットするようなグラフを作図するためには事前にデータの加工が必要です。


通常DataFrameでは左のような形でデータを持っていることが多いかと思います。  
この状態のままだとPyGWalkerでは　「"time" と "センサー001_温度"」 　のようなグラフしか作成できません。


今回のようにFilterやColorを使ってセンサごとの色分けなどをしたい場合は、右のような形で温度で1列にしてそれぞれがどのセンサの値かがわかる列を追加しておきましょう。

![5その他.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620691/54976883-281d-33f8-a5bd-81c8c97b2ba2.png)

時間ごとの集計をしたい場合にも同様に、集計したい単位の時間列を生成して追加しておく必要があります。

普段慣れている形とは違う形に作り変えるので多少手間ですが、これはPyGWalker特有というわけではなく、他のBIツールを使う際にも同様の加工が必要になるのかなと思います。

# さいごに

データ可視化は楽しいのですが、そこに時間を浪費してしまうと本末転倒です

素早く可視化して考察を深めることに時間を使いたいですね。
まずはPyGWalkerでデータの全体を把握して、深掘りたくなったら他の可視化方法を使う という使い分けがいいのかなという気がしました！

明日は @w-ryu さんの「オリジナルLive2Dをイチから作って色々活用してみた」です！お楽しみに〜！

# 参考

* [PyGWalker 公式ドキュメント](https://docs.kanaries.net/ja/pygwalker)
* [PythonでTableau風 BIツールによる視覚的データ探索をやってみよう 〜PyGWalker〜](https://qiita.com/hima2b4/items/dfdfb77cf3a588f4131a)
* [【Python】PyGWalkerでTableuっぽくグラフを描きたい。](https://choron81.hatenablog.com/entry/2023/03/01/000000)