技術メモ(仮)

IT系の話や研究,他のことなど話して行けたらいいな~って感じです.ただいまJavaを学習中

twitterデータを分析してみた その1(Tweet数編)

概要

昨年の秋(2014年10月)からtwitterのPublic Stream APIを用いて全量の1%のTweetを収集している.dev.twitter.com
しかし,ずっと貯めているだけで何も触っていなかったのでちょっとだけこのデータを利用しようと思う.
このデータを貯めている仕組みについては今度時間があったら紹介します.

ゴール

今回はRを用いてTweet量を時間単位で分けて折れ線グラフで表示し考察することをゴールとする.
さらにそれを各曜日で算出し比べてみる.
Rを使う理由は最近この本使って触ってみたから.もう少し勉強しようと思った.

ビジネス活用事例で学ぶ データサイエンス入門

ビジネス活用事例で学ぶ データサイエンス入門

作業

今回対象とした日付は2015/05/17~23の1週間である.
GWとかイベントとか特にないはずなのでイレギュラーなグラフは表示されないはずである.

1日のみ可視化

まずはじめの一歩として1日分のグラフを描画してみる.
以下のようなデータを用意する.
なおこれはタブ区切りである.
ファイル名:20150517.txt

time	count
2015-05-17 00:00:00	56918
2015-05-17 01:00:00	36735
2015-05-17 02:00:00	22748
2015-05-17 03:00:00	15885
2015-05-17 04:00:00	11987
2015-05-17 05:00:00	10769
2015-05-17 06:00:00	12665
2015-05-17 07:00:00	19398
2015-05-17 08:00:00	26735
2015-05-17 09:00:00	29715
2015-05-17 10:00:00	33747
2015-05-17 11:00:00	35657
2015-05-17 12:00:00	38422
2015-05-17 13:00:00	37761
2015-05-17 14:00:00	36903
2015-05-17 15:00:00	37946
2015-05-17 16:00:00	39019
2015-05-17 17:00:00	42120
2015-05-17 18:00:00	43838
2015-05-17 19:00:00	49303
2015-05-17 20:00:00	57333
2015-05-17 21:00:00	66247
2015-05-17 22:00:00	76951
2015-05-17 23:00:00	73168

これは各時間ごとのTweet数である.
これを元に折れ線グラフを書いてみる(この集計するプログラムについては後日githubにあげようかと).

以下が可視化するためのRのコードになる.
なお事前に以下のライブラリーをRにインストールしておく必要がある.

  • ggplot2
  • scales
  • tidyr

ファイル名:tweet_cnt_hour.R

library(ggplot2)
library(scales)

args <- commandArgs(trailingOnly = T)
file <- args[1]
date <- sub(".txt", "", file)
graph_title <- paste(date, ":Tweet", sep="")
data <- read.table(file, head=T, sep="\t")
limits <- c(0, max(data$count))
data$time <- as.POSIXct(data$time)
g = ggplot(data, aes(x = time, y = count)) + geom_line(lwd=1, color="blue") + geom_point(size=2, color="blue") + scale_y_continuous(label=comma, limits=limits) + ggtitle(graph_title) + scale_x_datetime(label=date_format("%H:%M")) + theme_bw()
ggsave(paste(date, ".pdf", sep=""), g)

以下のコマンドで実行

R --vanilla --slave --args 20150517.txt < tweet_cnt_hour.R

すると以下の日付.pdfという名前のファイル(今回だと20150517.pdf)ができる.
それを見てみるとこんな感じ.
f:id:fuji_151a:20150526010751j:plain
これをみると当然ながら深夜帯は少なくて,夕方から夜になるに連れてどんどんつぶやきの数が増えることがわかる.

1週間可視化

次に2015/05/17~23日までまとめて折れ線グラフとして表示してみた.
20150517~23.txtのデータを用いて以下のようなデータを作成した.
ファイル名:20150517-23.txt

time	20150517	20150518	20150519	20150520	2015052	20150522	20150523
00:00:00	56918	55711	48138	49733	48614	46605	49119
01:00:00	36735	32162	28379	29487	29363	28342	30199
02:00:00	22748	19277	17846	18980	19788	18437	19646
03:00:00	15885	13436	12822	13484	13737	12862	14398
04:00:00	11987	10320	9877	10943	13161	11559	11828
05:00:00	10769	10366	10345	10219	11624	11000	11218
06:00:00	12665	14730	14728	15550	15400	15915	14164
07:00:00	19398	26485	27733	27215	27336	28921	23858
08:00:00	26735	25505	27221	27155	27159	28386	27016
09:00:00	29715	22382	21609	22344	21898	22645	28332
10:00:00	33747	23717	23428	23815	23800	24272	31690
11:00:00	35657	25234	24416	24434	25234	25208	32245
12:00:00	38422	35393	35723	36317	36511	37030	37159
13:00:00	37761	29588	29624	30551	30408	30283	36167
14:00:00	36903	27232	26894	27793	27631	27617	34581
15:00:00	37946	28632	29281	29707	29066	29403	35091
16:00:00	39019	33182	32051	31748	31308	32623	35974
17:00:00	42120	38279	36806	36625	36432	36687	40027
18:00:00	43838	44254	43583	43895	42467	43413	42640
19:00:00	49303	49374	48201	47376	47939	48198	44884
20:00:00	57333	55440	55070	58300	55873	59388	53098
21:00:00	66247	63367	62990	64561	63599	67060	61320
22:00:00	76951	68307	67554	68326	67791	67936	66756
23:00:00	73168	63418	64788	63155	60027	63002	63761

これを可視化するRのコードが以下である.

library(ggplot2)
library(scales)
library(tidyr)
dd<-read.table("data/20150517-23.txt", head=T, sep="\t")
dd$time<-as.POSIXct(dd$time, format="%H:%M")
gather_data <- gather(dd, date, count, -time)
ggplot(gather_data, aes(x = time, y = count, colour = date)) + geom_line() + theme_bw() + scale_x_datetime(labels=date_format("%H:%M"))

これを実行すれば以下のようなグラフが表示される.
f:id:fuji_151a:20150526012226j:plain

考察

これを見てわかることは18~22日は同じようなグラフになり,17,23だけ少しだけ変わったグラフになった.
大きく分けると平日(18~22)と休日(17,23)である.

平日

まず平日から見てみる.最初に見せたグラフ同様深夜は少なく,夕方から夜にかけて上昇している.
また,平日は3つの山があることがグラフからわかる.
7時台,12時台,22時台.これはそれぞれ通勤or通学中,昼休み中,寝る前の自由な時間?を表していると予想.
社会人であるとこの時間帯でないとツイッターをする時間がないのかもしれない.(学生はわからない...)

休日

次に休日組(17,23)を見てみる.
深夜は少なく,夕方から夜にかけて上昇の傾向は変わらないが,朝や昼のTweet数が多少ことなる.
例えば7時台は平日と比べると少なくなっている.
これは休みの日なのでぐっすり寝てしまい,ツイッターを触っていないのではと予想.
また休みの日なので仕事が休みな人がほとんど,なので昼周辺の時間も比較的平日よりTweet数が多くなっている.

また最後の22時台はなぜか17(日曜)が土曜日より多くなっている.
たまたま多くなったのか,それとも普段からこんな感じなのかは他の週を調べないとわからないが,
もしかしたら「月曜やだ〜」とか「明日仕事だ〜」といった,嘆きみたいなのをつぶやいているのかもしれない...
これは今度調査.

まとめ

今回,twitter stream apiを用いて貯めた1%のデータから
各曜日の1時間ごとのTweet数を集計し可視化を行った.さらに自分なりの考察を入れた.
大きく分けて平日と休日のタイプに別れる.
平日は通勤 or 通学時,お昼時間,寝る前に山ができることがわかった.
また休日は平日より朝のTweet数は少なく変わりそれ以外の時間は平日より多かった.
日曜日のみ寝る前のTweet数が他の曜日より少々多かった.

次は一番つぶやかれてる単語とか調べたら面白いかも.

深夜にだいぶ慌てて書いたので誤字脱字やコードの間違いなどあるかもしれません.
もし何か見かけたら連絡ください.よろしくお願いします.