【AWS】QuickSightの便利機能を検証してみた

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

こんにちは。NTTテクノクロスの木村です。
本記事では Amazon QuickSight について、ちょっとしたノウハウや検証したことを共有します。

# 概要
Amazon QuickSightとは、様々なデータの分析及びビジュアライズが容易にできるAWSのBIサービスです。
多様な機能が提供されており、今回は以下3つの機能を使用してみたいと思います。

 - パラメータ(変数)：オリジナルの変数を作成し、フィルター条件や計算フィールドに使用できる
 - カスタムアクション：ビジュアルにURL呼び出しやワンクリックフィルタ等のアクションを指定できる
 - カスタムSQL：データに対してクエリを発行できる

# 構成
構成は以下の通りです。
S3に可視化するデータを格納し、Athenaでテーブル定義して、QuickSightへ連携します。
![アドカレ20211222_木村有希_architecture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/f34139b9-1e31-4641-033e-f519ee48c4c1.png)

# 可視化するデータ
家族が観葉植物好きな関係で、普段より室内の温度・湿度・光量をセンサで測定しています。
せっかく取得したデータなので、可視化してみたい思います。

```
date,room_temp,room_hum,room_light
2021-11-11 0:00:04,22.62,51.19,0
2021-11-11 1:00:06,22.35,50.7,0
2021-11-11 2:00:09,22.21,51.12,0
2021-11-11 3:00:04,21.98,48.87,0
2021-11-11 4:00:04,21.79,47.38,0
 ：
```

|  カラム  |  内容  |
| ---- | ---- |
|  date  |  日付  |
|  room_temp  |  温度  |
|  room_hum  |  湿度  |
|  room_light  |  光量  |

# 手順
## 1. S3にデータを格納
任意のS3バケットに可視化データ(sensor.csv)をアップロードしておきます。

## 2. Athenaにテーブル作成
Athenaのクエリエディタで以下のクエリを実行し、可視化データ用のデータベース、テーブルを作成します。
今回はデータベース名「qs」、テーブル名「sensor」で作成しました。
「S3 URI」には、手順1で可視化データを格納したプレフィックスを指定します。

```
CREATE DATABASE qs;
```
```
CREATE EXTERNAL TABLE IF NOT EXISTS `qs`.`sensor` (
  `date` timestamp,
  `room_temp` float,
  `room_hum` float,
  `room_light` float
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION '<S3 URI>'
TBLPROPERTIES ('has_encrypted_data'='false');
```

## 3. QuickSightの準備
### 3.1 権限設定
QuickSightからS3、Athenaに連携するにあたり、アクセス権限を付与します。
「QuickSightの管理」>「セキュリティとアクセス権限」>「QuickSight の AWS のサービスへのアクセス」 からS3とAthenaへの許可を設定し、保存します。
![アドカレ20211222_木村有希_qs-manage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/3fb9e3bd-6f53-716a-f7b1-1c98f74b7a68.png)

### 3.2 データセット作成
「データセットの作成」>「新しいデータセット」>「Athena」を選択し、データソース名を入力して「データソースを作成」を押下します。
![アドカレ20211222_木村有希_qs-dataset-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/fe3124bb-6b09-209d-ee02-af5c387555ba.png)

テーブルの選択で、カタログ、データベース、テーブルを選び、「選択」を押下し、そのまま「Visualize」に進みます。
![アドカレ20211222_木村有希_qs-dataset-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/b32b259a-7cca-bea4-acdd-a866dc0e6fc2.png)
![アドカレ20211222_木村有希_qs-dataset-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/d23208d4-df0f-6193-c966-6612c9cddedf.png)


## 4. 機能検証
### 4.1 パラメータ(変数)
まずはパラメータを使ってみます。
サンプルとして、2021/11/11～2021/11/20の**温度と湿度の折れ線グラフ、平均値**を描画します。
![アドカレ20211222_木村有希_qs-visualize-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/3d5296cc-eaaf-a755-3161-c354b27489da.png)


特定の日付のオリジナルなパラメータを作成し、データをフィルタリングしてみます。
「パラメータ」>「＋」を選択し、以下の通りパラメータを作成します。
今回は2021/11/15のみを対象として、「20211115」というパラメータを作成しました。

|  項目 |  設定値  |
| ---- | ---- |
|  名前 |  20211115 |
|  データタイプ  |  日時  |
|  時間詳細度  |  日  |
|  時間詳細度  |  2021/11/15 |

![アドカレ20211222_木村有希_qs-visualize-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/c9a5f999-5109-e252-2b46-b17ff25faa74.png)

「フィルター」>「＋」を選択し、先ほど作成したパラメータを指定します。
フィルタリングする対象に「date」を選択し、以下の設定で作成します。

|  項目 |  設定値  |
| ---- | ---- |
|  フィルタタイプ  |  日付と時刻の範囲<br>次と等しい  |
|  パラメータを使用  |  チェック  |
|  日付パラメータ  |  20211115  |

適用すると、2021/11/11～2021/11/20のデータから、パラメータで指定した2021/11/15のデータのみフィルタできました。
![アドカレ20211222_木村有希_qs-visualize-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/39b5a9a3-b9a4-a4d3-b576-a62f6ff562d4.png)


### 4.2 カスタムアクション

次にカスタムアクションです。今回は指定したシートに遷移する「ナビゲーションアクション」を作成します。
まずはアクション時の遷移先とするシート2に、**温度と湿度のテーブル**を作成します。
![アドカレ20211222_木村有希_qs-action-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/33fa2d3e-25c3-c9d6-1ffc-cfc3e032c585.png)

「アクション」で手順4.1で作成したシート1 の折れ線グラフにカスタムアクションを作成します。
シート1を選択し、「アクション」>「カスタムアクションを定義する」から以下の設定で作成します。

| 項目 |  設定値  |
| ---- | ---- |
| アクション名 | テーブルへ遷移 |
| アクティベーション | メニューオプション |
| アクションタイプ | ナビゲーションアクション |
| ターゲットシート | シート2 |
![アドカレ20211222_木村有希_qs-action-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/70dc3857-4d93-22b6-ade0-38bc68bde2ae.png)

作成したアクションを動作確認します。
シート1のビジュアル内で右クリックし「テーブルへ遷移」を選択すると、シート2へ遷移できました。
![アドカレ20211222_木村有希_qs-action-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/ff0e0478-a3be-2fc0-6c52-705cbedb632a.png)
![アドカレ20211222_木村有希_qs-action-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/6d0de067-5ef0-93ea-73aa-aab3ff7f2a55.png)

### 4.3 カスタムSQL
次にカスタムSQLです。サンプルとして、**温度・光量の散布図と相関係数**を描画してみます。

まずはデータセット作成でカスタムSQLを実行し、相関係数を取得します。
手順3.2と同じ手順でデータソースを新規作成し、テーブルの選択で「カスタムSQLを使用」に進みます。
![アドカレ20211222_木村有希_qs-sql-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/1049afab-fdb3-fae6-dcce-c02a05b9e47b.png)
「カスタムSQLクエリの入力」でクエリを入力して「クエリの確認」>「Visualize」を選択します。
今回作成したクエリ名は「corr_sql」、入力したクエリは以下の通りです。

```
select corr(room_temp, room_light) as corr from "qs"."sensor";
```
![アドカレ20211222_木村有希_qs-sql-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/00faadd3-d474-8d75-e663-1199f0204560.png)

散布図と相関係数を描画します。
相関係数はデータセットに「corr_sql」を選択し、ビジュアルタイプに「KPI」を選択します。
![アドカレ20211222_木村有希_qs-sql-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/39594faf-d1a2-3844-91c2-5a0139caeab1.png)

次に散布図を作成します。
デフォルトのデータセットが「corr_sql」なので、「この分析のデータセット」で「データセットの追加」を選択し、手順3.2で作成したデータセット「sensor」を追加します。
![アドカレ20211222_木村有希_qs-sql-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/4106c7bc-01c2-daf5-a06d-a04fed77e698.png)
![アドカレ20211222_木村有希_qs-sql-5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/79848cef-8c26-e85d-916d-1e5ca4b34eea.png)

データセットに「sensor」を指定し、ビジュアルタイプに散布図を選択すれば、描画完了です。
温度と光量は相関関係あるかと予想したのですが、期待していたより弱い相関でした。
![アドカレ20211222_木村有希_qs-sql-6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/8b7425f0-0f9a-9e6c-63c2-7cee3eb23e00.png)


### 4.4 ダッシュボード化
最後に作成したビジュアルを整形＆まとめて、テーマを「Seaside」に変更しダッシュボード化してみました。
![アドカレ20211222_木村有希_qs-dash-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/ec465261-beb1-2dac-7048-a508d033d8ac.png)

# おわりに
今回はデータが少量のため簡易な分析でしたが、得た知見を今後のデータ可視化作業で応用できればと思います。
また可視化データは手動で持ち込みましたが、AWS IoTを使えばデータ連携も自動化できそうです。
QuickSightは新機能がどんどん追加されているため、これからも継続してウォッチしたいですね。

それでは、 [NTTテクノクロス Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ntt-tx)  23日目も、引き続きお楽しみください。

# 参考
[Amazon QuickSight とは](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/welcome.html)