# 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
}

Metod

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.

Vanligaste trenderna

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

Trender över tid

Massmedier

# 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))

Politiska partier

# 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

Antal tweets för trender

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

Donald Trump

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.

Trenden #aktuellt över tid

SVT-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()

Alternativa sökord för #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") 

Slutsats

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.