Pakete laden
#Prelimaniers
suppressPackageStartupMessages({
library(dplyr)
library(tidyr)
library(data.table)
library(ggplot2)
library(ggridges)
library(purrr)
library(forcats)
library(magrittr)
library(lubridate)
library(scales)
library(sf)
library(data.table)
library(extrafont)
library(ggthemes)
library(stargazer)
library(RColorBrewer)
library(viridis)})
Daten laden
#Arbeitsverzeichnis definieren
setwd("~/Datajournalism")
#Dateipfad definieren
file1 <-
"~/Datajournalism/sotomo/daten_sotomo_24112022/vorsorge/vorsorge_data.csv"
file2 <-
"~/Datajournalism/sotomo/daten_sotomo_24112022/geschlechtergerechter/geschlechtergerechter_data.csv"
#Daten einlesen
vorsorge.raw <- read.csv(file1,
sep = ",",
encoding = "UTF-8",
stringsAsFactors = FALSE) %>%
as_tibble()
geschlechtergerecht.raw <- read.csv(file2,
sep = ",",
encoding = "UTF",
stringsAsFactors = FALSE) %>%
as_tibble()
Theme definieren
# define a theme function
theme_eat <- function(base_size = 12,
base_line_size = base_size / 170,
base_rect_size = base_size / 170) {
ggplot2::theme_minimal(base_size = base_size,
base_line_size = base_line_size) %+replace%
ggplot2::theme(
plot.title = element_text(
color = rgb(22, 27, 27,
maxColorValue = 250),
face = "bold",
hjust = 0
),
axis.title = element_text(
color = rgb(22, 27, 27,
maxColorValue = 250),
size = rel(0.75)
) ,
axis.text = element_text(
color = rgb(22, 27, 27,
maxColorValue = 250),
size = rel(0.7)
) ,
panel.grid.minor = element_line(
rgb(153, 153, 153,
maxColorValue = 250),
linetype = "dotted",
size = rel(4)
) ,
complete = TRUE
)
}
Datenbereinigung Vorsorgedatensatz für Frage: Haben Sie Beiträge in die Pensionskasse gerichtet?
vorsorge <- vorsorge.raw %>%
mutate(
pkhab =
case_when(
PKdone == "A1" ~ "Berufliche Vorsorge",
PKdone == "A0" ~ "Keine berufliche Vorsorge",
TRUE ~ NA_character_
)
) %>%
mutate(
herkunft = case_when(
sex == "F" & stber == "A2" ~ "Ausländerin",
sex == "M" & stber == "A2" ~ "Ausländer",
sex == "F" &
stber == "A1" ~ "Schweizerin",
sex == "M" & stber == "A1" ~ "Schweizer",
TRUE ~ NA_character_
)
) %>%
mutate(
eltern = case_when(
sex == "F" &
kinder == "A2" &
stber == "A2" ~ "Ausländerin ohne Kinder",
sex == "M" &
kinder == "A2" & stber == "A2" ~ "Ausländer ohne Kinder",
sex == "F" &
kinder == "A2" & stber == "A1" ~ "Schweizerin ohne Kinder",
sex == "M" &
kinder == "A2" & stber == "A1" ~ "Schweizer ohne Kinder",
sex == "F" &
kinder == "A1" & stber == "A2" ~ "Ausländerin mit Kinder",
sex == "M" &
kinder == "A1" & stber == "A2" ~ "Ausländer mit Kinder",
sex == "F" &
kinder == "A1" & stber == "A1" ~ "Schweizerin mit Kinder",
sex == "M" &
kinder == "A1" & stber == "A1" ~ "Schweizer mit Kinder",
TRUE ~ NA_character_
)
) %>%
mutate(sex =
case_when(sex == "M" ~ "Männer",
sex == "F" ~ "Frauen",
TRUE ~ NA_character_)) %>%
mutate(
haushaltstyp =
case_when(
haushalt == "A1" ~ "Einpersonenhaushalt",
haushalt == "A2" ~ "Paarhaushalt",
haushalt == "A3" ~ "Familienhaushalt mit Minderjährigen",
haushalt == "A4" ~ "Familienhaushalt ohne Minderjährige",
haushalt == "A5" ~ "Anderer Mehrpersonenhaushalt",
TRUE ~ NA_character_
)
) %>%
select(haushalt,
haushaltstyp,
sex,
age,
eltern,
stber,
herkunft,
pkhab,
PKdone,
weight)
Datenbereinigung Geschlechtergerechtdatensatz
geschlechtergerecht <- geschlechtergerecht.raw %>%
mutate(
herkunft = case_when(
stber == "Y" & gender == "W" ~ "Ausländerin",
stber == "Y" &
gender == "M" ~ "Ausländer",
stber == "N" &
gender == "W" ~ "Schweizerin",
stber == "N" &
gender == "M" ~ "Schweizer",
TRUE ~ NA_character_
)
) %>%
mutate(
eltern = case_when(
gender == "W" &
kids == "A0" &
stber == "Y" ~ "Ausländerin ohne Kinder",
gender == "M" &
kids == "A0" & stber == "Y" ~ "Ausländer ohne Kinder",
gender == "W" &
kids == "A0" & stber == "N" ~ "Schweizerin ohne Kinder",
gender == "M" &
kids == "A0" & stber == "N" ~ "Schweizer ohne Kinder",
gender == "W" &
kids == "A1" & stber == "Y" ~ "Ausländerin mit Kinder",
gender == "M" &
kids == "A1" & stber == "Y" ~ "Ausländer mit Kinder",
gender == "W" &
kids == "A1" & stber == "N" ~ "Schweizerin mit Kinder",
gender == "M" &
kids == "A1" & stber == "N" ~ "Schweizer mit Kinder",
TRUE ~ NA_character_
)
) %>%
mutate(sex = case_when(
gender == "W" ~ "Frauen",
gender == "M" ~ "Männer",
TRUE ~ NA_character_
))
Haben Sie bereits Beiträge in die obligatorische berufliche Vorsorge (BVG, Pensionskasse) eingezahlt? (Fairplay und Vorsorgestudie) [pkdone]
# Datengewichtung und Vorbereitung für Beitrag geleistet in die Pensionskasse nach Herkunft für Grafik 1
pkhab_herk <- vorsorge %>%
mutate(id = row_number()) %>%
select("id",
"pkhab",
"herkunft",
"weight") %>%
group_by(id) %>%
group_by(pkhab, herkunft) %>%
summarise(Nweighted = sum(weight), .groups = 'drop') %>%
na.omit() %>%
group_by(herkunft) %>%
mutate(Percentage = Nweighted / sum(Nweighted)) %>%
ungroup() %>%
arrange(desc(Percentage))
# Kontrolle Percentage --> ob es ein 1 ergibt
aggregate(Percentage ~ herkunft, pkhab_herk, sum)
## herkunft Percentage
## 1 Ausländer 1
## 2 Ausländerin 1
## 3 Schweizer 1
## 4 Schweizerin 1
# Grafik 1 Beitrag in die Pensionskasse geleistet nach Herkunft
plot1 <-
ggplot(pkhab_herk, aes(
x = factor(
herkunft,
levels = c("Schweizer", "Schweizerin", "Ausländer", "Ausländerin")
) ,
y = Percentage,
fill = pkhab
)) +
geom_bar(
stat = "identity",
position = "fill",
color = "white",
width = 0.9
) +
geom_text(
aes(
y = Percentage,
label = scales::percent(Percentage, accuracy = 1L)
),
position = position_stack(vjust = 0.5),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Rund 40 Prozent der ausländischen Frauen haben keine berufliche \nVorsorge",
subtitle = "\nHaben Sie bereits Beiträge in die obligatorische berufliche Vorsorge \n(BVG, Pensionskasse) eingezahlt?",
caption = "Daten: Forschungsstelle sotomo, Vorsorge und Fairplay-Studie (Stand: Januar 2023)",
x = "",
y = "",
fill = ""
) +
scale_fill_manual(
values = c(
"Keine berufliche Vorsorge" = "#f4a582",
"Berufliche Vorsorge" = "#3d5a80"
),
breaks = c("Keine berufliche Vorsorge", "Berufliche Vorsorge")
) +
theme_eat() +
coord_flip() +
theme(legend.position = "bottom")
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
plot1
# Datengewichtung und Vorbereitung für Beitrag geleistet in die Pensionskasse nach Kinder und Herkunft Grafik 2
pkhab_eltern <- vorsorge %>%
mutate(id = row_number()) %>%
select("id",
"pkhab",
"eltern",
"weight") %>%
group_by(id) %>%
group_by(pkhab, eltern) %>%
summarise(Nweighted = sum(weight), .groups = 'drop') %>%
na.omit() %>%
group_by(eltern) %>%
mutate(Percentage = Nweighted / sum(Nweighted)) %>%
ungroup() %>%
arrange(Percentage)
#Kontrolle Percentage --> ob es ein 1 ergibt
aggregate(Percentage ~ eltern, pkhab_eltern, sum)
## eltern Percentage
## 1 Ausländer mit Kinder 1
## 2 Ausländer ohne Kinder 1
## 3 Ausländerin mit Kinder 1
## 4 Ausländerin ohne Kinder 1
## 5 Schweizer mit Kinder 1
## 6 Schweizer ohne Kinder 1
## 7 Schweizerin mit Kinder 1
## 8 Schweizerin ohne Kinder 1
# Grafik 2 Beitrag in die Pensionskasse geleistet nach Herkunft und Kinder
plot2 <-
ggplot(pkhab_eltern, aes(
x = factor(
eltern,
levels = c(
"Schweizer mit Kinder",
"Schweizerin mit Kinder",
"Ausländer mit Kinder",
"Ausländerin mit Kinder",
"Schweizer ohne Kinder",
"Schweizerin ohne Kinder",
"Ausländerin ohne Kinder",
"Ausländer ohne Kinder"
)
),
y = Percentage,
fill = pkhab
)) +
geom_bar(
stat = "identity",
position = "fill",
color = "white",
width = 0.9
) +
geom_text(
aes(
y = Percentage,
label = scales::percent(Percentage, accuracy = 1L)
),
position = position_stack(vjust = 0.5),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Nur 13 Prozent der Schweizer mit Kinder haben nicht in die \nberufliche Vorsorge einbezahlt",
subtitle = "\nHaben Sie bereits Beiträge in die obligatorische berufliche \nVorsorge (BVG, Pensionskasse) eingezahlt?",
caption = "Daten: Forschungsstelle sotomo, Vorsorge und Fairplay-Studie (Stand: Januar 2023)",
x = "",
y = "",
fill = ""
) +
scale_fill_manual(
values = c(
"Keine berufliche Vorsorge" = "#f4a582" ,
"Berufliche Vorsorge" = "#3d5a80"
),
breaks = c("Keine berufliche Vorsorge", "Berufliche Vorsorge")
) +
theme_eat() +
coord_flip() +
theme(legend.position = "bottom")
plot2
Haben Sie in Ihrer eigenen Altersvorsorge Lücken bzw. Jahre,in denen Sie keine Beiträge geleistet haben? (Geschlechtergerecht-Studie) [ahvluecken]
# Daten Bereinigung und Gewichtung für Haben Sie eine BeitragsLücke nach Herkunft und Kinder für Grafik 3
luecke_eltern <- geschlechtergerecht %>%
mutate(id = row_number()) %>%
select(starts_with("ahv"), eltern, weight, id) %>%
pivot_longer(!id:eltern, names_to = "ahvluecken", values_to = "question") %>%
mutate(var.code = case_when(question == "Y" ~ 1, question == "" ~ 0, TRUE ~ NA_real_)) %>%
group_by(id) %>%
mutate(sum = sum(var.code, na.rm = T)) %>%
filter(sum != 0) %>%
mutate(
ahvluecke = case_when(
ahvluecken == "ahvluecken_SQ001" ~ "AHV Lücke",
ahvluecken == "ahvluecken_SQ002" ~ "BVG Lücke",
ahvluecken == "ahvluecken_SQ003" ~ "Keine Lücke",
ahvluecken == "ahvluecken_SQXXX" ~ "Weiss nicht"
)
) %>%
group_by(ahvluecke, question, var.code, eltern) %>%
filter(sum == 1) %>% #beides ausgeschlossen, da 100 Prozent überstiegen wird
summarise(Nweighted = sum(weight), .groups = 'drop') %>%
group_by(ahvluecke, eltern) %>%
mutate(Percentage = Nweighted / sum(Nweighted)) %>%
na.omit() %>% # Wenn eine Person keine Antwortoption gewählt hat, wird sie ausgeschlossen
filter(var.code == 1)
#Kontrolle Percentage --> ob es ein 1 ergibt
aggregate(Percentage ~ eltern, luecke_eltern, sum)
## eltern Percentage
## 1 Ausländer mit Kinder 1
## 2 Ausländer ohne Kinder 1
## 3 Ausländerin mit Kinder 1
## 4 Ausländerin ohne Kinder 1
## 5 Schweizer mit Kinder 1
## 6 Schweizer ohne Kinder 1
## 7 Schweizerin mit Kinder 1
## 8 Schweizerin ohne Kinder 1
# Grafik 3 Vorsorgelücke nach Herkunft und Kinder
plot3 <- ggplot(luecke_eltern, aes(
x = factor(
eltern,
levels = c(
"Ausländerin mit Kinder",
"Schweizerin mit Kinder",
"Schweizer mit Kinder",
"Ausländer mit Kinder",
"Schweizerin ohne Kinder",
"Schweizer ohne Kinder",
"Ausländerin ohne Kinder",
"Ausländer ohne Kinder"
)
),
y = Percentage,
fill = factor(
ahvluecke,
levels = c( "BVG Lücke","AHV Lücke", "Weiss nicht", "Keine Lücke")
)
)) +
geom_bar(stat = "identity",
position = "fill",
color = "white") +
geom_text(
aes(
y = Percentage,
label = scales::percent(Percentage, accuracy = 1L)
),
position = position_stack(vjust = 0.5),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Ausländische Frauen mit Kindern haben doppelt so häufig \nBeitragslücken wie ausländische Männer mit Kindern",
subtitle = "\nHaben Sie in Ihrer eigenen Altersvorsorge Lücken bzw. Jahre,\nin denen Sie keine Beiträge geleistet haben?",
caption = "Beobachtungen, mit AHV als auch BVG-Lücken wurden ausgeschlossen. \nDaten: Forschungsstelle sotomo, Geschlechtergerechter-Studie (Stand: Januar 2023)",
x = "",
y = "",
fill = ""
) +
scale_fill_manual(
values = c(
"AHV Lücke" = "#3d5a80",
"BVG Lücke" = "#DDA0DD",
"Keine Lücke" = "#f4a582",
"Weiss nicht" = "#C4C4CC"
),
breaks = c("Keine Lücke", "Weiss nicht", "AHV Lücke","BVG Lücke" )
) +
theme_eat() +
coord_flip() +
theme(legend.position = "bottom")
plot3
Wie schätzen Sie das ein: Verdienen Sie gegenwärtig genug, um Ihren Lebensunterhalt allein (ohne Lebenspartner:in) zu bestreiten?» (Geschlechtergerecht-Studie) [wage]
# Daten Bereinigung und Gewichtung für Wie schätzen Sie das ein: Verdienen Sie gegenwärtig genug, um Ihren Lebensunterhalt allein (ohne Lebenspartner:in) zu bestreiten?» für Grafik 4
genug_eltern <- geschlechtergerecht %>%
mutate(id = row_number()) %>%
mutate(
alleine = case_when(
wage == "A1" ~ "Ja",
wage == "A2" ~ "Nein",
wage == "A3" ~ "Weiss nicht",
TRUE ~ NA_character_
)
) %>%
select("id",
"alleine",
"eltern",
"weight") %>%
group_by(id) %>%
group_by(alleine, eltern) %>%
summarise(Nweighted = sum(weight), .groups = 'drop') %>%
na.omit() %>%
group_by(eltern) %>%
mutate(Percentage = Nweighted / sum(Nweighted)) %>%
ungroup() %>%
arrange(Percentage)
#Kontrolle Percentage --> ob es ein 1 ergibt
aggregate(Percentage ~ eltern, genug_eltern, sum)
## eltern Percentage
## 1 Ausländer mit Kinder 1
## 2 Ausländer ohne Kinder 1
## 3 Ausländerin mit Kinder 1
## 4 Ausländerin ohne Kinder 1
## 5 Schweizer mit Kinder 1
## 6 Schweizer ohne Kinder 1
## 7 Schweizerin mit Kinder 1
## 8 Schweizerin ohne Kinder 1
# Finanzielle Sicherheit nach Kinder und Herkunft
plot4 <-
ggplot(genug_eltern, aes(
x = factor(
eltern,
levels = c(
"Schweizerin mit Kinder",
"Ausländerin mit Kinder",
"Schweizer mit Kinder",
"Ausländer mit Kinder",
"Schweizerin ohne Kinder",
"Schweizer ohne Kinder",
"Ausländerin ohne Kinder",
"Ausländer ohne Kinder"
)
),
y = Percentage,
fill = factor(alleine, levels = c( "Ja", "Weiss nicht","Nein")))) +
geom_bar(
stat = "identity",
position = "fill",
color = "white",
width = 0.9
) +
geom_text(
aes(
y = Percentage,
label = scales::percent(Percentage, accuracy = 1L)
),
position = position_stack(vjust = 0.5),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Rund 70 Prozent der Schweizerinnen mit Kinder schätzen ein,\ndass Sie ihren Lebensunterhalt nicht alleine bestreiten \nkönnen",
subtitle = "\nWie schätzen Sie das ein: Verdienen Sie gegenwärtig genug, \num Ihren Lebensunterhalt allein (ohne Lebenspartner:in) \nzu bestreiten?",
caption = "Daten: Forschungsstelle sotomo, Geschlechtergerechter-Studie (Stand: Januar 2023)",
x = "",
y = "",
fill = ""
) +
scale_fill_manual(
values = c(
"Nein" = "#f4a582",
"Ja" = "#3d5a80",
"Weiss nicht" = "#C4C4CC"
),
breaks = c( "Nein","Weiss nicht", "Ja")
) +
theme_eat() +
coord_flip() +
theme(legend.position = "bottom")
plot4
Haben Sie Ihre Berufslaufbahn schon zugunsten Ihres/Ihrer Partner*in zurückgestellt? Geschlechtergerecht-Studie) [PartnerEffekt]
# Datenbereinigung und Gewichtung für Karriere zurückgestellt, für aktuell oder frühere Beziehung
zurueckstellen_eltern <- geschlechtergerecht %>%
mutate(id = row_number()) %>%
mutate(zuruckstellen
=case_when(PartnerEffekt %in% c("A1","A2")~"Ja",
PartnerEffekt=="A3"~"Nein"
)) %>%
select("id",
"zuruckstellen",
"eltern",
"weight") %>%
group_by(id) %>%
group_by(zuruckstellen
, eltern) %>%
summarise(Nweighted = sum(weight),.groups = 'drop') %>%
na.omit() %>%
group_by(eltern) %>%
mutate(Percentage=Nweighted/sum(Nweighted)) %>%
ungroup() %>%
arrange(Percentage)
#Kontrolle Percentage --> ob es ein 1 ergibt
aggregate(Percentage ~ eltern, zurueckstellen_eltern, sum)
## eltern Percentage
## 1 Ausländer mit Kinder 1
## 2 Ausländer ohne Kinder 1
## 3 Ausländerin mit Kinder 1
## 4 Ausländerin ohne Kinder 1
## 5 Schweizer mit Kinder 1
## 6 Schweizer ohne Kinder 1
## 7 Schweizerin mit Kinder 1
## 8 Schweizerin ohne Kinder 1
# Plot 5 Karriere für Partner*in zurückgestellt
plot5<-
ggplot(zurueckstellen_eltern, aes(
x = factor(
eltern,
levels = c(
"Schweizerin mit Kinder",
"Ausländerin mit Kinder",
"Schweizer mit Kinder",
"Ausländer mit Kinder",
"Schweizerin ohne Kinder",
"Ausländer ohne Kinder",
"Schweizer ohne Kinder",
"Ausländerin ohne Kinder"
)
),
y = Percentage,
fill = zuruckstellen
)) +
geom_bar(
stat = "identity",
position = "fill",
color = "white",
width = 0.9
) +
geom_text(
aes(
y = Percentage,
label = scales::percent(Percentage, accuracy = 1L)
),
position = position_stack(vjust = 0.5),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Jede zweite Frau mit Kindern hat schon einmal zugunsten \nIhres/Ihrer Partner*in Ihre Karriere zurückgestellt",
subtitle = "\nHaben Sie Ihre Berufslaufbahn schon zugunsten Ihres/Ihrer \nPartner*in zurückgestellt?",
caption = "Daten: Forschungsstelle sotomo, Geschlechtergerechter-Studie (Stand: Januar 2023)",
x = "",
y = "",
fill = ""
) +
scale_fill_manual(values = c(
"Ja" = "#3d5a80",
"Nein"="#f4a582"), breaks =c("Nein", "Ja")) +
theme_eat() +
coord_flip() +
theme(legend.position = "bottom")
plot5
Wie gut lässt sich Ihre Berufstätigkeit mit einer Familie Ihrer Einschätzung nach vereinbaren? (Geschlechtergerecht-Studie) [vereinbar]
# Datenbereinigung und Vorbereitung für wie gut ist ihr Beruf mit Familie vereinbar
vereinbar_eltern <- geschlechtergerecht %>%
mutate(id = row_number()) %>%
mutate(vereinbar
=case_when(vereinbar%in%c("A1","A2")~"Gut",
vereinbar%in%c("A3","A4")~"Schlecht",
)) %>%
select("id",
"vereinbar",
"eltern",
"weight") %>%
group_by(id) %>%
group_by(vereinbar
, eltern) %>%
summarise(Nweighted = sum(weight),.groups = 'drop') %>%
na.omit() %>%
group_by(eltern) %>%
mutate(Percentage=Nweighted/sum(Nweighted)) %>%
ungroup() %>%
arrange(Percentage)
#Kontrolle Percentage --> ob es ein 1 ergibt
aggregate(Percentage ~ eltern, vereinbar_eltern, sum)
## eltern Percentage
## 1 Ausländer mit Kinder 1
## 2 Ausländer ohne Kinder 1
## 3 Ausländerin mit Kinder 1
## 4 Ausländerin ohne Kinder 1
## 5 Schweizer mit Kinder 1
## 6 Schweizer ohne Kinder 1
## 7 Schweizerin mit Kinder 1
## 8 Schweizerin ohne Kinder 1
plot6<-
ggplot(vereinbar_eltern, aes(
x = factor(
eltern,
levels = c(
"Schweizer mit Kinder",
"Ausländer mit Kinder",
"Ausländerin mit Kinder",
"Schweizerin mit Kinder",
"Schweizer ohne Kinder",
"Ausländer ohne Kinder",
"Ausländerin ohne Kinder",
"Schweizerin ohne Kinder"
)
),
y = Percentage,
fill = vereinbar
)) +
geom_bar(
stat = "identity",
position = "fill",
color = "white",
width = 0.9
) +
geom_text(
aes(
y = Percentage,
label = scales::percent(Percentage, accuracy = 1L)
),
position = position_stack(vjust = 0.5),
color = "white",
size = 3
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Über ein Drittel der Frauen ohne Kinder, ist der Ansicht, \ndass Ihre Erwerbstätigkeit mit einer Familie schlecht \nzu vereinbar ist",
subtitle = "\nWie gut lässt sich Ihre Berufstätigkeit mit einer Familie Ihrer \nEinschätzung nach vereinbaren?",
caption = "Daten: Forschungsstelle sotomo, Geschlechtergerechter-Studie (Stand: Januar 2022)",
x = "",
y = "",
fill = ""
) +
scale_fill_manual(values = c(
"Gut" = "#3d5a80",
"Schlecht"="#f4a582"), breaks =c("Schlecht", "Gut")) +
theme_eat() +
coord_flip() +
theme(legend.position = "bottom")
plot6