[PYTHON] J'ai analysé les tweets sur le nouveau virus corona publiés sur Twitter

Aperçu

Sur Twitter, le nouveau virus corona est activement discuté jour et nuit. En analysant ces tweets, je me suis demandé s'il serait possible de saisir des tendances significatives pour les utilisateurs de Twitter. Par conséquent, dans cet article, nous allons collecter des tweets sur le nouveau virus corona publiés sur Twitter et les analyser facilement.

Si vous avez des erreurs, des parties difficiles à voir ou des conseils, n'hésitez pas à les signaler. Je vous remercie.

Détails des données

Les données de tweet utilisées dans cet article sont un tweet qui a été publié entre le 1er janvier 2020 et le 1er avril 2020, et inclut l'un des "Corona", "COVID-19" et "Maladies infectieuses". Cependant, il est limité aux tweets japonais, et seuls les tweets avec plus de 100 RT sont utilisés. En conséquence, nous avons construit un ensemble de données composé de 47041 tweets.

Les données du tweet ont été enregistrées dans la séquence associative suivante.

{
'text': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 
'date': datetime.datetime(2020, 1, 1, 1, 0, 1),
'retweets': 123,
'favorites': 456,
'user_id': 7890123,
'hashtags': ['# yyy', '# zzz'],
'url': ['https://aaaaaa.com', 'http://bbb.com']
}

Analyse des données explicatives (EDA)

À partir des données utilisées dans cet article, nous pouvons obtenir plusieurs quantités telles que la longueur du texte, l'heure de publication, le nombre de RT, le nombre de likes, la présence / absence de balises de hachage et la présence / absence d'URL. Par conséquent, les caractéristiques des données sont lues en utilisant ces quantités.

import os, sys, json, re
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
from datetime import datetime
import datetime as dt
%matplotlib inline

Nombre de caractères, nombre de RT, nombre de likes, présence / absence d'URL, présence / absence de hash tag

nombre de mots
tweet_len = tweets["text"].str.len()
tweets["text_len"] = tweet_len
tweets["text_len"].hist(bins=range(0, 141, 5))
plt.xlabel("len. of text")
plt.ylabel("num. of tweets")
plt.title("Histgram on length of texts in tweets")

文字数.png Au moment de l'acquisition des données, un petit nombre de tweets dépassant 140 caractères a été vu (pourquoi?), Mais ils ont été omis par souci de lisibilité de la figure. De nombreux tweets de l'ensemble de données semblent contenir de nombreux caractères (informations ≒). Étant donné que cet ensemble de données n'utilise que des tweets qui dépassent 10 RT, il se peut que le nombre de RT ait tendance à augmenter à mesure que le nombre de caractères augmente. (Ce point est vérifié ci-dessous.)

Nombre de RT, nombre de likes
tweets["retweets"].hist(bins=range(0,4001,100))
plt.xlabel("num. of RT")
plt.ylabel("num. of tweets")
plt.title("Histgram on the number of RT.")
-------------------------------------------------
tweets["favorites"].hist(bins=range(0,4001,100))
plt.xlabel("num. of favorites")
plt.ylabel("num. of tweets")
plt.title("Histgram on the number of favorites.")

RT数.pngいいね数.png En fait, il y a des tweets qui dépassent 100000 RT / like, mais la plage est définie comme ceci pour faciliter la visualisation de la figure. Les deux montrent une baisse, mais comme le nombre de tweets a tendance à augmenter jusqu'à environ 300 RT, il semble que le nombre de RT ait tendance à continuer d'augmenter jusqu'à une certaine ligne pour les tweets qui ont commencé à être RT une fois. Vous pouvez deviner s'il n'y en a pas.

Maintenant, regardons la corrélation entre le nombre de RT et le nombre de caractères.

fig, ax = plt.subplots()
ax.scatter(tweets["text_len"], tweets["retweets"], s=1)
plt.xlim(0, 140)
plt.ylim(0, 5000)
plt.xlabel("len. of texts in tweets")
plt.ylabel("num. of RT")
plt.title("Scatter plot of RT and len. of texts.")

文字数とRT数の相関.png Coefficient de corrélation: 0,022 En regardant la figure, il semble qu'il existe de nombreux tweets avec un grand nombre de RT où le nombre de caractères est proche de 140, mais il ne semble y avoir aucune corrélation. Par conséquent, il semble qu'on ne puisse pas dire que «les tweets qui sont souvent RT ont tendance à avoir un grand nombre de caractères» et vice versa.

Présence / absence de balise de hachage / URL
tweets.loc[tweets["hashtags"].str.len() > 0, "has_hashtag"] = 1
tweets.loc[tweets["hashtags"].str.len() <= 0, "has_hashtag"] = 0
tweets["has_hashtag"].hist()
plt.xlabel("has hashtag (1) or not (0)")
plt.ylabel("num. of tweets")
plt.title("Histgram of whether tweets have hashtag(s) or not.")
----------------------------------------------------------------
tweets.loc[tweets["url"].str.len() > 0, "has_url"] = 1
tweets.loc[tweets["url"].str.len() <= 0, "has_url"] = 0
tweets["has_url"].hist()
plt.xlabel("has URL (1) or not (0)")
plt.ylabel("num. of tweets")
plt.title("Histgram of whether tweets have URL(s) or not.")

ハッシュタグの有無.pngURLの有無.png Dans cet ensemble de données, il y a peu de tweets avec des balises de hachage et de nombreux tweets avec des URL. Étant donné que les URL sont données à plus de la moitié des tweets, on peut voir que la plupart des tweets avec des RT de 10 ou plus donnent des informations non seulement par le texte mais également par l'URL.

Résumé à ce jour

Il semble que cette zone ait les mêmes caractéristiques que les tweets généraux. (En fait, il faut créer un jeu de données avec des tweets généraux et comparer le même montant ...) Les tweets d'ensembles de données ont un long corps et ont tendance à ajouter des informations par URL plutôt que par hashtag. Le nombre de RT et le nombre de likes ont également tendance à diminuer nettement, et on pense que c'est la même chose pour les tweets généraux.

Analyse à l'aide de séries chronologiques

Dans ce qui suit, nous examinerons les évolutions en différentes quantités au cours des 92 jours du 1/1 au 4/1.

Nombre de tweets par jour
sns.set()
fig, ax = plt.subplots(figsize=(16.0, 8.0))
ax.bar(df.index, df["tweets"], color='#348ABD')
ax.plot(df.index, df["kansen"], color="blue")
ax.set_xticks([1,32,61,92])
ax.set_xticklabels(["01/01", "02/01", "03/01", "04/01"])
ax.set_xlabel("date")

日ごとのツイート数2.png

L'axe horizontal est la date. L'histogramme montre le nombre de tweets par jour et la ligne en pointillé montre le nombre de nouvelles infections à coronavirus trouvées au Japon [^ 1] chaque jour. L'échelle sur l'axe vertical est commune aux deux.

Certains pics peuvent être vus dans la figure ci-dessus. Pour chaque pic, le nombre de tweets augmente en quelques jours, pas seulement en un jour. À partir de là, on s'attend à ce que ces pics ne soient pas des valeurs aberrantes et qu'il y ait quelque chose qui a attiré l'attention de l'utilisateur pendant cette période.

De plus, le nombre d'infections confirmées est également affiché, mais il semble qu'il n'y ait pas beaucoup de corrélation avec le nombre de tweets. ~~ J'ai eu du mal ~~ À partir de là, on s'attend à ce que les utilisateurs réagissent plus fortement aux autres événements qui en résultent (tels que le jugement politique et l'annulation d'événements) qu'à l'augmentation du nombre de patients atteints du nouveau virus corona (propagation de l'infection).

Maintenant, analysons ce qui cause chaque pic.

日ごとのツイート数_mod.png

Dans cette figure, concernant le pic du chiffre précédent et le jour de préoccupation personnelle, nous avons enquêté sur le contenu réel du tweet et l'annonce du ministère de la Santé, du Travail et du Bien-être social, et ajouté le contenu qui semble avoir provoqué l'événement tel que le pic. Chose.

J'ai lu plus de 100 tweets dans l'ensemble de données pour environ 1/28 et 2/26, qui sont importants, mais ils sont incohérents et je ne peux pas confirmer la cause du pic. fait. Cela sera confirmé en détail ultérieurement lors de l'analyse des mots fréquemment utilisés et du nombre de RT. Peut-être

Nombre cumulé de RT par jour
sns.set_style("dark")
fig, ax1 = plt.subplots(figsize=(16.0, 8.0))
ax1.bar(df.index, df["retweets"], color='#348ABD')
ax2 = ax1.twinx()
ax2.plot(df.index, df["kansen"], color="blue")
ax2.set_ylim(0,2500)
ax1.set_xticks([1,32,61,92])
ax1.set_xticklabels(["01/01", "02/01", "03/01", "04/01"])
ax1.set_xlabel("date")
ax1.set_ylabel("num. of retweets")
ax2.set_ylabel("num. of infected people")

日ごとの累計RT数.png Dans la figure ci-dessus, l'histogramme et l'axe vertical gauche représentent le nombre cumulé de RT par jour, et la ligne pointillée et l'axe vertical droit représentent le nombre d'infections confirmées par jour. Un graphique similaire au nombre de tweets par jour est sorti. Après tout, il semble que cela n'a rien à voir avec le nombre d'infections confirmées quotidiennement.

Maintenant, comparons le nombre de tweets par jour avec le nombre de RT par jour.

sns.set_style("dark")
fig, ax1 = plt.subplots(figsize=(16.0, 8.0))
ax1.bar(df.index, df["tweets"], color='#348ABD', alpha=0.7)
ax2 = ax1.twinx()
ax2.plot(df.index, df["retweets"], color="red")
ax2.set_ylim(0,3000000)
ax1.set_xticks([1,32,61,92])
ax1.set_xticklabels(["01/01", "02/01", "03/01", "04/01"])
ax1.set_xlabel("date")
ax1.set_ylabel("num. of tweets")
ax2.set_ylabel("num. of retweets")

日ごとのツイート数_日ごとのRT数_mod.png Dans la figure ci-dessus, l'histogramme et l'axe vertical gauche représentent le nombre de tweets par jour, et la ligne rouge et l'axe vertical droit représentent le nombre cumulé de RT par jour. Le nombre de tweets par jour et le nombre de RT par jour semblent être corrélés la plupart des jours. Ici, seulement vers 3/25 à 28, il semble différent des autres. La raison pour laquelle le nombre de tweets (10 RT ou plus) dépassait le nombre de RT par rapport à d'autres personnes était qu'il y avait de nombreux sujets liés au nouveau virus corona par rapport à d'autres périodes uniquement pendant cette période, et l'utilisateur ne pouvait pas dépasser le sujet ( Il est possible que RT ne soit pas possible).

à partir de maintenant

~~ Je voulais le poster rapidement ~~ Sur la base de ce qui précède, j'écrirai ce que je ferai à l'avenir.

--Analyse des mots fréquents ――Pourquoi y a-t-il des pics autour du 1/24 et du 2/26? --MeCab sous Windows ne fonctionne pas pour une raison quelconque.

en conclusion

Je posterai sur Qiita pour la première fois. En tant qu'analyse, je n'ai pas obtenu de résultats innovants, mais j'ai le sentiment d'avoir saisi la politique de fouiller dans cet ensemble de données à l'avenir. L'EDA est également importante pour déterminer cette direction, n'est-ce pas? En fait, je voulais construire un modèle prédictif fermement et analyser l'évaluation et la nature du modèle, mais j'avais une forte envie de le publier, alors j'ai décidé de l'activer la prochaine fois.

Merci d'avoir lu jusqu'ici. Je suis désolé pour l'analyse et le texte médiocres, mais n'hésitez pas à nous donner vos suggestions, opinions et conseils.

[^ 1]: Référence: https://www.asahi.com/special/corona/

Recommended Posts

J'ai analysé les tweets sur le nouveau virus corona publiés sur Twitter
J'ai analysé les tweets sur le nouveau virus corona publiés sur Twitter, partie 2
(Maintenant) j'ai essayé d'analyser le nouveau virus corona (COVID-19)
J'ai essayé de créer un script qui retrace les tweets d'un utilisateur spécifique sur Twitter et enregistre l'image publiée à la fois
J'ai essayé d'utiliser des données PDF de soins médicaux en ligne basés sur la propagation d'une nouvelle infection à coronavirus
J'ai vérifié l'image de l'Université des sciences sur Twitter avec Word2Vec.
Tracez la propagation du nouveau virus corona
Recevez uniquement des tweets d'images sur Twitter
J'ai refactoré "J'ai essayé de faire un script qui enregistre les images postées à la fois en retournant sur les tweets d'un utilisateur spécifique sur Twitter".
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Folding @ Home sur Linux Mint pour contribuer à l'analyse du nouveau virus corona
Je suis tombé sur l'API Hatena Keyword
Publier le sujet de Gmail sur Twitter
Estimer le pic d'infectivité du nouveau virus corona
Les prévisions épidémiques du nouveau virus corona ont été publiées sur le Web à une vitesse explosive
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python