Twitterデータ

データ提供:Twitter Japan 株式会社

データの概要

震災から1週間の,日本語のツイートのデータである。書き込まれた場所は日本とは限らない。

tweet0 から tweet5 までの6ファイル(合計34,232,308,442バイト)と簡単な README が提供される。ファイルはUTF-8,行末 \u000a で,各行は \u0001 で区切られた4つのフィールド iduser_iddatetimetext から成る。この user_id は,変更可能なユーザ名(screen_name,私なら h_okumura)と異なり,アカウントを削除しない限り不変なもの。私の user_id は 28894757。http://twitter.com/users/show/28894757.xml あるいは http://api.twitter.com/1/users/show.xml?id=28894757 にアクセスすればユーザ名がわかる(あるいは逆に http://api.twitter.com/1/users/show.xml?screen_name=h_okumura など)。より簡単な方法として Twidder というサイトがある。また,ツイートの id がわかれば http://api.twitter.com/1/statuses/show.xml?id= でXMLが取得できるし,http://twitter.com/ユーザ名/status/id でツイートが閲覧できる。

以上はProject 311が行われた時代の話。現在は上のようなことはできない。新しいAPIを使うか,コマンドで使うなら例えばRubyで動く t というツールを使って t whois @h_okumura と打ち込めばIDなどが出力される。

単純にgrepして気づいたが,テキスト中に改行 \u000a が含まれることがあるので,まず次のようなスクリプトでテキスト中の改行をスペースで置き換えた(他の制御文字のほうがよかったかもしれない):

#! /usr/bin/ruby -w

lastline = nil
while line = gets()
  line.chomp!
  if line =~ /\x01/
    if lastline
      puts lastline
    end
    lastline = line
  elsif lastline
    lastline = lastline + " " + line
  end
end
puts lastline

これを例えば cat.rb というファイル名で作って実行のパーミッションを与え,

./cat.rb tweet? >all

とすれば,tweet0 から tweet5 が結合されて all という一つのファイルになる(ただし \u001a が紛れ込んでいるらしいがこれはWindowsでテキストとして扱うとEOFと解されてそこで切れるので要注意。というかWindowsなんか使うなWindowsではCygwinを使おう)。

これに対して,例えば「SPEEDI」という語を検索するには,grep(またはegrep)を使って

grep SPEEDI all >SPEEDI.txt

とする。正規表現というものを使えばもっと複雑な検索ができる。

結果をさらに時系列に並べ直すには,たとえば

A=`ruby -e 'print "\x01"'`
sort -t $A -k 3 SPEEDI.txt >SPEEDI_sorted.txt

とすればよい。

冗談で全体のファイルを上のようにしてソートしようとしてみたが,全部で30Gバイトなので,すぐに諦めた。ソートするには,日時欄は 2011-03-11 09:00:002011-03-18 08:59:59 の範囲なので,7桁の基数ソートが速そうである。最初は右から1桁ずつ見てビンに分けたが,途中で2桁ずつくらいのほうが効率が良いことに気づいた。最終的に,ソートされた 2011031120110318 の8個のファイルに分けた。この手順はちょっと面倒なので,今からやる人は,grep 後の小さなファイルに対してソートするほうがよいだろう。

なお,このデータでは公式・非公式RTの区別はつかない。公式RTも RT @だれだれ: 〜 の形式で収められている。

ツイート数などの時間変化

全179286297個のツイートを時ごとにプロットすると次のようになり,11日15時台3528319ツイートを記録する:

時ごとのツイート数

分ごとにプロットすると一番高いピークの位置が変わる:

分ごとのツイート数

ピークは15日22:34の99695ツイート/分である。これは22:31の静岡県東部の震度6強の地震が原因である。11日のピークは14:52の76370ツイート/分である。もっとも,分ごとのツイート数のピークの高さは,事象が分の境い目に落ちて二つに分れれば半分になるので,あまり良い指標ではない。移動平均をとったほうがよいかもしれない。

何かがあるとツイート数は増えるが,逆にツイート当たり平均文字数(バイト数ではない。Rubyでは .split(//u).size で求める)は減ることが,次のグラフからわかる。「地震!」とか「バルス!」を考えてみればよい。

ツイート当たり文字数

両者の積である分ごとの文字数はピークが少ない。

分ごとの文字数

ユニークなツイーター数

全179286297ツイートは3691599人によってつぶやかれた。日本の人口128百万人の2.9%がつぶやいたことになる。1人最大15635ツイートしている。1ツイートしかしていない人は711287人いる。縦軸にツイート数,横軸にその順位をプロットすると,次のようになる。

ユーザごとのツイート数

上位4ユーザはいずれも1万ツイート以上しているが,Person Finderの内容をそのままつぶやくボットのようである(今はアカウントが消えている)。5位は運行情報サイトJorudanLiveである。グラフを見るとここまでとこれ以下が分かれているように見える。ちなみに私は147回つぶやいた。

地震の予兆・始まりのツイート

省略は […] で示した。

毎秒のツイート数をいろいろなスケールで描いてみた。次のようにいったん減ってから増える。

毎秒のツイート数
毎秒のツイート数
毎秒のツイート数

リツイート

最初にも書いたように,本データでは公式リツイートと単に「RT @だれだれ: 」で始まるツイートを区別することができないが,この形で始まるまったく同じツイートの数を調べた。

h = Hash.new(0)

while line = gets()
  if line =~ /^.*?\x01.*?\x01.*?\x01(RT @\w+: .*)$/
    h[$1] += 1
  end
end

h.sort_by { |k,v| -v }.each { |k,v|
  print v, "\t", k, "\n"
}

全RT数は 38422630 で,全ツイート数 179286297 の21.4%にあたる。また,ユニークなRT数は 4324580 で,全ツイートの2.5%が公式RTされたことになる。

Zipf則に当てはまるかと思ったが,両対数グラフで直線にならない。たまたま順位の1/5乗とRT数の対数をプロットするとほぼ直線になるが,根拠は不明。

RT数 RT数

10位までを紹介する(以下では頭の「RT @だれだれ: 」は省略した)。先頭の数字がリツイート数である。

その後,RT(QT)関係だけを抜き出したデータも配付された。こちらはコメント付きリツイートも含むものであるが,結果はほぼ同じである(上で最初に挙げたもののリツイート回数は47454回になる)。

頻出するURL

@harapon さんの 東日本大震災ビッグデータWS project 311に参加する その1 - Fire and Motion の二番煎じというかチェックの意味でちょっとだけやってみた。@harapon さんも1ツイート複数URLに対応されたのでほぼ同じ数になったが,まだほんの少し違うところがある(理由は後述)。

173978  http://ustre.am/vmCj
138647  http://ustre.am/kJ3E
85775   http://bit.ly/17n4iz
64056   http://twitpic.com/49zcwy
50959   http://t.co/spB1CKU
46609   http://bit.ly/eVdXpd
40718   http://ustre.am/eOVh
39908   http://bit.ly/eoeUc2
37422   http://bit (不完全)
36519   http://bit.ly/euuWSb
35594   http://bit.ly/tokyohinan
34768   http://bit.ly/ehTZkT
34141   http://japan.person-finder.appspot.com/?lang=ja
33188   http://bit.ly/hznGrs
31642   http://t.co/07xUH83
31461   http://twitpic.com/48r1o9
31443   http://bit.ly/etWywJ
30344   http://bit.ly/hF2BHS
30325   http://bit. (不完全)
30023   http://nerv.evangelion.ne.jp/
29379   http://j.mp/hkqf4H
28909   http://www.saigai-touseki.net/sendsdata/total.php
28624   http://savejapan.simone-inc.com/
28062   http://www.ustream.tv/channel/fc2mh3

@harapon さんと違いが大きいものとして例えば http://twitpic.com/49zcwy がある。こちらは 64056 だが @harapon さんは 64083 だ。27 の違いの理由は次の表を見ればわかる。[…] はスクリーン名らしいので省略した。

64056	http://twitpic.com/49zcwy
110	http://twitpic.com/49zcwy/full
25	http://twitpic.com/49zcwy#
24	https://twitpic.com/49zcwy
8	http://twitpic.com/49zcwy/
4	http://twitpic.com/49zcwy 
2	http://twitpic.com/49zcwy:
2	http://twitpic.com/49zcwy@[…]
2	http://twitpic.com/49zcwy#jishin
1	http://twitpic.com/49zcwy!!!
1	http://t.co/iOmDFUNhttp://twitpic.com/49zcwy

おそらく # をURLに含めなければ @harapon さんと一致する。正しい回数としてはこの表の合計 64235 であろう。同様に,パーソンファインダーは http://japan.person-finder.appspot.com/?lang=ja が 34141 回現れるが,それと同等なものの合計が 59499,http://goo.gl/sagas と同等なものが 15466,http://bit.ly/f5qJK0 と同等なものが 13964,合計 88929 で,もっとあるかもしれない。

URLの取り出し方は,Rubyで次のようにした。

while line = gets()
  a = line.scan(/(https?:\/\/[-_.!~*'a-zA-Z0-9;\/?:\@&=+\$,%#]+)/)
  a.each { |x|
    puts x
  }
end

最初 () も含めたがこれは失敗だった。

横軸に出現数の順位,縦軸に出現数をプロットすると,なんとかZipf則が成り立っているようだ。

URLの出現頻度

頻出するスクリーン名

上のRT数とも関係するが,スクリーン名(正規表現 /@w+/)は1ツイートに複数現れることも多い。100回以上出現したスクリーン数の出現回数(縦軸)と順位(横軸)を両対数プロットで表した。

スクリーン名の出現回数と順位

10位までの出現回数とスクリーン名を挙げる:

842586  @NHK_PR
353472  @takapon_jp
326360  @nhk_seikatsu
316603  @itsumonoTL
297029  @Asahi_Shakai
272672  @nhk_news
244540  @ayu_19980408
237331  @tsuda
196403  @nhk_HORIJUN
188442  @hayano

理系では早野先生 @hayano が当初から圧倒的な知名度を得ている。ちなみに私 @h_okumura は1796回(5577位)にとどまった。

いろいろな語の利用頻度

SPEEDI

とりあえず grep SPEEDI してみたが,もうちょっとがんばって '(S|s|S|s)(P|p|P|p)(E|e|E|e)(E|e|E|e)(D|d|D|d)(I|i|I|i)' とし,さらにSpeeding等を外した。201件あった。

SPEEDI

初出は12日04:31:05。早野先生が15日14:20:30に1度つぶやかれただけで,14時台に103ツイートのピークができたが,長続きしていない。

放射(線|能|性)

放射(線|能|性)

83264ツイート/時を記録したのは12日17時台である。

溶融|メルトダウン

溶融|メルトダウン

34950ツイート/時を記録したのは12日14時台である。時間的に溶融→放射線の順序であったことがわかる。

デマ

デマ

60928ツイート/時を記録したのは11日16時台である。

放射脳

放射脳

初出は11日18:24:22「原爆で放射脳漏れの可能性があります!」だが,初期のものは誤変換の可能性がある。27ツイート/時を記録したのは15日19時台で,19:02:28に「【ご注意ください】「買い占めや デマが大好き 放射脳」 あなたの脳味噌、飛び散っていませんか?」というツイートがあり,多数リツイートされた。

イソジン|うがい薬

イソジン|うがい薬

無関係なものも多いが,原発事故関連での初出は11日15:27:39「震度5弱とか刈羽原発大丈夫かな…イソジン用意しよ」。その後,イソジン服用を勧めるツイート,戒めるツイート,いずれも多数。

イソジン服用を勧めるツイートで最も多くRTされていたのは12日20:23:48の「島原発近くのひと。友人の放射線科医よりの情報です。 イソジンうがいするだけで数日は効果あり。放射性ヨードは気体だけど他の放射性物質はほとんどが粒子なので室内退避+マスク+イソジンで一番問題になる内部被曝はかなり防げるはず。 との事です。 #jishin」(1370RT),11日21:18:31の「福島第一原発が思った以上にヤバい!!チェルノブイリに行ってきた俺から警告だ。億が一放射性物質が大気中に拡散した場合、チェルノブイリのように甲状腺ガンになる場合がある。これを防ぐにはヨウ素剤が必要だが、これはイソジンで代用できる。イソジンを3滴いれた水を毎日3日間飲んどけ!今!!」(869RT)など。

戒めるツイートが増えたのは14日以降。最も多くRTされていたのが @nhk_kabun の15日15:30:08の【デマに注意!】(8019RT)。ほぼ同内容の15日16:10:36の【デマに注意】(2954RT)と合わせて1万を超える。ほかにも戒めるツイートが多数RTされた。

コスモ石油とデマ

オレンジは「コスモ石油」を含む毎時のツイート数,青は「コスモ石油」「デマ」の両方を含む毎時のツイート数。ただし「デマ」の2文字を含まないデマ否定のツイートも多い。

コスモ石油とデマ

3月11日のツイートを調べると,千葉市〜市原市の工場群で複数の火災・爆発があり,情報が錯綜していたことがわかる。このような状況で,とりあえず雨に当たらないようにすることは合理的な判断ではあるが,「工場勤務の方から」「厚生労働省より」などの尾ひれを付けて流される情報はデマである。なお,地震への対応状況: 千葉市長:熊谷俊人の日記によれば「JFE工場の大きな炎はコークスガスの圧力を下げるために燃焼させたもので火災ではありませんのでご安心ください」とのこと。以下 [...] は注釈。

いったん収まったかのように見えたが,翌12日再燃し,デマとその打ち消しが入り乱れ,16時台に28906ツイート/時を記録する。

最初は棒グラフで描いたが,情報通信白書平成23年版p.24の図(下に引用)にインスパイアされて描き直した。ただしスケールは全く違う。RTを除いてもピーク時7000ツイート/時を超えている。

情報通信白書平成23年度版p.24コスモ石油とデマ

放射*・鼻血

放射・鼻血

放射能を浴びて鼻血が出るという噂は,最初の1週間ではほとんど見られなかったことがわかる。初出は11日20:03:36の「放射能漏れだっけ、あれ大丈夫になったの????お風呂入っててよくわからん…鼻血と咳出たら終わりって聞いた」というツイートである。12日18:18:19には「【拡散希望】現在マイクロシューベルトの値は1年間であびる量を1時間であびている計算になります。鼻血、歯茎からの出血、粘膜からの出血がある場合は、放射線の専門医のいる病院、または血液内科がある病院へ【原子力災害】」というツイートがされ,10回RTされるも収束する(シューベルトはシーベルトの間違いだがすべて原文のまま)。

浪江町の放射線

浪江町の放射線のツイートは,15日16時台2件,17時台8件だが,18時台391件でピークに。逃げるためのガソリンがないというツイートが大量に。

浪江・放射

文科省のモニタリングカーが15日に福島市経由で福1の方向に20kmあたりまで近づき,20時40-50分に195-330μSv/hの高線量を測定した件,朝日「プロメテウスの罠」ではSPEEDIを使って高線量地点がピンポイントでわかったことになっていたり,文科省が地名を伏せて云々といった批判があったりする。文科省発表のURLは http://www.mext.go.jp/component/a_menu/other/detail/__icsFiles/afieldfile/2011/03/16/monitoring.pdf で,PDFのタイムスタンプは2011-03-16 02:46だったが,現在は行方不明である(ミラー。文科省は古いファイルを探せなくするような「サイトの整理」をやめてほしい)。上記PDFを掲載したという文科省のツイートはまだ残っている。[訂正されたファイルが別URLで公開されていた。下参照]

浪江・放射・330μ

さて,この発表を一般の人が知ったのはいつか。朝日新聞では16日夕刊で報道されたが地図はない。読売は縮刷版を探したが見つからない。ツイッターでの初出は16日02:20:35「文部科学省によると、福島第1原発から約20km離れた福島県浪江町周辺で、195~330μSv/hの放射線を観測。24時間屋外に居続けた場合、2~3週間で健康に影響が出るレベル。」,2番目は16日02:34:06「20キロで330マイクロシーベルト http://j.mp/dZl5Ef [gikoneko] ◆ 20キロ地点の放射線量を観測=195~330マイクロシーベルト-文科省 文部科学省は16日、福島第1原発から約20キロの距離にあり、住民に屋内退避指示が出されている 福島県浪江町…」である。20キロで330マイクロシーベルトという2ちゃんねるの書き込みは16日02:33:55.85で,http://www.jiji.com/jc/c?g=soc_30&k=2011031600058 へのリンクがあるが消滅している。時事ドットコムが報じたらしい。3番目の02:46:25のツイート「文部科学省は16日、福島第1原発から約20キロの距離にあり、住民に屋内退避指示が出されている福島県浪江町周辺で、1時間当たり195~330マイクロシーベルトの放射線量を測定したと発表した。 (2011/03/16-02:13)」はニュースソースの発表時刻が記されている。以下,ニュースソースはどんどん増え,2890倍とか6600倍といった記述も出てくる。

330μSv/hの発表は衝撃的で,私も16日07:26:09にこんなことをつぶやいた。しかし,あまりマスコミでは大きく報じられず,ツイート数も少ない。なぜか。『Journalism』2012年9月号の武田徹・高橋真理子対談のp.6で高橋記者は「一部でものすごく高い数字が出ていることが早い時期からわかっていました。それがどこなのか、最初は車載計測であることを理由に示されず、マスコミ側が明らかにするよう要求して3月17日に発表させた。それで18日の紙面で「浪江町で毎時170マイクロシーベルトという高い値だった」と報じているんです」と述べている。16日早朝の文科省の発表は地図も付けて非常に具体的だったのだが,場所がよくわからないという理由で半ば無視されたのだろうか。

なお,上に「行方不明」と書いた文科省3月16日の発表は,現在はモニタリングカーを用いた固定測定点における空間線量率の測定結果(平成23年3月) | 文部科学省の一番下の福島第一原子力発電所の20Km以遠のモニタリング結果[平成23年3月16日(水曜日)1時05分時点](PDF:1181KB)に,数値の訂正をして掲載されていた(タイムスタンプ2012年2月10日17:30)。ただし,このURLも old が入っているので,そのうち削除されて,また新しいURLで掲載されるのであろう(文科省はクールなURIは変わらないを読んでほしい)。

[付記] 上の3月15日の結果(訂正版)は現在福島第一原子力発電所の20Km以遠のモニタリング結果[平成23年3月16日(水曜日)1時05分時点](平成24年2月10日測定結果訂正) | 原子力規制委員会にある。

友人の.*(から|より)の情報

よくあるデマのパターンである。grepしてみるとおもしろい。多くなりすぎないように実際には次のような感じで検索した。

while line = gets()
  if line !~ /RT/ && line =~ /友人の.{1,30}?(から|より)の情報/ 
    puts line
  end
end

PDF

「(P|P)(D|D)(F|F).*読め(ない|ません)」は,数は少ない(183件)が,重要。11日(RT以外)は次の4件(@FDMA_JAPAN は総務省消防庁。これだけ批判されても現在も報道発表はPDFで行っている):

12日からもいくつか拾っておく:

最後に @sakaima さんのツイートを一つ:

パーソンファインダー・Web171

NHKの項も参照されたい。

パーソンファインダー・Web171

'(W|w|W|w)(E|e|E|e)(B|b|B|b)( | )?(1|1)(7|7)(1|1)'パーソン.?ファインダ|person.?finder|goo\.gl/sagas(大文字・小文字区別せず)を比較した。

ヤシマ作戦

ヤシマ作戦については例えば節電徹底へ「ヤシマ作戦」賛同者がTwitterで広がる(ITmediaニュース)を参照されたい。3月12日18:00に1717ツイート/分を記録する。

ヤシマ作戦

奥村晴彦

Last modified: