StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

RでTwitterのデータを分析するための準備(2015年6月現在のやり方)

RでTwitterを触る方法

 Twitterのデータを分析しようと思って、手始めに{twitteR}というパッケージを触ってみました*1
 導入前にやることがいくつかあるのですが、ググって出てきた解説サイトに書いてあったとおりにやってみると失敗して数時間苦しみましたので*2、一応利用開始に至った道のりをメモしておきます。他にやる人がいたら参考にしてください。


 なんかですね、RでTwitterのAPIを触る方法に関する記事は昔のものも含め色々みつかるのですが、Twitter側の仕様やRのパッケージの仕様の変更なども微妙に生じていて、どの記事のどこの部分が現行なのかというのがよく分からなかったりします。
 なので、2015年6月20日現在やるならこうです、という意味でエントリを起こしておきます。ちなみに私はR for Mac OS X GUI(3.0.2)のコンソールで操作しており、ターミナルやコマンドプロンプトから使ってる人や、R Studioとか使ってる場合は何か違うのかもしれません。


 基本的には、


 Rでウェブ解析:Twitterデータの取得もおまかせ「twitteR」パッケージの紹介
 R言語でTwitterを操作する : 実験ぶろぐ(仮)試供品


 これらのサイトに書かれてあるようなことをやってみるわけなんですが、書いてある通りにやっても動かないところがありましたので、本エントリで後述する通りやればいいと思います。あくまで私の環境では、今回のやりかたで成功したというだけですが。


 なお、{streamR}というパッケージもあるらしく、試していないので、あとで下記のページに従ってやってみたほうがいいかもと思っております。


 [R] [Twitter] streamR パッケージで Twitter Streaming API にアクセスしてみた - ill-identified diary


 これはTwitterが提供しているStreaming APIというものをつかうものなんですが、このAPIは、リロードしなくても情報がリアルタイムで流れてくるってやつらしいです。それをRで使うと何が可能になるのかとかは、よく分かってはいません。
 ちなみにTwitterには"Streaming API"とは別に"User Stream"ってのがあるらしく、解説記事もありましたが、{stramR}が使ってるのはたぶん"Straming API"のほうであって"User Stream"のほうではないんじゃないですかね。知らんけど。

Twitterアプリ作成の登録を行う

 さて、まず何よりも、Twitterアプリ作成の登録を行って各種キー、トークンを発行してもらう必要があります。
 RからTwitterを操作する場合、Rそのものが、一つのTwitterクライアントアプリという扱いになりますので、アプリ開発をしている人たちと同じような登録が必要ということですね。
 手順としては、


 Rでウェブ解析:Twitterデータの取得もおまかせ「twitteR」パッケージの紹介


 この解説記事の冒頭に書かれてあるとおりにやればOK。数分で完了します。
 ウェブサイトのURLを入れるところは、ブログのURLでもなんでも入れておけばいいです。
 なお事前に、自分のTwitterアカウント(アプリ作成者として登録するアカウント)の「設定」画面に行って、携帯電話番号を紐付けておかないとダメなので注意してください。


 手順とおりにやると、Twitterアプリ管理サイトで、自分の作成アプリが管理できるようになります。


f:id:midnightseminar:20150620093924p:plain


 この管理画面から、認証に必要な情報を取得したりするわけです。Rでの操作に必要になるのは、とりあえず、「Keys and Access Tokens」のタブから取得できる、

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access TokenSecret

 の4つの情報です。


各種パッケージのインストール

 やりたいことは{twitteR}を使えるようにすることですが、当初いろいろ躓きました。
 Rでウェブ解析:Twitterデータの取得もおまかせ「twitteR」パッケージの紹介
 このサイトに書いてある順番でやってみていたのですが、途中で、

> setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)
Error: could not find function "setup_twitter_oauth"


 というエラーが出て何もできなくなりました。
 {twitteR}は呼び出してあるのでsetup_twitter_oauth()関数は使えるはずなのですが、なぜか「見つからない」と返される……。英語のサイトも含め、同じエラーに悩まされている人は何人も見つかったのですが、結局解決策は見つかっていない感じでした。


 これは結局、私の場合は、Rのバージョンが古いせいで、各種パッケージも以前のバージョンをインストールしてしまっていたのが問題だったようです。{twitteR}でTwitterを触るためにはたくさんの依存パッケージが使われるんですが、全部最新版にしておかないとダメなようですね。たとえば私が使っていたR 3.0.2だと、{httr}のバージョンが0.5だったのですが、0.6にしないと使えない機能があり、そのためにはR自体をバージョンアップする必要がありました*3
 解説記事の中には、古いバージョンを前提にしているものもあったりしてややこしかったです。また、「CRANからダウンロードするとtwitteR自体が1.7になってしまうので、GitHubから1.8をダウンロードすること」みたいにアドバイスしているページもあったりしたんですが、今はCRANできちんと最新版が揃っておりました*4


 なのでいったん、Rを最新版(3.2.1)にしてからやり直しました。
 とりあえず今回やることは、{twitteR}と{ROAuth}という2つのパッケージがあればいいので、インストールして呼び出しておきます。

install.packages(c("twitteR", "ROAuth"))  # {twitteR}と一緒に{RCurl}{rjson}{httr}もインストールされる。
library(twitteR)
library(ROAuth)

 

OAuthの認証

 OAuthの認証を行って、自分のRとTwitterアカウントを結びつけます。
 OAuthというのはサービス間でID等の連携をするときに使われるプロトコルで、Twitterクライアントアプリで自分のTwitterアカウントを使えるようにするときに「連携しますか?」とか聞かれてOKしている時に、裏で動いている仕組みのことですね。
 以下の手順で行います。


 先ほどアプリ作成の管理画面から取得した4つのキーを、↓のXXXX...のところに入力しておきます。

# Twitterアプリ作成の認証情報をオブジェクトにいれておく
consumerKey <- "XXXXXXXXXXXXXXXXXXXXXXXXX"
consumerSecret <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
accessToken <- "XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
accessSecret <- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"


 次に、冒頭の解説サイトに書いてあったのですが、下記のようにファイルをダウンロードしないとダメらしいです。中身をみてみましたが、たぶんこれはmozillaのルートCA一覧をダウンロードしてるんだと思います*5。あとで電子証明書の検証か何かに必要なんでしょう。

download.file(url="http://curl.haxx.se/ca/cacert.pem", destfile="cacert.pem")


 これは現在のworking directoryに保存されますが、destfile="cacert.pem"のところでファイル名の前にディレクトリを指定すれば好きなところに保存はできます。あとで呼び出すときにも同じように書く必要がありますが。
 次に、以下のようなコマンドを実行します。これは中身をよく分からずに参考サイトから写経してます。

cred <- OAuthFactory$new(consumerKey=consumerKey,
consumerSecret=consumerSecret,
requestURL ="https://api.twitter.com/oauth/request_token",
accessURL = "https://api.twitter.com/oauth/access_token",
authURL="https://api.twitter.com/oauth/authorize")


 次に、以下のコマンドを実行します。

cred$handshake(cainfo="cacert.pem")


 R GUIのコンソールからコマンドを打っている場合の話ですが、↑のコマンドを実行すると自動的にWebブラウザ(私の場合はMacのSafari)に飛んでページが開き、Twitterアカウントとの連携可否をきかれます。
 OKすると、7桁の認証コードが発行されます。
 なお、連携したいアカウントに電話番号を登録していなかった場合、ここで止まってしまうので、かならず電話番号を登録しておく必要があります。


 上記コマンドを実行した際、Rのコンソールには以下のような表示が出ます。

To enable the connection, please direct your web browser to: 
https://api.twitter.com/oauth/authorize?oauth_token=X-XXXXXXXXXXXXXXXXXXXXXXXXX
When complete, record the PIN given to you and provide it here: 


 これは「here: 」のところに、ブラウザから取得した7桁のコードを入れろってことです。数字を打ち込んで、Enterを押せばOKです。


 次に、以下のコマンドを実行します。

setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)


 すると、

[1] "Using direct authentication"
Use a local file to cache OAuth access credentials between R sessions?
1: Yes
2: No

Selection: 


 と聞かれます。よくわかりませんがYesでいいと思うので、「Selection: 」のあとに1を入力してEnterを押します。
 これで認証が終わって、{twitteR}が使える状態になりました。


 ところで昨晩、この認証を何回かやっていたら、

[1] "Using direct authentication"
Error in check_twitter_oauth() : OAuth authentication error:
This most likely means that you have incorrectly called setup_twitter_oauth()'


 というエラーが出て進めなくなりました。
 原因等はよくわかりませんが、APIの使用制限(◯分以内に◯個のリクエストが可能、みたいな制限が色々とあるらしい)か何かだと思われ、朝起きてから同じコードを実行したら普通に進めました。
 ちなみに上記エラーが出た際、自分のTwitter Apps管理画面から、キーとトークンの再発行して入れ替えると解決する場合もあるらしいので、覚えておくと助かるかもしれません。

RでTwitterをみてみる

 準備完了したので、少し試しにTwitterを触ってみます。
 英語しかないと思いますが、詳しいことは{twitteR}パッケージの仕様を読めば、このパッケージで何ができるかのかは分かります*6


 まず手始めに、自分のツイートを表示してみます。(ユーザ名のところを変えれば、他人のツイートも同じやりかたで取得できます。)

> userTimeline("statsbeginner",       # ユーザ名を@無しで入れる
+               n=5,                  # 取得件数を指定(上限は3200?)
+               maxID=NULL,           # ツイートIDの範囲指定(今回は無し)
+               sinceID=NULL,         # ツイートIDの範囲指定(今回は無し)
+               includeRts=TRUE,      # RTを含むかどうか
+               excludeReplies=FALSE  # リプライを含むかどうか
+               )
[[1]]
[1] "statsbeginner: “Twitter の User Streams とは - ぐま あーかいぶ” http://t.co/mwW0xoCE2N"

[[2]]
[1] "statsbeginner: TwitteRがなかなか思い通りに動かなかったんだけどなんとかタイムラインをRで取得するところまではできた"

[[3]]
[1] "statsbeginner: そ、そうでした失礼いたしました “@shinichiroinaba: @statsbeginner 「IQと集中力と体力が平均以上を保証された作業員」は大切にしないといけません!”"

[[4]]
[1] "statsbeginner: RT @shinichiroinaba: @statsbeginner 「IQと集中力と体力が平均以上を保証された作業員」は大切にしないといけません!"

[[5]]
[1] "statsbeginner: R 3.0.2を使っているのを忘れていた。R3.2にアプデします。"


 次に、検索をやってみましょう。

> searchTwitter("統計",                # 検索ワード。複数の場合は+でつなぐ
+               n=5,                   # 取得する件数
+               lang=NULL,             # 言語(日本語に限定するなら"ja")
+               since=NULL,            # 期間指定
+               until=NULL,            # 期間指定
+               locale=NULL,           # ロケールを指定(日本なら"ja")
+               geocode=NULL,          # 位置情報を指定
+               sinceID=NULL,          # ツイートID単位で範囲指定
+               maxID=NULL,            # ツイートID単位で範囲指定
+               resultType="mixed"     # 目的に応じて"popular","recent","mixed"を指定
+               retryOnRateLimit=120   # APIコール制限にひっかかったときのリトライ回数指定
+               )
[[1]]
[1] "TBC_saigai: 【6/18-14:30 TBC気象台】梅雨入りのタイミングを逸した東北南部。土曜以降は宮城、山形、福島ともズラリ晴れマーク(予報は気象庁)。この傾向がかわらなければ、梅雨入りは統計開始以降、最も遅くなる可能性が高い。 画像は気象庁HP http://t.co/wfzuQ21QJj"

[[2]]
[1] "nhk_news: 「82.8」 5月分の貿易統計では、輸出の“量”を示す指数が、平成22年を100として、およそ8割の水準にとどまったことが明らかになりました。 円安なのに、なぜ、輸出は増えないのでしょうか?\nhttp://t.co/xlybbafN9Z"

[[3]]
[1] "levinassien: 教務部長在職中に文科省から「シラバスを詳しく書け」という指示がありました。シラバスの精粗と学生の授業満足度の間には統計的に有意な相関がないという学術的知見に基づいて、僕は教授会で「詳しく書くには及ばない」と公言しました。"

[[4]]
[1] "honyaaaaa: 統計学入門 (基礎統計学) http://t.co/9d9YhQE6S2"

[[5]]
[1] "dogenzakademia: 統計学なのに、数式をみるだけで吐き気がする(汗) http://t.co/BPGtpEeoH9"


 上記のとおり結果がリスト型で返ってくるわけですが、以下のようにきれいにデータフレームにまとめる関数も用意されているようで、分析する上では便利ですね。
 先ほどのコマンドだとユーザ名と本文しか出ていませんが、実際には日時とかRT件数とかも情報としては取得されていて、それが全部データフレームに格納されます。
 自分のツイートをデータフレームに入れて表示してみます。
 

# さっきと同じやりかたで自分のツイートを取得
mytweets <- userTimeline(
              "statsbeginner", 
              n=10, 
              maxID=NULL, 
              sinceID=NULL, 
              includeRts=TRUE, 
              excludeReplies=FALSE
              )


# DFにまとめる関数
mytweets.df <- twListToDF(mytweets)
print(mytweets.df)


 文字が多いので、表示結果は画像で貼っときます。


 f:id:midnightseminar:20150620093839p:plain

*1:別のサービスを使ってデータをドカンと落としたほうが、分析にはいいのかも知れませんが、よく知りません。

*2:ただし私の場合、Rのバージョンが古かったという致命的な問題点がほぼ全てでしたがw

*3:Rのコマンドでインストールすると現在のバージョンに適したやつが選択されてしまうというだけで、CRANなりGitHubからバイナリを取ってくればパッケージの最新版をインストールすること自体はできたのかもしれませんが、よく分かってません。

*4:それを書いている人自体、Rのバージョンが古かったために、R上でコマンドを打っても古いバージョンしか落とせなかったのかもしれない。

*5:違ったら教えて下さい……。

*6:あわせて、TwitterのAPIの仕様を確認する場面が発生するとも思いますが