Redashの有用性をご存じでない？

[Ateam cyma Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-cyma)、14日目です！
14日目は [株式会社エイチーム](https://www.a-tm.co.jp/) のちょっとおちゃめな帰国子女エンジニア [@NamedPython](https://qiita.com/NamedPython) がお送りします。(母国語は忘れました:stuck_out_tongue_closed_eyes:)

[5日目](https://blog.namedpython.site/entry/cyma-adventc-2019)では「見える化を新卒が進めるといい感じに成長できたよ〜」というお話ともうひとつ、 「[Redash](https://redash.io)は最高だよ〜」というお話もしました。そこで今日はRedashについてのお話です。

とはいってもcymaのRedashを安易には公開できないので、自前でインスタンスを用意してやりました。

## Redashってなんなのよ

俗にいうBIツールというやつです。データの分析や、可視化に特化したツールで、データベース等の情報源を繋ぐことでデータの抽出やグラフ化が容易にできます。
データベースからのデータ抽出といえば`SQL`を書くことが必要かと思われますが、そこすらグラフィカルなUIにした非エンジニアにも扱いやすいツールも出てきています。
Redashとよく比較されるものとしては、

- metabase
- Tableau
- Google Data Portal
- Superset

等があります。

RedashのUIはこんな感じ↓↓
<img width="1293" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/caedf43d-b509-c75b-83bd-18eb6121dde8.png">

じゃあRedashはどんなBIツールかという特徴を簡単にまとめると

- OSS :v:
- SQLでゴリゴリデータを引ける :muscle:
- HTMLコンテンツを結果に描画できる :paintbrush: 
- SQLで引いた結果をさらにSQLで引ける(**Query Results**) :arrows_counterclockwise:

といった感じです。**Query Results**が極め付けに最強です。

ここからは、Redashの機能の一部とその設定方法を紹介していきます！

## データを取得する

Open data等からRDSにデータを注入してやろうとも考えましたが、時間の関係で**Google Analytics**のデータを用いて紹介していきます。
幸いなことに、[自分のブログ](https://blog.namedpython.site)には数年前からGoogle Analyticsを導入しているおかげで多少データがたまっています。

### Data sourceの追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/d8721a3c-29b9-b325-bb18-4b80c13487b5.png)

RedashにはすでにGoogle Analyticsと連携する機能が備わっています。ここでは詳細には解説しませんが、少しステップを踏む必要があるので、挑戦する際は[公式ドキュメント](https://redash.io/help/data-sources/setup/google-analytics)をご参照下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/d1b578fa-59c5-ea32-63bb-461fc1dae678.png)

Data sourceに名前をつけ、ドキュメントの手順に従い取得した認証情報のJSONをアップロードします。
すべてのData sourceには、Test connectionのボタンが必ず設置されているので、接続に成功するまでにらめっこできます。

![コメント 2019-12-14 045700_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/6906a9e0-afef-ab91-a5ac-caee99be6193.jpeg)

### データの取得方法

**「SQLでゴリゴリデータを引ける」**なんて言った矢先ですが、Google AnalyticsのData sourceは**SQLを書くことができません**。ここで書くのは、**APIリクエストのBody**なのです。

例えば、「**ページタイトル**毎の**UU**を2年前から今日にかけて降順でみたい」というようなものを書くとします。

画面はこんな感じ。きちんと取得できていますね:ok_hand:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/861fdfe0-e390-19af-e066-183a75a5701c.png)

スニペットもドン。

```json:
{
    "ids": "ga:********",
    "start_date": "365daysAgo",
    "end_date": "today",
    "metrics": "ga:users",
    "dimensions": "ga:pageTitle",
    "sort": "-ga:users"
}
```

`ga:users`であったり、`ga:pageTitle`のようなキーワードが見て取れると思います。

#### FAQ

Q: 「そのキーワードはどこから知るんじゃ！」
A: 「[Google Analytics APIのDimensions & Metrics Explorer](https://ga-dev-tools.appspot.com/dimensions-metrics-explorer/)から探しましょう」

この中から、自分の見たいメトリクス、その切り口を探します。
例えば、Google Analyticsに**Adwords**をつないでいる人は**CPA**(1CVあたりの広告費)を、`ga:costPerConversion`や`ga:costPerGoalConversion`をメトリクスに指定することで得られます。

切り口は、**オーガニック**, **リスティング**などの流入元(`ga:medium`)や日付(`ga:date`)など様々な切り口で分析できます。

## Query Results してみる

さて、データが取得できたところで続いての機能の紹介です。
どんなシチュエーションでこの機能を使うかを考えてみましょう:thinking:

先ほどの「**ページタイトル**毎の**UU**を2年前から今日にかけて降順でみたい」というクエリの結果をよ～く見てみると、実は似たようなものがいくつかあるんです。
記事タイトルは同じでも**僕がブログタイトルを何回か変えている**せいで結果が複数に分かれてしまっているんですね。

じゃあこれをSQLの力で取り除くとしましょう。

### Data sourceの設定

超絶簡単です。Google Analytics同様に追加できます。構成や接続を間違えていない限り作るだけで追加できます。

### やっていく

さて、ここからはSQLを書きます。Query Resultsは、MySQLでもPostgreSQLでもありません！**SQLite**です。少し癖はありますが調べながらやればよいでしょう。

データを加工する前に、とりあえず丸ごと引っ張ってみましょう。
**Data sourceにQuery Resultsを指定するのを忘れずに**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/f71b01de-a669-8084-43a5-dd2be86d3cfb.png)

全部引っ張ってくるSQLはこれだけ。

```sql
SELECT *
FROM query_3
```
`query_3`...？そんなテーブル作ってないぞ...いや**まさか**...？！
そう。クエリ結果は勝手にこのような名前でテーブルに保存されているのです。

では`3`とはなにか。それはクエリページのURLを見ればわかります。
先ほどのクエリ結果のURLが、`/queries/3`となっているので、テーブルの命名も`query_3`となるわけです。

では本題に戻ってデータ加工をやっていきます。

「タイトル(ex: `スマートフォンで撮った書類から影を取り除いてみた - 有能なフリ`)から、ブログタイトル(ex: `有能なフリ`)を**取り除き**、同タイトルのUU数を**合算する**」、をゴールにしましょう。

この記事はSQLのための記事ではないので、さっそくドーン！

```sql:データ加工のSQL(sqlite)
SELECT substr(q.ga_pageTitle, 1, instr(q.ga_pageTitle, ' - ')) AS page_title,
       SUM(q.ga_users) AS uu
FROM query_3 q
WHERE substr(q.ga_pageTitle, 1, instr(q.ga_pageTitle, ' - ')) != ""
GROUP BY 1
ORDER BY 2 DESC
```

結果もドーン！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/44ca6ee0-f52f-16e0-11fd-482fde4168ce.png)

うまく取り除けましたね。空白になってしまう結果があったので、それは`WHERE`句で取り除きました。
Google Analyticsの結果を取得しただけではできなかったことが、**Query Results**で簡単に実現できました。やったね:tada:

#### TIPS

偉大なる先輩 [@ihsiek](https://qiita.com/ihsiek) から教えてもらったんですが、上記の方法でQuery Resultsをすると、参照しているクエリを再実行し結果を待ってからQuery Resultsをしています。
すでに実行してあるクエリなら、そのキャッシュを使ってQuery Resultsがしたいですよね？

**あるんです**

テーブル名を`cached_query_N`にしてあげればいいだけです。実行に時間のかかるクエリを扱う際には、キャッシュされた結果をQuery Resultsすると**爆速**です:zap:

## グラフにしてみる

さて続いての機能は、BIツールの本領、可視化です。
先ほど綺麗にしたクエリ結果を、記事タイトルごとにグラフとして描画してみましょう。

### Visualizationの追加

ここにボタンがありますのでポチー！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/750384cd-e78e-1dd2-41fc-e9fdb0ba57c1.png)

### SQLを調整 & グラフを作る

UUトップ5の記事たちを並べて円グラフにしてみましょう！
トップ5なので、先ほどのSQLの最後に`LIMIT 5`を足してあげればいいですね。あとはカチカチっと...いじるところが多いので結果だけドーン！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/25fd13d5-1977-70f5-5b34-8b278934621a.png)

ふむふむ、いいですね。
グラフもそこそこにカスタマイズが効くので何でもできそうです。

## 検索をつけてみる

実際の業務でRedashを運用し始めると、

- この期間のこのデータが...
- この特定の自転車のこのデータが...
- こういう条件の注文データが...

というような需要がとても多くあります。Redashは、この需要をとても簡単にかなえることができます。

### 結果内を検索

言葉の通り、一度叩いたクエリ結果に対してかける検索です。

先ほどのクエリを、タイトルによって検索できるようなものにしてみましょう。 
テーブルビューから、`Edit Visualization`に行きましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/ce2c187c-3f63-935e-6607-94f11bbcf779.png)

そして、`Use for search`にチェックを入れ、せっかくなのでついでにカラム名もいい感じにしてあげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/7c59f951-b2ed-7371-1aa4-02ea39ff28ab.png)

そうすると何やら、テーブルビューのカラム名の下に**検索欄**が現れました！
そう...もう検索するだけなんです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115622/914a3e02-6630-1e93-e327-ba04647af320.png)

しかもここ**リアルタイム検索**なので、かなり**キビキビ**動きます。
ただ注意点として、`Use for search`はどのカラムにも付与することができますが、付与しすぎるとむしろリアルタイム検索が非常に**重く**なりますので、欲しい検索を使用者とすり合わせると**Good**です:thumbsup:

## まとめ

Redashによるデータの取得から可視化、検索まで一通り紹介してみました。
これでもまだほ～～～～んの一部です。まだまだ紹介し足りません。

この記事を書くにあたって、RedashをEC2に建てるなどしましたが、そこまで手間取らずむしろAWSの構成の勉強にもなったくらいです。
インターネットにはOpen data含めいろいろなデータが転がっているので、皆さんもぜひお手元で試してみてください！

### 小ネタ

Redash on EC2を無料枠の中で試そうとすると`t2.micro`を選ぶことになるんですが、それだと**まったく性能が足りない**ので公式アナウンスの`t2.small`か、`t2`シリーズより安価で性能の高い`t3`の`t3.small`か、`t3`とほぼ同性能だが10%ほど安価な`t3a`の`t3a.small`あたりをお勧めします(実際に`t2.micro`を試して動きませんでした:joy:)。

`t3a`シリーズは、CPUに`Intel Xeon`ではなく`AMD EPYC`を採用しており、互換性に若干の懸念(主観)がありますが、今回のRedashインスタンス構築の際は特に問題なく、むしろ**サクサク**動きました。

## おわりに

[Ateam cyma Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-cyma)、14日目いかがでしたか？
15日目は キャンプガチ勢デザイナーの [@manooo](https://qiita.com/manooo) さんが、キャリアパスやマネジメントに関する記事を書かれるそうですので、お楽しみに！

株式会社エイチームでは、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。

エンジニアとしての働き方に興味を持たれた方は[cymaのQiita Jobs](http://bit.ly/35E1I08)をご覧ください。

そのほかの職種は、[エイチームグループ採用サイト](http://bit.ly/2XQpd3q)をご覧ください。