Twitter-mining mit R – Teil 5 – Followermap

Mit nur wenigen Zeilen R-Code ist es möglich, die globale Verteilung der Follower eines Accounts zu Visualisieren. Dies geht besonders einfach, wenn man eine Funktion zur Hilfe nimmt, die auf folgender Homepage veröffentlicht wurde http://simplystatistics.org/2011/12/21/an-r-function-to-map-your-twitter-followers/.

Zwei Dinge sollten bedacht werden:

  • Viele Twitter-User tragen aus Datenschutzgründen keinen, oder einen falschen Standort ein
  • Visualisierungen wie diese Followermap bilden häufig nur die variiernde Bevölkerungsdichte bzw. die variierende Dichte des Internetzugangs über die Weltregionen ab

Randell Munroe von XKCD bringt das Problem mit einem Comic treffend auf den Punkt:
XKCD.com

#-----------------------------------------------------
# --- Mit Twitter verbinden ---
#-----------------------------------------------------
library(twitteR)
# Authentifizierungsschlüssel eingeben
api_key <- "**************************"
api_secret <- "***************************"
access_token <- "*****************************"
access_token_secret <- "******************************"
setup_twitter_oauth(api_key,api_secret,access_token,access_token_secret)

#Followermap-Funktion laden
source("http://biostat.jhsph.edu/~jleek/code/twitterMap.R")

#Followermap-Funktion ausführen (erstellt ein PDF)
twitterMap("OfficialSanta",nMax=2000,plotType="followers",userLocation="Anchorage",fileName="Weihnachtsmann-Follower.pdf")

Das Ausführen dieser Funktion kann etwas länger dauern (durchaus einige Minuten). Es müssen schließlich die Koordinaten von bis zu 2000 Accounts abgefragt werden. Nach einiger Wartezeit erhält man eine solche Grafik:

Als Wohnsitz von Santa Claus wurde der North Pole in Alaska bei Fairbanks gewählt bzw. die nächstgrößte Stadt Anchorage.

Als Wohnsitz von Santa Claus wurde der North Pole in Alaska bei Fairbanks gewählt bzw. die nächstgrößte Stadt Anchorage.

Twitter-mining mit R – Teil 3 – Erweiterte Wordclouds

Im letzten Blogeintrag (Teil 2) wurden die Ergebnisse einer Twitter-Suche als Wordcloud visualisiert. Man kann das Potential von Wordclouds noch etwas weiter ausschöpfen, wenn man Wordclouds miteinander vergleicht. Das  folgende Beispiel orientiert sich an dem code von dieser Seite.

Wie immer, brauchen wir zuerst die Verbindung zwischen R und der Twitter-API.

#-----------------------------------------------------
# --- Mit Twitter verbinden ---
#-----------------------------------------------------
library(twitteR)
# Authentifizierungsschlüssel eingeben
api_key <- "**************************"
api_secret <- "***************************"
access_token <- "*****************************"
access_token_secret <- "******************************"
setup_twitter_oauth(api_key,api_secret,access_token,access_token_secret)

#--- Suchabfrage: 450 tweets mit dem Hashtag #rstats ---
tweets<-searchTwitter("christmas",n=450))
tweets

Comparison Wordcloud
Als Beispiel werde ich die Tweets der Bundestagsfraktionen von CDU, SPD und den Grünen abgreifen und jeweils einen Textkorpus erstellen, der dann zusammengefügt in einer einzelnen Wordcloud visualisiert wird. Jede Partei wird eine Wordcloud ihrer Farbe erhalten. Dadurch kann vielleicht ein Einblick erhalten werden, über welche inhaltlichen Schwerpunkte die Parteien jeweils am häufigsten twittern.

#Twitter Accounts der Bundestagsfraktionen CDU/CSU, SPD, Gruene(wordcloud)

library(tm)
library(wordcloud)
cdu.tweets<-userTimeline("CDUCSUBT",n=500)
spd.tweets<-userTimeline("SPDBT",n=500)
gruene.tweets<-userTimeline("GrueneBundestag",n=500)

# get text
cdu_txt = sapply(cdu.tweets, function(x) x$getText())
spd_txt = sapply(spd.tweets, function(x) x$getText())
gruene_txt = sapply(gruene.tweets, function(x) x$getText())

#text cleanings
clean.text = function(x)
{
# tolower
x = tolower(x)
# remove rt
x = gsub("rt", "", x)
# remove at
x = gsub("@\\w+", "", x)
# remove punctuation
x = gsub("[[:punct:]]", "", x)
# remove numbers
x = gsub("[[:digit:]]", "", x)
# remove links http
x = gsub("http\\w+", "", x)
# remove tabs
x = gsub("[ |\t]{2,}", "", x)
# remove blank spaces at the beginning
x = gsub("^ ", "", x)
# remove blank spaces at the end
x = gsub(" $", "", x)
return(x)
}

cdu_clean = clean.text(cdu_txt)
spd_clean = clean.text(spd_txt)
gruene_clean = clean.text(gruene_txt)

#join text
cdu = paste(cdu_clean, collapse=" ")
spd = paste(spd_clean, collapse=" ")
gruen = paste(gruene_clean, collapse=" ")
# put everything in a single vector
all = c(cdu, spd, gruen)

Die Daten sind nun vorbereitet und können geplottet werden.
An dem Punkt, an dem die TermDocumentMatrix erstellt wird, werden mittels „stopwords(„german“) häufig genannte deutsche Wörter („der“, „die“, „das“, „und“…) von der Auswertung ausgeklammert.

#WORDCLOUD COMPARISON
# create corpus
corpus = Corpus(VectorSource(all))
# create term-document matrix 
tdm = TermDocumentMatrix(corpus, control = list(removePunctuation = TRUE, stopwords = stopwords("german"),removeNumbers = TRUE))
# convert as matrix
tdm = as.matrix(tdm)
# add column names
colnames(tdm) = c("CDU", "SPD", "Grüne")

#PLOTTING
# comparison cloud
comparison.cloud(tdm, random.order=FALSE, colors = c("black", "red", "green"),max.words=100)

Die untenstehende Grafik ist das Ergebnis. Während bei der CDU/CSU-Fraktion häufig der Fraktionsvorsitzende Kauder erwähnt wird sowie der Nachruf auf „Schockenhoff“ viel Raum einnimmt, werden auch „Europa“, „Erbschaftssteuer“, „Ukraine“ und „Europa“ genannt. Auch bei den Grünen wird der Fraktionsvorsitzende (Hofreiter) am häufigsten genannt. Ansonsten ist die Klimakonferenz in Lima scheinbar ein Hauptthema. Der Twitteraccount der SPD-Bundestagsfraktion scheint ein breites Themenrepertoire zu haben, da sich keine einzelnen thematischen Schwerpunkte abheben. Jedoch zeigt sich wie bei der CDU und den Grünen, dass die Fraktionsvorsitzende Lambrecht häufig genannt wird.

Comparison Wordcloud. Tweets der Accounts der CDU, SPD und Grünen Bundestagsfraktion (je 450 tweets)

Comparison Wordcloud. Tweets der Accounts der CDU, SPD und Grünen Bundestagsfraktion (je 450 tweets)

Commonality Cloud
Eine Alternative zur Comparison Wordcloud ist die Commonality Cloud. Sie wird ebenfalls mit der wordcloud-library erstellt.

# commonality cloud
commonality.cloud(tdm, random.order=FALSE, colors = brewer.pal(8, "Dark2"),title.size=1.5)

Leider kristalliert sich in der Commonality Cloud kaum Übereinstimmung ab. Eventuell sollten mehr Tweets abgegriffen und häufige Wörter wie „die, der, das“ aus der Analyse ausgeschlossen werden.

Jeweils 450 letzte Tweets der Accounts der CDU, SPD und Grünen Bundestagsfraktion als Commonality Cloud

Jeweils 450 letzte Tweets der Accounts der CDU, SPD und Grünen Bundestagsfraktion als Commonality Cloud

Im nächsten Blogeintrag (Teil 4) zeige ich, wie eine einfache Sentiment Analysis mit Tweets durchgeführt werden kann.