##はじめに
最近色々なものが値上げしているニュースを見ますよね。
生活にも影響が出るので困っちゃうなと。
そこで思いつきました。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ファイルに保存します。
得られた内容は個人情報のため、表示はなしで。
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型でないと、エラーが出ていたので変換しています。
Dataframe型・Series型・list型で一応エラー確認はしていますが、やり方によってはいけるかもしれません。
#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%正しいかは不明)
#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,
)
##可視化して思うこと
-
うまい棒
単語でわかれちゃっていますが、うまい棒は大きく出ていました。今まで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