Slackで使用されたリアクション絵文字の回数をAlteryxで集計してTableauで可視化してみた(一部結果を公開) #Alteryx #Tableau

はじめに

どうも。DI部@大阪オフィスのtamaです。

弊社では、今年の1月くらいから、社内コミュニケーションにSlackを使い始めました。Slackといえば、投稿に対して絵文字でリアクションできる機能があるのですが、「どのリアクション(絵文字)がよく使われてるのか?」という疑問が社内でありました。

ちょっとググれば「Slackのリアクションを集計してみた」エントリは沢山でてきます。しかし、DI部としては、データの取得・集計はAlteryxだけで完結させる…という矜持があります(ありません)。というわけで、今回は一切コード無し、Alteryx(とTableau)だけで、Slackのリアクション使用回数を集計してみたいと思います。

処理の概要

Slackの元データですが、すべてAPIから取得します。

使用するAPI

こちらのAPIで、Slackで行われた会話のデータを取得することができます

Channel〜というAPIもあるのですが、こちらは古いものだそうで、色々注意書きもあるので、やはりConversation APIを使用したいと思います。

The members array found in this and other methods will begin automatically truncating at 1,500 and eventually fewer results beginning December 1, 2017. As of March, 2018 the cap is 500. Please Use conversations.members to manage memberships instead. Read on to learn more.

集計するリアクションについて

以下のルールで行きます。

  • 投稿に対して付与できるリアクションが対象
  • スレッド内で使用されたリアクションも対象
  • 投稿本文の中で使用された絵文字は対象外
  • 対象期間は全期間

処理の流れ

今回、Slack上で使用されたリアクションを集計する処理の流れは以下の感じでいきます。

  1. conversations.list method | Slackでチャネル一覧(チャネルのID)を取得する
  2. チャネルID毎にconversations.history method | Slackを使用し、会話データを取得する
  3. 会話の中でスレッドがある場合は、conversations.replies method | Slackでスレッドデータを取得する
  4. 取得したデータからリアクションのデータを取得・整形して.hyper形式で出力
  5. (Tableauで可視化する)

ワークフローについて

本体ワークフロー

メインとなるワークフローです。上記の「処理の流れ」に書いてあることを、そのままワークフローに落とし込んだ形になります。各処理はそれぞれマクロ内で行います。

テキスト入力ツール

最初にチャネル一覧を取得する必要があるため、conversations.list method | SlackのURLとトークン、後はcursorという列(値は空)を渡します。

チャネル一覧を取得するIterativeマクロ

上記のテキスト入力ツールからconversations.list method | Slackの各情報を受け取り、それをもとに、チャネル一覧を取得します。一回のリクエストで取得しきれない場合を想定してIterativeマクロにしました。で、その構成なのですが、実は下記で紹介しているIterativeマクロとほとんど同じ構成です。

反復条件

Zendeskの時と異なるのはループする条件の部分。これはconversations.list method | SlackのPaginationに書かれている仕様に従います。

Responses will include a top-level response_metadata attribute containing a next_cursor value. By using this value as a cursor parameter in a subsequent request, along with limit, you may navigate through the collection page by virtual page.

response_metadatanext_cursorに値があったら、それを使用して再度リクエスト。空の場合は「それ以上データは無い」ということなので、ループを終了…ということなので、そのように設定します。

クロスタブで縦横変換して、response_metadataが空でなければループするようにしました。

2度以降叩く場合は、response_metadataに入っている値を cursorというパラメータにしてリクエストを送る必要があります。Iterativeマクロは入力と出力で同じデータ構造にしておく必要があるため、最初のテキスト入力ツール時点で、空のcursor列を用意しています。

Downloadツール

Slack APIをAlteryxで叩く場合は上記のように設定しました。トークンの取得方法はググればいくらでも出てくるので本エントリでは触れません。

チャネル毎に会話データとスレッドデータを取得して集計するBatchマクロ

今回の一連のワークフローで一番キモなところかもしれません。先程のIterativeマクロで取得してきたチャネル一覧データに含まれるチャネルIDをもとに、チャネル毎の会話とスレッド内のデータを取得して集計します。

チャネルID毎にconversations.history method | Slackを叩く必要があるため、Batchマクロ化して、先程取得したチャネルIDを1つずつ渡すようにしました(そして更に会話データを取得するIterativeマクロに移ります)

集計部分

ここでは会話とスレッド内のデータを取得した後、リアクションを集計する処理も存在します。正直今回一番自信が無い部分です(もっと効率的な集計の仕方があるのではないかと悩み中)。

後述する、会話データを取得するIterativeマクロで、上記のような形でデータが上がってくるようにしています。このうち、reactionのデータだけを取り出します。このままだと、リアクションの名称と回数が縦セット(?)になってしまっているので、countだけのデータとnameだけのデータに分離、それぞれに一意のIDを振って、そのIDをキーに結合して、Tableauで集計しやすい形にしています。

この一連の処理が、チャネルID分繰り返されることようになっています。

会話データを取得するIterativeマクロ

上記のBatchマクロ上に組み込まれているマクロです。チャネルIDをもとにconversations.history method | Slackを叩くようになってます。例のごとく1度のリクエストでは全データを取得しきれないため、Iterativeマクロでループしています。

反復条件

チャネル一覧を取得するワークフローと一緒です。

スレッドデータを取得する部分

会話の中でスレッドがある場合は、conversations.replies method | Slackでスレッドデータを取得する

今回はスレッド内で使用されたリアクションも集計します。ですので、会話にスレッドがあった場合、別途スレッドデータも取得しないといけません。スレッドデータを取得するためにはconversations.replies method | Slackを使用する必要があります。

このAPIはリクエストパラメータとしてthread_tsが必要です(スレッドが開始された時間)。ですので、会話データを取得する中で、thread_tsの一覧も取得し、それをスレッドデータを取得するマクロに投げるようにしました。

注意点としては、スレッドが作られたことがないチャネルの存在です。スレッドが無いチャネルの場合はthread_ts自体が無いため、thread_tsを参照する部分(今回でいうとフィルタツールでthread_tsの値だけ抽出している部分)でエラーが発生します。

そこで、Chaos Reigns Within: MacrosEnsure Fieldsツールを使用します。これは、「xxという名前のカラムが無かったら作成する」という便利なツールでして、これを利用してthread_tsが無ければ作成するようにします(値は全部NULLとなる)。これでthread_tsが無いチャネルでもエラーを抑えることができました(thread_tsが無いため、後述するマクロも回らない)。

スレッドのデータを取得するBatchマクロとIterativeマクロ

Batchマクロ

上記の会話データを取得するIterativeマクロの中で、スレッドがある場合は、こちらのマクロでスレッドを取得することになります。conversations.replies method | SlackはリクエストパラメータとしてチャネルIDとthread_tsが必須なので、今までの処理の中で取得してきたチャネルIDとthread_tsを、その数だけBatchマクロで繰り返します。

Iterativeマクロ

API恒例のIterativeマクロです。チャネル一覧や会話一覧の時と構成はほとんど同じです。

異なるのは反復する条件の部分。conversations.replies method | Slackによれば他のAPIと全く同じ記述なのですが…。

なぜかresponse_metadataのカラム自体が返ってきません。ドキュメントをもう少し読むと、has_moreがtrueの間はまだデータがある…ということだったので、has_moreがfalseになるまでループし続ける構成にしました。

アクセス制限問題にぶつかる

ワークフローを構築したのはいいのですが、いざ実行してみると「データがありません」的なエラーが連発しました。マクロ単体では問題なかったので悩んでいたのですが、どうやらAPIのアクセス制限に引っかかっていた模様です(パブリックチャネルの数だけ会話とスレッドのデータを取得するので、それなりにAPIを叩きまくる)。

API別に、Tierが設定されており、それに応じて制限が設けられているようです。例えばconversations.replies method | Slackでは下記のようになっております。

Tire3は50+ per minuteと書かれています。なるべくこの制限内にリクエスト数を抑えたい…というわけで活躍するのがスロットルツールです。詳細が下記をご覧ください。

このツールをスレッド内データを取得するマクロの前に置きます。とりあえず1分間に60レコードまで…という感じで設定しました(この後、Batchマクロでthread_tsの数だけAPIを叩くようにしているため、thread_tsをスロットルツールで制限する形)。

ついに実行完了

全チャネルの会話とスレッドのデータを取得、さらにスロットルツールでAPI制限に収まるようにしているため、かなり時間がかかりました。

4時間以上かかりました。

ちなみに、最終的に下記の形式でファイルが出力されるようにしています。これだとTableauで可視化するのはすごく楽ちんです。

可視化してみる

というわけで、上記で出力したデータをTableauで可視化してみました。できたビューがこちら。

今年の1月〜3月13日くらいまでの結果となります。期間が曖昧なのは、データを取得している間にもSlackはガンガン利用されているため、厳密に「このチャネルは何時までのデータ」というのが非常に把握しづらいんですね。なので大体でやってます。

全チャネルの総合1位はサムズアップみたいなやつですね。妥当だと思います。

ワークフローでチャネル名も取得するようにしているので、これをTableauのフィルタに設定することで、各チャネル内でどのようなリアクションが使われているかも、見ることができます。せっかくなので、ちょっとだけ、結果をご紹介したいと思います。

Alteryxサポートチーム部屋

弊社はAlteryxのテクニカルサポート業務を行っています。もちろん、それに関連するメンバーが集うチャネルもあります。というわけで、Alteryxサポート部屋でよく使用されているリアクションのベスト3を紹介します(左から1位、2位、3位です)。

さすがだ」がよく使われているのは、チーム内でお互い褒め称えあっている感じがしていいですね。

…3位と1位は一体????

3位:Alteryx ACE じょんすみす氏

3位は何を隠そう、弊社が誇るAlteryx ACEのじょんすみす氏のアイコンです。このアイコンが多く使われているということは、チームメンバーの困り事をACEがバンバン解決しており、それに対して畏敬の念を込めてこのアイコンでリアクションされている…ということなのでしょう。社内でも社外でも”ACE”なのがじょんすみす氏なのです…。

1位:ひろよし

数字的にはブッチギリの1位なのが「ひろよし」でした。

誰だよって感じですが、その正体は弊社営業の大場裕喜氏です。主にデータ分析系の案件を扱っておりますが、もちろんAlteryxも守備範囲。社内では凄腕営業として名を馳せており、あまりに凄すぎて「鬼畜」なんて称号を得ているとかいないとか…(褒め言葉)。ACEを圧倒的に超えるリアクション使用回数からして、Alteryxチームからの「愛され度」は常軌を逸しているレベルではないでしょうか。今後とも弊社ひろよしをよろしくお願い致します。

ちなみに全チャネルの中でも2104個中、33位という驚異の成績を残しています。もはや全社レベルで愛されてます

大阪オフィス雑談部屋

冒頭でも言っていますが、私は大阪オフィスの人間です。で、弊社のSlackには大阪オフィスメンバーが雑談するチャネルがあります。せっかくなので、そのチャネルでよく使用されているリアクションのベスト3も紹介します(左から1位、2位、3位です)。

弊社の大阪オフィスは、色々な部署のメンバーが一堂に会している(フリーアドレスなので席もごちゃまぜ)なのですが、「さすがだ」「お大事に」が多いのは、部署の垣根を超えたメンバー同士の絆の深さが伺えて、とても良い結果だと思います(「お大事に」は、逆にいうと、体調崩し気味のメンバーが多いのでは、という懸念もありますが…)。

1位の南蛮亭とは…

大阪オフィス雑談部屋で一番使われているリアクションは「南蛮亭」でした。

…??????

解説すると、南蛮亭とは大阪オフィス近くにある居酒屋です。

昼もランチをやっており、大阪オフィスメンバーも昼夜問わず非常にお世話になってます。鶏をメインに扱っており、ランチの鶏丼はとても美味しいです。しかし、なぜこの店のリアクションがこんなにも多く使われているのでしょうか…。

理由が気になる方は、ぜひ弊社大阪オフィスへのジョインをご検討ください

おわりに

Alteryxの実践的なブログを書いてると思ったら、Alteryx ACE、ひろよし、大阪オフィスの紹介になってました

正直、このワークフローはまだまだ改善の余地があるので、余裕があったらテコ入れしたいと思ってます(もっとデータをとってきて、誰がいつどのリアクションを何回したとか集計したい)。