[PYTHON] Ich habe die Tweets über den neuen Corona-Virus analysiert, die auf Twitter veröffentlicht wurden

Überblick

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.

Datendetails

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']
}

Erklärende Datenanalyse (EDA)

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

Anzahl der Zeichen, Anzahl der RTs, Anzahl der Likes, Vorhandensein / Fehlen einer URL, Vorhandensein / Fehlen eines Hash-Tags

Wortzahl
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 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.)

Anzahl der RTs, Anzahl der 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 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.")

文字数とRT数の相関.png 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.

Vorhandensein / Fehlen von Hash-Tag / 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 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.

Zusammenfassung bisher

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.

Analyse anhand von Zeitreihen

Im Folgenden werden die Veränderungen in verschiedenen Mengen in den 92 Tagen von 1/1 bis 4/1 betrachtet.

Anzahl der Tweets pro Tag
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

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.

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

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

Kumulierte Anzahl von RTs pro Tag
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 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")

日ごとのツイート数_日ごとのRT数_mod.png 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.

von jetzt an

~~ Ich wollte es schnell posten ~~ Basierend auf dem oben Gesagten werde ich schreiben, was ich in Zukunft tun werde.

abschließend

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

Ich habe die Tweets über den neuen Corona-Virus analysiert, die auf Twitter veröffentlicht wurden
Ich habe die Tweets über den neuen Corona-Virus analysiert, die auf Twitter Teil 2 veröffentlicht wurden
(Jetzt) Ich habe versucht, das neue Koronavirus (COVID-19) zu analysieren.
Ich habe versucht, ein Skript zu erstellen, das die Tweets eines bestimmten Benutzers auf Twitter verfolgt und das veröffentlichte Bild sofort speichert
Ich habe versucht, PDF-Daten der medizinischen Online-Versorgung zu verwenden, die auf der Ausbreitung einer neuen Coronavirus-Infektion basieren
Ich habe das Bild der Science University auf Twitter mit Word2Vec überprüft.
Zeichnen Sie die Ausbreitung des neuen Koronavirus
Holen Sie sich nur Bild-Tweets auf Twitter
Ich habe "Ich habe versucht, ein Skript zu erstellen, das gepostete Bilder sofort speichert, indem ich zu den Tweets eines bestimmten Benutzers auf Twitter zurückgekehrt bin" überarbeitet.
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Folding @ Home unter Linux Mint soll zur Analyse des neuen Corona-Virus beitragen
Ich bin auf die Hatena Keyword API gestoßen
Veröffentlichen Sie das Thema Google Mail auf Twitter
Schätzen Sie die maximale Infektiosität des neuen Coronavirus ab
Die epidemische Vorhersage des neuen Koronavirus wurde mit explosiver Geschwindigkeit im Internet veröffentlicht
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden