slackの会話ネットワークの分析、及びチャネル内活性化指標の提案

コンペの紹介

データラーニングギルドで開催されたデータ分析コンペティションに参加した時の私たちの分析についてまとめていきたいと思います。

​データ分析の内容はデータラーニングギルドのslackから所得できるデータについて以下の三つの部門の中から分析課題を選ぶものでした。

  • BI・KPI策定部門
  • データサイエンス部門
  • 自由部門​

私たちはデータサイエンス部門で参加し、自然言語処理やネットワーク解析を用いてチャネルについての分析を行いました。​​細かい内容は以下のデータラーニングギルドの記事に書いています。


データラーニングギルド データサイエンティストBLOG

データラーニングギルド内slackデータを用いた分析コンペ「slackデータ分析コンペ」を開催致します。 目次 1 実施…

データの内容

​今回slackから所得して用いるデータの中で私たちが用いたデータには次のような項目が存在しました。

  • メッセージ時刻
  • 発言者
  • 発言内容
  • チャネル
  • mention先​

分析内容

​私たちの最終発表の資料は以下のslideshareにのせております。


slideshare​以下で分析の流れを時系列で書いていきます。分析は以下のように進めました。

  • データの把握と前処理
  • テーマ設定
  • 数理モデル構築
  • 評価と今後の課題​

データの把握と前処理

​主に以下の分析でデータを把握していきました。

  • 基本統計量の確認
  • ネットワーク解析によるチャネル内のユーザー関係の分析
  • 自然言語処理にて、各チャネルでのメッセージのトピック分類​

まず、基本統計量は全期間の各チャネルのメッセージの量や、時系列でどのようにメッセージ量が変化しているか、各ユーザーの発言量のヒストグラムなどを可視化し、考察していきました。

​次にネットワーク解析ですが、ネットワークの定義を以下のように設定しました。

  • node:user
  • edge:発話の有無​

​ただし、mentionがなければchannel内全員へのメッセージとしました。さらに、以下の四つの中心性を計算し、可視化することで考察していきました。

  • ​次数中心性
  • 媒介中心性
  • 近接中心性
  • 固有値中心性​

すると、あるユーザーが全ての中心性で高い値を示し、edgeもそのユーザーに集まっていることがわかりました。つまり、ある一人のユーザーを中心にネットワークが形成されており、チャネル内の話題ごとに小さいネットワークが形成されておらず、組織としてはいわゆるワンマン経営のようなイメージの組織になっていることがわかりました。

​次に、自然言語処理でのトピック分類ですが、各チャネルのメッセージデータのトピック分類をしました。(前処理は大変すぎて諦めました…)

結果はあまり解釈しやすいものではありませんでした。(なんの前処理もせず、アルゴリズムを適用しただけなので、当たり前ですが。)​

テーマ設定

​テーマを以下のように設定しました。​

ある発言によってチャネルがどれくらい活性化したかの指標作成

​この指標がうまくチャネル活性化を表現できれば、チャネルが活性化するワードをトピック分類で求めたり、どういった人物の発言の後にチャネルが活性化されやすいかなど、チャネル活性化の要因を分析することができます。

​​チャネルが活性化している状態を次のように定義しました。​


ある発言Mが起こったとき、

  • \mathcal{U}:={ u_1,u_2,...,n_N }:ユーザーの集合
  • D:メッセージMの後、一日以内の発話ユーザーの時系列データ
    • ex) D_M = { u_1, u_2, u_1, u_4, u_1, u_7 ,...}
  • \mathcal{P}:\mathcal{U} \rightarrow [0,1]:ユーザーの発言確率を出力する関数
  • talkCNT_D:\mathcal{U} \rightarrow \mathbb{N}:メッセージMの後一日以内のチャネル内の発話回数
    • talkCNT_{D_M} (u) = \sum_{u_i \in D_M} \delta_{u}(u_i)
    • \delta_{u_i}(u_j)u_i=u_jなら1、そうでないなら0となる関数
  • \phi:\mathbb{R} \rightarrow \mathbb{R}:単調減少関数
  • A(D_M):メッセージMのチャネル活性化値

発言M_1,M_2に対して、(D_M)_1={u_1},(D_M)_2={u_2}とする。

この時、

  • \mathcal{P}(u_1) < \mathcal{P}(u_2)であれば、A((D_M)_1) > A((D_M)_2)

を満たすとする。これは発言確率が低いユーザーが発言すれば、そのほうがチャネルは活性化さ>れていることを意味する。 また、

(D_M)_3 := (D_M)_1 \cup (D_M)_2とすると、

  • A((D_M)_3) = A((D_M)_1) + A((D_M)_2)

を満たすとする。これはメッセージMの後一日以内に発言したユーザー増えるごとに加法的に活性化指標が増えることを意味する。

一つ目の条件については、\phiが単調減少していることに注目する。

A(D_M)=\sum_{u_i \in M_D} \phi(\mathcal{P}(u_i))

これを活性化指標とする。さらに、\phi(x) = -\log(x)と置くと、

A(D_M) = \sum_{u \in M_D} - \log(\mathcal{P}(u)) = \sum_{u \in \mathcal{U}} talkCNT_D(u) \times -\log(\mathcal{P}(u)) = - \sum_{u \in \mathcal{U}} \log(\mathcal{P}(u))^{talkCNT_D(u)} = - \log \Pi_{u \in \mathcal{U}} \mathcal{P}(u)^{talkCNT_D(u)}

となり、対数尤度となっている。


​​要約すると、チャネル活性化指標は​メッセージMの後一日以内に発言した人u_iの発言確率が\mathcal{P}(u_i)とすると、その人が発言したことによるチャネル活性化量は-\log(\mathcal{P}(u_i))であり、それを足すことでチャネル活性化指標を作った。

​slackデータの各メッセージで活性化指標を計算し、ヒストグラムを見ると、slideshareの9ページ目のようになりました。​なんとなくべき分布に従っているようにみえます。​活性化指標の上位30%のメッセージでトピック分類した結果がslideshareの10ページ目です。データ分析系の単語や、チーム、コミュニティといった協調性を意識した単語もありました。


数理モデル構築

​活性化指標の値をhigh,lowの2値に分割し、light-GBMによって、活性化指標クラスを予測し、どのような量がチャネル活性化に貢献しているかを分析します。特徴量は以下のものを使いました。​

  • ネットワークの中心性
    • 次数、近接、媒介、pagerank
  • 感情分析値
    • happy, sad, disgust, angry, fear, surprice
  • メッセージのワード数
  • Time zone (朝、昼、晩)
  • 曜日
  • 発話者の情報
  • 過去の発言における自分の発言の割合​

ただし、ネットワークの中心性は、「データの把握と前処理」で行ったグラフの定義は用いず、以下のように設定しました。​

  • node:ユーザー
  • edge:u1の発言一日以内に一度でもu2が発言していれば、edgeを通す
  • 重み:u1の発言の中で一日以内にu2が発言した割合​

とし、メッセージがどれくらい他の発言を誘発しているかを表現したグラフにし、中心性を計算しました。​​ネットワークがどのような形になったかはslideshareの14-16ページにあります。

​​light-GBMで予測し、特徴量重要度を算出しました。すると、ワード数や、感情分析のhappy, surpriseが活性化指標に貢献していることがわかりました。


評価と今後の課題

​精度はaccuracyが0.83程度になりました。その他の指標についてはslideshareの29ページにまとめています。

​今から思えば、対数変換などをして回帰分析をした方が、解釈がしやすかったかもしれないなと思います。今後の課題では、lightGBMのハイパラチューニングや、channelでの階層化分析、さらにhigh,logのクラスの分け方の設計や、テキストの内容を特徴量に(word2vecなど)するなどが考えられます。

​また、Bot型アプリケーションを作成し、slackでメッセージを送ると、どれくらい活性化指標が見込めるかの予測値を返すことも考えていました。
​​

最後に

​今回のデータ分析コンペティションは初めて友人と参加するコンペティションになりました。とてもいい思い出になりました。以下、苦労したこと、楽しかったことについてまとめておきます。​

苦労したこと

テーマを設定するのに時間がかかりました。データ分析の「勉強」だけではやはりデータサイエンティストになるために必要なスキルは身につけられないと感じることができました。課題設定や、分析の穴の気をつけ方などを中間発表で指摘して頂き、とても勉強になりました。​

楽しかったこと

やはり友人と参加できたことは楽しかったと感じた大きな要因の一つです。人それぞれのスキルがあり、友人を尊敬し、信頼することができました。また、slackのデータには分析アイデアはたくさん湧いてきて、時間があればもっと色々なテーマについて分析してみたかったと感じました。​​

>トップクラスのスキル、経験、人脈が 手に入る分析人材コミュニティ

トップクラスのスキル、経験、人脈が 手に入る分析人材コミュニティ

データ分析人材が活躍できるようにするため、互いに情報を交換しながらキャリア構築をしていく環境、学習や仕事の獲得できる仕組み、実際の課題や実データなど、ありとあらゆるものを提供して行きます。