twarcによるデータ収集とtwitterのトレンド分析

> 問題 twitter apiを用いて、何らかのトピックのデータを収集し、それをトレンド分析せよ。

この記事では、Twitterからデータを収集してトレンド分析をする方法について紹介します。簡単に言えば、twitter版googleトレンドみたいなことをするということです。


# データ収集(Twarc2)

```
!pip3 install --upgrade twarc 
!pip3 install --upgrade twarc-csv
```

まずは、tweet収集用のライブラリtwarcをインストールします。tweet収集のライブラリはいくつかありますがその中でもtwarcは比較的簡単に使うことができます。
<br>
```
!twarc2 configure
```

つづいて、Twitter DevelopersにあるBearer Token、API key、 API key secretを入力します(過去一週間を超えてツイートを収集する場合、academic apiの申請が必要です)。
<br>

```
!twarc2 search --archive --start-time "2022-07-02" """("ジビエ" "生食")""" tweet.jsonl
```
searchコマンドで検索ができます。
--archiveオプションは過去1週間よりも遡ってツイートを収集する場合に必要です。
--start-timeオプションはいつのツイートから収集するのかを指定します。
<br>

```
!twarc2 csv tweet.jsonl tweet.csv
```
データを扱いやすくするために、csvコマンドでjsonlからcsvに変換します。
<br>

# Pythonによるトレンド分析
```
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
!pip install japanize-matplotlib
import japanize_matplotlib
```

必要なライブラリをインストールします。
<br>
```
tweet_df = pd.read_csv("/content/tweet.csv", parse_dates=['created_at'])
tweet_df['count'] = 1
tweet_trend_df = tweet_df.set_index('created_at')
```
ツイートが作成された時間をdatetime型で読み込むためread_csv()にparse_dates=['created_at']を指定します。
トレンド分析では一つのツイート毎に1件カウントしたいため、各ツイートのcountコラムを1にします。
最後に、プロットするためインデックスをツイートが作成された時間にします。


```
fig, ax = plt.subplots()
tweet_trend_df['count'].resample('D').sum().plot(title='ジビエ生食のトレンド分析');
```
ここでは、tweet_trend_dfのcountコラム毎に日付('D')毎に集計してそれを合計しています。
<br>
![スクリーンショット 2022-07-05 20.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581047/dd873940-8b01-9e4f-9ff2-e7b91bc9189c.png)

```
fig, ax = plt.subplots()
tweet_trend_df['count'].resample('H').sum().plot(title='ジビエ生食のトレンド分析');
```
resampleにHを指定すれば、時刻ごとの集計も可能です。
<br>
![スクリーンショット 2022-07-05 20.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581047/ec6a8ca5-dc94-531c-e43b-1322db9f9fe3.png)

# 応用
ジビエの生食では、下記のツイートがよくリツイートされていたため、どれくらい影響があったのかも検討してみます。

https://twitter.com/shark_sociology/status/1543870586791002112

https://twitter.com/nekton27/status/1543834768626036736

https://twitter.com/Ortho_FL/status/1543728924815167488

また、下記の記事に関するツイートの影響力についても調べてみます。

https://news.yahoo.co.jp/articles/e30fe66c5c933f38e98a044fcecf276f894de573

```
tweet_with_yahoo_news_df = tweet_trend_df[tweet_trend_df['text'].str.contains("https://t.co/CWFHw1l458")] 
tweet_with_retweet_df1 = tweet_trend_df[tweet_trend_df['text'].astype(str).str.contains("未だに「コオロギやセミを食べた」と言うと奇人扱いされますが")]
tweet_with_retweet_df2 = tweet_trend_df[tweet_trend_df['text'].astype(str).str.contains("ジビエ生食が表に出る度に")]
tweet_with_retweet_df3 = tweet_trend_df[tweet_trend_df['text'].astype(str).str.contains("ここ数日鶏肉や鹿肉などのジビエの生食に")]

fig, ax = plt.subplots()
tweet_trend_df['count'].resample('H').sum().plot(title='ジビエ生食のトレンド分析');
tweet_with_yahoo_news_df['count'].resample('H').sum().plot();
tweet_with_retweet_df1['count'].resample('H').sum().plot();
tweet_with_retweet_df2['count'].resample('H').sum().plot();
tweet_with_retweet_df3['count'].resample('H').sum().plot();
```

![スクリーンショット 2022-07-05 21.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581047/150bc50f-1219-f578-c084-0a7a624fe765.png)

リツイートが大半を占めていること、記事の影響力はそれほどないことがわかります。