1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

そこで思いつきました。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,
)

image.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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?