Twitterに投稿された新型コロナウィルスに関するツイートを分析してみた その2

# 概要
[前回](https://qiita.com/mazui_tapioka/items/27fa722788b642e8926f)の続きです。


前回構築したデータセットを拡張して、さらに分析を進めていきます。

この記事の目標は以下の2点です。

- 新型コロナウィルスに関して、Twitterではどのように話題が変化しているか把握する
- ツイートの内容を定量化しRT数を予測することで、ツイートの内容とユーザの関心について洞察を得る

上記の目標に関して、Twitterに投稿されたツイートデータを分析していきます。

# データの詳細
本記事で用いるツイートデータは，2020年1月1日～2020年**4月30日**までの間に投稿された，「コロナ」「COVID-19」「感染症」のいずれかを含むツイートです．
データセットに含まれるツイートは、いずれも100回以上RTされています。

(前回のデータセットから新たに29日分のツイートをデータセットに加えました。)

データセットのサイズは、前回: 47071 -> 今回: 79562 となりました。

<img width="955" alt="日毎のツイート数.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612953/679c2a36-89cc-e77a-8248-503c69017494.png">




上の図は、構築したデータセットに関して、日ごとにツイート数を表示したものです。
図中の丸数字は以下での各考察に対応しています。
(このグラフの01/01 ~ 04/01に関する考察は[前回の記事](https://qiita.com/mazui_tapioka/items/27fa722788b642e8926f)をご覧ください)

# 頻出語の分析

日ごとのツイートに含まれる単語の出現頻度から、その日ユーザは何に関心を持っていたのか推測できます。
本記事では、全てのツイートに対して以下の前処理を施しました。

```python
def pre_process(texts):
    texts_mod = []
    for text in tqdm(texts):
        text = re.sub(r'd+', '', text) # 数字の除去 (不要?)
        text = zenhan.z2h(text) # 全角を半角に
        text = mecab_wakati(text) # 分かち書き (これだけでも良いかも)
        text = text.lower() # 文字種の統一

        stopwords = load_stopwords()
        # ストップワードを除去 (不要?)
        for sw in stopwords:
            if sw in text:
                text = text.replace(sw, '')
                
        texts_mod.append(text)

    return texts_mod
```
ただし、形態素解析ではツイートの名詞、形容詞、形容動詞のみを抽出しています。


次に、各日の単語を集計し、頻出語を出力してみます。

<details><summary><font color="Red">**表: 日ごとの頻出語 (クリックで展開)**</font></summary><div>

|日付|頻出語|
|:-:|:-:|
|2020-02-01|肺炎, ない, ｺﾛﾅｳｨﾙｽ, 対策, 拡大, ｳｲﾙｽ, 武漢, 予防, 医療, ｱﾙｺｰﾙ|
|2020-02-02|肺炎, 武漢, 対策, 治療, ｺﾛﾅｳｨﾙｽ, ｳｲﾙｽ, ｲﾝﾌﾙｴﾝｻﾞ, 発表, 拡大, 死亡|
|2020-02-03|肺炎, 拡大, 検査, 対策, 武漢, ｲﾝﾌﾙｴﾝｻﾞ, ｳｲﾙｽ, ｺﾛﾅｳｨﾙｽ, 拡散, ﾏｽｸ|
|2020-02-04|肺炎, 武漢, 確認, 病院, 拡大, ない, 香港, who, 対策, 死亡|
|2020-02-05|肺炎, ﾏｽｸ, ｸﾙｰｽﾞ, 確認, 検査, ない, 武漢, 対策, ｳｲﾙｽ, 拡大|
|2020-02-06|肺炎, 武漢, ｳｲﾙｽ, ｺﾛﾅｳｨﾙｽ, 対応, ﾏｽｸ, 検査, 研究, 影響, ない|
|2020-02-07|医師, ｸﾙｰｽﾞ, 肺炎, 確認, ｳｲﾙｽ, 拡大, ｺﾛﾅｳｨﾙｽ, ｲﾝﾌﾙｴﾝｻﾞ, 武漢, ない|
|2020-02-08|肺炎, 武漢, 死亡, ﾏｽｸ, ｺﾛﾅｳｨﾙｽ, 発表, 入院, 疑い, ない, 対策|
|2020-02-09|肺炎, ｴｱﾛｿﾞﾙ, ｺﾛﾅｳｨﾙｽ, ｸﾙｰｽﾞ, 確認, 対策, ない, who, 武漢, 拡大|
|2020-02-10|ｸﾙｰｽﾞ, 検査, 肺炎, 確認, 対策, ｺﾛﾅｳｨﾙｽ, 発表, 拡大, 武漢, 対応|
|2020-02-11|肺炎, ｺﾛﾅｳｨﾙｽ, 対応, 武漢, 確認, 医療, ない, 安倍, 対策, 検査|
|2020-02-12|covid, 検疫, 肺炎, who, 検査, 対策, ﾏｽｸ, ｸﾙｰｽﾞ, ない, ｳｲﾙｽ|
|2020-02-13|確認, 死亡, 肺炎, 検査, 運転, 東京, ﾀｸｼｰ, 神奈川, 速報, 対策|
|2020-02-14|<font color="Red">対策, 確認, 検査, 安倍, 対応, 肺炎, 拡大, ない, 発表, 医師</font>|
|2020-02-15|対策, 検査, 安倍, 対応, ｺﾛﾅｳｨﾙｽ, ない, 確認, 政権, 東京, 専門|
|2020-02-16|対策, 安倍, 検査, 対応, ない, 肺炎, 専門, 拡大, ｺﾛﾅｳｨﾙｽ, 確認|
|2020-02-17|対策, 拡大, ない, ｺﾛﾅｳｨﾙｽ, 発表, 安倍, 野党, 検査, 対応, 肺炎|
|2020-02-18|対策, 野党, 対応, 検査, 症状, 肺炎, 開催, ない, 確認, 拡大|
|2020-02-19|<font color="Red">対策, 岩田, 専門, ﾌﾟﾘﾝｾｽ, ﾀﾞｲﾔﾓﾝﾄﾞ, 拡大, 安倍, 対応, covid, 健太郎</font>|
|2020-02-20|対策, 開催, ｸﾙｰｽﾞ, 確認, 拡大, 岩田, ｲﾍﾞﾝﾄ, 対応, 予定, ない|
|2020-02-21|拡大, 確認, 対策, 検査, 肺炎, 開催, お願い, お知らせ, 予定, ｲﾍﾞﾝﾄ|
|2020-02-22|検査, 対策, 確認, 拡大, 肺炎, 対応, ｸﾙｰｽﾞ, ｺﾛﾅｳｨﾙｽ, ｳｲﾙｽ, 安倍|
|2020-02-23|検査, 対策, 安倍, ない, 対応, ｺﾛﾅｳｨﾙｽ, 肺炎, 確認, 拡大, ｳｲﾙｽ|
|2020-02-24|検査, 対策, 安倍, ない, 拡大, 対応, 肺炎, 病院, 発表, ｺﾛﾅｳｨﾙｽ|
|2020-02-25|検査, 対策, 拡大, ない, 開催, 対応, ｺﾛﾅｳｨﾙｽ, 延期, 安倍, 確認|
|2020-02-26|<font color="Red">検査, 拡大, 対策, 開催, お知らせ, 公演, ｲﾍﾞﾝﾄ, 延期, 対応, 予定</font>|
|2020-02-27|拡大, 対策, お知らせ, 開催, 検査, ｲﾍﾞﾝﾄ, 予定, 公演, 延期, 防止|
|2020-02-28|拡大, 対策, お知らせ, 防止, 開催, 検査, 安倍, 確認, 予算, お願い|
|2020-02-29|対策, 安倍, 検査, 確認, 拡大, 対応, ない, ｺﾛﾅｳｨﾙｽ, 発表, 肺炎|
|2020-03-01|対策, 検査, ない, 安倍, 拡大, ﾏｽｸ, ｺﾛﾅｳｨﾙｽ, 肺炎, 確認, 対応|
|2020-03-02|拡大, 対策, 安倍, 検査, 影響, ｺﾛﾅｳｨﾙｽ, 専門, 緊急, ない, お知らせ|
|2020-03-03|拡大, 対策, 肺炎, 検査, ない, 確認, 安倍, 影響, 武漢, 緊急|
|2020-03-04|拡大, 対策, 安倍, 検査, 確認, ない, 肺炎, 緊急, 対応, 開催|
|2020-03-05|対策, 安倍, 拡大, 確認, ない, 影響, 発表, 延期, 緊急, 対応|
|2020-03-06|対策, 拡大, 検査, 影響, 確認, ない, 安倍, 対応, 開催, ｺﾛﾅｳｨﾙｽ|
|2020-03-07|対策, 安倍, 検査, 拡大, ﾏｽｸ, 確認, ない, 対応, 医療, 影響|
|2020-03-08|対策, 検査, ない, 安倍, 確認, ｺﾛﾅｳｨﾙｽ, ｲﾀﾘｱ, ｳｲﾙｽ, 拡大, 病院|
|2020-03-09|対策, 拡大, 安倍, 影響, ない, 医療, 検査, 緊急, 延期, ｳｲﾙｽ|
|2020-03-10|対策, 拡大, 検査, ない, 専門, 安倍, 緊急, 対応, ｳｲﾙｽ, 影響|
|2020-03-11|検査, 拡大, 開催, ない, 対策, 影響, 医療, 予定, 延期, 消費|
|2020-03-12|検査, 対策, 拡大, 医療, ない, 発表, ﾊﾟﾝﾃﾞﾐｯｸ, who, 影響, 予定|
|2020-03-13|対策, 拡大, 検査, 延期, 影響, 開催, 発表, 可能, 緊急, 予定|
|2020-03-14|検査, 対策, 安倍, ない, 宣言, 大統領, 対応, 拡大, ｺﾛﾅｳｨﾙｽ, ﾄﾗﾝﾌﾟ|
|2020-03-15|検査, 対策, 拡大, ない, 医療, 病院, 安倍, 影響, 対応, 緊急|
|2020-03-16|検査, 対策, 拡大, 対応, ない, ｺﾛﾅｳｨﾙｽ, 肺炎, 影響, 安倍, ｲﾀﾘｱ|
|2020-03-17|検査, 拡大, 対策, 確認, 安倍, ない, 影響, who, 公演, 開催|
|2020-03-18|対策, 拡大, 検査, ｳｲﾙｽ, ない, 影響, 開催, 死亡, 予定, 給付|
|2020-03-19|拡大, 対策, 検査, 影響, ない, 経済, 確認, 開催, 大阪, 対応|
|2020-03-20|拡大, 対策, ない, 検査, 発表, 影響, 開催, 確認, ｲﾀﾘｱ, 延期|
|2020-03-21|対策, 拡大, 検査, ない, 東京, 影響, ｲﾀﾘｱ, 病院, 開催, 発表|
|2020-03-22|対策, 検査, 拡大, ない, 自粛, 経済, 確認, 影響, ｲﾀﾘｱ, 規模|
|2020-03-23|<font color="Red">対策, 拡大, 東京, ない, 延期, 開催, 経済, 発表, 検査, 確認</font>|
|2020-03-24|対策, 延期, 東京, 拡大, 検査, 影響, ない, 医療, 開催, 経済|
|2020-03-25|対策, 東京, 経済, 検査, 延期, 確認, 拡大, 影響, ない, 緊急|
|2020-03-26|対策, 拡大, 東京, 自粛, 検査, お知らせ, 確認, ない, 影響, 延期|
|2020-03-27|拡大, 対策, 検査, 東京, 自粛, 影響, 確認, 発表, お知らせ, 開催|
|2020-03-28|対策, 確認, 拡大, 自粛, 東京, ない, 安倍, 検査, 医療, 病院|
|2020-03-29|対策, 自粛, ない, 東京, 検査, 拡大, 確認, 経済, 病院, 安倍|
|2020-03-30|<font color="Red">けん, 対策, 拡大, 東京, 肺炎, ない, 死去, 確認, 自粛, 検査</font>|
|2020-03-31|拡大, 対策, 確認, 東京, 発表, 自粛, ない, 影響, 検査, お願い|
|2020-04-01|対策, 確認, 拡大, ﾏｽｸ, 医療, ない, 東京, 発表, 安倍, 状況|
|2020-04-02|ﾏｽｸ, 拡大, 対策, 確認, 東京, 医療, ない, 検査, 支援, 影響|
|2020-04-03|拡大, 対策, 給付, 確認, 東京, 世帯, 影響, nhk, お知らせ, 開催|
|2020-04-04|対策, 拡大, 確認, 検査, 医療, ﾏｽｸ, 東京, 病院, ない, nhk|
|2020-04-05|対策, 東京, 拡大, 検査, 医療, ない, 確認, 病院, 自粛, ｺﾛﾅｳｨﾙｽ|
|2020-04-06|緊急, 拡大, 対策, 宣言, 検査, 東京, 影響, お知らせ, 自粛, 確認|
|2020-04-07|<font color="Red">緊急, 宣言, 拡大, 対策, 東京, お知らせ, 確認, ない, 休業, お願い</font>|
|2020-04-08|拡大, 対策, 緊急, 宣言, 確認, 影響, お知らせ, ない, 自粛, 延期|
|2020-04-09|対策, 拡大, 確認, 緊急, 検査, 宣言, 影響, 東京, ない, 医療|
|2020-04-10|拡大, 対策, 確認, 影響, 検査, 医療, 緊急, ない, 東京, お知らせ|
|2020-04-11|対策, 拡大, 安倍, ない, 検査, 自粛, 医療, 確認, 緊急, 病院|
|2020-04-12|対策, 検査, 確認, 安倍, 拡大, 医療, ない, ﾏｽｸ, 病院, 東京|
|2020-04-13|拡大, 対策, 緊急, 検査, 影響, 確認, ない, 宣言, 休業, 発表|
|2020-04-14|拡大, 対策, 緊急, 医療, 影響, 確認, 対応, ない, 病院, 安倍|
|2020-04-15|対策, 拡大, 病院, 医療, 安倍, ない, 対応, 影響, 東京, 確認|
|2020-04-16|対策, 拡大, 給付, 緊急, ない, 医療, 検査, 支援, 影響, ﾏｽｸ|
|2020-04-17|対策, 拡大, 検査, 緊急, 医療, 影響, 対応, 安倍, 給付, ない|
|2020-04-18|医療, 対策, 検査, ない, 拡大, 確認, ﾏｽｸ, 安倍, 病院, 必要|
|2020-04-19|対策, 医療, 拡大, ない, ﾏｽｸ, 検査, 対応, 研究, 影響, 病院|
|2020-04-20|検査, 対策, 拡大, 医療, 影響, 確認, ない, pcr, 判明, 安倍|
|2020-04-21|対策, 拡大, 影響, ない, 医療, 給付, ﾏｽｸ, 検査, 安倍, 支援|
|2020-04-22|検査, 拡大, 対策, 医療, ない, 確認, 影響, pcr, nhk, 自粛|
|2020-04-23|<font color="Red">岡江, 検査, 久美, 医療, 病院, 拡大, 対策, ない, 自宅, 支援</font>|
|2020-04-24|拡大, 検査, 対策, 医療, 影響, 確認, ない, nhk, 東京, お願い|
|2020-04-25|検査, 対策, 医療, 拡大, 自粛, 経済, 確認, ない, nhk, 支援|
|2020-04-26|検査, 対策, 医療, ない, ﾏｽｸ, 自粛, 拡大, 影響, 東京, rt|
|2020-04-27|対策, 拡大, 検査, 医療, 支援, ない, 自粛, 影響, 経済, 新しい|
|2020-04-28|拡大, 検査, 対策, 影響, ない, 支援, 医療, 東京, news, nhk|
|2020-04-29|対策, 検査, 緊急, 拡大, 医療, ない, 影響, 症状, 安倍, 経済|
|2020-04-30|検査, 対策, 拡大, 医療, 影響, ない, 安倍, 自粛, 支援, 確認|

</div></details>

上の表は、2月から4月までの各日について、頻出語上位10件を示しています。
ただし、「ｺﾛﾅｳｲﾙｽ」「COVID-19」「感染症」は出力対象から除外しています。
また、表中の注目して欲しい箇所を赤字で示しています。

① 1月〜2月上旬は、「肺炎」「ｲﾝﾌﾙｴﾝｻﾞ」「武漢」「確認」「ｸﾙｰｽﾞ」など、新型コロナウイルスの症状や、感染者が確認されている武漢やクルーズ船での動向について取り沙汰されていることがわかります。

② 2月14日を境に、「対策」「発表」「対応」といった、日本の行政の動向に関する単語が頻出しており、ユーザが関心を持つ話題が移ったことが確認できます。
また、[データの詳細](#データの詳細)で示したグラフにおいて、2月14日あたりから急激にツイート数が伸びています。
ユーザは新型コロナウイルスがもたらす被害そのものよりも、行政の動向に関心を持つことが予想されます。

③ 2月26日付近について、前回の記事ではツイート数の伸びが原因不明としていました。
ここで、頻出語には「開催」「講演」「ｲﾍﾞﾝﾄ」「延期」など、イベントに関する単語が多くみられます。
ここから、ユーザは自身が関心を持つイベントが新型コロナウイルスの影響で延期等になったことに反応し、ツイート数やRT数が増加したと考えられます。

また、上記①〜③から、ユーザは自身のより身近で起こる事柄ほど関心を持つ傾向にあると考えられます。
(武漢やクルーズ船 -> 行政の対応 -> イベントの延期 と、順に身近な(直接的に関わる)内容になっています。)

④ 3月23日以降は、「東京」という語が頻出語に登場しています。
これは、東京都での感染者の急増のためであると考えられます。
また、[データの詳細](#データの詳細)で示したグラフでは、この日以降ツイート数が急増している事から、東京都の動向に非常に強い関心が寄せられていることがわかります。

⑤ 4月6日はから7日にかけて、東京都をはじめとする数都市で緊急事態宣言について言及がありました。
外出の自粛要請や各種店舗の休業があり、生活に密接した内容である事から、多くのユーザが関心を寄せたと考えられます。

⑥ 2月19日・3月30日・4月23日について、それぞれ「岩田健太郎さんのクルーズ船に関する投稿」「志村けんさんの訃報」「岡江久美子さんの訃報」があり、これが各日の頻出語に影響していることがわかります。
また、[データの詳細](#データの詳細)で示したグラフの各日において、数日に渡ってのピークがみられます。
ここから、多くのユーザが数日に渡りこれらの話題に関心を持ったことが確認できます。
また、個人に関する話題は、多くのユーザに影響する話題と比較して話題性が減衰しやすいと考えられます。


# ツイートの意味内容からRT数を予測
ここでは、ツイートの内容を定量化し、RT数(どれだけ人気か)を予測するモデルを構築することで、ツイートの内容や含む語によってRT数に差が出るのか？を検証します。

## 構築するモデルの概要
ここでは、ツイートの内容をTF-IDFにより定量化し、Light GBMによってRT数を予測します。

### TF-IDF
Web上に解説記事が多くありますので、詳細はそちらをご覧ください[^1][^2]。
定性的には「文章中の各単語の重要度を定量化したもの」であり、各ツイートについて、全ツイートに含まれる単語数分の次元を持つベクトルが得られます。
結果として、今回のデータセットでは、TF-IDFにより 79562ツイート × 52636次元 の行列を得ました。



### Light GBM
こちらも詳細はWeb上の解説記事をご確認ください[^3][^4]。
決定木を拡張したモデルであり、回帰や分類を行えます。
また、回帰・分類に寄与した次元を簡単に出力でき、TF-IDFと合わせることで、「どの内容がRT数に寄与したか」が簡単に把握できます。

今回は、データセット内のツイートの80%をモデルの学習、残りの20%を精度や各次元の寄与度合いの確認(テスト)に用いました。
したがって、今回LightGBMが予測する問題は、「新型コロナウイルスに関して、時期を問わずユーザが関心を持つ内容は何か」であると解釈できます。


```python
train_data = lgb.Dataset(x_train, label=y_train)
test_data = lgb.Dataset(x_test, label=y_test, reference= train_data)

params = {
    'task': 'train',
    'boosting_type': 'gbdt',
    'objective': 'regression'
}

gbm = lgb.train(
    params,
    train_data
)

preds = gbm.predict(x_test)
```

## 結果
学習したモデルがどれだけうまくRT数を予測できているか定量的に評価します。
ここでは、数値を数値を予測する回帰モデルの評価に頻繁に用いられるMean Absolute Error (MAE)とRoot Mean Square Error (RMSE)という指標を用います。
それぞれの詳細については解説記事に委ねます。
簡単に、それぞれ値が小さいほど正確に予測できていることを表します。

ここで、単に各評価指標の数値だけ見ても、どの程度良いの？となってしまうため、何か他のモデルと比較する必要があります。
今回は、ベースラインとして「全てのツイートのRT数を必ずデータセットのRT数の平均値(1429.36)と予測する」モデル(BaseLine)を比較対象としています。

||MAE|RMSE|
|:-:|:-:|:-:|
|LightGBM|1462.95|4565.19|
|BaseLine|**1429.36**|**4559.26**|

上の表において、BaseLineがいずれの評価指標でもLightGBMを上回ることから、ツイートの内容(TF-IDF + LightGBM)からではRT数は高精度には予測できないことが示唆されました。

また、各次元のLightBGMの葉での出現回数で表現されるFeature Importanceを出力してみます。

```python
importance = pd.DataFrame(gbm.feature_importance(), 
                index=x_condition.get_feature_names(), columns=['importance'])
display(importance.sort_values("importance", ascending=False).head(100))
```

| 単語 | Feature Importance |
|:--|--:|
| ｺﾛﾅ | 138 |
| ｺﾛﾅｳｲﾙｽ | 111 |
| ｺﾒﾃﾞｨｱﾝ | 99 |
| 当社 | 95 |
| rt | 93 |
| cov | 85 |
| 有益 | 81 |
| 旅館 | 78 |
| おじいん | 77 |
| just | 77 |
| 新型 | 71 |
| com | 64 |

上の表で上位の単語ほど、Light BGMがRT数を予測する上で重要であると判断した単語と解釈できます。
しかしながら、「ｺﾛﾅ」「rt」「com (URL?)」などはRT数にかかわらず多くのツイートに含まれており、LightGBMが正確に学習できていないことが定性的に確認できます。
一方で、例えば「ｺﾒﾃﾞｨｱﾝ」はおそらく志村けんさんに関するツイートから抽出された単語であると考えられ、LightGBMが上記の「著名な個人の話題は急峻なピークを作る」という特徴を捕らえられているとも考えられます。

以上より、LightGBMが「新型コロナウイルスに関して、時期を問わずユーザが関心を持つ内容は何か」という問題をうまく解決できなかったことと、上記の頻出語の分析により、「ウイルスがもたらす症状」「日本の動向」「イベントの延期」……とユーザの関心が移ろうことから、
新型コロナウイルスについて、「この内容のツイートは時期を問わず必ずユーザの関心をひく」と言った内容は存在しないことが示唆されました。


# まとめ
今回の記事では、以下の点が示唆されました。

- ツイートの頻出語と日ごとのツイート数の遷移から、ユーザの関心について、
    - 著名な個人が関係する話題では、数日にわたって関連するツイート数に局所的なピークがみられるが、その減衰も早い
    - ユーザは、自身に身近なほど話題に関心を持つ。意外にも、感染症そのものや政府の対応よりも、イベントの延期に関してユーザは関心を高く持つ。

- 時期を問わず必ずRT数が大きくなるような内容は存在しない。

今後は、「フォロワー数や公式アカウントなど、知名度の高いユーザが発信するツイートが多くのユーザの目にとまり、その分ユーザの関心を引きやすい」という仮説をたて、ユーザの情報を活用した分析を行いたいです。

[^1]: TF-IDF参考(1): https://qiita.com/AwaJ/items/5937665d5a4152cc24cf
[^2]: TF-IDF参考(2): https://dev.classmethod.jp/articles/yoshim_2017ad_tfidf_1-2/
[^3]: LightGBM参考(1): https://www.codexa.net/lightgbm-beginner/
[^4]: LightGBM参考(2): https://qiita.com/ryo_naka/items/f479e5b7cb49fb55f150