Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Rによるemailコミュニケーションの可視化

2.140 Aufrufe

Veröffentlicht am

people analytics tokyo #1で発表したスライドです。
https://people-analytics-tokyo.connpass.com/event/130158/

Veröffentlicht in: Daten & Analysen
  • Loggen Sie sich ein, um Kommentare anzuzeigen.

Rによるemailコミュニケーションの可視化

  1. 1. Rによるemailコミュニケーションの可視化 2019/6/28 @flatsilver 1
  2. 2. ⾃⼰紹介 2 名前: @flatsilver 仕事: ソフトバンク株式会社 • 社会⼈3年⽬ • 新卒で⼈事に配属され、⼈事企画の仕事を1年半ほど経験 • ⼈事企画の仕事をしながらPeople Analyticsに挑戦 • 社内の強いエンジニアに⽇々助けられる • 最近では機械学習タスクにも取り組み中 趣味: ポッドキャスト, 猫の世話 R
  3. 3. Special Thanks 3 許可をいただき参考にさせていただきました https://www.slideshare.net/kashitan/tidygraphggraph
  4. 4. Agenda 4 • ネットワーク分析概要 • Rによるデータ処理 • ネットワークの可視化
  5. 5. Agenda 5 • ネットワーク分析概要 • Rによるデータ処理 • ネットワークの可視化
  6. 6. ネットワーク分析とは 6 構成要素間の関係構造を探る研究⽅法 ソーシャルネットワーク コンピューター・ネットワーク
  7. 7. ノードとエッジ 7 ⼈間関係などをノードとエッジに抽象化して捉える ノード エッジ
  8. 8. 無向グラフと有向グラフ 8 ネットワークによっては辺の向きも考慮に⼊る 無向グラフ 有向グラフ
  9. 9. 隣接⾏列 9 様々な演算を⾏うため、隣接⾏列で表現することが多い 隣接⾏列 1 2 3 4 1 0 1 1 1 2 1 0 1 0 3 1 1 0 0 4 1 0 0 0 plot.igraph() 無向グラフ
  10. 10. 辺リスト 10 データサイズなどの観点から辺リストも扱う 辺リスト plot.igraph() from to 1 2 1 3 1 4 2 3 有向グラフ
  11. 11. ネットワーク構造の指標 11 全体的な構造を⽰す指標が複数存在する 密度 辺の数の割合 推移性 三⾓形の関係の割合 相互性 両想いの割合
  12. 12. 中⼼性指標 12 各頂点の重要性や、頂点同⼠を⽐較するための指標 離⼼中⼼性・近接中⼼性: 他の頂点との距離が⼩さい頂点ほど、より中⼼的とする指標 次数中⼼性: ネットワーク内でより多くの関係をもつ頂点を⾼く評価する指標 固有ベクトル中⼼性: 次数中⼼性を拡張して、グラフ全体の構造を反映した指標 PageRank: リンク数の多いページをランキングし、 ランキングの⾼いページからのリンクを⾼く評価する指標 パワー中⼼性: 隣接する頂点の中⼼性が⾼いほど、中⼼性を低く評価する指標 媒介中⼼性: 最短経路上に位置する程度を表した指標 情報中⼼性: 最短経路以外や、経路の⻑さも考慮に⼊れた指標 etc...
  13. 13. コミュニティ 13 相対的に密度の⾼いグループをコミュニティとして抽出する
  14. 14. Agenda 14 • ネットワーク分析概要 • Rによるデータ処理 • ネットワークの可視化
  15. 15. Enron Email Dataset 15 実在した企業の50万件以上のemailデータ [1] https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%AD%E3%83%B3より引⽤ 概要: Enronに勤めるsenior management 150⼈を中⼼としたコーパス • 倒産時にFederal Energy Regulatory Commissionが調 査していた際のデータがオリジナルの模様 Enronとは: アメリカ合衆国テキサス州ヒューストンに存在した、総合エネルギー取引 とITビジネスを⾏なっていた企業[1] データDL元: https://www.cs.cmu.edu/~./enron/
  16. 16. アウトプットイメージ 16 今回は以下のグラフの作成を⽬指す
  17. 17. 実際のデータ 17 library(tidyverse) library(lubridate) enron <- read_csv("data/emails.csv") head(enron) # A tibble: 6 x 2 file message <chr> <chr> 1 allen-p/_sent_mail/… "Message-ID: <18782981.1075855378110.JavaMail.evans@thyme>¥nDate: … 2 allen-p/_sent_mail/… "Message-ID: <15464986.1075855378456.JavaMail.evans@thyme>¥nDate: … 3 allen-p/_sent_mail/… "Message-ID: <24216240.1075855687451.JavaMail.evans@thyme>¥nDate: … 4 allen-p/_sent_mail/… "Message-ID: <13505866.1075863688222.JavaMail.evans@thyme>¥nDate: … 5 allen-p/_sent_mail/… "Message-ID: <30922949.1075863688243.JavaMail.evans@thyme>¥nDate: … 6 allen-p/_sent_mail/… "Message-ID: <30965995.1075863688265.JavaMail.evans@thyme>¥nDate: … “file”と”message”という2つのカラムのデータセット
  18. 18. 実際のデータ 18 "Message-ID: <18782981.1075855378110.JavaMail.evans@thyme> Date: Mon, 14 May 2001 16:39:00 -0700 (PDT) From: phillip.allen@enron.com To: tim.belden@enron.com Subject: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-From: Phillip K Allen X-To: Tim Belden <Tim Belden/Enron@EnronXGate> X-cc: X-bcc: X-Folder: ¥Phillip_Allen_Jan2002_1¥Allen, Phillip K.¥'Sent Mail X-Origin: Allen-P X-FileName: pallen (Non-Privileged).pst Here is our forecast " ”message”の内容
  19. 19. データの前処理 19 # headerとbodyを分割する位置を特定 breaks <- str_locate(enron$message, "¥n¥n") # headerとbodyに分割 header <- str_sub(enron$message, end = breaks[, 1] - 1) body <- str_sub(enron$message, start = breaks[, 2] + 1) # headerをそれぞれの要素に分割するfunctionを定義 parse_header <- function(header) { message_id <- str_sub(str_extract(header, "Message-ID:.*"), 12) date <- str_sub(str_extract(header, "Date:.*"), 7) from <- str_sub(str_extract(header, "From:.*"), 7) to <- str_sub(str_extract(header, "To:.*"), 5) subject <- str_sub(str_extract(header, "Subject:.*"), 10) x_cc <- str_sub(str_extract(header,'X¥¥-cc:.*'), 7) x_bcc <- str_sub(str_extract(header,'X¥¥-bcc:.*'), 8) parsed_header <- tibble(message_id, date, from, to, subject, x_cc, x_bcc) return(parsed_header) } # parseしたheaderを取得 parsed_header <- parse_header(header) # parse date parsed_header <- parsed_header %>% mutate( date = parse_date_time(parsed_header$date, "%a, %d %m %Y %H:%M:%S %z", locale = "C") ) # split file file_split <- as_tibble(str_split(enron$file, "/", simplify = TRUE)) enron <- bind_cols(file_split, parsed_header) %>% mutate(body = body)
  20. 20. データの前処理 20 # 今回はheader部分のみを分析に利用 enron %>% select(message_id:body) %>% head() # A tibble: 6 x 8 message_id date from to subject x_cc x_bcc body <chr> <dttm> <chr> <chr> <chr> <chr> <chr> <chr> 1 " <18782981.10… 2001-05-14 23:39:00 phillip… tim.be… "" "" "" "Here is our f… 2 " <15464986.10… 2001-05-04 20:51:00 phillip… john.l… Re: "" "" "Traveling to … 3 " <24216240.10… 2000-10-18 10:00:00 phillip… leah.a… Re: te… "" "" test successfu… 4 " <13505866.10… 2000-10-23 13:13:00 phillip… randal… "" "" "" "Randy,¥n¥n Ca… 5 " <30922949.10… 2000-08-31 12:07:00 phillip… greg.p… Re: He… "" "" Let's shoot fo… 6 " <30965995.10… 2000-08-31 11:17:00 phillip… greg.p… Re: He… "" "" "Greg,¥n¥n How…
  21. 21. データの前処理 21 # 計測期間の確認 summary(enron$date) Min. 1st Qu. Median Mean "0001-05-30 21:10:06" "2000-10-12 18:47:00" "2001-03-05 10:45:00" "2000-02-03 01:03:02" 3rd Qu. Max. "2001-08-14 14:06:25" "2044-01-04 22:48:58” # ユニークユーザー数の確認 enron %>% pull(from) %>% unique() %>% length() [1] 20328 ユニークユーザー数と集計期間の確認
  22. 22. データの前処理 22 # 計測期間の確認 summary(enron$date) Min. 1st Qu. Median Mean "0001-05-30 21:10:06" "2000-10-12 18:47:00" "2001-03-05 10:45:00" "2000-02-03 01:03:02" 3rd Qu. Max. "2001-08-14 14:06:25" "2044-01-04 22:48:58” # ユニークユーザー数の確認 enron %>% pull(from) %>% unique() %>% length() [1] 20328 ユニークユーザー数と集計期間の確認
  23. 23. データの前処理 23 単純化のために、以下2つの条件で絞り込み • 2000/6/1 ~ 2001/5/31まで毎⽉レコードが存在する • 2000年6⽉に送信されたデータ
  24. 24. データの前処理 24 # 2つの条件で絞り込んだデータ head(enron_june) # A tibble: 6 x 3 date from to <dttm> <chr> <chr> 1 2000-06-30 12:54:00 phillip.allen@enron.com ina.rangel@enron.com 2 2000-06-27 16:40:00 phillip.allen@enron.com mike.grigsby@enron.com 3 2000-06-27 16:40:00 phillip.allen@enron.com keith.holst@enron.com 4 2000-06-27 12:33:00 phillip.allen@enron.com kenneth.shulklapper@enron.com 5 2000-06-26 13:57:00 phillip.allen@enron.com keith.holst@enron.com 6 2000-06-23 11:46:00 phillip.allen@enron.com torrey.moorer@enron.com # 辺リストの作成 enron_edge_list <- enron_june %>% group_by(from, to) %>% count() ユニークユーザー数と集計期間の確認
  25. 25. # 辺リストの確認 head(enron_edge_list) # A tibble: 6 x 3 # Groups: from, to [6] from to n <chr> <chr> <int> 1 alan.aronowitz@enron.com jeffrey.hodge@enron.com 5 2 alan.aronowitz@enron.com mark.taylor@enron.com 2 3 alan.aronowitz@enron.com sheila.glover@enron.com 4 4 audrey.robertson@enron.com jeffery.fawcett@enron.com 24 5 audrey.robertson@enron.com kevin.hyatt@enron.com 6 6 audrey.robertson@enron.com michelle.lokay@enron.com 3 # 人数の確認 enron_edge_list %>% pull(from) %>% unique() %>% length() [1] 87 データの前処理 25 ユニークユーザー数と集計期間の確認 資料の個⼈名はアップ時削除
  26. 26. “tidygraph” 26 “tidy”にgraphデータを扱えるようにするpackage • 多くの”igraph”の関数が利⽤可能 • “dplyr”でデータの操作が可能 • nodeとedgeの2つの仮想的なdata frameを⽤意 • 隣接⾏列の場合は、”tidy”なデータ加⼯が難しい
  27. 27. “tidygraph” 27 “tidy”にgraphデータを扱えるようにするpackage # tbl_graphオブジェクトへ変換 g <- as_tbl_graph(enron_edge_list, directed = FALSE) g # A tbl_graph: 94 nodes and 272 edges # # An undirected multigraph with 2 components # # Node Data: 94 x 1 (active) name <chr> 1 alan.aronowitz@enron.com 2 audrey.robertson@enron.com 3 brant.reves@enron.com 4 carol.clair@enron.com 5 chris.foster@enron.com 6 chris.germany@enron.com
  28. 28. “tidygraph”とグラフの連結 28 # … with 88 more rows # # Edge Data: 272 x 3 from to n <int> <int> <int> 1 1 29 5 2 1 48 2 3 1 64 4 # … with 269 more rows # グラフが連結しているか確認 g %>% is.connected() [1] FALSE
  29. 29. グラフの連結 29 連結していない
  30. 30. グラフの連結 30 # 連結したグラフのみに絞る g_conected <- g %>% mutate(component = group_components()) %>% filter(component == 1) # グラフが連結しているか確認 g_conected %>% is.connected() [1] TRUE “dplyr”がそのまま使える
  31. 31. ネットワーク構造の指標 31 “igraph”の関数がそのまま利⽤できる # 密度 g_conected %>% graph.density() [1] 0.06593407 # 推移性 g_conected %>% transitivity() [1] 0.2598784
  32. 32. 中⼼性指標 32 # 次数, 固有ベクトル中心性, 媒介中心性の計算 g_conected <- g_conected %>% mutate( degree = degree(g_conected), eigen_centrality = eigen_centrality(g_conected)$vector, betweenness = betweenness(g_conected) ) g_conected # A tbl_graph: 91 nodes and 270 edges # # An undirected multigraph with 1 component # # Node Data: 91 x 5 (active) name component degree eigen_centrality betweenness <chr> <int> <dbl> <dbl> <dbl> 1 alan.aronowitz@enron.com 1 8 0.248 70.9 2 audrey.robertson@enron.com 1 5 0.0000941 11.7 3 brant.reves@enron.com 1 7 0.295 310. 4 carol.clair@enron.com 1 16 0.542 277. 5 chris.foster@enron.com 1 3 0.0863 13.0 6 chris.germany@enron.com 1 3 0.00110 0
  33. 33. コミュニティの検出 33 # コミュニティの検出 # どうしても検出したい場合は、一度多重グラフを取り除く必要がある g_conected %>% morph(to_simple) %>% mutate(community = as.factor(group_fast_greedy())) %>% unmorph() # A tbl_graph: 91 nodes and 270 edges # # An undirected multigraph with 1 component # # Node Data: 91 x 6 (active) name component degree eigen_centrality betweenness community <chr> <int> <dbl> <dbl> <dbl> <fct> 1 alan.aronowitz@enron.com 1 8 0.248 70.9 1 2 audrey.robertson@enron.com 1 5 0.0000941 11.7 4 3 brant.reves@enron.com 1 7 0.295 310. 1 4 carol.clair@enron.com 1 16 0.542 277. 1 5 chris.foster@enron.com 1 3 0.0863 13.0 1 6 chris.germany@enron.com 1 3 0.00110 0 6
  34. 34. Agenda 34 • ネットワーク分析概要 • Rによるデータ処理 • ネットワークの可視化
  35. 35. “ggraph” 35 統⼀的な⽂法でネットワーク図をplotできるpackage • ネットワーク図などをplotするための関数が多数ある • “ggplot2”のextension • “ggplot2”を使えると学習コストが低い
  36. 36. レイアウトの追加 36 g_conected %>% ggraph(layout = "kk")
  37. 37. レイアウトの追加 37
  38. 38. エッジの追加 38 g_conected %>% ggraph(layout = "kk") + geom_edge_arc(aes(width = n), alpha = 0.8, colour = "lightgray")
  39. 39. エッジの追加 39
  40. 40. エッジの太さ調整 40 g_conected %>% ggraph(layout = "kk") + geom_edge_arc(aes(width = n), alpha = 0.8, colour = "lightgray") + scale_edge_width(range = c(0.5, 1))
  41. 41. エッジの太さ調整 41
  42. 42. ノードの追加 42 g_conected %>% ggraph(layout = "kk") + geom_edge_arc(aes(width = n), alpha = 0.8, colour = "lightgray") + scale_edge_width(range = c(0.5, 1)) + geom_node_point(aes(size = degree), colour = "steelblue")
  43. 43. ノードの追加 43
  44. 44. ラベルの追加 44 g_conected %>% mutate(name = str_remove(name, "@enron.com")) %>% # ドメインの削除 ggraph(layout = "kk") + geom_edge_arc(aes(width = n), alpha = 0.8, colour = "lightgray") + scale_edge_width(range = c(0.5, 1)) + geom_node_point(aes(size = degree), colour = "steelblue") + geom_node_text(aes(label = name), repel = TRUE, size = 1.2)
  45. 45. ラベルの追加 45
  46. 46. テーマの適⽤ 46 g_conected %>% mutate(name = str_remove(name, "@enron.com")) %>% ggraph(layout = "kk") + geom_edge_arc(aes(width = n), alpha = 0.8, colour = "lightgray") + scale_edge_width(range = c(0.5, 1)) + geom_node_point(aes(size = degree), colour = "steelblue") + geom_node_text(aes(label = name), repel = TRUE, size = 1.2) + theme_graph()
  47. 47. テーマの適⽤ 47
  48. 48. コミュニティによる⾊分け 48 g_conected %>% mutate(name = str_remove(name, "@enron.com")) %>% morph(to_simple) %>% mutate(community = as.factor(group_fast_greedy())) %>% unmorph() %>% ggraph(layout = "kk") + geom_edge_arc(aes(width = n), alpha = 0.8, colour = "lightgray") + scale_edge_width(range = c(0.5, 1)) + geom_node_point(aes(size = degree, colour = community)) + geom_node_text(aes(label = name, colour = community), repel = TRUE, size = 1.2) + theme_graph()
  49. 49. コミュニティによる⾊分け 49
  50. 50. 固有ベクトル中⼼性 50 隣接するノードを反映して中⼼性が定まる
  51. 51. 媒介中⼼性 51 コミュニティをつなぐノードが 評価されている
  52. 52. おまけ: 2000年6⽉と2001年5⽉の⽐較 52
  53. 53. 参考 53 • ネットワーク分析 第2版 (Rで学ぶデータサイエンス) • tidygraph • Introducing tidygraph • ggraph • Introduction to ggraph: Layouts • Introduction to ggraph: Nodes • Introduction to ggraph: Edges
  54. 54. Enjoy! 54

×