東日本大震災ビッグデータWS project 311に参加する その1
(2012/9/19 22:51追記 url切れが多かったは間違いだったので修正.奥村先生の分析結果と数が合わないのはもう一度チェックする!)
(2012/9/20 14:24追記 1tweetに複数以上のurlが含まれていても1つしか抽出していなかったので修正.奥村先生の抽出結果の数字とほぼ同じオーダーの数値になったが,今度はこちらが10〜20程度多いものがある…なぜ…?)
(2012/9/20 22:05追記 奥村先生とのツイート数のずれはURLの後ろに付いた#が原因であることが判明.詳細は奥村先生のtwitter分析のページに記載されています)
Googleが幹事となり,朝日新聞社,JCC,Twitter Japan,日本放送協会,本田技研工業,レスキューナウ,ゼンリンデータコムによる8社が2011年3月11日前後のデータを公開して,当時何が起こったのか,震災時に必要なサービスは何か,次の災害のためにどんな準備が必要かを明らかにするWSを9月12日から10月28日にかけて開催する.それに申し込んでみた.主に情報系の方々が多いのだと思うが,テーマがテーマだけに様々な分野の人たちが参加しているように感じる.MLでもデータ処理の手法が共有されるなど,ことさらに学際融合などと言わなくても,共通のテーマ,共通のデータでWSを行うことで,十分に交流が行われるのではないか.そのように感じさせるWSが始まった.
東日本大震災ビッグデータWS
https://sites.google.com/site/prj311/
twitterによるURL共有情報の分析
NLPの方々が多数参加されているように思われるので,その方々にまかせればよいのだが,twitterのデータを扱う機会はそんなにない,というか初めてなので,自分もいろいろ分析することにした.twitterによるソーシャルネットワーク分析やデマの拡散研究は情報系の国際会議や論文誌,また社会科学系でもしばしば分析されている対象なので,今更やっても追いつきようがない.ということで,震災時にどのような情報が必要とされたか,または共有されたかをツイートに付随したURLに着目して分析を行うことにしよう.
動機と目的
ツイートにURLを貼り付けるとき,「こういう情報があるよ!」と知ってもらいたい・伝えたいという欲求が表れていたり,「○○について誰か知りませんか?」という問いかけに対して「@×× ここに書いてあるよ http:〜〜」という情報提供がなされていると考えられるため,tweetに付随するURLは震災時に共有された情報・共有したかった情報が端的に詰まっていると考えられる.そこで,つぶやかれたURLを集計し,できればアノテーションもつけて分類を行い,各URLの性質(短期的にバズった,長期的に引用され続けた etc)を見ていけば,当時の情報共有のされ方や今後の情報提供・情報共有手法に有用であるかもしれない….
困りそうなこと
今回の震災は1)直接的な地震・津波による被害(主に東北沿岸部から関東沿岸部にかけて),2)311当日の東京圏の帰宅困難問題,3)福島第一原発の事故の問題,4)計画停電や物資の買い占め等の問題(主に関東)が同時または雪崩的に発生したため,各tweetやURLがどの問題に対応した内容であるのかを分類する必要があるだろう.そして,各urlは開いて見ない限り,どの内容に対応しているのかわからないので….どこかで心が折れる可能性がありそう.
また,twitterでは短縮urlがしばしば利用されているため,同一urlに対して異なる短縮urlサービスを利用すれば,urlの文字列として異なる文字列になってしまう.そのため,urlの集計を行う際には元のurlに戻して名寄せをする必要がある.これはpythonのurllib2を使って展開するつもりだが,いちいち展開することになるため時間がかかりそう….
分析方針
twitterから提供されたデータは2011/3/11から2011/3/18の日本語tweetデータ.容量は30GB程度,総ツイート数は179,286,297.1週間で約1億8000万ツイートだが,容量が30GB程度と考えると多いようでそれほど多くないのだなぁと感じる.この中から文字列として"http"を含むツイートを取り出して,正規表現でurlを抽出した.この時点では,1)urlの名寄せができていない,2)非公式RTなどにより,文末の途切れたurlも正規表現によって抽出されてしまうという問題を有している.
上記の問題を含む抽出ツイート総数は26,951,976であり,全ツイートの15%程度であることがわかる(どこかで処理を間違えていなければ).平常時と比べていないので傾向はわからないが,6-7tweetに1度はurl付きtweetをしているというのは結構多いのではないか.
ここまで,処理した上でとりあえず途中経過を載せてみる.今回のような場合,重要なのは上位100くらいではなく(後で示すように上位100はマスメディアによる情報が多数を占める),もっと下位のロングテール(懐かしい響き)部分だと思う.上位はどうしても報道資料や国・自治体による発表,速報的内容になってしまうからだ.しかし,これらの情報を含んだurl以外をうまく抽出するのはなかなか骨が折れそうである.urlごとに[報道][地震・津波]や[ブログ][原発]などの分類を行いたいが,どこまでがんばれるかは未知数である.
分析の途中経過として,短縮urlの名寄せ前の生データ段階での上位100のurlを下記の表にまとめる.
ここでは便宜上,"リンク切れ"は現時点でサイトに繋がらないもの,"url切れ"はtweet内で(非公式RTなどによって)urlが完全ではないが正規表現によって取り出されたものとする.
考察
こうやって見てみると,既存メディア,特にNHKは強いなぁと思わされる.災害時においては全国に放送局を持つNHKは情報の速さや信頼性の点でよく参照されているのだろう.あと,url切れが大変多いのが気になるが,これは非公式RTのせいなのか,正規表現の書き方をミスってるのか,どちらかだと考えられる(両方もありえるけど).本当に思いっきり間違えてたので修正.最初に比べてurl切れは減ったので上位100に登場するurlも変化した.上位100くらいではustreamのような映像配信サイトが多いことが特徴的で,情報が錯綜している段階においてはpassiveなメディアが強いことが示される.
一方で,はじめからわかっていたことだが,上位100では人口が多く,また当時電力やインターネット環境においても平常時とほぼ変わらなかった東京圏の情報が大半を占めている.あれほど大きな地震・津波災害があったにもかかわらず,被災地の情報が共有されておらず,また被災地向けの情報もあまり見られない.ただし,これは上位100のurlのみ見ているからであって,下位を細かくみていくことで,それらの情報共有や情報のやりとりがあることは見出せる可能性は存在する.そこらへんは細かく見ていきつつ,各urlを分類していくことが必要だと思われる.なんか良い方法があれば,どなたか教えてください.
正規表現はpythonで以下のようにやっている.
当初"-"を抽出してなかった,1tweet内の複数urlに対応していなかった問題を修正した.
(tweet_id, user_id, timestamp, body) = line.split('\t') pattern = "http://[A-Za-z0-9\'~+\-=_.,/%\?!;:@#\*&]+" regExp = re.findall(pattern, unicode(body, "utf-8")) if regExp: for i in regExp: output(fo, tweet_id, user_id, timestamp, i)
ゼンリンデータコムの混雑統計の可視化
こっちもとても適当な分析?というより,簡易的な可視化をしてみた.データはゼンリンデータコムがGPSで取得した位置情報を250mメッシュに分割し,そのメッシュの人数を1時間単位で推定したデータであり,提供機関は2011/3/8〜3/17までのデータである.
東日本を対象エリアとしてデータが提供されているようだが,とりあえず関東近辺を可視化したのが下図.それぞれ緯度・経度がよくわからない数字なのだが,これらを3600*1000で割ると,通常の度表現の緯度経度座標になるようです(@kotanakahiraさんにtwitterで教えてもらいました,thx!!)これに関してはとりあえずデータ概要を眺めるためにRで可視化をしただけである.各メッシュ3000人以上が赤,1000-2999がオレンジ,1000未満が黒にしてある.
上記の東京近辺に絞ったデータで,各メッシュに冪乗則の関係またはZipf則に従ってないかを確認してみたのが下の図.順位とメッシュ人口の両対数グラフである.途中までは直線だが,最後にガクっと下がってしまう.ある閾値までは冪乗則が成り立っていそうな感じがする.
それはともかく,震災前の平日と震災当日の人口変動をこの図を用いて比較してみよう.左が3/08,右が地震当日の3/11.黒が深夜0時,オレンジが昼の12時,赤が22時のデータである.つまり,黒が夜間人口,オレンジが昼間人口を表し,1日の中でエリア全体で人口密度の低い地域から人口密度のより高いエリアに人口全体が移動(通勤・通学など)していることがわかる.で,22時の段階では一部を除いて自宅に帰っており,深夜に近づくにつれて帰宅する様子がうかがえる(たぶん1時間ごとに表示したら全体の変動がわかりやすそう).一方で,震災当日は22時になっても,人口分布が昼間人口の分布とほぼ変わらない.これは当日の鉄道運休などによる帰宅困難状態により,22時の段階でも都心部に人が多く残っていたことを表している.
上記のtwitterの分析もこの混雑統計も,既にみんな(感覚的に)知っていることをデータに基づいて確認しただけに過ぎないので,もう少し面白い発見があったり,次の災害時に寄与するような分析が行えると良いのですが.tweetデータと移動・活動データを同時に扱えると面白いなと思いつつ,実際にやるのはなかなか骨が折れそうです.
あと,診断メーカーはどんな状況においてもウザいことがわかりました.
地図のplotはあまりに適当なので載せるの恥ずかしいのですが,このようにしています.
###首都圏あたりをplotする関数 plotTokyo <- function(x) { date <- x[1] time <- x[2] #首都圏の座標(適当) lat_up <- 35.83333 lat_down <- 35.27778 lon_left <- 139.4444 lon_right <- 140.2778 #zenrin0308などのファイル名でゼンリンデータを読み込んでおく originalData <- eval(parse(text=paste("zenrin0", date, sep=""))) #東京中心部 subData <- subset(originalData, (originalData$V3 >= lat_down)& (originalData$V3 <= lat_up)&(originalData$V4 >= lon_left)& (originalData$V4 <= lon_right)&(originalData$V2==time)) plot(subData$V4, subData$V3, pch=15, xlab="lon", ylab="lat", main =paste(date, time), col=ifelse(subData$V7 >= 3000, "red", ifelse(subData$V7 >= 1000, "orange", "black"))) }