QuickSightを使ってみました

# Introduction
本記事は、[ハンズラボ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/handslab) 15日目の記事です。

## きっかけ
AWSのQuickSightでどのようにデータが可視化されるのかに興味を抱きました。しかしハンズオンやどこかのデータを元に可視化するのは、興味を覚えませんでした。
そこで、社内Slackにおいて、どんなスタンプが使われているのかを可視化してみようと感じました。


## 結論
早速ですが、可視化してみるとこのようになりました。
縦軸はスタンプの使用数、横軸は時間軸です。
なお、プライバシーの問題があるため、どんなスタンプがあるのかを見せられません。

![slack_sticker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262742/4cd12532-0b31-4f97-8e5e-4d7f7c83b6d6.png)

申し訳ないですが、可視化されたグラフのみを紹介いたします。

QuickSightを用いることで、上記のごちゃごちゃしたデータから見たい部分のみを抽出することが出来ます。
![slack_nov.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262742/195dd1a7-26fb-c82f-04e7-450fc90f924f.png)


## 本日のお品書き
・Slack APIを用いてスタンプ情報を取得する。
・QuickSightでサクッと可視化

### 対象者
・Slack APIに興味がある人
・1を聞いて10を理解できるエンジニア
・QuickSightを使ってみたい方
・**Macユーザー**の人
・データの前処理に苦しむ方

### 非対象者
・Slack APIが超お得意な人
・説明下手な筆者を攻撃しようとするエンジニア
・QuickSightの最高到達クエストをクリア済みの方
・**Windowsユーザー**の人
・データの前処理エキスパートの方

## 自己紹介
![smile.jpg](https://qiita-image-store.s3.amazonaws.com/0/262742/38a82ae5-98e6-8d78-b461-3d14024af15d.jpeg)

[自己紹介ページ](https://qiita.com/Senple/items/b47374e68e4d8d26d0cb)

### 環境情報

```terminal:環境情報
macOS Monterey ver:12.6.1
Python 3.9.13
```

最近はPipenvを使っています。
Pipenvに関する詳細は、こちらの記事がわかりやすかったので、リンクを貼っておきます。(古い記事ですのでご注意ください)
要約すると仮想環境でいい感じにライブラリを管理してくれるバージョン管理システムです。

https://www.m3tech.blog/entry/python-packaging#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%86%E3%83%84%E3%83%BC%E3%83%AB

<details><summary>Python2系とかPython3系の意味が分からない人へ！</summary>
Pythonには2系と3系があって、最近始めた人ならほとんどPython3系だと思います。一応バージョンを確認する方法を記載しておきます。
MacOSに入っているターミナル(Terminal)でPythonのインタラクティブ(対話)モードを起動すればバージョン情報が表示されます。

```
$ Python
> Python 3.9.13 (main, Aug 17 2022, 11:46:02) 
[Clang 13.1.6 (clang-1316.0.21.2.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
```
インタラクティブモードを辞めるには*exit()*を入力しましょう！

</details>

# Let's Start

## Slack APIを用いてスタンプ情報を取得する。
Slack APIの導入に関しては、割愛しますので過去の記事を参照してください。

https://qiita.com/Senple/items/0e4626307b4559d26bc5

https://qiita.com/Senple/items/47e45f5e93ba225ddad1

今回は、`メッセージが投稿された時刻`と`その投稿にひもづくスタンプ`、`スタンプを押したユーザーの情報`を取得しています。
なお本来は、メッセージが投稿された時刻ではなく、スタンプが押された時刻を取得したかったのですが、そのデータはAPIに含まれていないため、メッセージが投稿された時刻を利用しています。

QuickSightには、CSVで取り込みますので、事前にCSV形式で出力しました。

https://note.nkmk.me/python-csv-reader-writer/

なおSlackのtimestampをQuickSightが読み込んでくれなかったので、事前に日本の日付形式に修正しています。[^1]
> "ts": 
メッセージが投稿されたタイムスタンプ。このタイムスタンプは、オンラインの UNIX 時間変換ツールを使って日付に変換できます。
https://slack.com/intl/ja-jp/help/articles/220556107-Slack-%E3%81%8B%E3%82%89%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E6%96%B9

https://note.nkmk.me/python-unix-time-datetime/


作成したCSVは下記のような構造にしました。[^2]
|  ts  |  sticker  | user  | 
| ---- | ---- | ---- |
| 2022-12-13 17:54:32  |  hoge  | user_id |
| 2022-12-13 17:27:32  |  fuga  | user_id |


## QuickSightでサクッと可視化[^3]

QuickSightを初めて使う場合は、AWSの登録とは別で利用登録が必要となるようです。
費用の詳細等はこちらを参考にしてください。自分はスタンダードプランで作成しました。

https://dev.classmethod.jp/articles/amazon-quicksight-free-tier-free-trial/

利用登録を済ませ、マネコンをぽちぽちした結果、CSVを読み込むことに成功しました。

そしてぽちぽちすること数分後、、、

![slack_sticker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262742/4cd12532-0b31-4f97-8e5e-4d7f7c83b6d6.png)


冒頭でも紹介した謎のグラフの完成です。
縦軸はスタンプの使用数、横軸は時間軸です。
CSVのレコード数がそのままスタンプの使用数として、縦軸へ出力されています。(同じ投稿に一人の人間が特定のスタンプを複数回押すことはできないため)

しかしこのままでは何が何だかわからないため、フィルターを用いて、時間軸で分割します。

やり方としては、フィルターを用いて、1ヶ月間のみを表示します。
importしたデータから時系列を意味するパラメータであるtsを選択します。
![filter_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262742/353cd560-fa98-0f9e-be4e-8ab0ec3b0c22.png)

このように、期間を選択できるようになるため、こちらで任意の日付に設定します。
自分は、11月1日 ~ 11月30日を選択しました。
![filter_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262742/a0b18616-5e00-b218-f114-7f22cd28f620.png)



![slack_nov.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262742/195dd1a7-26fb-c82f-04e7-450fc90f924f.png)

マネコンから操作できるので、コードを書き換える必要はありません。
便利ですね。

マッピングされる要素を自分で調整する必要がない点が楽だと思います。
ただ、上記の画像から分かる通り、有意な情報をグラフから読み取るためには、もう少しマネコンをいじる必要があります。
今後はそのあたりを進めていく予定です。


# To be Continued
## 終わりに
今後もTwitterでこのようなデータの可視化を発信しています。興味があったらご覧ください。 ~~大抵はくだらないことです。~~

[Sempleのツイッター](https://twitter.com/Semple_smile)

## Future Work
今回はQuickSightの検証ということで、データの可視化を簡単に試しました。
初めてQuickSightをさわってみましたが、データから有意な情報を取得する目的で使いやすいと感じました。
ソースコードを修正した方が早い場合もありますが、選択肢としてQuickSightを用いたデータの可視化もできるようにしておくと良いと思います。
今後は、曜日ごとの統計だったり、月ごとの統計、スレッド内のリアクションも取り込めたら面白いと感じています。

なお、Slack APIに関しては、こちらで試行錯誤してる方がいるので、事前に見ておくのも良いかもしれません。

https://qiita.com/mpyw/items/5a8a90713a56196a55ae

## 参考記事
https://qiita.com/kokorinosoba/items/e9ab9398af5b44d2ac9a

https://slack.com/intl/ja-jp/help/articles/220556107-Slack-%E3%81%8B%E3%82%89%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E6%96%B9

https://note.nkmk.me/python-csv-reader-writer/

https://note.nkmk.me/python-unix-time-datetime/

https://note.nkmk.me/python-datetime-usage/

[^1]: QuickSightでそのまま読み込める可能性もあります。しかしPythonを書き換える方が容易だったので、大して調べきれていません。Future workですね。
[^2]: 今回の可視化では、user_idは使っておりません。
[^3]: QuickSightが既に、サクッと可視化って意味なので、頭痛が痛い状態ですね。