# Ladda data.
trends <- read.csv("trends_sweden.csv", header=TRUE, sep=",", encoding = "UTF-8")
trends$datetime <- ymd_hm(trends$datetime) # Konvertera datumsträng till POSIX.
trends$hour <- hour(trends$datetime) # Plocka ut timme.
trends$week <- week(trends$datetime) # Plocka ut vecka.
# Trenderna är rankade (t ex 1-10) så för varje ny timme börjar de om på 1.
counter <- 0
lasthour <- 0
trends$rank <- 0 # Skapa rank.
for (i in 1:nrow(trends)) # Extremt långsam, bör skrivas om med apply eller dylikt.
{
counter <- counter + 1
if(trends$hour[i] != lasthour) {
counter <- 1
lasthour <- trends$hour[i]
}
trends$rank[i] <- counter
}
Datan samlades in genom att hämta svenska trender (WOEID 23424954) på Twitter varje timme under ett år. Trender är alltså vad som visas i kanten vid ditt Twitterflöde och något som Twitter sammanställer själva.
Totalt har 381681 trender samlats in från Sverige under 2016-03-29 11:25:00 till 2017-04-03 10:15:00.
Jag har även trender för Göteborg respektive Stockholm, men har inte tittat på dessa separat.
12 av 20 mest förekommande trenderna handlar om sport.
# 20 vanligaste trenderna.
freq <- trends %>% count(trend)
freq <- freq[order(freq$n, decreasing=TRUE), ]
head(freq, 20)
## # A tibble: 20 × 2
## trend n
## <fctr> <int>
## 1 #ffse 1662
## 2 #aktuellt 1435
## 3 #lyrikfredag 1374
## 4 #sthlmpol 1218
## 5 United 1042
## 6 Liverpool 1027
## 7 Chelsea 1001
## 8 Zlatan 983
## 9 Hovet 939
## 10 #GONINJAS 922
## 11 Frölunda 917
## 12 Arsenal 907
## 13 Blåvitt 808
## 14 #opinionlive 795
## 15 #fbkse 758
## 16 #modose 756
## 17 Sirius 734
## 18 Elfsborg 728
## 19 #MondayMotivation 724
## 20 Östersund 723
# Andra intressanta nyckelord att söka efter.
keywords <- c("#08pol", "#sthlmpol", "#svpol", "#fempol", "#säkpol")
keywords <- c("Zlatan", "Liverpool", "United", "Chelsea", "Arsenal", "Elfsborg", "Frölunda")
keywords <- c("Donald Trump", "Trump", "Clinton", "Hillary Clinton")
# Nyckelord.
keywords <- c("#aktuellt", "#opinionlive", "#nyheter", "#tv4nyheterna", "#ExpressenLive", "#nymo", "#svtagenda", "#agenda", "#granskning", "#kallafakta")
# Plotta trender + dagligen.
freq <- trends %>%
filter(trend %in% keywords) %>%
group_by(date=as.Date(datetime), trend=trend) %>% # Dagligen.
count(trend, date)
ggplot(freq, aes(date, n, fill=trend)) +
labs(title="Antal trender per dag", subtitle="Massmedier", y="", x="") +
geom_bar(stat="identity") +
scale_x_date(date_labels="%B", date_breaks = "2 months") +
theme_minimal() +
theme(legend.position = "right")
# Plotta trender + veckoligen.
freq <- trends %>%
filter(trend %in% keywords) %>%
group_by(week=floor_date(as.Date(datetime), "week"), trend=trend) %>%
count(trend, week)
ggplot(freq, aes(week, n, fill=trend)) +
labs(title="Antal trender per vecka", subtitle="Massmedier", y="", x="") +
geom_bar(stat="identity") +
scale_x_date(date_labels="vecka %U", date_breaks="2 week") +
theme_minimal() +
theme(legend.position = "right", axis.text.x = element_text(angle=90, size=7))
# Mest förekommande partierna.
freq <- trends %>%
filter(trend %in% keywords) %>%
group_by(trend) %>%
count(trend)
freq <- freq[order(freq$n, decreasing = TRUE), ]
freq
## # A tibble: 8 × 2
## trend n
## <fctr> <int>
## 1 Moderaterna 429
## 2 Miljöpartiet 254
## 3 Liberalerna 155
## 4 Vänsterpartiet 73
## 5 Socialdemokraterna 70
## 6 Sverigedemokraterna 66
## 7 Folkpartiet 36
## 8 Centerpartiet 19
Volymen av tweets för varje trend (dock har bara 31 % av trenderna rapporterad volym).
De trender som skapar mest tweets är sällan svenska från början.
# Högst tweetvolym, fallande.
freq <- trends %>%
group_by(trend) %>%
summarise(tweets=sum(as.numeric(tweetvolume), na.rm=TRUE))
freq <- freq[order(freq$tweets, decreasing=TRUE), ]
head(freq, 20)
## # A tibble: 20 × 2
## trend tweets
## <fctr> <dbl>
## 1 Trump 2765648357
## 2 #iHeartAwards 1002110008
## 3 #MTVHottest 708759970
## 4 Hillary 588884198
## 5 #EMABiggestFansJustinBieber 562608291
## 6 #BestFanArmy 534301615
## 7 Christmas 473779422
## 8 Beyoncé 447133765
## 9 America 427544886
## 10 United 362609746
## 11 Clinton 361619398
## 12 #TeenChoice 330863369
## 13 #MAMARedCarpet 297960563
## 14 Friends 287290558
## 15 #MTVAwardsStar 262190904
## 16 Happy New Year 253148146
## 17 #AMAs 246574312
## 18 Messi 241612127
## 19 Google 241388660
## 20 #WomensMarch 238616362
Antalet tweets i tabellen ovan är grupperade och ackumulerade (och därför fullständigt missvisande). Det har alltså inte skrivits 2,7 miljarder tweets om Trump. Jämför med att ta temperaturen på 100-gradigt vatten 4 gånger, det blir 400 grader om man bara slår ihop observationerna.
Man kan också ta medelvärdet, som i tabellen nedan.
# Medel tweetvolym, fallande.
freq <- trends %>%
group_by(trend) %>%
summarise(tweets=mean(as.numeric(tweetvolume), na.rm=TRUE))
freq <- freq[order(freq$tweets, decreasing=TRUE), ]
head(freq, 20)
## # A tibble: 20 × 2
## trend tweets
## <fctr> <dbl>
## 1 #MAMARedCarpet 18622535
## 2 Grammys 10080829
## 3 #iHeartAwards 8947411
## 4 #MTVHottest 8859500
## 5 #BestFanArmy 8759043
## 6 #TEAMGOT7 6668306
## 7 #teamgot7 6451109
## 8 #TeamGOT7 6162280
## 9 Vine 6007198
## 10 #IHeartAwards 5885359
## 11 #5SOSFam 5448136
## 12 #BellLetsTalk 5048207
## 13 Kobe 4844159
## 14 #GRAMMYs 4586734
## 15 Cubs 4500156
## 16 #ElectionNight 4460185
## 17 GO DIRECTIONERS GO 4268145
## 18 President 4266844
## 19 #MTVAwardsStar 4228886
## 20 #TeamBTS 4205617
# Antal tweets över tid.
freq <- trends %>%
group_by(date = as.Date(format(datetime, "%Y-%m-%d"))) %>%
select(trend, date, tweetvolume) %>%
summarize(tweetvolume=max(tweetvolume, na.rm=TRUE))
ggplot(freq, aes(date, tweetvolume/1000)) +
geom_bar(stat = "identity") +
labs(title="Antal tweets över tid för respektive trend", subtitle="Tweets i tusental", x="", y="") +
theme_minimal()
Bilden ovan visar alltså endast antalet tweets för respektive trend. Bilden säger ingenting om antalet tweets på Twitter i allmänhet.
Den första peaken runt april 2016 handlar om #iHeartAwards (42 miljoner tweets) samt #BestFanArmy (34 miljoner tweets).
Den andra peaken runt movember 2016 handlar om Donald Trump (36 miljoner tweets).
Om vi tittar närmare på Donald Trump ser vi att trender om honom står för den ena spiken i grafen ovan.
# Plocka enbart ut Trump-trender.
freq <- trends %>%
filter(trend == "Trump") %>%
group_by(date = as.Date(format(datetime, "%Y-%m-%d"))) %>%
select(trend, date, tweetvolume) %>%
summarize(tweetvolume=max(tweetvolume, na.rm=TRUE))
ggplot(freq, aes(date, tweetvolume/1000)) +
geom_bar(stat = "identity") +
labs(title="Trump", subtitle="Tweets i tusental", x="", y="") +
theme_minimal()
Som mest skrevs det 36204401 tweets om Trump 2016-11-09.
#aktuellt
över tidSVT-programmet Aktuellt är den vanligaste trenden vad gäller medier. Det finns dock ingen rapporterad tweetvolym.
Vi kan däremot ta fram rank på #aktuellt
. Det är hur högt upp trenden kommer på Twitters trendlista. 1=högst upp.
freq <- trends[trends$trend=="#aktuellt",]
ggplot(freq, aes(datetime, rank)) +
labs(title="#aktuellt", subtitle="Rank (1=högst upp)", x="") +
geom_point() +
theme_minimal()
#aktuellt
# Ta ut unika relaterade trendnamn (fuzzy search).
related <- unique(agrep("#aktuellt", trends$trend, ignore.case=TRUE, value=TRUE))
related
## [1] "#aktuellt" "#Aktuellt" "Aktuellt" "#svtaktuellt"
## [5] "Aktuellt Fokus"
# Plotta relaterade trender + månatligen.
df <- trends %>%
filter(trend %in% related) %>%
group_by(date=as.Date(strftime(datetime, format="%Y-%m-01")), trend=trend) %>% # Månatligen.
count(trend, date)
ggplot(df, aes(date, n, fill=trend)) +
labs(title="Antal trender för relaterade trender", subtitle="Per månad", y="", x="") +
geom_bar(stat="identity") +
scale_x_date(date_labels="%B %Y", date_breaks = "3 months") +
theme_minimal() +
theme(legend.position = "right")
Vad gäller trender i Sverige:
Detta gäller alltså endast trender och ordagranna stavelser av respektive sökord. Använder man andra sökord eller annan metod får man också andra resultat.
Ta denna analys med en stor nypa salt.