ラベル Twitter の投稿を表示しています。 すべての投稿を表示
ラベル Twitter の投稿を表示しています。 すべての投稿を表示

2016年1月16日土曜日

祭りの後 ~バルス離れとかいわれてる…

今度の金曜ロードSHOW(2016年1月15日でのTweetデータを、前々回(2011年12月9日前回(2013年8月2日のデータと比較してみます。

2016年1月13日水曜日

過去のバルス祭りを調べてみた ~今度の金曜ロードSHOW(2016/01/15)はバルス祭り~

今度の金曜ロードSHOW(2016年1月15日がバルス祭りということなので、過去のバルス祭りのときのTweet数をいろいろ調べてみました。

実は、前回のバルス祭りのときに、予告していたにもかかわらずブログに書かなかった(書けなかった)ので、今回は、事前に過去放送時のTweet数比較などを書いておきます。

2015年6月23日火曜日

2015年6月22日月曜日

2015年5月31日日曜日

「おっぱい」のツイート数を調べれば地震が発生した日付がわかる…というわけではなかった

このツイート↓に触発されてしまったのですよ。

----------------------------------------
[2015/06/05追記]
元ツイートは削除されたようなので、類似ツイートと転載ページのリンクを張っておきます
TwTimez
ツイナビ
----------------------------------------

20150530の小笠原諸島西方沖地震と20110311の東日本大震災をツイートで比較してみる

昨日(2015/05/30)、小笠原諸島で地震が発生し、広い範囲で大きな揺れが観測されました。

2015年2月7日土曜日

2015年2月3日火曜日

後藤健二さんの注目ツイートのリツイート推移

後藤健二さんの過去のツイートが注目されています。


該当ツイートの「リツイート」と「お気に入り」の推移を(TwitterStreaminngAPIで収集した過去データから)推定しました。

2014年11月29日土曜日

Twitter分析:インフルエンザ2014-2015

 先日インフルエンザの流行が例年より早く始まったという報道を目にしました

 TwitterのTweet数の変化から、これを確認してみます。
  • 期間:2010年8月1日から2014年11月28日まで(諸原因による欠落あり)
  • 対象:TwitterStreamingAPI で取得できたTweet(全体の約1%)のうち日本語文
  • 抽出:「インフルエンザ」を含む文(「鳥インフルエンザ」を含む文は除外)
  • 1日単位のデータを2つのパターンでグラフ化
    • 出現頻度=「インフルエンザ」を含む文の数
    • 出現率 =出現率/日本語文の数

■出現頻度
クリックで拡大

 毎年明らかなピークができているのがわかります。
 昨年までの傾向をさらに見ると、11月の終わりに小さな山ができて、2月始めに大きな山が来ています。

 11月終わりの山はインフルエンザ予防接種関係のつぶやきによるもので、2月の山がインフルエンザのピークだと考えられます。

 次の資料と比較して、ほぼピークが一致していることが見て取れます。


 さて、例年に比較して今年のTweet数の変化から、今後のインフルエンザの流行の傾向を判断できるでしょうか?

 11月27日、28日にバーストが見られますが、これはむしろ前述の報道を受けてのツイートが多く、「インフルエンザにかかった」というようなTweetとは異なり、患者数と直接的に結びつくものではありません。
 11月26日以前に小規模な山ができてますが、これは例年の予防接種関連のものと判断できます。

 したがって、11月26日までの「インフルエンザ」Tweet数からは、流行が早く始まったことを判断することはできませんでした。

 では、今後、大流行になるか、例年並みなのかを判断する方法はあるでしょうか?

 流行が早く始まった=患者総数が多くなる、ということを示唆しています。
 一方、この報道が社会にフィードバックされた結果、対策を取る人が増えて患者数が抑制される可能性もあります。

 以上から、今後のTweet数に対して、次のような判断が可能ではないかと考えています。
  • 今回のバーストが一時的なもので1月に向けて減少に転ずる → 例年と同等
  • このまま増加する → 大流行 or ピーク前倒し
この仮説についての検証は行うつもりですが、報告できるかどうかは未定です。
 (個人的事情の見通しが立たないので…



■出現率

 上記の出現頻度による分析で、「インフルエンザ」に関する分析は終わっています。
 ところが、ここで一つ問題があります。「出現頻度でいいのか」ということです。

 TwitterStreamingAPI で取得できたTweet(全体の約1%)のうち日本語文の数は、明らかに大幅に増加しているのです。
  • 2010年10月:約 150,000 ツイート/日
  • 2014年11月:約 850,000 ツイート/日
そこで、試しに出現率=出現頻度/総数でグラフ化すると、次のようになってしまいます。

クリックで拡大

 2月のピーク位置は一致しますが、毎年のピーク量が実際の流行状況から外れています。
 つまり、出現頻度のままの方が、現実との相関が高いのです。

 どうやら、「インフルエンザ」に関しては、出現頻度で見た方が良さそうです。

 Tweet総数が増えれば、「インフルエンザ」Tweetもそれに比例して増えそうなのですが、なぜそうなってないのでしょうか?

 原因としていくつかの仮説が立てられます。
  • 各人の興味の多様化
  • 個人情報や故人の徳的に関わる可能性のあることをTweetしなくなった
  • スパムの増加
  • (その他)
しかし、「インフルエンザ」だけでこの仮説を裏付けすることはできません。
 今後、他のデータの分析も含めての宿題とさせてください。



■参考ページ(インフルエンザ関連)

インフルエンザ対策特集

2014年11月27日木曜日

rubyで日本語文の抽出

 Twitterのつぶやきを収集することはできましたが、現実には日本語以外の文は必要ありません。

 そこで、rubyを使って日本語の文だけを取り出します。
 日本発信の文でも日本人の書いた文でもなく、日本語で書かれた文を抽出するのです。

 ここでは、「ひらがな」と「カタカナ」の含まれている文だけを抽出する方法を紹介します。

 rubyの「=~」メソッドによるマッチングの戻り値を利用して、ひらがなまたはカタカナを含んでいるかどうかを判定します。
  • マッチング成功 → マッチングした文字の位置を返す
  • マッチング失敗 → nil を返す


■サンプルコード
while line = gets
 pos_h = ( line =~ /\p{Hiragana}/) # ひらがなの位置(なければnil)
 pos_k = ( line =~ /\p{Katakana}/) # カタカナの位置(なければnil)

 if pos_h || pos_k then
  puts line
 end
end

■参考ページ


2014/11/28 typoを修正

2014年11月21日金曜日

Ruby2.0でTwitterStreamingAPI (1.1) を使う(改):TweetStream

 以前に、TwitterStreamingAPI 1.1 をhttp接続で使う方法を掲載しました。
 その方法では問題が発生する場合があることがわかり、その対処を行ったので紹介します。

 その問題は、最近の(処理速度の速い)PCを使うと気がつかないかもしれません。
 しかし、少し前の(処理速度の遅い)PCを使うとCPU100%状態が続き、プログラムの処理が追いつかなくなって、エラー終了することが頻繁に発生します。

 以前はとりあえず動作することが目的だったので、速いPCで動作すれば良かったのですが、その後、限られた資源の効率よい役割配分が求められたので、必要に迫られて試行錯誤しました。


 結論としては、以前は不採用としたTwitterStreamを使う方法できちんと動作することを確認しました。

 古いPC上でのCPU負荷を、ざっくりとした比較をすると
http接続による処理  → 100%オーバー
TwitterStreamを使用 → 数%程度
となりました。


■前準備
インストールには、Development Kitが必要です。
(1) Linux
ruby-develをインストールします
yum install ruby-devel

そのほかに、g++など基本的な開発ツール見つからずにエラーになる場合もあるようです。適宜インストールしてください。

(2) Windows
Develipment kitをインストールします。
次のページにわかりやすい説明があるのでご覧ください

■gemのインストール
gem install tweetstream


■サンプルコード
1時間単位で別ファイルに、TweetID、日時、ユーザID、Tweet内容を出力します。
コンシュマーキーやアクセストークンは別途取得してください。
require "tweetstream"
require "date"

consumer_key    = "xxxxxxxx"
consumer_secret = "xxxxxxxx"
access_token           = "xxxxxxxx"
access_token_secret    = "xxxxxxxx"
TweetStream.configure do |config|
 config.consumer_key       = consumer_key
 config.consumer_secret    = consumer_secret
 config.oauth_token        = access_token
 config.oauth_token_secret = access_token_secret
 config.auth_method        = :oauth
end

TweetStream::Client.new.sample do |status|
 next unless status.user

 dt = status.created_at.to_s.split( /[ :-]/ )
 fname = "#{dt[0]}#{dt[1]}#{dt[2]}_#{dt[3]}.txt"
 daytime = "#{dt[0]}-#{dt[1]}-#{dt[2]} #{dt[3]}:#{dt[4]}:#{dt[5]}"

 f = open( fname, "a:utf-8" )
 f.puts "#{status.id}\t#{daytime}\t#{status.user.screen_name}\t#{(status.text).gsub(/[\r\n\t]+/, " ")}"
 f.close
end
exit


※Webを検索するとTweetStreamにパッチの必要性との情報もありますが、最新環境ではパッチ不要で動作しています。RubyやGemのバージョンおよび動作環境に依存する場合もあるので、状況に応じて対応してください。


2013年7月13日土曜日

次のTwitter分析ターゲット(予定)は…8月2日、バルスの日

 本来は、参議院選挙に向けていろいろと考えていたのですが(各党and/or候補者のTweet数と当選の相関関係の抽出など)、大人の事情で本件をレポートすることはできなくなりました。

 その代わりに、
『天空の城ラピュタ』
2013.8.2(Fri) 21:00-23:34 O.A. (金曜ロードSHOW!|日本テレビ)
をTwitter分析ターゲットとします。(これなら大人の事情が絡んでくることは、まずないはず!)

 基本的には「バルス」Tweetによるバースト観測ですが、その他に何ができるかをいろいろと模索中です。
 検討しているのは、
  • 前回放映時との比較(過去データを捜索中…確かあったはず…
  • 人名Tweet数の比較
  • 注目セリフTweetの比較(表現揺らぎ「目が目が」「目が、目がぁ~」などの扱いが難しい
といったところですが、現時点では未確定です。もしかすると「バルス」観測だけになるかもしれません。

 表現揺らぎの問題は(注目セリフだけではなく)常につきまといます。そもそも音声表現されているものを文字表現に変換しているから仕方がないのですが…

 パロディ表現の扱いも困りものです。前回放映時は「バルス五段活用」らしきものが観測されました。また、某声優がらみで「海賊にならない/海賊王になる」の突っ込みとか、某公共放送さんアカウントが「ニルス!」とつぶやいていたりとか…

 今回は何が起こるのか、楽しみでもあり、分析しきれるのか不安でもあります。

--
 ところで、ガミラス語で「点火」らしき表現が「バルス」に聞こえるのは気のせいでしょうか?

--
※リンク先修正しました


2013年7月4日木曜日

Ruby2.0でTwitterStreamingAPI (1.1) を使う

2014/11/21 追記
Ruby2.0でTwitterStreamingAPI (1.1) を使う(改)」にtweetstreamを使う方法を書きました。
下記でも動作しますが、より効率の良いこちらもご覧ください。


これまで、PerlでStreamingデータを収集していたのですが、API1.1になったのを機会にRubyに移行しました。以下、動作までの覚え書きです。

投稿や検索は、gem で Twitterライブラリをインストールすれば、簡単に使えます。

ところが、このライブラリでは StreamingAPIには対応していないようです。
To access the Twitter Streaming API, we recommend TweetStream.
とのことだったので、TweetStreamを見てみました

ところがこちらにも
Note: TweetStream does not currently work with Ruby 2.0, this is a known issue.
という記載があります。
そこで、さらに内部で使用しているらしいEM-Twitterを使ってみました

ところが、これは実行時にライブラリが足りないらしく、なにやらDevelopperKitうんぬんとメッセージが表示されます。gemだけで使いたいので、これも不採用としました。


 上記の調査から既存ライブラリの使用は断念し、TwitterStreamingAPI を直接http接続から使用する方法をとることにしました。
 探してみると、以下のようなものがありました。3つのプログラムコードはほとんど同じです。



上記のページを参考にしながら、次のような変更を施しました。
1.CONSUMER_KEY、ACCESS_TOKENなど
 自分で用意したものに変更しました。

2.request["User-Agent"]
 自分の都合に合わせて変更しました

3.接続先
 「GET statuses/sample
を使いたかったので、接続先を
  https://stream.twitter.com/1.1/statuses/sample.json
に変更しました

4.サーバ証明書
 これは、本来は必要なんでしょうが、実験で使用するプログラムであることから、証明書なしで動作させるために
  https.verify_mode = OpenSSL::SSL::VERIFY_NONE
としました
(将来的な動作を保証するものではありません)

※必要なライブラリは、適宜gemからインストールしました

以上で、基本動作の確認が出来ました。あとは、それぞれの都合に合わせて修正して使います。

※2013/07/04時点の調査です。

2013年6月25日火曜日

Twitter分析:2013年コンフェデ杯での選手別Tweet計測

2013年コンフェデ杯での出場選手別のTweet数を計測しました。
例によってTwitterStreamingAPIでの1%Tweetを用いています。
検索条件は、検索文字列は名字のみ、期間はキックオフの1.5時間前から5時間分です。



■予選3試合での出場選手ごとTweet合計
 予選3試合のTweet数を合計して順位付けしました。
 上位3名(本田香川岡崎)が飛び抜けています。
 以下、3試合前出場した選手が横並びで、1~2試合出場の選手が続きます。


■2013年6月16日(日) 対ブラジル戦(4:00キックオフ) 2:30-7:30
 3:00に全体的なピークがあります。おそらくスタメン発表がらみだと思われます。

■2013年6月20日(木) 対イタリア戦(7:00キックオフ)  5:30-10:30
 この試合だけ時間帯が違います。
 平日にも関わらず昼間の時間だったため、Tweet数の目盛りが6倍程度になっています。

■2013年6月23日(日) 対メキシコ戦(4:00キックオフ) 2:30-7:30
 深夜帯の試合に加えて、既に予選敗退が決まっていたこともあり、結果のみを確認した人が多かったようです。


第1試合と第3試合は時間が深夜帯だったため、全体のTweet数が少ないので、全数調査との乖離があるかもしれません。
第2試合は、妥当な結果が出ていると思います。


2013年6月22日土曜日

ビッグデータとサンプリングデータ:『ワールドカップアジア最終予選 日本×オーストラリア』での比較調査

 「ビッグデータ」という言葉は世間に定着してきていると言っていいでしょう。バズワードと呼ぶかどうかはここでは言及しませんし、重要ではありません。
 その一方、統計との関係性から、「ビッグデータありき」という姿勢に疑問を呈している記事もあります。

そこで、自然言語処理(というか文字列検索)での「全数データ」と「サンプリングデータ」の結果を比較して、どのような違いが出てくるかを調査してみました。

対象データとして次を見つけたので、これを全数データと見なします。
(最新の試合でないのが残念ですがご容赦ください)
サンプリングデータは過去と同様にTwitterAPIのストリーミングデータ(全Tweetの1%)を使います。
集計期間および検索条件は、元記事に記載されているものを原則そのまま使用します。(#fjaという記載がありますが、これは#jfaのタイポと思われるので、これだけは「#jfa」を使用)
細部については元記事を参照して下さい。

結果を以下に掲載します



1.出場した全14選手の名字検索でのランキング
 ほとんど同じですが、本調査では5位の長友と8位の内田がより上位になる結果となりました。
 (下記表は元記事の順位のままに、投稿件数のみを本調査のものを記載しました)


2.本田選手、香川選手、川島選手の投稿数推移
 元記事同様、本田選手のみ右側の目盛りを参照してください。
 本調査では18時~19時台で多めの数値が出ていますが、それ以降は同じ傾向が確認できます。


3.オーストラリア戦での投稿数の推移
 同じ傾向が見られます。

4.松木氏、ゴン中山氏、セルジオ越後氏の投稿数グラフ
 同じ傾向が見られます。(ゴン中山が多めに取られてる?)

5.松木氏の投稿数推移グラフ
 全体の傾向(ピーク位置)が同じことが確認できます。


6.「渋谷」「道頓堀」の投稿数推移
 渋谷のピーク位置がずれましたが、全体の傾向はほぼとれています。



元記事で示したかった情報とほとんど同様の結果がサンプリングデータでも示すことができたと思いますがいかがでしょうか。

「定性的な傾向はサンプリングデータ(今回は1%)でもほぼ取得できる。ただし、精度的には劣る場合がある」と言うことを認識した上で使用するのであれば、十分役に立つのではないでしょうか。


(2013/6/26)タイトルを変更しました

2011年2月2日水曜日

Twitter分析:2011年アジアカップ(決勝戦)での「松木」Tweet状況

2011年1月29日、日本-オーストラリア戦、日本時間24:00キックオフ、1-0で勝利

2011年アジアカップ(日本-韓国戦)での日本語Tweet数:22:00-05:00

※収集条件は、「Twitterにおける日本語投稿の一傾向分析」と同じ。


厳しい試合でしたが辛勝しました。日本代表の皆さんおめでとうございます。
日本が延長戦で豪州を下し、4度目のアジア制覇(スポーツナビ)

さて、その裏で次のような記事が出ていました。
解説・松木安太郎に関するツイートが1試合1万5千件 (サポティスタ)

主要メンバーに「松木」を加えたTweet数のグラフが上記になります。
TwitterStreamingAPIでは、全体の1%程度しか取得できないので、Tweet数は相対的な比較で見てください。

グラフではわかりにくいので、各人ごとのTweet総数を出してみました。

川島1788
942
長友914
松木851
本田764
岡崎588
ザック557
内田374
藤本343
香川323
前田310
遠藤308
長谷部272
ザッケローニ258
吉田249
名波210
今野175
岩政149

取得できるTweetが全体の1%なので、10~20件程度は誤差の範囲ととらえることができます。
状況によっては、100件くらいの誤差があるかもしれません。
それでも「松木」のTweetが多いのが明確です。人気ありすぎです。

※TwitterStreamingAPIではその時間の全Tweet数の約1%をストリーミングします。
 ここでは、その中から日本語Tweetのみを抽出して集計しています。
 平均的な時間帯なら日本語Tweetは18%程度ですが、このときは全Tweetの30%程度を日本語Tweetが占めていました。
 したがって、単純に100倍しても正確なTweet数を得ることはできません。
 あくまでも、相対的な比較のための数値としてみてください。