TwitterのAPIを使い特定地域の情報を取得：『R』「getTrends」「geocode」

##「getTrends」であるエリアのトレンド

**「R」**のパッケージ「twitteR」を使うと、Twitterのツイートの情報を取得できます。
（TwitterからAPIの使用許可を得る必要があリます）
ある地域の情報を得る場合、を考えました。

例えば**「getTrends」**関数を使えます。

```R
install.packages("twitteR") #インストールしてない場合
ibrary("twitteR")
library(dplyr) #パイプ処理などの使用に必要

#TwitterAPI認証情報設定
consumerKey <- "************"
consumerSecret <- "*****************"
accessToken <- "*****************"
accessSecret <- "*********************"

##TwitterAPIにログイン
library("twitteR")
options(httr_oauth_cache = TRUE)
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)

#Twitter APIから地域名とIDを取得する
#その中から日本のIDだけを抽出
woeid <- availableTrendLocations()
woeid %>% filter(country == "Japan")

         name country    woeid
1  Kitakyushu   Japan  1110809
2     Saitama   Japan  1116753
3       Chiba   Japan  1117034
4     Fukuoka   Japan  1117099
5   Hamamatsu   Japan  1117155
6   Hiroshima   Japan  1117227
7    Kawasaki   Japan  1117502
8        Kobe   Japan  1117545
9    Kumamoto   Japan  1117605
10     Nagoya   Japan  1117817
11    Niigata   Japan  1117881
12 Sagamihara   Japan  1118072
13    Sapporo   Japan  1118108
14     Sendai   Japan  1118129
15  Takamatsu   Japan  1118285
16      Tokyo   Japan  1118370
17   Yokohama   Japan  1118550
18    Okinawa   Japan  2345896
19      Osaka   Japan 15015370
20      Kyoto   Japan 15015372
21      Japan   Japan 23424856
22    Okayama   Japan 90036018

#東京のIDみ抽出
woeid %>% filter(name == "Tokyo")
#   name country   woeid
#1 Tokyo   Japan 1118370

#東京のトレンドワードを取得
trends <- getTrends(1118370)
head(trends)
trends$name %>% head(10)
 [1] "流れ弾1位"              "生田さん"               "田中将大"              
 [4] "イノッチ"               "紅林くん"               "#Rocketeer"            
 [7] "文書回答"               "#スカロケ"              "#さがらFFF"            
[10] "嵐活動休止後初の公の場"  
```

##「geocode」で緯度と軽度を指定

**「searchTwitter」**関数を使うと、「緯度」と「軽度」を指定できます。

https://www.rdocumentation.org/packages/twitteR/versions/1.1.9/topics/searchTwitter

「searchTwitter」で使えるパラメータ**「geocode」**を使います。
ただ、getTrendsと違い、「トレンドワード」を返すのではなく、指定したキーワードを含むツイート文言やリツイート数など、ツイート関連の各種情報を取り出します。
例えば、「澁谷駅から半径10kmの範囲』を指定します。

緯度と軽度は、「澁谷駅の緯度と軽度」とGoogle検索すれば確認できます。
「35.6598003」「139.7023894」となります。

あまり偏らないように、キーワードには「です。」と指定し、最大10000ツイート取得します。
（「です。」を指定した特別な意図はありません。動作確認が目的なので、なんとなく選びました）

```R
tweets2 <- searchTwitter('です。', geocode='35.689607,139.700571,10km', n = 10000, since = "2021-10-25", lang="ja")
head(tweets2)
```

##トピックワードは「RMeCab」で

このデータからトレンドキーワードを出そうとする場合、例えば形態素解析をかけます。
パッケージには**「RMeCab」**を使います。
今回は固有名詞を指定します。

```R
#データフレームに変換
tweetsdf2 <- twListToDF(tweets2) 
#型を確認
class(tweets2)
[1] "list"
class(tweetsdf2)
[1] "data.frame"

#確認
tweetsdf2  %>% head(10)

#リツイートされたもの（TRUE）、そうでないもの（FALSE）の数を確認
table(tweetsdf2$isRetweet)
FALSE 
10000 

#データフレームのテキスト列だけ抽出
tweetsdf3 <- tweetsdf2 
texts <- tweetsdf3$text

#複数の（リスト型）テキストを結合。テキストとテキストの間にはブランクを入れる
texts3 <- paste(texts, collapse = "")

#一時ファイルを作り、xfileという名前で保存
xfile <- tempfile()
write(texts3, xfile)

##形態素解析のライブラリー
library(RMeCab)

#形態素解析。頻度を集計
frq_Tw2 <- RMeCabFreq(xfile)
#上位50を確認
frq_Tw2 %>% arrange(Freq) %>% tail(50)
35237        1   名詞                       数  1130
755         が   助詞                 接続助詞  1156
2811  くださる   動詞                   非自立  1230
747       まで   助詞                   副助詞  1237
34658       日   名詞                     接尾  1325
38869       ）   記号                   括弧閉  1336
36710       方   名詞                   非自立  1342

#固有名詞のみに絞り込む
frq3_Tw2 <- frq_Tw2 %>% filter(Info2 %in% c("固有名詞")) 
frq3_Tw2 %>% arrange(Freq) %>% tail(50) #確認
            Term Info1    Info2 Freq
32664       太郎  名詞 固有名詞   14
33103       毎日  名詞 固有名詞   14
32512     北海道  名詞 固有名詞   15
32758       山下  名詞 固有名詞   15
32805       工藤  名詞 固有名詞   15
32966       月野  名詞 固有名詞   15
33316         祐  名詞 固有名詞   15
31072          s  名詞 固有名詞   16
31645 オリックス  名詞 固有名詞   16
32231       リツ  名詞 固有名詞   16
32265     ロッテ  名詞 固有名詞   16
```

##ノイズになりそうな言葉を外す

ここで、（自分の場合は）1つのワードとして意味を成しにくい文字列を外します。


```R
#Termが1文字の行を削除。まず、1文字のワードの行番号を抽出
index <- grep('..', frq3_Tw2[,1])
head(index)
[1] 2 3 4 5 6 7
frq3_Tw2[index,] %>% arrange(Freq) %>% tail(50) #確認
              Term Info1    Info2 Freq
33159 流通センター  名詞 固有名詞   11
33251         生田  名詞 固有名詞   11
30333      YouTube  名詞 固有名詞   12
33286         眞子  名詞 固有名詞   12
33676         韓国  名詞 固有名詞   12
32085         プレ  名詞 固有名詞   13
32973         朝日  名詞 固有名詞   13

#1文字のワードの行を外したデータフレームにする
frq4_Tw2 <- frq3_Tw2[index,] 
frq4_Tw2 %>% arrange(Freq) %>% tail(50)

#アルファベットと数値で表現される文字列をgrep
#invert = TRUEで、grep対象以外の行を残す
index2 <- grep('[0-9A-Za-z]', frq4_Tw2[,1], invert = TRUE)
head(index2)
[1] 1851 1852 1853 1854 1855 1856
frq4_Tw2[index2,] %>% arrange(Freq) %>% tail(50) #確認

#アルファベットと数値で表現される文字列を含まない要素をデータフレーム化
frq5_Tw2 <- frq4_Tw2[index2,] 
frq5_Tw2 %>% arrange(Freq) %>% tail(50)
              Term Info1    Info2 Freq
33506       衆議院  名詞 固有名詞    9
33507         衆院  名詞 固有名詞    9
33674         静岡  名詞 固有名詞    9
32332         中国  名詞 固有名詞   10
32734         小室  名詞 固有名詞   10
31830         スマ  名詞 固有名詞   11
33136         沖縄  名詞 固有名詞   11
33159 流通センター  名詞 固有名詞   11
```

なお、アルファベットと数値のgrepに

```R
grep('[0-9A-Za-z]', frq4_Tw2[,1], invert = TRUE)
```

を使いましたが、以下の正規表現を使ってもできると思います。
ただ、自分の技量不足か、余計なスペースなどがあったからか、取りこぼし（うまく引っかからない文字列）が出ました、
**'[0-9A-Za-z]'**で、やりたいことができたので、こちらを使いました。

```R
#正規表現
#[:alnum:] ：アルファベットと数値 = [:alpha:] + [:digit:]
index2 <- grep('[:alnum:]', frq4_Tw2[,1], invert = TRUE)

#[:alpha:] ：大小文字アルファベット = [:lower:] + [:upper:]
grep('[:alpha:]', frq4_Tw2[,1], invert = TRUE)

#アルファベット小文字、大文字の順
grep('[:lower:]', frq4_Tw2[,1], invert = TRUE)
grep('[:upper:]', frq4_Tw2b[,1], invert = TRUE)
≈
```

**「ggplot2」**を使い、出現頻度順に棒グラフも作っておきます

```R
#Freqが10以上にする
frq6_Tw2 <-　frq5_Tw2$Freq >= 10
frq7_Tw2 <- frq5_Tw2[frq6_Tw2,]
frq7_Tw2 %>% arrange(Freq) %>% tail(50)

#ggplot2で棒グラフを描く
#reorderは並び順指定
#stat="identity"はデータラベルつけるときに必要
#fill=ｰFreqにすると値が大きいほど色が濃くなる
#coord_flip()を追加すると、x軸とy軸が入れ替わる
#geom_textとlabelで棒グラフにラベル（Freq）を追加。hjustはラベルの位置
library(ggplot2)
par(family = "HiraKakuProN-W3") 
ggplot(frq7_Tw2, aes(x=reorder(Term, Freq), y=Freq))+
   geom_bar(aes(y=Freq,fill=-Freq),stat="identity") +
   xlab("")+
   theme_gray (base_family = "HiraKakuPro-W3") +
　　geom_text(aes(x=reorder(Term,Freq), y=Freq,label = Freq), hjust=-0.1,colour = " blue", size = 2.5) +
   coord_flip()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/ba2debdf-4664-1f5d-b0b3-dfd74867d844.png)

**了**