Rubyでtweetを収集(Twitter Streaming API)、分析してみた
RubyでTwitterのtweetを収集して、簡単な分析をしてみます。
ここでは以下を点を分析することにします。
・tweetでは、どれくらいの割合でHashタグが付けられているのか?
・tweetでは、どれくらいの割合でリンクが付けられているのか?
・tweetでは、どれくらいの割合でmentionが付けられているのか?
・どのクライアントアプリでよく使われているのか?
tweetの収集
まずtweetの収集ですが、
Twitterには「REST API」と「Streaming API」の二種類があり、
分析するために大量のtweetを取得する用途には、
「Streaming API」が向いてそうなのでそちらを使います。
RESTAPIとStreamingAPIの違いはこのスライドがわかりやすいです。
TwitterのStreamingAPIについて 概要と簡単な実演
TwitterのStreaming APIのマニュアル
Streaming APIを使用してtweetを取得してみます。
こちらのサイト参考にしました(かなりの部分そのままですww)。
Twitter Streaming APIをRubyで試してみる
先に上げた分析に必要な情報は
・tweetの本文
・クライアントアプリ名
これを取得する、以下のプログラムでtweetを収集します。
呼び出し時にコマンドライン引数で、
twitterのユーザ名・パスワードを指定します。
#!/usr/bin/env ruby
# coding: utf-8
require 'net/http'
require 'uri'
require 'rubygems'
require 'json'
# コマンドライン引数からtwitterユーザ名・パスワードを取得
if ARGV.size < 2
puts "usage: ruby get_publictweet.rb [username] [password]"
exit
end
username = ARGV[0]
password = ARGV[1]
# 取得したtweetを出力するファイルをオープン
twout = File.open('twout.csv',"w")
# streaming APIに接続
uri = URI.parse("https://stream.twitter.com/1/statuses/sample.json")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.start
# tweetの取得開始
request = Net::HTTP::Get.new(uri.request_uri)
request.basic_auth(username, password)
twcnt = 0
http.request(request) do |response|
raise 'Response is not chuncked' unless response.chunked?
response.read_body do |chunk|
# 空行は無視、JSON形式でのパースに失敗したら次へ
status = JSON.parse(chunk) rescue next
# 削除通知など、'text'パラメータを含まないものは無視して次へ
next unless status['text']
# 日本語でないtweetは無視して次へ
next unless status['user']['lang'] == 'ja'
# tweetの本文とクライアントの情報を出力
twarray = [status['text'], status['source']]
twarray.map! {|e| e.gsub(/"/, "\"\"") }
twarray.map! {|e| "\"#{e}\"" }
twout.puts twarray.join(",")
twcnt += 1
# 必要な数のtweetが収集できたら終了(ここでは40tweet)
exit if twcnt > 40
end
end
# ファイルをクローズ
twout.close
このプログラムを実行すると、
1列目:tweetの本文
2列目:クライアントアプリ名
が入ったCSVファイルが出力されます。
◆出力イメージ

tweetの分析
tweetの分析ですが、今回収集したもの以外に
2001年5月に収集したデータが手元にあったので比較して見ます。
tweet本文の中に
「http://」が含まれている場合 → URLのリンクを含んだtweet
「#」が含まれている場合 → hashタグのついたtweet
「@」が含まれている場合 → mentionのtweet
として集計します。
※実際の集計にはExcelを使いましたが、細かいところは省略します。
tweet本文を上記のように集計したところ以下のようになりました。
2011年5月と2012年8月のtweet傾向比較
| 2011/5 | 2012/8 | |
|---|---|---|
| URLのリンクを含んだtweet | 16.50% | 18.72% |
| hashタグのついたtweet | 6.93% | 6.39% |
| mentionのtweet | 8.98% | 41.19% |

15ヶ月前と比較するとmentionの付いたtweetが、
4倍以上増加している事がわかります。
このことから、twitterの使われ方が、
「個人のつぶやき」→「コミュニケーション」
と変化してきているのではないかと考えられます。
次にクライアントもsource部分のクライアント名で集計します。
集計結果は次のようになりました。
◆2011年のクライアント利用状況
| クライアント名 | 利用割合 |
|---|---|
| web | 13.10% |
| Keitai Web | 12.99% |
| ついっぷる/twipple | 6.82% |
| Twitter for iPhone | 5.14% |
| モバツイ / www.movatwi.jp | 4.71% |
| Tween | 4.22% |
| Echofon | 3.73% |
| twicca | 3.41% |
| yubitter | 2.33% |
| ついっぷる for iPhone | 2.27% |
| TweetDeck | 2.16% |
| Twitter for Android | 2.00% |
| jigtwi | 1.89% |
| Saezuri | 1.46% |
| Tweet Button | 1.46% |
| SOICHA | 1.24% |
| TwitBird | 1.03% |
| YoruFukurou | 1.03% |
| HootSuite | 0.97% |
| TweetMe for iPhone | 0.81% |
| その他 | 27.22% |
◆2012年のクライアント利用状況
| クライアント名 | 利用割合 |
|---|---|
| Twitter for iPhone | 14.76% |
| web | 12.33% |
| Twitter for Android | 12.11% |
| twittbot.net | 6.83% |
| Keitai Web | 5.95% |
| EasyBotter | 4.85% |
| ついっぷる/twipple | 3.08% |
| twicca | 2.86% |
| Echofon | 2.42% |
| SOICHA | 2.20% |
| ついっぷる for iPhone | 1.98% |
| Janetter | 1.54% |
| jigtwi | 1.32% |
| Tweet Button | 1.10% |
| Twipple for Android | 1.10% |
| twitterfeed | 1.10% |
| mixi ボイス | 0.88% |
| BotMaker | 0.88% |
| jigtwi for Android | 0.88% |
| Tween | 0.88% |
| その他 | 20.93% |
2012年の利用率上位10位のクライアントについて、
2011年の利用率と比較してみると以下のようになりました。

15ヶ月前と比較すると
・Keitai Webが減少
・Twitter for iPhone/Androidが増加
という傾向がはっきりと見えます。
最近のスマートフォンの普及の影響でしょう。
Echofonが減少して、SOICHAが増加というのも、
スマートフォン向けtwitterクライアントの
トレンドを反映してそうですね。
結果をまとめると、twitterは、
『従来型携帯電話からスマートフォンでの利用にシフト』しており、
その使われ方は、
『個人のつぶやきよりもコミュニケーション(会話)』が増えてきている
と考えられます。
さらに「それはなぜなのか」も考えて見ると面白いかもしれませんね。
例えば考えられる仮説:
- ユーザのtwitterの利用暦が長くなり人脈が増えた結果、会話が増えた
- 従来型携帯電話よりスマホの方が会話しやすいから、会話が増えた(専用クライアントがあるため)
- 個人的なつぶやき中心のユーザが飽きてtwitterやめて、会話の割合が増えた
とか、とか。。
※情報の収集方法・期間
収集方法: public_timelineのtweetを15分後とに20件ずつ取得し、ユーザの言語がjaのものを抽出
収集期間:
2011年5月分: 5/18(水) 10:45 ~ 5/24(水) 11:30 (日本時間)
2012年8月分: 8/16(木) 17:15 ~ 8/17(金) 13:30 (日本時間)
Discussion