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.
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']
}
À 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
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")
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.)
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.")
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.")
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.
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.")
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.
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.
Dans ce qui suit, nous examinerons les évolutions en différentes quantités au cours des 92 jours du 1/1 au 4/1.
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")
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.
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
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")
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")
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).
~~ 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.
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