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.
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.
Der Code für die vorliegende Datenprozessierung ist auf https://github.com/srfdata/2019-12-climate-strikes zur freien Verwendung verfügbar.
2019-12-climate-strikes von SRF Data ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 4.0 International Lizenz.
Code & Daten von SRF Data sind unter https://srfdata.github.io verfügbar.
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.
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. |
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.
## [1] "package package:rmarkdown detached"
## Loading required package: knitr
## Loading required package: rstudioapi
# 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")
# 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)
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
# 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)
)
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 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")
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")
# 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`
# 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 = "")
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")
# 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")
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)
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")