tweetbotornot2でユーザーがbotかどうか判定してみる

## Botチェックのやり方
Twitterの世界にはBotと思われるアカウントも数多く見られます。あるアカウントがBotかどうか判別したい際に機械学習のツールを使用することができます。例えば[Botometer](https://botometer.osome.iu.edu)は、当該アカウントのスクリーンネーム（＠以下の英数字）を入れるとBotかどうか判定してくれます。（下の画像のような感じ）
![suga2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861475/86416832-6bc0-35e3-3920-63d97d1f2c37.png)



Botometerは1,2個のアカウントを調べる分には問題ないのですが、100個とかになるとあまり使い勝手がよくありません。Botometerには[Pythonのライブラリ](https://github.com/IUNetSci/botometer-python)があるようですが、Pythonはほとんどやったことがないので使い方がよくわかりませんでした。

## tweetbotornot2パッケージ
Rしか分からない私はtweetbotornot2と言うモデルを使用する事にしました。tweetbotornot2は教師あり学習のモデルで、アカウントの属性・ツイートの統計・ツイートのテキスト内容の3つのカテゴリを元にBotかどうか判定します。tweetbotornot2はRで[パッケージが提供されている](https://tweetbotornot2.mikewk.com/index.html)点が優れています。（実はBotometerもRで実行することができますが、BotometerのAPIを取得する手間がかかり面倒です）

では早速このパッケージの内容を見ていきます。
tweetbotornot2パッケージはまだCRANには登録されていないようなので、` install_github()` でパッケージをインストールします。

```r
remotes::install_github("mkearney/tweetbotornot2")
```

次に、あるアカウントがBotかどうか判定してみます。ここではおそらくBotだろうと思われるアカウント（[@sharenewsjapan1](https://twitter.com/sharenewsjapan1)）を例に見ていきます。
Botかどうか判定するには`predict_bot()`を使用し、引数にスクリーンネームかユーザーIDのいずれかを入れます。

```r
 predict_snj <- tweetbotornot2::predict_bot("sharenewsjapan1") #引数はuser_idでもok
 predict_snj
```
結果はこんな感じに出ます。`prob_bot ` が0.96と1に近い数字をとっているためBotの可能性が高いと考えられます。

```r
               user_id     screen_name  prob_bot
1: 1161186227279654912 sharenewsjapan1 0.9659563
```

どのような要素がBot判定に使用されたかを調べるには`explain_bot()`を使用します。

```r
 explain_snj <- tweetbotornot2::explain_bot("sharenewsjapan1")
 explain_snj[c(1:5),]
```



結果をみると`Tweet source of popular service`などがBot判定に大きく寄与していることがわかります。

```r
               user_id     screen_name  prob_bot   feature      value                feature_description
1: 1161186227279654912 sharenewsjapan1 0.9659563 twt_srcas -2.0583100    Tweet source of popular service
2: 1161186227279654912 sharenewsjapan1 0.9659563 twt_srctw  2.0131807 Tweet source of Twitter (official)
3: 1161186227279654912 sharenewsjapan1 0.9659563 usr_actyr  0.6793488                   User account age
4: 1161186227279654912 sharenewsjapan1 0.9659563 twt_rtwts  0.5672238                 Tweet via retweets
5: 1161186227279654912 sharenewsjapan1 0.9659563 twt_srcna -0.4722273            Tweet source of unknown
```


なお、今使用した`predict_bot()`や`explain_bot()`はベクトルやデータフレームの引数にも対応しています。

```r
screen_names <- c( "sugawitter", "JoeBiden") #ベクトルも対応可能
predict_bot(screen_names)

screen_names <- c( "sugawitter", "JoeBiden") 
screen_names_df <- data.frame(screen_name = screen_names)
predict_bot(screen_names_df) #データフレームも対応可能

```

## 実際に使用してみる 

この`tweetbotornot2`パッケージを使用して簡単な分析をしてみたいと思います。
今日（2020/1/17）の朝に「【映像流出】なぜ中国は大量に人を消し始めたのか」と言う動画が拡散されトレンド入りされていたので、今回はこれに関するツイートを投稿したユーザーにBotがいるかどうかみてみます。
`tweetbotornot2`は`rtweet`パッケージとの相性もいいので、ここでは`rtweet`パッケージと組み合わせた使用をしてみます。


```r
scripts <- "【映像流出】なぜ中国は大量に人を消し始めたのか" #今回使用するテキスト内容
tweet_china <- search_tweets(scripts,n = 100, include_rts = FALSE) #scriptsに関するツイートを100件収集
account_china <- tweet_china$screen_name #tweet_chinaからスクリーンネームを抽出

## rtweetパッケージ
name_tweets <- get_timelines(account_china, n = 200, check = FALSE)
 #account_chinaの100アカウントについてそれぞれ200件ツイートを収集

#tweetbotornot2パッケージ
pred_china <- tweetbotornot2::predict_bot(name_tweets) 
#name_tweetを元にそれぞれのアカウントのBot確率を計算
```

結果はこんな感じです。

```r
pred_china %>% arrange(desc(prob_bot) %>% head(10) #Bot確率が高い上位10つを抜き出す

########
                user_id     screen_name     prob_bot
  1: 1218334562024972288     GenkiKusano 0.8895582557
  2: 1299905176552132608   mao_twice_111 0.6415558457
  3: 1317390868769173504     mini___0108 0.6333681941
  4: 1305020751297146880       me2ro5nn9 0.5322452784
  5: 1047812051601514496       Ryota9856 0.4668125212
  6: 1212059230775083009 At3K3Yko7WHDlOp 0.4525235295
  7: 1295471147446722560 kQlPMTs0LrApTK4 0.4238883555
  8: 1271010741600976896        TM_MICAN 0.3104926646
  9: 1010098103691538432     Real_K_1683 0.2870370150
 10: 1112408161971896320 wD4UVuii4mBbTCF 0.2740830183
```
0.5を超えているアカウントは100個中4個ありました。実際この4つをみると不自然なツイート内容・ツイートタイミングがみられるのである程度予測が当たっているのかなと思います。
ただ、全体としてはほとんどがBotではないアカウントと予測されました。下の図は横軸にBotである確率（0~1）、縦軸にカウント数をとったものです。

![china.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861475/f125635d-352d-6f43-fbc8-6218e9fec12f.png)

今回は特に大きな発見はありませんでしたが、今後tweetbotornot2を使用して日本のトランプ支持者のアカウントなどを調べてみたりすると面白いことが言えるかもしれません。