見出し画像

SlackデータをTableauで可視化する

※私個人が試行錯誤の結果たどり着いた内容になっているため、誤りやもっと良い方法があるかもしれません。その際はご指摘いただけますと幸いです。

Slackデータの取得~Tableauでの接続

Slackデータの取得

オンラインサロンのSlackデータを分析するというテーマ設定まではよかったのですが、そもそもSlackのデータをどこから取得したらよいのかわかりません。まずは検索。するとSlackの公式ページにデータをエクスポートの方法が書かれていました。

zip ファイルには、すべてのパブリックチャンネルからエクスポートされた、ワークスペースのメッセージ履歴(JSON 形式)とファイルへのリンクが含まれます。

上記Slackヘルプページより

JSON形式でSlackの投稿やスタンプ履歴のデータが取得できるようです。

JSONファイル!
WHY JAPANESE PEOPLE!?

TableauでCSV、Excel以外のファイル接続をしたことがありませんでしたが、Tableau Publicでデータ接続を見ると以下のようにJSONファイルも直接読み込みできることがわかりました。(Tableauすごい!)

Tableau Pubiic接続画面

データのダウンロードはSlackの管理者しかできなかったため、管理者の方にお願いしデータをいただきました。ダウンロードされたデータはこんな感じです。

DLされたSlackデータ(ダミー)

チャンネルごとのやり取りがフォルダで別れ、その中に日別のJSONファイルが入っています。channnelsファイルにはチャンネル情報、usersにはユーザー情報、integration_logsにはアプリのアクティビティログが入っています。また、今回は出ていないファイルについても公式HPで説明されています。

Slackヘルプより

Tableauでデータを読み込む

JSONファイルが読み込めるのであれば、あとはワイルドカードユニオンしてすぐに分析に取りかかれそうに思えます。しかし、現実はそう甘くありませんでした。JSONデータに接続してみるとこのような表示が出ます。

JSONファイルに接続した画面

スキーマレベルの選択とは・・・?

スキーマの選択が必要なようですが、どれが必要か不明だったためとりあえず全部選択してみます。

次に同じチャンネルのフォルダ内にある日付ごとに入っているJSONファイルをワイルドカードユニオンします。(異なるチャンネルもすべてユニオンしてよいという場合には、□検索を親フォルダーに拡大にチェックを入れますが、今回は後述するチャンネル名の取得問題によりできませんでした)

ファイルを右クリックしてワイルドカードユニオン

再度ファイルを右クリックしてスキーマレベルの選択を見てると、チェックされていない項目が出てきます。

チェックが入っていないスキーマが存在している

これは2022-01-06.jsonには存在していなかったスキーマがほかの日付のファイルに存在していたために起きています。今回も全選択してみます。

ここから今回の分析に必要なスキーマの選択をします。

※Slackアプリの画面と照らし合わせながら手探りでしたのでもし誤りがあればご指摘いただけると嬉しいです。

今回分析に必要な項目は以下としました。
・誰が、いつ、投稿をしているのか
 └それは親スレッドなのか、リプライなのか
・誰が、いつ、なんのスタンプをおしているか
編集の履歴なども残っているようですが、それらは不要として外します。

検討の結果、最終的に必要なスキームは以下になりました。

スキーマ選択画面

日付、reactions、usersです。


Tabeau接続後のデータ精査

必要カラムの選定

上述のスキーマを選択してシートに移動します。

日付とreactionsのフォルダに分かれており、usersはReactionフォルダに入っている。

カラムが多くてまた嫌になります。。。
が、くじけずに必要なデータを見ていくと、上述の目的に合わせて以下のカラムが必要なことがわかりました。

  •  Thread Ts:親スレッド投稿時刻 (一部NULLあり)

  •  Text:親スレッド&子スレッドのテキスト

  •  User:Textの投稿ユーザー

  •  Ts:親スレ&子スレの投稿時刻(親スレの場合はThread Tsと同時刻、一部NULLあり)

  •  name (reactions.Value):スタンプの名前

  •  Users:スタンプ押下ユーザー

※Thread TsおよびTsにNULLが出る条件についてはよくわかりませんでした。。

必要カラムを表示

これで完成!
と思いきやチャンネル情報がありません。実はChannel ID、Channel Nameはスキーマ選択の際のAttachmentsにあったのですが、Chanel情報が全行に入っているか確認してみると、ほとんどの行に入っていませんでした。

1チャンネル約5万行のうち2行以外はChanel情報がNULL

なのでどうしたのかというと。。。。

1つ1つ手動でChannelIDをふってシートを作成し、それをExcelにコピペすることにしました。。。エクスポートしたchannels.jsonにチャンネルIDとチャンネル名が入っているためそこから持ってきます。

40チャンネルくらいあったのでしんどかった。泣
もっと適切な方法があったら教えてください。

すべてのチャンネルのデータがそろったExcelを読み込めば元データは完成です!


Tableau上でのデータ加工

分析までの下準備はあと少し!続いてTableau上でのデータ加工を見ていきます。

・Thread Tsの加工
発生条件はわからないのですがNULLがあります(作成時25%程度)。おそらく親スレッドに返信がない場合にNULLになっているようですが、同条件でTsがNULLになっている場合もありました。NULLをなくすために数式を作成します。 
 Thread Ts修正
  IFNULL([Thread Ts],[Ts])
 
Thread TsがNULLの場合Tsを使用することにします。

・TSの加工
Thread TS同様なぜかNULLがある(作成時1.5%程度)ので同様に。
 Ts修正
  IFNULL([Ts],[Thread Ts])

・上記で作成したThread Ts修正、Ts修正の日本時間への変更
Slackからエクスポート下データの時間はUNIX時間となっているため、日本時間への変更が必要です。

UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。協定世界時 (UTC) での1970年1月1日午前0時0分0秒(UNIXエポック)から形式的な経過秒数として表される。

ウィキペディアより

例えば2022/8/28/16:45はUNIX時間では1661672715.24808と表示されます。変更するための数式はこちら
 DATEADD('second',INT([Ts修正])+32400, #1970-01-01#)
1970年1月1日にTs修正の秒数分だけプラスしています。また、+32400は協定世界時(UTC)を日本時間に変更するためにプラスしています。

・各種シリアルの作成
スタンプや投稿がいくつあったのかを個別カウントするために各種シリアルを作成します。

 スタンプシリアル
  [Channnel]+STR([Ts修正])+[name (reactions.Value)]+[Users]

 投稿シリアル
  [Channnel]+[User]+STR([Ts修正])

 親投稿シリアル
  [Channnel]+STR([Thread Ts修正])

これでようやく元データの準備ができました!!!

あとは自分の行いたい分析に合わせて数式を作るなりなんなりしていくと良いと思います。

最後に

今回は
 Slackからデータをエクスポート→
 チャンネルごとに元データを作成してExcel貼り付け→
 ExcelをTableauで読み込み
という方法をとりましたが、Zapierというツールを使えばSlackからデータをエクスポートすることなくSlackに投稿やスタンプが押されるたびにデータをスプレッドシートに自動出力するということができるようになります。次回はこちらのご紹介をしたいと思います。

ではまた!

この記事が気に入ったらサポートをしてみませんか?