Rでツイート時刻をヒートマップ表示

目次

Twitter のツイートを R のライブラリ rtweet を使用して取得し、ツイート時刻のヒートマップを作成します。


目的

毎日 Twitter を使用していますが、特定の時間に使用していることが多いのでしょうか?

Githunのコントリビューション(アクティビティ)の草原のようなヒートマップで可視化します。

方法

Twitter からツイートの取得は、rtweetライブラリーを使用します。

ツイートした時刻は、得られたデータフレームのcreated_atカラムに UTC で記録されています。ですので、時間帯を指定してローカルな時刻に変換します。

簡単なヒストグラム

1時間毎の粒度で知りたいので、lubridateライブラリを使って時間の部分を取り出し、countで集約してツイート数を数えます。

geom_histogram()でヒストグラムを作成するのであれば、ツイートを数える必要はありません。しかし、bin(バー)の数を制御できないので、棒グラフで表示します。

library(tidyverse)
library(lubridate)
library(rtweet)

tweets <- get_timeline("nosuz", n=1000)

tweets %>%
  mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
  mutate(tweet_at = hour(lt)) %>%
  count(tweet_at) %>%
  ggplot(aes(x=tweet_at, y=n)) +
  geom_bar(stat = "identity") +
  theme_light()

ツイート時刻

縦軸を全体に占める割合で示すときには、janitorライブラリーのtabylで集計します。

library(janitor)
library(knitr)

tweets %>%
  mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
  mutate(tweet_at = hour(lt)) %>%
  tabyl(tweet_at) %>%
  kable()
tweet_at n percent
5 1 0.001
6 33 0.033
22 36 0.036
23 5 0.005

また、縦軸をパーセント表示にしたいので、縦軸のスケールをscale_y_continuousで修正します。

library(janitor)

tweets %>%
  mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
  mutate(tweet_at = hour(lt)) %>%
  tabyl(tweet_at) %>%
  ggplot(aes(x=tweet_at, y=percent)) +
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = scales::percent) +
  theme_light()

ツイート時刻

ヒートマップ

ヒートマップは、曜日と時刻の2次元で表示します。

そこで、countで集計します。

wday hour n
6 12
7 40
22 7
23 2

ヒートマップは、geom_tileで作成します。

この時wdayに月曜日開始にするオプションを与えます。また月 → 日の順番に factor の数字が大きくなるので、上から月 → 日となるように factor の順番をfct_revで逆順にします。

library(forcats)

tweets %>%
  mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
  mutate(wday=fct_rev(wday(lt, label = TRUE, week_start = 1)), hour = hour(lt)) %>%
  count(wday, hour) %>%
  ggplot(aes(x=hour, y=wday, fill=n)) +
  geom_tile(color = "white", size = 0.5) +
  scale_fill_gradient(low="lightgreen", high = "red") +
  theme_light() +
  theme(axis.ticks = element_blank(),
      panel.grid = element_blank(),
      axis.title.y = element_blank(),
      legend.position = "none")

ツイート・ヒートマップ

もっと Github っぽいヒートマップを作成

配色については、GitHub Contributions Graph の作り方(ロジック成分多め)が参考になります。

その配色をscale_fill_gradientnに使うと、次の図のようになります1

ツイート・ヒートマップ

更にヒートマップを Github のような見た目にしたい場合はGitHub-style waffle plots in Rが参考になります2

参考サイトと脚注


  1. #eeeのような三桁での指定方法を知らなかったのですが、【CSS】#fff と#eee、#111 と#000 の間はどのくらいグラデーションになるかによると#eeeeeeと同じ意味らしいです。 ↩︎

  2. Github のコントリビューションのような表は、草原ではなくワッフルですか。確かに四角く切られた枠はワッフルっぽいですね。 ↩︎