Auf Twitter wird Tag und Nacht aktiv über das neue Koronavirus diskutiert. Bei der Analyse dieser Tweets habe ich mich gefragt, ob es möglich ist, sinnvolle Trends für Twitter-Nutzer zu erfassen. Daher werden wir in diesem Artikel Tweets über den neuen Corona-Virus auf Twitter sammeln und diese einfach analysieren.
Wenn Sie Fehler, schwer sichtbare Teile oder Ratschläge haben, können Sie diese gerne darauf hinweisen. Vielen Dank.
Bei den in diesem Artikel verwendeten Tweet-Daten handelt es sich um einen Tweet, der zwischen dem 1. Januar 2020 und dem 1. April 2020 veröffentlicht wurde und "Corona", "COVID-19" und "Infektionskrankheiten" enthält. Es ist jedoch auf japanische Tweets beschränkt, und es werden nur Tweets mit mehr als 100 RTs verwendet. Als Ergebnis haben wir einen Datensatz erstellt, der aus 47041 Tweets besteht.
Die Tweet-Daten wurden in der folgenden assoziativen Reihenfolge gespeichert.
{
'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']
}
Aus den in diesem Artikel verwendeten Daten können verschiedene Größen wie Textlänge, Veröffentlichungszeit, Anzahl der RTs, Anzahl der Likes, Vorhandensein / Fehlen eines Hash-Tags, Vorhandensein / Fehlen einer URL ermittelt werden. Daher verwenden wir diese Größen, um die Eigenschaften der Daten zu lesen.
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")
Zum Zeitpunkt der Datenerfassung wurde eine kleine Anzahl von Tweets mit mehr als 140 Zeichen gesehen (warum?), Die jedoch aus Gründen der Lesbarkeit der Abbildung weggelassen wurden. Viele Tweets im Datensatz scheinen viele Zeichen zu enthalten (≒ Informationen). Da in diesem Datensatz nur Tweets verwendet werden, die 10 RT überschreiten, kann es sein, dass die Anzahl der RTs mit zunehmender Anzahl der Zeichen tendenziell zunimmt. (Dieser Punkt wird unten überprüft.)
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.")
Tatsächlich gibt es Tweets, die 100.000 RT / Likes überschreiten, aber der Bereich wird auf diese Weise eingestellt, um die Anzeige der Figur zu vereinfachen. Beide weisen einen Rückgang auf, aber da die Anzahl der Tweets tendenziell auf etwa 300 RTs ansteigt, scheint die Anzahl der RTs für Tweets, die einmal RT geworden sind, bis zu einer bestimmten Linie weiter zuzunehmen. Sie können erraten, wenn es nicht gibt.
Betrachten wir nun die Korrelation zwischen der Anzahl der RTs und der Anzahl der Zeichen.
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.")
Korrelationskoeffizient: 0,022 Betrachtet man die Abbildung, scheint es viele Tweets mit einer großen Anzahl von RTs zu geben, bei denen die Anzahl der Zeichen nahe bei 140 liegt, aber es scheint keine Korrelation zu geben. Daher kann nicht gesagt werden, dass "Tweets, die häufig RT sind, eine große Anzahl von Zeichen haben" und umgekehrt.
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.")
In diesem Datensatz gibt es nur wenige Tweets mit Hash-Tags und viele Tweets mit URLs. Da URLs mehr als der Hälfte der Tweets zugewiesen werden, ist ersichtlich, dass die meisten Tweets mit RTs von 10 oder mehr Informationen nicht nur über den Text, sondern auch über die URL enthalten.
Es scheint, dass dieser Bereich die gleichen Eigenschaften wie allgemeine Tweets hat. (Eigentlich ist es notwendig, einen Datensatz mit allgemeinen Tweets zu erstellen und die gleiche Menge zu vergleichen ...) Dataset-Tweets haben einen langen Körper und fügen Informationen eher nach URL als nach Hashtag hinzu. Die Anzahl der RTs und die Anzahl der Likes sinken ebenfalls tendenziell sauber, und dies wird für allgemeine Tweets als gleich angesehen.
Im Folgenden werden die Veränderungen in verschiedenen Mengen in den 92 Tagen von 1/1 bis 4/1 betrachtet.
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")
Die horizontale Achse ist das Datum. Das Histogramm zeigt die Anzahl der Tweets pro Tag, und die gestrichelte Linie zeigt die Anzahl der täglich in Japan gefundenen neuen Coronavirus-Infektionen [^ 1]. Die Skala auf der vertikalen Achse ist beiden gemeinsam.
Einige Spitzen sind in der obigen Abbildung zu sehen. Für jeden Peak steigt die Anzahl der Tweets über einige Tage und nicht nur über einen Tag. Aus diesem Grund wird erwartet, dass diese Peaks keine Ausreißer sind und dass es etwas gab, das die Aufmerksamkeit des Benutzers während dieses Zeitraums auf sich gezogen hat.
Darüber hinaus wird auch die Anzahl der bestätigten Infektionen angegeben, es scheint jedoch keine große Korrelation mit der Anzahl der Tweets zu bestehen. ~~ Ich hatte es schwer ~~ Aus diesem Grund wird erwartet, dass Benutzer stärker auf andere Ereignisse reagieren (z. B. politisches Urteilsvermögen und Absage von Ereignissen) als auf die Zunahme der Anzahl der Patienten mit dem neuen Coronavirus (Ausbreitung der Infektion).
Lassen Sie uns nun analysieren, was jeden Peak verursacht.
In dieser Abbildung haben wir in Bezug auf den Höhepunkt der vorherigen Abbildung und den Tag der persönlichen Besorgnis den tatsächlichen Inhalt des Tweets und die Ankündigung des Ministeriums für Gesundheit, Arbeit und Soziales untersucht und den Inhalt hinzugefügt, der das Ereignis wie den Höhepunkt verursacht zu haben scheint. Ding.
Ich habe über 100 Tweets im Datensatz für 1/28 und 2/26 gelesen, die wichtig sind, aber sie sind inkonsistent und ich kann nicht bestätigen, was den Peak verursacht. tat. Dies wird später bei der Analyse häufig verwendeter Wörter und der Anzahl der RTs ausführlich bestätigt. Vielleicht
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")
In der obigen Abbildung repräsentieren das Histogramm und die linke vertikale Achse die kumulative Anzahl von RTs pro Tag, und die gestrichelte Linie und die rechte vertikale Achse repräsentieren die Anzahl bestätigter Infektionen pro Tag. Ein Diagramm ähnlich der Anzahl der Tweets pro Tag wurde veröffentlicht. Schließlich scheint es nichts mit der Anzahl der bestätigten Infektionen pro Tag zu tun zu haben.
Vergleichen wir nun die Anzahl der Tweets pro Tag mit der Anzahl der RTs pro Tag.
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")
In der obigen Abbildung repräsentieren das Histogramm und die linke vertikale Achse die Anzahl der Tweets pro Tag, und die rote Linie und die rechte vertikale Achse repräsentieren die kumulative Anzahl der RTs pro Tag. Die Anzahl der Tweets pro Tag und die Anzahl der RTs pro Tag scheinen an den meisten Tagen korreliert zu sein. Hier, nur um 3/25 bis 28, sieht es anders aus als die anderen. Der Grund, warum die Anzahl der Tweets (10 RT oder mehr) die Anzahl der RTs im Vergleich zu anderen Personen überstieg, war, dass es nur in diesem Zeitraum viele Themen im Zusammenhang mit dem neuen Koronavirus im Vergleich zu anderen Zeiträumen gab und der Benutzer das Thema nicht überholen konnte ( Es ist möglich, dass RT nicht möglich war.
~~ Ich wollte es schnell posten ~~ Basierend auf dem oben Gesagten werde ich schreiben, was ich in Zukunft tun werde.
Ich werde zum ersten Mal bei Qiita posten. Als Analyse habe ich keine innovativen Ergebnisse erhalten, aber ich habe das Gefühl, dass ich die Politik verstanden habe, in Zukunft in diesen Datensatz zu graben. EDA ist auch wichtig, um diese Richtung zu bestimmen, nicht wahr? Eigentlich wollte ich ein Vorhersagemodell fest aufbauen und die Bewertung und die Art des Modells analysieren, aber ich hatte den starken Wunsch, es zu veröffentlichen, und beschloss, es beim nächsten Mal einzuschalten.
Vielen Dank, dass Sie so weit gelesen haben. Es tut mir leid für die schlechte Analyse und den schlechten Text, aber bitte geben Sie uns Ihre Vorschläge, Meinungen und Ratschläge.
[^ 1]: Referenz: https://www.asahi.com/special/corona/
Recommended Posts