Vorbemerkungen

Dieses Dokument beschreibt die Vorprozessierung und explorative Analyse des Datensatzes, der Grundlage des auf srf.ch veröffentlichten Artikel XYZ ist.

SRF Data legt Wert darauf, dass die Datenvorprozessierung und -Analyse nachvollzogen und überprüft werden kann. SRF Data glaubt an das Prinzip offener Daten, aber auch offener und nachvollziehbarer Methoden. Zum anderen soll es Dritten ermöglicht werden, auf dieser Vorarbeit aufzubauen und damit weitere Auswertungen oder Applikationen zu generieren.

Die Endprodukte des vorliegenden Scripts, neben der vorliegenden explorativen Analyse, sind (Datenbeschreibung siehe unten):

  • climate_strikes.csv: Für die Datenanalyse und -visualisierung aufbereitete Daten.

  • language_region.csv: Für die Visualisierung aufbereitete Daten bezgl. dem Anteil der Teilnehmerinnen und Teilnehmer an Klimastreiks und -demos relativ zu der Bevölkerungsgrösse der Sprachgebiete.

R-Script & Daten

Die Vorprozessierung und Analyse wurde im Statistikprogramm R vorgenommen. Das zugrunde liegende Script sowie die prozessierten Daten können unter diesem Link heruntergeladen werden. Durch Ausführen von main.Rmd kann der hier beschriebene Prozess nachvollzogen und der für den Artikel verwendete Datensatz generiert werden. Dabei werden Daten aus dem Ordner input eingelesen und Ergebnisse in den Ordner output geschrieben.

SRF Data verwendet das rddj-template von Timo Grossenbacher als Grundlage für seine R-Scripts. Entstehen bei der Ausführung dieses Scripts Probleme, kann es helfen, die Anleitung von rddj-template zu studieren.

Debug-Informationen: This report was generated on 2019-12-11 16:21:58. R version: 3.5.3 on x86_64-apple-darwin15.6.0. For this report, CRAN packages as of 2019-03-01 were used.

GitHub

Der Code für die vorliegende Datenprozessierung ist auf https://github.com/srfdata/2019-12-climate-strikes zur freien Verwendung verfügbar.

Weitere Projekte

Code & Daten von SRF Data sind unter https://srfdata.github.io verfügbar.

Haftungsausschluss

Die veröffentlichten Informationen sind sorgfältig zusammengestellt, erheben aber keinen Anspruch auf Aktualität, Vollständigkeit oder Richtigkeit. Es wird keine Haftung übernommen für Schäden, die durch die Verwendung dieses Scripts oder der daraus gezogenen Informationen entstehen. Dies gilt ebenfalls für Inhalte Dritter, die über dieses Angebot zugänglich sind.

Datenbeschreibung

climate_strikes.csv (Beispiel)

Attribut Typ Beschreibung
Ortschaft String Einteilung nach Ortschaft.
Kanton String Kantonskürzel der Ortschaft.
Datum Date Datum des Klimastreiks.
Anzahl Numeric Anzahl Teilnehmende an Klimastreik.

language_region.csv (Beispiel)

Attribut Typ Beschreibung
Sprachgebiete String Einteilung in Sprachgebiete.
Teilnehmer Numeric Anzahl Teilnehmer an Klimastreiks in Sprachgebiet.
Anz_Personen Numeric Anzahl Personen wohnhaft in Sprachgebiet.
Prozentueller_Anteil Numeric Anteil Teilnehmer rel. zu Bevölkerung in Sprachgebiet.

Originalquelle

Die Daten stammen von «Klimastreik Schweiz», den Organisatoren der Schweizer Klimastreiks. Die Daten wurden mit Polizeinagaben und der Schweizer Mediendatenbank abgeglichen. Grösstenteils stimmen die Angaben überein. Einzig bei den Grossdemonstrationen in Städten wie Bern, Lausanne oder Zürich zeigt sich ein grösserer Unschärfebereich bezüglich Teilnehmeranzahl.

Die Daten können bei «Klimastreik Schweiz» angefragt werden.

Vorbereitungen

## [1] "package package:rmarkdown detached"
## Loading required package: knitr
## Loading required package: rstudioapi

Packages definieren

# from https://mran.revolutionanalytics.com/web/packages/checkpoint/vignettes/using-checkpoint-with-knitr.html
# if you don't need a package, remove it from here (commenting is probably not sufficient)
# tidyverse: see https://blog.rstudio.org/2016/09/15/tidyverse-1-0-0/
cat("
library(rstudioapi)
library(raster) # raster used for relief important: load before tidyverse
library(glue) # cooler string templating
library(tidyverse) # ggplot2, dplyr, tidyr, readr, purrr, tibble
library(magrittr) # pipes
library(readxl) # excel
library(scales) # scales for ggplot2
library(jsonlite) # json
library(lintr) # code linting
library(sf) # spatial data handling
library(gganimate) # animate a ggplot as a gif
library(gifski)
library(png)
library(rmarkdown)",
file = "manifest.R")

Packages installieren

# if checkpoint is not yet installed, install it (for people using this
# system for the first time)
if (!require(checkpoint)) {
  if (!require(devtools)) {
    install.packages("devtools", repos = "http://cran.us.r-project.org")
    require(devtools)
  }
  devtools::install_github("RevolutionAnalytics/checkpoint",
                           ref = "v0.3.2", # could be adapted later,
                           # as of now (beginning of July 2017
                           # this is the current release on CRAN)
                           repos = "http://cran.us.r-project.org")
  require(checkpoint)
}
# nolint start
if (!dir.exists("~/.checkpoint")) {
  dir.create("~/.checkpoint")
}
# nolint end
# install packages for the specified CRAN snapshot date
checkpoint(snapshotDate = package_date,
           project = path_to_wd,
           verbose = T,
           scanForPackages = T,
           use.knitr = F,
           R.version = R_version)
rm(package_date)

Packages laden

source("manifest.R")
unlink("manifest.R")
sessionInfo()
## R version 3.5.3 Patched (2019-03-11 r76227)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Mojave 10.14.5
## 
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] de_CH.UTF-8/de_CH.UTF-8/de_CH.UTF-8/C/de_CH.UTF-8/de_CH.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] rmarkdown_1.11   png_0.1-7        gifski_0.8.6     gganimate_1.0.1 
##  [5] sf_0.7-3         lintr_1.0.3      jsonlite_1.6     scales_1.0.0    
##  [9] readxl_1.3.0     magrittr_1.5     forcats_0.4.0    stringr_1.4.0   
## [13] dplyr_0.8.3      purrr_0.3.0      readr_1.3.1      tidyr_1.0.0     
## [17] tibble_2.1.3     ggplot2_3.1.0    tidyverse_1.2.1  glue_1.3.0      
## [21] raster_2.8-19    sp_1.3-1         checkpoint_0.4.0 rstudioapi_0.9.0
## [25] knitr_1.21      
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.1        lubridate_1.7.4   lattice_0.20-38  
##  [4] prettyunits_1.0.2 class_7.3-15      assertthat_0.2.0 
##  [7] zeallot_0.1.0     digest_0.6.18     R6_2.4.0         
## [10] cellranger_1.1.0  plyr_1.8.4        backports_1.1.3  
## [13] evaluate_0.13     e1071_1.7-0.1     httr_1.4.0       
## [16] pillar_1.3.1      rlang_0.4.0       progress_1.2.0   
## [19] lazyeval_0.2.1    munsell_0.5.0     broom_0.5.1      
## [22] compiler_3.5.3    modelr_0.1.4      xfun_0.5         
## [25] pkgconfig_2.0.2   htmltools_0.3.6   tidyselect_0.2.5 
## [28] codetools_0.2-16  crayon_1.3.4      withr_2.1.2      
## [31] grid_3.5.3        nlme_3.1-137      gtable_0.2.0     
## [34] lifecycle_0.1.0   DBI_1.0.0         units_0.6-2      
## [37] cli_1.0.1         stringi_1.4.3     farver_2.0.1     
## [40] rex_1.1.2         xml2_1.2.0        generics_0.0.2   
## [43] vctrs_0.2.0       tools_3.5.3       tweenr_1.0.1     
## [46] hms_0.4.2         yaml_2.2.0        colorspace_1.4-0 
## [49] classInt_0.3-1    rvest_0.3.2       haven_2.1.0

Daten einlesen

# first prepare a data frame only for the animation with filled values
climate_strikes_filled <- read_delim(
  "input/Klimademos_aktuell.csv",
  delim = ";",
  locale = locale(encoding = "ISO-8859-1")
  ) %>% 
  gather(key = "Datum", value = "Anzahl", -Ortschaft, -Kanton) %>%
  mutate(Anzahl = as.numeric(sub("'", "", Anzahl, fixed = TRUE)),
         Datum = as.Date(Datum, "%d.%m.%Y")) %>% 
  mutate(Ortschaft = case_when(
    Ortschaft == "Aarau" ~ "Aarau",             
    Ortschaft == "Affoltern a. A." ~ "Affoltern am Albis",   
    Ortschaft == "Allschwil" ~ "Allschwil",         
    Ortschaft == "Altdorf" ~ "Altdorf (UR)",           
    Ortschaft == "Baden" ~ "Baden",             
    Ortschaft == "Basel" ~ "Basel",             
    Ortschaft == "Bellinzona" ~ "Bellinzona",        
    Ortschaft == "Bern" ~ "Bern",              
    Ortschaft == "Biel / Bienne" ~ "Biel/Bienne",     
    Ortschaft == "Brig" ~ "Brig-Glis",              
    Ortschaft == "Bülach" ~ "Bülach",            
    Ortschaft == "Burgdorf" ~ "Burgdorf",          
    Ortschaft == "Chemin-Dessus" ~ "Martigny",     
    Ortschaft == "Chur" ~ "Chur",              
    Ortschaft == "Davos" ~ "Davos",             
    Ortschaft == "Degersheim" ~ "Degersheim",        
    Ortschaft == "Delémont" ~ "Delémont",          
    Ortschaft == "Erlach" ~ "Erlach",            
    Ortschaft == "Frauenfeld" ~ "Frauenfeld",        
    Ortschaft == "Fribourg" ~ "Fribourg",          
    Ortschaft == "Genf" ~ "Genève",              
    Ortschaft == "Glarus" ~ "Glarus",            
    Ortschaft == "Hettlingen" ~ "Hettlingen",        
    Ortschaft == "Horgen" ~ "Horgen",            
    Ortschaft == "Ins" ~ "Ins",               
    Ortschaft == "Interlaken" ~ "Interlaken",        
    Ortschaft == "Köniz" ~ "Köniz",             
    Ortschaft == "Kreuzlingen" ~ "Kreuzlingen",       
    Ortschaft == "La Chaux-de-Fonds" ~ "La Chaux-de-Fonds", 
    Ortschaft == "Lausanne" ~ "Lausanne",          
    Ortschaft == "Langenthal" ~ "Langenthal",        
    Ortschaft == "Liestal" ~ "Liestal",           
    Ortschaft == "Lugano" ~ "Lugano",            
    Ortschaft == "Luzern" ~ "Luzern",            
    Ortschaft == "Lyss" ~ "Lyss",              
    Ortschaft == "Massongex" ~ "Massongex",         
    Ortschaft == "Mésery-près-Donneloye" ~ "Donneloye",
    Ortschaft == "Münsingen" ~ "Münsingen",         
    Ortschaft == "Neuchâtel" ~ "Neuchâtel",         
    Ortschaft == "Olten" ~ "Olten",             
    Ortschaft == "Pfäffikon" ~ "Pfäffikon",         
    Ortschaft == "Porrentruy" ~ "Porrentruy",        
    Ortschaft == "Rapperswil" ~ "Rapperswil-Jona",        
    Ortschaft == "Regensdorf" ~ "Regensdorf",        
    Ortschaft == "Sarnen" ~ "Sarnen",            
    Ortschaft == "Saignelégier" ~ "Saignelégier",      
    Ortschaft == "Schaffhausen" ~ "Schaffhausen",      
    Ortschaft == "Schwarzenburg" ~ "Schwarzenburg",     
    Ortschaft == "Sion" ~ "Sion",              
    Ortschaft == "Solothurn" ~ "Solothurn",         
    Ortschaft == "Stans" ~ "Stans",             
    Ortschaft == "St. Gallen" ~ "St. Gallen",        
    Ortschaft == "Sursee" ~ "Sursee",            
    Ortschaft == "Teufen" ~ "Teufen (AR)",            
    Ortschaft == "Thun" ~ "Thun",              
    Ortschaft == "Uster" ~ "Uster",             
    Ortschaft == "Vuiteboeuf" ~ "Vuiteboeuf",        
    Ortschaft == "Wattwil" ~ "Wattwil",           
    Ortschaft == "Wetzikon" ~ "Wetzikon (ZH)",          
    Ortschaft == "Winterthur" ~ "Winterthur",        
    Ortschaft == "Zollikofen / Wohlen" ~ "Zollikofen",
    Ortschaft == "Zug" ~ "Zug",               
    Ortschaft == "Zürich" ~ "Zürich"
  ))
## Parsed with column specification:
## cols(
##   Ortschaft = col_character(),
##   Kanton = col_character(),
##   `14.12.2018` = col_double(),
##   `21.12.2018` = col_character(),
##   `18.01.2019` = col_character(),
##   `02.02.2019` = col_character(),
##   `15.02.2019` = col_double(),
##   `15.03.2019` = col_character(),
##   `06.04.2019` = col_character(),
##   `04.05.2019` = col_character(),
##   `24.05.2019` = col_character(),
##   `31.08.2019` = col_character(),
##   `27.09.2019` = col_character(),
##   `28.09.2019` = col_character(),
##   `29.11.2019` = col_character()
## )
## Warning: NAs durch Umwandlung erzeugt
# create normal data frame for usual analysis
climate_strikes <- climate_strikes_filled %>%
  filter(!is.na(Anzahl)) # %>% 
  # write.csv("output/climate_strikes.csv") # csv of data

# add cumsum
climate_strikes_filled %<>%
  group_by(Ortschaft) %>%
  arrange(Datum) %>%
  mutate(
    Anzahl = if_else(is.na(Anzahl), 0, 1),
    Anzahl = cumsum(Anzahl)
  )

Geographische Daten einlesen

Generalisierte Gemeindegrenzen, Relief, Seen

getwd()
## [1] "/Users/felix/Documents/datenjournalismus/srfdata/2019-12-climate-strikes/analysis"
# read country borders for masking relief
country_geo <- read_sf(
  "input/gd-b-00.03-875-gg19/ggg_2019-LV95/shp/g1l19.shp",
  crs = 2056
)
## Warning: st_crs<- : replacing crs does not reproject data; use st_transform
## for that
# read lakes
lake_geo <- read_sf(
  "input/gd-b-00.03-875-gg19/ggg_2019-LV95/shp/g2s19.shp",
  crs = 2056
) %>%
  # remove lake Como, it's not really within Switzerland
  filter(GMDNAME != "Lago di Como")
## Warning: st_crs<- : replacing crs does not reproject data; use st_transform
## for that
# read cantonal borders
canton_geo <- read_sf(
  "input/gd-b-00.03-875-gg19/ggg_2019-LV95/shp/g2k19.shp",
  crs = 2056
)
## Warning: st_crs<- : replacing crs does not reproject data; use st_transform
## for that
# read municipal borders
municipality_geo <- read_sf(
  "input/gd-b-00.03-875-gg19/ggg_2019-LV95/shp/g2g19.shp",
  # set crs to lv95
  crs = 2056
)
## Warning: st_crs<- : replacing crs does not reproject data; use st_transform
## for that

Teilnehmer & Klimastreiks

# Teilnehmer an Klimastreiks nach Ortschaft
climate_strikes %>%
  group_by(
    Ortschaft
  ) %>%
  summarise(Teilnehmer = sum(Anzahl, na.rm = TRUE)) %>% 
  mutate(Ortschaft = fct_reorder(Ortschaft, Teilnehmer, last)) %>%  
  ggplot(aes(x = Ortschaft, y = Teilnehmer)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  theme_minimal() +
  labs(title = "Anzahl Teilnehmer an Klimastreiks nach Ortschaft",
       y = "Teilnehmer an Klimastreiks")

# Anzahl Klimastreiks nach Ortschaft
climate_strikes %>%
  group_by(
    Ortschaft
  ) %>%
  count() %>% 
  ungroup() %>% 
  mutate(Ortschaft = fct_reorder(Ortschaft, n, last)) %>%  
  ggplot(aes(x = Ortschaft, y = n)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  theme_minimal() +
  labs(title = "Anzahl Klimastreiks nach Ortschaft",
       y = "Anzahl Klimastreiks")

Klimastreiks, verteilt über das Jahr

get_qrt <- function(date) {
  month <- as.numeric(format(date, "%m"))
  year <- as.numeric(format(date, "%Y"))
  
  qrt <- case_when(
    month <= 3 ~ "Q1",
    month <= 6 ~ "Q2",
    month <= 9 ~ "Q3",
    TRUE ~ "Q4"
  )
  
  glue("{year} {qrt}")
}

# Verteilung über das Jahr
climate_strikes %>% 
  group_by(Datum) %>% 
  summarise(Teilnehmerzahl = sum(Anzahl)) %>% 
  ggplot(aes(x = Datum, y = Teilnehmerzahl)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Anzahl Teilnehmer an Klimastreiks über das Jahr verteilt")

# TODO: Hier wären Annotations noch cool ->möglich?

# nach Quartal
climate_strikes %>% 
  mutate(Quartal = get_qrt(Datum)) %>% 
  group_by(Quartal) %>% 
  summarise(Teilnehmer = sum(Anzahl, na.rm = TRUE)) %>% 
  ggplot(aes(x = Quartal, y = Teilnehmer)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Anzahl Teilnehmer an Klimastreiks nach Quartal",
       y = "Teilnehmer an Klimastreiks")

climate_strikes %>% 
  mutate(Quartal = get_qrt(Datum)) %>% 
  group_by(Quartal) %>% 
  count() %>% 
  ungroup() %>% 
  ggplot(aes(x = Quartal, y = n)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Anzahl Klimastreiks nach Quartal",
       y = "Anzahl Klimastreiks")

Visualisierung der Klimastreiks

# Anzahl neue Ortschaften mit Klimastreiks (aufsummiert)
climate_strikes %>% 
  group_by(Ortschaft) %>% 
  filter(row_number() == 1) %>% 
  ungroup() %>% 
  group_by(Datum) %>% 
  count() %>% 
  ungroup() %>%
  mutate(Anzahl = cumsum(n)) %>% 
  ggplot(aes(x = Datum, y = Anzahl)) +
  geom_step(stat = "identity") +
  theme_minimal() +
  labs(title = "Ausbreitung der Klimastreiks der Schweiz",
       y = "Anzahl Ortschaften mit Klimastreiks") 

# Anzahl Klimastreiks (aufsummiert)
climate_strikes %>% 
  group_by(Datum) %>% 
  count() %>% 
  ungroup() %>% 
  mutate(Anzahl = cumsum(n)) %>% 
  ggplot(aes(x = Datum, y = Anzahl)) +
  geom_step(stat = "identity") +
  theme_minimal() +
  labs(title = "Kumulierte Anzahl Klimastreiks in der Schweiz",
       y = "Kumulierte Anzahl")

# Anzahl Teilnehmer (aufsummiert)
climate_strikes %>% 
  group_by(Datum) %>%
  mutate_if(is.numeric, ~replace(., is.na(.), 1)) %>% 
  summarise(Teilnehmer = sum(Anzahl)) %>% 
  ungroup() %>% 
  mutate(Anzahl = cumsum(Teilnehmer)) %>% 
  ggplot(aes(x = Datum, y = Anzahl)) +
  geom_step(stat = "identity") +
  theme_minimal() +
  labs(title = "Kumulierte Anzahl Teilnehmer an Klimastreiks in der Schweiz",
       y = "Kumulierte Anzahl Teilnehmer")
## `mutate_if()` ignored the following grouping variables:
## Column `Datum`

Bubble map: Wo streikten die meisten Leute?

# Nach Teilnehmer
climate_strikes %>%
  group_by(
    Ortschaft
  ) %>%
  summarise(Teilnehmer = sum(Anzahl, na.rm = TRUE)) %>%
  ungroup() %>%
  left_join(
    municipality_geo,
    by = c("Ortschaft" = "GMDNAME")
  ) %>%
  ggplot() +
  geom_sf(
    data = canton_geo,
    fill = "#EEEEEE",
    color = "#FFFFFF",
    size = 0.3
  ) +
  # draw lakes in light blue
  geom_sf(
    data = lake_geo,
    fill = "#D6F1FF",
    color = "transparent"
  ) +
  geom_polygon(aes(x = E_CNTR, 
                   y = N_CNTR,
                   group = GMDNR)) +
  geom_point(aes(x = E_CNTR, 
                 y = N_CNTR,
                 size = Teilnehmer,
                 color = Teilnehmer),
             alpha = 0.9) +
  theme_void() +
  theme(panel.grid.major = element_line("transparent"))

# Nach Anzahl Streiks
climate_strikes %>%
  group_by(
    Ortschaft
  ) %>%
  count() %>%
  left_join(
    municipality_geo,
    by = c("Ortschaft" = "GMDNAME")
  ) %>%
  ggplot() +
  geom_sf(
    data = canton_geo,
    fill = "#EEEEEE",
    color = "#FFFFFF",
    size = 0.3
  ) +
  # draw lakes in light blue
  geom_sf(
    data = lake_geo,
    fill = "#D6F1FF",
    color = "transparent"
  ) +
  geom_polygon(aes(x = E_CNTR, 
                   y = N_CNTR,
                   group = GMDNR)) +
  geom_point(aes(x = E_CNTR, 
                 y = N_CNTR,
                 size = n,
                 color = n),
             alpha = 0.9) +
  theme_void() +
  theme(panel.grid.major = element_line("transparent")) +
  labs(title = "Anzahl Klimastreiks nach Ortschaft",
       size = "Anzahl Klimastreiks",
       color = "")

Animated Bubble Chart

plot <- climate_strikes_filled %>%
  left_join(municipality_geo, by = c("Ortschaft" = "GMDNAME")) %>%
  ggplot() +
  geom_sf(data = canton_geo, fill = "#EEEEEE", color = "#FFFFFF", size = 0.3) +
  # draw lakes in light blue
  geom_sf(data = lake_geo, fill = "#D6F1FF", color = "transparent") +
  geom_point(
    alpha = 1,
    colour = "#e31f2b",
    aes(
      x = E_CNTR,
      y = N_CNTR,
      group = GMDNR,
      size = Anzahl
    )
  ) +
  scale_size_continuous(range = c(-1, 15), breaks = c(1, 3, 9)) +
  theme_void() +
  theme(
    panel.grid.major = element_line("transparent"),
    plot.title = 
      element_text(
        size = 18,
        family = "SRG SSR Type Text",
        face = "bold"
        ),
    legend.title = element_blank(),
    legend.text = element_text(size = 14, family = "SRG SSR Type Text"),
    legend.position = c(0.03, 0.88)
  ) +
  labs(
    title = 'Anzahl Klimastreiks bis {format(frame_time, "%B %Y")}'
  ) +
  transition_time(Datum) +
  ease_aes()

# desktop version
animate(plot, width = 800, height = 550, renderer = gifski_renderer())

# Save at gif:
anim_save(filename = "output/animation_raw.gif")

# override certain scales / theme settings for mobile (square and smaller)
mobile <- plot +
  scale_size_continuous(range = c(-1, 8), breaks = c(1, 3, 9)) +
  theme(legend.position = "bottom")

# mobile version
animate(
  mobile,
  width = 400,
  height = 400,
  renderer = gifski_renderer()
)

# Save at gif:
anim_save(filename = "output/animation_raw_mobile.gif")

Analyse nach Sprachgebieten

# Daten zu Sprachregionen einlesen
language_regions <- read_excel("input/Raumgliederungen.xlsx", 
                               skip = 1
                               ) %>%
  slice(-1) %>% 
  mutate(Sprachgebiete = case_when(
    Sprachgebiete == 1 ~ "Deutsches Sprachgebiet",
    Sprachgebiete == 2 ~ "Französisches Sprachgebiet",
    Sprachgebiete == 3 ~ "Italienisches Sprachgebiet",
    Sprachgebiete == 4 ~ "Rätoromanisches Sprachgebiet"
  ))

# mergen
strikes_region <- climate_strikes %>% 
  left_join(language_regions,
            by = c("Ortschaft" = "Gemeindename")
            ) %>% 
  mutate_if(is.numeric, ~replace(., is.na(.), 1)) %>% 
  group_by(Sprachgebiete) %>% 
  summarise(Teilnehmer = sum(Anzahl))
  
# Bevölkerungsdaten einlesen
population_region <- read_excel(
  "input/Bevölkerung_Sprachregion.xlsx", 
  skip = 3
  ) %>% 
  select(
    -1,
    - (4:16)
    ) %>% 
  slice(
    - (6:16)
    ) %>% 
  set_colnames(c("Sprachregion", "Anz_Personen")) %>% 
  mutate_if(is.character, ~replace(., is.na(.), "Total"))
## New names:
## * `` -> ...1
## * `` -> ...2
## * `Anzahl\r\nPersonen` -> `Anzahl\r\nPersonen...3`
## * `Vertrauens- intervall \r\n± (in %)` -> `Vertrauens- intervall \r\n± (in %)...4`
## * `Anzahl\r\nPersonen` -> `Anzahl\r\nPersonen...5`
## * … and 11 more problems
# mergen
strikes_region %>% 
  left_join(population_region,
            by = c("Sprachgebiete" = "Sprachregion")
            ) %>% 
  mutate(Prozentueller_Anteil = Teilnehmer / Anz_Personen,
         Sprachgebiete = fct_reorder(Sprachgebiete, Prozentueller_Anteil, last)
         ) %>%
  # arrange(Prozentueller_Anteil) %>%
  # write.csv("output/language_region.csv") # csv for Datawrapper
  ggplot(aes(x = Sprachgebiete, y = Prozentueller_Anteil)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Anteil Teilnehmer nach Sprachregion und Bevölkerung",
       y = "Prozentueller Anteil")

Korrelation Klimastreik in Gemeinde und Wähleranteil der Grünen

parties_per_municipality <- read_csv("input/parties_per_municipality.csv")
## Parsed with column specification:
## cols(
##   wahl_jahr = col_double(),
##   gemeinde_nummer = col_double(),
##   gemeinde_bezeichnung = col_character(),
##   kanton_nummer = col_double(),
##   partei_id = col_double(),
##   partei_bezeichnung_de = col_character(),
##   partei_bezeichnung_fr = col_character(),
##   partei_bezeichnung_it = col_character(),
##   partei_bezeichnung_en = col_character(),
##   stimmen_partei = col_double(),
##   letzte_wahl_stimmen_partei = col_double(),
##   differenz_stimmen_partei = col_double(),
##   partei_staerke = col_double(),
##   letzte_wahl_partei_staerke = col_double(),
##   differenz_partei_staerke = col_double(),
##   flag_staerkste_partei = col_double(),
##   partei_rang = col_double()
## )
climate_strikes %>%
  group_by(
    Ortschaft
  ) %>%
  summarise(Teilnehmer = sum(Anzahl, na.rm = TRUE)) %>%
  ungroup() %>%
  left_join(
    parties_per_municipality,
    by = c("Ortschaft" = "gemeinde_bezeichnung")
  ) %>%
  filter(partei_bezeichnung_de == "GPS") %>%
  ggplot(aes(x = Teilnehmer, y = partei_staerke)) +
  geom_point(shape = 1) +
  geom_smooth(method = lm)

Linting

Der Code in diesem RMarkdown wird mit lintr automatisch auf den Wickham’schen tidyverse style guide überprüft.

lintr::lint("main.Rmd", linters =
              lintr::with_defaults(
                commented_code_linter = NULL,
                trailing_whitespace_linter = NULL
                )
            )
## main.Rmd:383:3: warning: local variable 'month' assigned but may not be used
##   month <- as.numeric(format(date, "%m"))
##   ^~~~~
## main.Rmd:384:3: warning: local variable 'year' assigned but may not be used
##   year <- as.numeric(format(date, "%Y"))
##   ^~~~
# if you have additional scripts and want them to be linted too, add them here
# lintr::lint("scripts/my_script.R")