Die Schulen in Deutschland sollen bald wieder öffnen und mit diesen Meldungen gab es auch wieder Meldungen über "Fridays for Future"-Demonstrationen. Wie entwickelt sich die Bewegung in Deutschland? Hier ein Versuch, wie viel wir mit Google Trends über die Bewegung erfahren können.
Google Trends ist ein Tool von Google, mit dem man die Popularität von Suchbegriffen analysieren kann. Hierbei muss man beachten, dass die Zahlen normalisiert sind um Einflüsse von Zeit und Ort zu verhindern. Herauskommt eine Zahl zwischen 0 und 100, welche die Popularität eines Suchbegriffes über all Suchen und alle Themen hinweg anzeigt. Die Arbeit in RStudio funktioniert in diesem Fall mit dem package gtrendsR.
Wir fangen mit dem Zeitverlauf an, wie wir ihn auch von Google Trends kennen: Für die Popularität der beiden Suchbegriffe "Fridays for Future" und "Klimawandel" für die letzten 12 Monate, in Deutschland bekommen wir folgenden Datensatz:
> head(time_trend)
date hits geo time keyword gprop category
1 2019-04-28 6 DE today 12-m Klimawandel web 0
2 2019-05-05 6 DE today 12-m Klimawandel web 0
3 2019-05-12 7 DE today 12-m Klimawandel web 0
4 2019-05-19 9 DE today 12-m Klimawandel web 0
5 2019-05-26 10 DE today 12-m Klimawandel web 0
6 2019-06-02 9 DE today 12-m Klimawandel web 0
Visualisiert zeigen sich folgende Verläufe:
Wir sehen, dass die Popularität des Suchbegriffs "Klimawandel" leicht abnimmt, während der Suchbegriff "Fridays for Future" einen extremen Peak im Herbst 2019 zeigt; entsprechend beeinflusst ist die geglättete Linie. Aber auch hier gibt es eine abnehmende Popularität; sind die Proteste also vorbei? Die Proteste waren neulich doch in den Nachrichten?
Schauen wir uns entsprechend einmal die Suchanfragen pro Bundesland für dieses Jahr an - mit den Suchanfrage im kompletten Web, als auch nur für Youtube, wo ja bekanntlich einige Influencer vertreten sind.
Schauen wir uns entsprechend einmal die Suchanfragen pro Bundesland für dieses Jahr an - mit den Suchanfrage im kompletten Web, als auch nur für Youtube, wo ja bekanntlich einige Influencer vertreten sind.
Wir können sehen, dass beide Suchbegriffe auf Youtube tatsächlich eine höhere Popularität haben. Die Protestbewegung scheint also doch nicht unbedeutend zu sein. Eventuell informieren die Schüler nach dem Thema nur anders als der Rest der Internetnutzer - z.B. zum größeren Teil über Youtube.
Doch die Suche nach "Klimakrise" - einem populären Begriff der Bewegung - für den Zeitraum seit 2020 ergibt, dass der Begriff im Web eindeutig populärer ist als auf Youtube. Dies kann aber auch daran liegen, dass sich deutlich mehr Menschen (jung und alt) über den Begriff informieren wollen. Hier die Suche nach "Klimakrise" im Web als auch nur auf Youtube:
Der Zeitraum von drei Monaten erlaubt eine granularere Anzeige; wir sehen, dass der Suchbegriff a) tagesabhängige Peaks und b) im Web populärer ist. Die durchschnittlichen Web-Anfragen nach Tagen ergeben folgendes Bild:
Wir sehen, dass das Interesse unter der Woche am höchsten ist. Dies deutet zumindest daraufhin, dass direkt nach den jeweiligen Protesten, das eigentliche Interesse erst einmal gesättigt ist. Die Proteste scheinen also tatsächlich ein vorhandenes Interesse zu bedienen.
Mit GoogleTrends können wir auch verwandte Suchbegriffe identifizieren. Wir bekommen zwei Ergebnisse: die populärsten verwandten Suchen und diejenigen verwandten Anfragen, mit den höchsten Wachstumraten. Im Folgenden die Ergebnisse zum Suchbegriff "Klimawandel":
Nicht überraschend, ist bei beiden Ergebnissen das Thema Corona stark vertreten. Aber wir sehen auch dass Suchbegriffe wie "Maßnahmen gegen Klimawandel" unter den populärsten und trending Anfragen sind. Dies spricht dafür, dass ein öffentliches Interesse am Klimawandel besteht. Wer weiß, vielleicht gewinnt Fridays for Future mit den Schulöffnungen wieder an Popularität und Aufmerksamkeit.
Und wie sieht es weltweit mit der Bewegung aus? Wir schauen uns dazu die Anfragen zu "Fridays for Future" für die letzten drei Monate weltweit an. Die Daten zeigen, dass der Suchbegriff in Deutschland die höchste Popularität hat:
> head(country_trend)
location hits keyword geo gprop region
1 Germany 100 fridays for future world web Germany
2 Austria 58 fridays for future world web Austria
3 Luxembourg 36 fridays for future world web Luxembourg
4 Latvia 25 fridays for future world web Latvia
5 Sweden 16 fridays for future world web Sweden
6 St. Helena 16 fridays for future world web St. Helena
Hier kommt das Problem zutage, dass wir für die Visualisierung auf Karten eine Logik zur Darstellung der Werte brauchen. In diesem Beispiel habe ich Wertspannen hinterlegt:
Die Google-Suche nach "Fridays for Future" ist vor allem eine europäische Sache. Was nicht heißen muss, dass die Bewegung weltweit bedeutungslos ist. Hier sind nur Google-Daten und nur zu den jeweiligen Suchbegriffen hinterlegt; evtl. sieht das Bild auch anders aus, würden Instagram, andere Quellen oder länderspezifischere Suchbegriffe hinterlegt.
Anbei noch der in RStudio benutzte Code:
Anbei noch der in RStudio benutzte Code:
library(quantmod)
library(gridExtra)
library(grid)
library(ggplot2)
library(ggthemes)
library(gtrendsR)
library(dplyr)
library(gridExtra)
library(stringr)
# Google Trends erlaubt max ~200 Anfragen in 24h
# 1) Popularität von Schlagwörtern über die Zeit (mit Smoothing)
keywords=c("Klimawandel", "Fridays for Future")
country=c('DE') #eg DE = Germany
time=("today 12-m") #"now 2-H" for last 2 hour / "now 4-d" for last four days / "today 1-m" for last seven days / "today 12-m" for past 12months / "all" for last five years
channel='web' # "web" / "news" / "images" / "froogle" / "youtube"
trends = gtrends(keywords, gprop=channel, geo=country, time=time)
time_trend=trends$interest_over_time
head(time_trend)
time_trend %>%
mutate_at("hits", ~ifelse(. == "<1", 0.5, .)) %>% # replace with 0.5
mutate_at("hits", ~as.numeric(.)) %>% # convert to numeric
ggplot(aes(x = date, y = hits, group=keyword, col=keyword))+
geom_smooth(span=0.5,se=FALSE, size=1.5) +
geom_line(size = 0.5) +
xlab('Zeit') + ylab('relatives Interesse') +
theme_minimal()+
theme(legend.title = element_blank(),legend.position="bottom",legend.text=element_text(size=12))+
ggtitle("Interesse - zeitlicher Verlauf") +
facet_wrap(~keyword) +
scale_color_manual(values=c("#66c2a4","#238b45"))
# 2) Popularität über Regionen hinweg
keywords=c("Klimawandel", "Fridays for Future")
country=c('DE')
time=("2020-01-01 2020-04-23")
channel='web'
channel2='youtube'
trends = gtrends(keywords, gprop=channel, geo=country, time=time)
trends2 = gtrends(keywords, gprop=channel2, geo=country, time=time)
plot1 <- trends %>%
.$interest_by_region %>%
mutate_at("hits", ~ifelse(is.na(.), 0, .)) %>% # replace with 0
mutate_at("hits", ~as.numeric(.)) %>% # convert to numeric
ggplot(aes(x=location, y=hits, group=keyword, col=keyword, fill=keyword)) +
geom_area(position="dodge", stat="identity", color=NA, alpha=0.5) +
scale_fill_manual(values=c("#4eb3d3","#41ab5d"))+
xlab('Bundesland') + ylab('relatives Interesse') +
theme_minimal() +
theme(legend.title = element_blank(),legend.position="bottom",legend.text=element_text(size=12) , axis.text.x=element_text(angle = -90, hjust = 0)) +
ggtitle("Interesse per Region - Web")
plot2 <- trends2 %>%
.$interest_by_region %>%
mutate_at("hits", ~ifelse(is.na(.), 0, .)) %>% # replace with 0
mutate_at("hits", ~as.numeric(.)) %>% # convert to numeric
ggplot(aes(x=location, y=hits, group=keyword, col=keyword, fill=keyword)) +
geom_area(position="dodge", stat="identity", color=NA, alpha=0.5) +
scale_fill_manual(values=c("#4eb3d3","#41ab5d"))+
xlab('Bundesland') + ylab('relatives Interesse') +
theme_minimal() +
theme(legend.title = element_blank(),legend.position="bottom",legend.text=element_text(size=12), axis.text.x=element_text(angle = -90, hjust = 0)) +
ggtitle("Interesse per Region - Youtube")
grid.arrange(plot1, plot2, ncol=2)
# 3) Popularität von Schlagwörtern über die Zeit (mit Smoothing)
keywords=c("Klimakrise")
country=c('DE') #eg DE = Germany
time=("2020-01-01 2020-04-23")
channel='web'
channel2='youtube'
trends = gtrends(keywords, gprop=channel, geo=country, time=time)
trends2 = gtrends(keywords, gprop=channel2, geo=country, time=time)
time_trend=trends$interest_over_time
time_trend2=trends2$interest_over_time
plot1 <- time_trend %>%
mutate_at("hits", ~ifelse(. == "<1", 0.5, .)) %>% # replace with 0.5
mutate_at("hits", ~as.numeric(.)) %>% # convert to numeric
ggplot(aes(x = date, y = hits, group=keyword, col=keyword))+
geom_smooth(span=0.5,se=FALSE, size=1.5) +
geom_line(size = 0.5) +
xlab('Zeit') + ylab('Relatives Interesse') +
theme_minimal()+
theme(legend.title = element_blank(),legend.position="bottom",legend.text=element_text(size=12))+
ggtitle("Google Interesse") +
facet_wrap(~keyword) +
scale_color_manual(values=c("#66c2a4","#238b45"))
plot2 <- time_trend2 %>%
mutate_at("hits", ~ifelse(. == "<1", 0.5, .)) %>% # replace with 0.5
mutate_at("hits", ~as.numeric(.)) %>% # convert to numeric
ggplot(aes(x = date, y = hits, group=keyword, col=keyword))+
geom_smooth(span=0.5,se=FALSE, size=1.5) +
geom_line(size = 0.5) +
xlab('Zeit') + ylab('Relatives Interesse') +
theme_minimal()+
theme(legend.title = element_blank(),legend.position="bottom",legend.text=element_text(size=12))+
ggtitle("Youtube Interesse") +
facet_wrap(~keyword) +
scale_color_manual(values=c("#66c2a4","#238b45"))
grid.arrange(plot1, plot2, ncol=2)
# an welchen Tagen gibt es durchschnittlich am meisten Anfragen?
dayLabs<-c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
day_trend <- time_trend %>%
mutate(day = weekdays(date)) %>%
group_by(day) %>%
summarise(mean = mean(hits))
day_trend %>%
ggplot(aes(x = factor(day, levels= dayLabs) , y = mean)) +
geom_bar(stat="identity", fill="#66c2a4")+
xlab('Tage') + ylab('Relatives Interesse') +
theme_minimal()+
theme(legend.title = element_blank(),legend.position="bottom",legend.text=element_text(size=12))
# 4) Populäre verwandte Anfragen (funktioniert nur mit einem Suchbegriff)
keywords=c("Klimawandel")
country=c('DE')
time=("2020-01-01 2020-04-23")
channel='web'
trends = gtrends(keywords, gprop=channel, geo=country, time=time)
# Anzeige der "evergreen" Anfragen (populärste Anfragen innerhalb angegebenem Bereich)
trends %>%
.$related_queries %>%
filter(related_queries == 'top') %>%
mutate(value=factor(value,levels=rev(as.character(value))),
subject=as.numeric(subject)) %>%
ggplot(aes(x=value,y=subject)) +
geom_bar(stat='identity', fill = "#66c2a4") +
xlab('Suchanfragen') + ylab('relatives Interesse') +
ggtitle("Verwandte populäre Anfragen") +
coord_flip()
# die "rising" Anfragen im Trend (mit evergreen herausgerechnet)
# ergibt einen Prozentwachstum der Anfragen im definierten Zeitraum vs. dem zuvor ("breakout" = +5000%)
queries_trend <- trends$related_queries
queries_trend %>%
mutate(subject2 = gsub("\\,","",queries_trend$subject)) %>%
mutate(subject3 = gsub("Breakout", "+5000%", subject2)) %>%
mutate(subject = str_sub(subject3, 2, str_length(subject3)-1)) %>%
filter(related_queries == 'rising') %>%
mutate(value=factor(value,levels=rev(as.character(value))),
subject=as.numeric(subject)) %>%
ggplot(aes(x=value,y=subject)) +
geom_bar(stat='identity', fill = "#66c2a4") +
xlab('Suchanfragen') + ylab('Wachstum an Anfragen') +
ggtitle("Verwandte Trending Anfragen") +
coord_flip()
# 5) Die Trends in Ländern weltweit
keywords=c("fridays for future")
time=("today 3-m")
channel='web'
trends = gtrends(keyword = keywords, gprop = channel, time = time)
country_trend=trends$interest_by_country
head(country_trend)
# Umbenennen mancher Google Trends Regionen zum Erweitern mit ggmap
country_trend$region <- ifelse(country_trend$location == 'United States','USA',
ifelse(country_trend$location == 'United Kingdom', 'UK',
ifelse(country_trend$location == 'Czechia', 'Czech Republic',
as.character(country_trend$location))))
country_trend$region <- as.character(country_trend$location)
country_trend$hits <- as.numeric(country_trend$hits)
new_map <- full_join(map_data("world"), country_trend)
# Gruppierung der Spalte "hits" zur Darstellung auf der Weltkarte
new_map$search_index <- factor(ifelse(is.na(new_map$hits), 'no data', ifelse(
new_map$hits >= 0 & new_map$hits < 10, '0-10', ifelse(
new_map$hits >= 10 & new_map$hits < 30, '10-29', ifelse(
new_map$hits >= 30 & new_map$hits < 80, '30-79', ifelse(
new_map$hits >= 80, '> 80', new_map$hits))))),
levels = c('> 80', '30-79', '10-29', '0-10', 'no data'))
# Visualisierung
ggplot(new_map, aes(x=long, y=lat, group=group, fill=search_index)) +
geom_polygon(colour="black", show.legend = T) +
scale_fill_manual(values=c("#005824", "#238b45", "#41ae76", "#ccece6", "grey90")) +
labs(title = "Interesse per Land",
x = "Longitude",
y = "Latitude") +
theme_bw()
Photo by Markus Spiske from Pexels