に疲れたのでnehanでデータ分析してみた(コロナ禍でもライブに行きたい - 後編)


ご挨拶

こんにちは、マンボウです。
「Twtter×コロナ」引き続き分析していきます。
前編はtweetテキストを形態素解析し、頻出単語の日別出現数を出すところまでやりました。

↓選ばれた頻出単語27

Twitterのデータから、上昇・下降トレンドの単語を探してみる

コロナウイルスが社会問題になってから半年以上が経過しました。
人々の中で何が高まり、逆に何が忘れられているのか、つぶやきから追ってみます。
後編では、回帰分析を用いて上昇・下降トレンドの単語を見つけ出します。

データ

前編で作成した、日別・単語別出現数のデータを使います。
↓データ

↓可視化すると

回帰分析を行う準備

日が経過するに連れ、出現数が増or減、の単語を見つけたいと思います。
つまり

y:特定単語のtweet数=a\times x:経過日数+b

こういう回帰式を導き、傾きであるaと、相関係数を観察してみよう、と。
データ操作としては、日付のデータから「経過日数」を算出する必要があります。
アプローチとして、連番を・単語ごとに・日付が若い順から、振ります。

from scipy.spatial.distance import cdist
import pandas as pd
import statsmodels.api as sm

port_23 = port_22.copy()
model_params = {'method': 'first', 'ascending': True}
port_23[['Created_At']] = pd.to_datetime(port_23[['Created_At']])
port_23['index'] = port_23.groupby(['単語'])[['Created_At']].rank(**model_params)
port_23[['Created_At']] = port_23[['Created_At']].map(lambda x: x.date())

↓x軸に注目。経過日数が出せ、回帰分析の準備が整いました。

回帰分析を実施。単語ごとに

選定した24単語が経過日数に応じてどう変化しているか、回帰分析結果から観察していきます。
pythonで書こうとすると、単語ごとにループを回したりと、大変です。

group_keys = ['単語']
X_columns = ['index']
Y_column = 'カウント'
groups = port_23.groupby(group_keys)
models = {}
summaries = {}

def corr_xy(X, y):
    """目的変数と説明変数の相関係数を求める"""
    X_label = X.columns.tolist()
    X = X.T.values
    y = y.values.reshape(1, -1)
    corr = 1 - cdist(X, y, metric='correlation')
    corr = pd.DataFrame(corr, columns=['目的変数との相関係数'])
    corr['説明変数'] = X_label
    return corr

for i, g in groups:
    X = g[X_columns]
    Y = g[Y_column].squeeze()
    corr = corr_xy(X, Y)
    try:
        model = sm.OLS(y, sm.add_constant(X, has_constant='add')).fit()
        model.X = X.columns
        models[i] = model
        summary = pd.DataFrame(
            {
                '説明変数': X.columns,
                '係数': np.round(model.params, 5),
                '標準偏差': np.round(model.bse, 5),
                't値': np.round(model.tvalues, 5),
                'Pr(>|t|)': np.round(model.pvalues, 5)
            },
            columns=['説明変数', '係数', '標準偏差', 't値', 'Pr(>|t|)'])
        summary = summary.merge(corr, on='説明変数', how='left')
        summaries[i] = summary
    except:
        continue

res = []
for key, value in summaries.items():
    value[group_keys] = key
    res.append(value)

concat_summary = pd.concat(res, ignore_index=True)
port_24 = models
port_25 = concat_summary

↓nehanであれば、グループごとにモデルを作成するオプションで面倒なループ処理を書かずに済みます。

そして、単語ごとの回帰分析の結果を得られました。説明変数=const、は切片の情報です。

上昇/下降トレンドの単語に絞る

様々な解釈はありますが、ここでは

  • 相関係数が0.4以上
  • 相関係数が-0.4以下

に絞り、これを相関がある、として単語を抽出します。

port_27 = port_25[(port_25['目的変数との相関係数'] <= -0.4) |
                  (port_25['目的変数との相関係数'] >= 0.4)]

単語の情報を詳しく見てみます。

結果を観察

上昇トレンドの単語

  • イベント
  • ライブ

下降トレンドの単語

  • 患者
  • 政府
  • 症状
  • 重症

ライブ、の出現数日別推移

政府、の出現数日別推移

まとめ

コロナの脅威は去ったわけでは有りませんが、危機的な時期にニュースでよく見ていたような単語の出現数は減り、イベントやライブといった、自粛の影響を強く受けた単語の出現数が増えている様子が見て取れます。
もちろん、これだけでは「みんなライブに行きたいんだ!」とは言えませんが、ここまでのデータを見た、いち考察として本テーマを締めさせていただければと思います。

前処理したデータから様々な分析、可視化に繋げられるプログラミング不要の分析ツールnehanの魅力が少しでも伝われば幸いです。

※分析ツールnehanのご紹介はこちらから。
※↓今日の内容

なお、上記のソースコードはnehanのpythonエクスポート機能で出力したコードをコピペしました。(一部バグってたので、書き直しました・・・)