【Python/AWS】第5回 AthenaでクエリしたデータをQuickSightで可視化【データ分析】

# 1. はじめに

本記事は【Python/AWS】の第5回として前回に引き続き、
AWSのサービスを利用した一連のデータ分析の続きとなります。

**<font color="blue">▼前回の記事はこちら▼</font>**

https://qiita.com/kawanago_py/items/f2dd2da9b7c3618a5146


私自身、AWSのサービスを触るのは初めてだったので、
細かい説明など不足する点はあるかと思いますが、
大まかな流れをこちらで解説していきたいと思います。

本分析の全体像は以下のようになります。
![AWSアーキテクチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/b791565c-37c8-2bb6-2e52-5c94703fb6ec.png)
全体の分析目的は以前の分析から継続/発展して、
**<font color="red">「Splatoon3」におけるコンテンツのユーザー満足度調査</font>** です。

収集したデータから項目ごとに感情分析を行い、
ポジティブ/ネガティブの値を可視化することが最終目的です。

**<font color="blue">▼以前の記事はこちら▼</font>**

https://qiita.com/kawanago_py/items/38fbf30c3e1d1580c76c

## 1-1. 本記事の概要と目標

今回のテーマは **<font color="red">「S3のデータをQuickSightで可視化」</font>** で、
全5回の分析フローの最終回となります。

数日分のCSVデータがS3に格納されているので、
Athenaで一度クエリしてから可視化を行います。

今回作成するパートのイメージはこのような形です。
![可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/23fac38b-7137-8628-5f06-070af729ac16.png)
使用するサービスとそれぞれの役割は以下の通りです。
**Amazon S3： 様々な形式のデータを保管できるストレージ
Amazon Athena： 標準的なSQLを使用してS3内のデータを直接分析できるクエリサービス
Amazon QuickSight： 様々なソースのデータを結合できるクラウド規模のBIサービス**

なお本記事ではAWSの登録方法や初期設定については取り上げていません。
必要に応じて以下の記事を参考にして下さい。

https://aws.amazon.com

https://pages.awscloud.com

## 1-2. 全体の流れ

本記事の作業の流れとしては以下の通りです。
**１．AthenaからS3のcsvデータをクエリ
２．作成したテーブルを元にQuicksightで可視化**

# 2. Amazon Athenaについて
## 2-1. Athenaの概要

Amazon Athenaは、SQLを使用してS3内のデータを
直接分析することを容易にするクエリサービスです。

今回は可視化に使うcsvが複数存在しているため、
可視化用のテーブルを作成するために使用しています。

**<font color="blue">▼AWS Glueの公式紹介▼</font>**

https://aws.amazon.com/jp/athena/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc

## 2-2. 他の分析ツールサービス

データ分析のツールとしては他にも存在します。

Athenaは最も手軽に使用できるツールで、
データ規模や運用方法による使い分けが推奨されています。
![Athenaとか.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/3f73b04e-1715-adb9-aba8-9328ab7b5b4a.png)
>以下リンク先の資料より引用
>[【初級】AWS でのデータ収集、分析、そして機械学習](https://pages.awscloud.com/rs/112-TZM-766/images/C2-05.pdf)

# 3. QuickSightについて
## 3-1. BIツール

![graph-3068300_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/2ebbfb79-ad83-2764-5469-16dcdf417276.jpeg)
BIは **<font color="red">"ビジネスインテリジェンス"</font>** の略であり、
企業が持つデータをグラフなどで可視化することで
業務や経営の判断に役立てるためのツールです。

近年は企業が持つビックデータの活用として、
BIツールを利用した経営判断の重要性が高まっています。

**<font color="blue">▼BIツールの参考ページ▼</font>**

https://bi.lakeel.com/course/detail01/

## 3-2. QuickSightの特徴

QuickSightではデータを高速表示、集計するために
内部で<font color="red">SPICEというインメモリDBを採用</font>しています。

そのため様々なデータの可視化方法を
その場で試しながらデータを確認することができます。

またQuickSight内で<font color="red">機械学習による分析も可能</font>です。
例えば使用しているデータが時系列データであれば、
その先の変化を予測する機能も搭載しています。
![spiceの図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/91d48787-9a83-44ef-66ed-14ff811f4c67.png)
>以下リンク先の資料より引用
>[AmazonQuickSightダッシュボード表示速度の最適化](https://pages.awscloud.com/rs/112-TZM-766/images/%5B%E7%AC%AC%E4%BA%8C%E9%83%A8%5DAmazonQuickSight%E3%82%BF%E3%82%99%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9B%E3%82%99%E3%83%BC%E3%83%88%E3%82%99%E8%A1%A8%E7%A4%BA%E9%80%9F%E5%BA%A6%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96_1014.pdf)

**<font color="blue">▼QuickSightの参考ページ▼</font>**

https://www.stylez.co.jp/columns/what_is_amazon_quicksight/

https://www.sunnycloud.jp/column/20210930-01/

# 4. 実践

大まかなと説明の流れとして、
**１．AthenaからS3のデータをクエリ
２．作成したテーブルをQuickSightで可視化
３．可視化したデータの確認**
の3段階に分けて確認をしていきます。

## 4-1. AthenaからS3のデータをクエリ

https://us-east-1.console.aws.amazon.com/athena/home?region=us-east-1#/landing-page

上記のリンクからAthenaのホーム画面に移動したら、
左側のメニューから **[クエリエディタ]** を選択します。
![クエリエディタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/4ab4caac-f535-ce71-797c-2a3593fff9fe.png)
クエリエディタを始めて開いた際には、
出力先をS3フォルダを選択する必要があります。
**[設定を編集]** を選択します。
![最初の設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/f3effb69-f954-1b80-50a5-51a200e4a5cb.png)
**[S3を参照]** から出力先のフォルダを選択し、
AWSアカウントのID(12桁の数字)を枠に入力します。

また私は個人での利用のみであるため、
クエリ結果に対する完全なコントロールを割り当てました。
最後に **<font color="orange">[保存]</font>** を押しておきます。
![初期設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/921e7b02-00bd-578a-8e02-c8b67d506a58.png)
エディタ画面に戻ったら以下を入力して実行します。
``` sql
CREATE EXTERNAL TABLE IF NOT EXISTS sentiment_table (
  UserId STRING,
  tweetID STRING,
  CreatedAt TIMESTAMP,
  SearchWord STRING,
  Text STRING,
  RTcount INT,
  RPcount INT,
  LKcount INT,
  QTcount INT,
  NumKeyWord INT,
  Sentiment STRING,
  Positive FLOAT,
  Negative FLOAT,
  Neutral FLOAT,
  Mixed FLOAT
  ) 
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 's3://for-twitter-api-bucket/csv_data/' 
TBLPROPERTIES ('has_encrypted_data'='false',  'skip.header.line.count'='1')
```
csvデータなので`FIELDS TERMINATED BY ','`、
`LINES TERMINATED BY '\n'`として設定をしています。

`LOCATION`はデータの参照先をしており、
`'skip.header.line.count'='1'`で先頭1行を飛ばしています。

これで可視化に必要なテーブルの作成は完了です。

:::note info
**【csvファイル作成時の注意点】**
pandasでデータフレームをcsvに変換する際、
特に引数を設定しないと行の区切りがデフォルトの`"\r\n"`になります。
Athenaでは`LINES TERMINATED BY '\n'`しか指定できないため、
`df.to_csv(line_terminator="\n")`を指定しておく必要があります。
:::

**<font color="blue">▼テーブル作成の参考ページ▼</font>**

https://qiita.com/yokobonbon/items/d36f50ddf8ca681a6944

https://qiita.com/yoshiyama_hana/items/6b70e049b11d048a571b#3-athena-%E3%81%A7%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E6%83%85%E5%A0%B1%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/data-types.html

## 4-2. 作成したテーブルをQuickSightで可視化

https://ap-northeast-1.quicksight.aws.amazon.com/sn/start/analyses

上記のリンクからQuickSightのホーム画面に移動します。
初めてQuickSightを利用する場合は初期設定が必要なので、
必要な方は[こちらの記事](https://qiita.com/yoshiyama_hana/items/6b70e049b11d048a571b#4-quicksight%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参考に設定を進めて下さい。

以下の画面に移動したら、 **<font color="royalblue">[新しい分析]</font>** を押します。
![QuickSight HOme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/8d62ddd5-5a04-ed51-06db-d34fb212f5b4.png)
**<font color="royalblue">[新しいデータセット]</font>** を選択します。
![新しいデータセット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/89d60779-721d-5c8f-5414-d3ed045b7613.png)
先ほど作成したテーブルを使用したいので、
**[Athena]** を選択し、名前を入力します。
![Athenaえらぶ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/920bab97-32ed-3579-896d-912149f26ede.png)
自分が作成したデータベースを選択し、
可視化するテーブルを選択します。
![作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/b0c06ead-091a-0813-487f-63f9acc0a62e.png)
今回はそこまで大規模なデータではないので、
SPICEにインポートして分析を行います。
![visualize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/fd37b2ae-d105-f7cb-6c79-6904767fd358.png)
これで可視化の準備は完了です。

## 4-3. 可視化したデータの確認
画像と同じ画面に移動したら、赤枠部分で
確認したいラベルを選択するだけで可視化が可能です。
今回は **<font color="red">[searchword],[negative],[positive]</font>** の3つを選択します。
![ラベルを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/9bce898a-256b-700b-1043-00ce08d16cb5.png)
画面右上の▽を開くと表示の設定が可能です。
![設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/1d72d6e9-5ff3-f099-65d6-fbefb62139cd.png)
デフォルトの表示では判別確信度の合計なので、
この表示を合計から平均に変更します。
![平均に変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/5b1b2a3e-d9b3-a545-af93-1c204fbaaade.png)
画像は **[Negative]** で降順になっています。
やはり **"通信エラー", "味方落ち"** などは上位になっています。
![Negative.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/60798430-d3e3-2820-a273-b8a65a5e616e.png)
今度は **[Positive]** で降順に変更します。
![positiveに変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/b2e9bb02-feed-d783-d3d5-c1de39a26849.png)
**"ナイス", "ステージ"** などは無関係のデータを含みそうですが、
**"333倍マッチ", "グレートバリア"** はある程度正確かと思います。
![positive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512226/013a8831-60c0-79c3-ed8f-94bdc8c4f607.png)
上記のグラフでは各ワードの出現数が分かりません。

<font color="red">ワードによってはサンプル数がとても少なく、
全てを均等に扱うのは不適</font>だと思うので、
ここの表現方法についても検討が必要です。

このデータの純度をもっと高めた後であれば、
各ブキやステージごとの評価を見ることで
コンテンツの改善点などをより明確にできそうです。

# 5. 所感と今後の展望
## 5-1. 躓いた点

**・クエリする際のSQL文
・csvの区切り文字**

まずはAthenaを使ってS3のデータをクエリする際、
シンプルにSQL文に慣れていないことに気づきました。

一通りSQLの学習はしているものの、
再度<font color="red">SQL復習の必要性</font>を感じました。

そして注意書きもした<font color="red">csvの区切り文字</font>ですが、
Athenaでクエリする際にとても困りました。

実際にローカルでcsvの中身を見て`\r\n`に気付き、
Athenaが`\n`にしか対応していないことを調べてやっと
次に進めたので自分のメモとしても注意書きしました。

## 5-2. 今後の展望

今回までで目的の可視化は完了したことになりますが、
やはり **<font color="red">データの収集と精製にはまだ課題がありそう</font>** です。

AWS上での分析フロー構築という目標は達成したので
連投していた記事はここで終わりとなります。

気が向いたら<font color="red">EC2上でjupyter-labを開く方法</font>や
<font color="red">データ精製方法の検討の様子</font>などの記事も
いずれ投稿しようかなぁ、なんて考えています。

また今回のフローを流用した他コンテンツの分析や、
データベース系のサービスにもいずれ触れてみたいと思います。

## 5-3. さいごに
本記事を読んで頂いてありがとうございました。
また連載した5記事を全て読んで下さった方(もしいたら)、
ご覧頂いて本当にありがとうございます。

まだまだ稚拙な記事ばかりですが、
同じく初学者の方の参考になっていたら嬉しい限りです。

ぜひコメントや質問、お気軽に宜しくお願い致します。

# 連載記事一覧

https://qiita.com/kawanago_py/items/68999167adb87001764c

https://qiita.com/kawanago_py/items/aabbe6c6d129c915f2ad

https://qiita.com/kawanago_py/items/9f86f9d3f4acdb7a5096

https://qiita.com/kawanago_py/items/f2dd2da9b7c3618a5146