お金と数字と温泉を考えるブログ

お金と数字と温泉を考えています。

トランプ大統領の発言が過激かどうかをTwitterのつぶやきから確かめる

トランプ大統領のつぶやきは世界を動かす
言わずと知れた、アメリカ大統領 ドナルド・トランプ。資産家らしい歯に布着せぬ発言でアメリカ社会を混乱させています。
その中でもとりわけ影響を与えているのはトランプ大統領ツイッターです。大統領でありながら個人を攻撃したり、その発言によってアメリカのダウやS&P500といった株価指数に影響を与えることもしばしばです。
そこで、今回はトランプ大統領のつぶやきがどれくらい過激かどうかを、Rのパッケージ「syuzhet」を用いて見ていきたいと思います。
記事執筆の際は、こちらの書籍を参考にしました。
https://www.amazon.co.jp/Rではじめるソーシャルメディア分析-Twitterからニュースサイトまで-Raghav-Bali/dp/4320124529

目次

準備編

Twitter社はAPIを公開しており、個々人のツイートのデータをAPIを通じで取得することが出来ます。
取得するためには、アカウント申請をし、API接続をするためのKeyやTokenの情報を提供してもらうことが必要です。
これが結構面倒で、申請の際には利用目的や分析方法などを英語で記載する必要があります。
アカウント申請からKeyやToken取得までの方法について、綺麗に纏められている方がいらっしゃいましたので、そちらをご参照ください。
qiita.com

データ取得編

KeyやTokenが取得出来たら、いよいよツイートをTwiterから取得していきます。
Twitterからデータを取得するためのパッケージに「rtweet」を用いて実践します。

ツイートの取得
library(rtweet)
consumer_key<-"*****"
consumer_secret<-"***** "
access_token<-"*****"
access_secret<-"****"#Twitter社から提供されます
twitter_token<-create_token(app="***",consumer_key =consumer_key, consumer_secret consumer_secret)
#appはユーザー名のことで、申請時に設定できます
Trump_account = "realDonaldTrump"#トランプ大統領のアカウント
Trump_tweets = get_timeline(Trump_account, n = 10000, token = twitter_token, include_rts = FALSE)
#get_timeline()で該当のアカウントのタイムラインを取得できる。include_rts=FALSEでリツイートを除く 
#n=で取得するツイート数を指定できるが、TwiterのAPIに使用上限があるため、取得出来ても1,500個ほど
Trump_text<-sapply(Trump_tweets$text,iconv,to="UTF-8")#文字コードをUTF-8に変換

取得できました。

「syuzhet」パッケージの導入

「syuzhet」は、感情分析のためのパッケージで、スタンフォード大学自然言語処理チームによって作成された感情辞書によって文章の感情スコアを計算してくれます。
なお、感情スコアは、その文章内の「ポジティブな単語のスコア」と「ネガティブな単語のスコア」を合計したものです。
一つ具体例を挙げて、実際の感情スコアを見てみましょう。
*1

library(syuzhet)
my_example_text <- "I begin this story with a neutral statement.  
  Basically this is a very silly test.  
  You are testing the Syuzhet package using short, inane sentences.  
  I am actually very happy today. 
  I have finally finished writing this package.  
  Tomorrow I will be very sad. 
  I won't have anything left to do. 
  I might get angry and decide to do something horrible.  
  I might destroy the entire package and start from scratch.  
  Then again, I might find it satisfying to have completed my first R package. 
  Honestly this use of the Fourier transformation is really quite elegant.  
  You might even say it's beautiful!"
#例文を入力する
s_v <- get_sentences(my_example_text)
#例文を1文ごとに行ベクトルにする
s_v_sentiment <- get_sentiment(s_v,method="syuzhet")#1文ずつ感情分析する
s_v_sentiment 
 [1]  0.00 -0.25 -0.50  0.75  0.40 -0.50  0.00 -1.50 -1.10  1.00  1.00  0.75

上記の結果を見てみると、"I might get angry and decide to do something horrible."のスコアが低くなっています。"angry"や"horrible"がスコアを下げていることが分かります。
感情スコアの仕組みを示したところで、トランプ大統領のツイートを感情分析しましょう。

tweetSentiments<-get_sentiment(Trump_text,method="syuzhet")
tweets<-cbind(Trump_tweets,tweetSentiments

データ可視化編

上記でトランプ大統領のツイートの感情スコアが取得できましたので、あとはデータの可視化です。

2019年10月~12月における感情スコア(=過激さ)の分布

感情スコアの値がどのように分布しているのかを見ていきます。グラフを綺麗に記述できる「ggplot2」を用います。
①感情スコアのヒストグラム

library(ggplot2)
qplot(tweets$tweetSentiments,binwidth =0.1)+theme(legend.position="none")+xlab("Sentiment Score")+ylab("Number of tweets")+ggtitle("Tweets by Sentiment Score")

f:id:umejiro330:20191222145348j:plain
感情スコアのヒストグラム(9月~12月)
思っていた以上にニュートラルな発言が多いように見えます。とは言え、±4を超える発言も見られます。次に、いつそのつぶやきをしていたかを確認します。
②感情スコアの散布図

ggplot(tweets)+geom_point(mapping=aes(x=created_at,y=tweetSentiments),color="blue")+xlab("Month of 2019")+ylab("Sentiment score")+ggtitle("Tweets by Sentiment Score")

f:id:umejiro330:20191222144851j:plain
感情スコアの散布図(9月~12月)
見てみると、9月に4か月で1番スコアが高いツイートを、12月に4か月で1番スコアが低いツイートをしていることが見えます。具体的には下記のツイートでした。

(1)スコアが一番高いツイート


ニューメキシコ州で勝つぞ!という宣言ツイートでした。序盤の「皆がアメリカを愛している」だったり、「神に祝福されている」といった文言がスコアを上げたようです。
(2)スコアが一番低いツイート
アメリカ下院議長のペロシに対して、トランプ大統領の弾劾決議案を上院に提出しないことを「弾劾があまりに見ていられないほど出来が悪いから、上院に提出出来ないんだ」と煽っています。"phony""pathetic""afraid""refuse""bad"など、ネガティブな単語発言のオンパレードでした。