TwitterのAPIを使って値上げに関するトレンドを調査した

##はじめに
最近色々なものが値上げしているニュースを見ますよね。
生活にも影響が出るので困っちゃうなと。

そこで思いつきました。Twitter APIを使って最近の値上げトレンドを調査したら面白そう。
ネットに上がっている手法を参考に**~~パクッて~~**、APIでの情報取得～可視化までトライしました。

##環境
* windows10
* python 3.8.10
* requests 2.25.1
* pandas 1.2.5
* emoji 1.6.3
* janome 0.4.1
* nlplot 1.4.0

##内容
###Twitter API利用の準備
詳細は省きますが、下記のサイトを参考に実施しました。今回利用したのはV2になるので、初期設定からRead and writeに変更しています。

https://techacademy.jp/magazine/51411
https://qiita.com/penguinprogrammer/items/b220be0c203eaaad015a

###Twitterからテキスト取得

Bearer tokenを使って情報を取得していきます。今回のは「値上げ」の文字が入っているツイートで、かつリツイートとハッシュタグは除いた条件で探します。条件にあったツイートをデータフレーム化し、csvファイルに保存します。

得られた内容は個人情報のため、表示はなしで。

```python
import requests
import pandas as pd
import emoji
import re

# 発行したBearer tokenを指定
bearer_token = '自分のBearer token'

# Twitter APIのURL
search_url = "https://api.twitter.com/2/tweets/search/recent"

# 検索クエリ(リツイートとハッシュタグ付きは除く)
query_params = {'query': '値上げ -is:retweet -(has:hashtags)','max_results': 100}

def create_headers(bearer_token):
    headers = {"Authorization": "Bearer {}".format(bearer_token)}
    return headers

def connect_to_endpoint(url, headers, params):
    has_next = True
    c = 0
    result = []
    while has_next:
        response = requests.request("GET", search_url, headers=headers, params=params)
        if response.status_code != 200:
            raise Exception(response.status_code, response.text)

        response_body = response.json()
        result += response_body['data']

        rate_limit = response.headers['x-rate-limit-remaining']
        print('Rate limit remaining: ' + rate_limit)

        c = c + 1
        has_next = ('next_token' in response_body['meta'].keys() and c < 50)

        # next_tokenがある場合は検索クエリに追加
        if has_next:
            query_params['next_token'] = response_body['meta']['next_token']

    return result

# Pandasのデータフレームを使ってデータを加工
def create_data_frame(json_data):
    df = pd.DataFrame(json_data)

    # ツイート中のURLを削除
    df['text'] = df['text'].apply(lambda x: re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', '', x))
     # ツイート中の絵文字を削除
    df['text'] = df['text'].apply(lambda x: ''.join(c for c in x if c not in emoji.UNICODE_EMOJI))
    return df

# データフレーム中のツイートデータをCSVファイルへ出力、indexは出力しない(文字化けしないようにutf設定)
def write_csv(data_frame):
    data_frame['text'].to_csv('値上げ.csv', index = False, encoding='utf_8_sig') 

headers = create_headers(bearer_token)
json_response = connect_to_endpoint(search_url, headers, query_params)

data_frame = create_data_frame(json_response)
write_csv(data_frame)
```

###形態素解析

得られたcsvファイルを形態素解析にかけ、名詞・動詞・形容詞・形容動詞だけを抜き出しました。
また形態素解析時はstr型でないと、エラーが出ていたので変換しています。

:::note warn
Dataframe型・Series型・list型で一応エラー確認はしていますが、やり方によってはいけるかもしれません。
:::


```python 
#Janomeのインポート
from janome.tokenizer import Tokenizer

df2 = pd.read_csv('値上げ.csv')

#形態素解析
t = Tokenizer()
word_list=[]

for i in range(len(df2)):
    st = df2['text'].astype(str)
    sentence = st.iloc[i]
    tokens = t.tokenize(sentence)
    
    
    for token in tokens:
        word = token.surface
        partOfSpeech = token.part_of_speech.split(',')[0]
        if partOfSpeech in['名詞', '動詞', '形容詞', '形容動詞']:
            word_list.append(word)
        else:
            continue
```

##nlplotによる可視化
ただnlplotを使いたかっただけ。
nlplotの際はDataframeじゃないと、エラーが出たので変換(これも100%正しいかは不明)

```python
#nlplotのインポート
import nlplot

df3 = pd.DataFrame(word_list, columns = ['text'])
npt = nlplot.NLPlot(df3, target_col='text')

## 再頻出ワード(ここでは値上げ)をストップワードに指定
stopwords = npt.get_stopword(top_n=1, min_freq=0)

npt.wordcloud(
    max_words=100,
    max_font_size=100,
    colormap='tab20_r',
    stopwords=stopwords,
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/dcc50c3d-c07f-81b3-1c83-269b3ef7f340.png)

##可視化して思うこと

* うまい棒
単語でわかれちゃっていますが、うまい棒は大きく出ていました。今まで10円だったのが値上がりするというのは、やっぱり大きな衝撃だったんでしょうね。あとはumaemonも多分関連ワードかな？

* DAZN
ネットのニュースで見ましたが、値上げ幅にびっくりしました。約1.5倍でしたっけ？確かにトレンドになってもおかしくないですね。

* インフラ関係
電気とガソリンでしょうか。今年の冬は去年より寒いので、電気代が上がったのは自分でも感じます。
あとはガソリン。最近、政府が価格抑制策を出しましたね。それもあって上位にあるのかなと。

もう少し食品が入ってくるかなと思いましたが、あまり出ませんでした。
うまい棒がそうですが、うまい+棒のように途中で分割してしまうのが原因かもしれません。

##まとめ
処理の部分に課題はありますが、最近のトレンドを出すことができました。
自分の生活ともリンクしていることがわかり面白かったです。

**…とにかく値上げが落ち着かないかな**

##参考
https://www.takapy.work/entry/2020/05/17/192947
https://norari-kurari-way.com/python-janome/
https://sebenkyo.com/2021/06/28/post-2060/
https://developer.twitter.com/en/docs/twitter-api/tweets/search/integrate/build-a-query