# libraries
library(data.table)
library(tidyverse)
library(ggthemes)
library(lubridate)
library(scales)
Eigene Funktion zur Datenaufbereitung
# write function to reshape wide columns into proper tidy shape ----
reshape_wide_columns <- function(data, variable_name){
out <- data %>%
pivot_longer(cols = starts_with(variable_name),
names_to = "name",
values_to = "value") %>%
filter(str_detect(value, pattern = "Selected")) %>%
separate(col = value, into = c("description", "value"), sep = ": ") %>%
select(-name, -value) %>%
rename(!! sym(variable_name) := description)
return(out)
}
Initiale Datenaufbereitung
# load data
sotomo_raw <- fread(file = "Daten_DDJ_HS20_Olat/Corona-Monitor/2-Daten/CoronaMonitorAll.csv") %>%
as_tibble()
sotomo_df <- sotomo_raw %>%
# exclude respondents abroad
filter(kanton != "- Auslandschweizer/in -",
!arbtyp %in% c("", "-oth-")) %>%
mutate(Welle = recode(as.character(Welle),
"1" = "Mär",
"2" = "Apr",
"3" = "Mai",
"4" = "Jun",
"5" = "Nov"),
# shorten job type names
arbtyp = recode(arbtyp,
"Produktion, Reparatur, Reinigung" = "Reparatur, Reinigung",
"Landwirtschaft, Forstwirtschaft" = "Land- & Forstwirtschaft",
"Tourismus, Gastgewerbe, Hotellerie" = "Tourismus, Gastgewerbe",
"Sport, Wellness, Schönheit" = "Sport, Wellness",
"Analyse, Forschung, Entwicklung" = "Forschung, Entwicklung"))
Grafik 1: Betroffenheit der einzelnen Berufskategorien pro Umfragewelle
# loss of salary by job type ----
# dataprep
einbussen_df <- sotomo_df %>%
# select relevant vars
select(id, arbtyp, einkEinbusse, Welle, weight) %>%
drop_na() %>%
group_by(arbtyp, Welle) %>%
summarise(n = n(),
# used weighted means!!
mean_einbusse = weighted.mean(einkEinbusse, w = weight)) %>%
mutate(freq = n / sum(n)) %>%
ungroup() %>%
mutate(Welle = as_factor(Welle))
# classify job types by how strongly they are affected according to data above
schwer_betroffen <- c("Beratung, Verkauf", "Gestaltung, Kommunikation", "Kunst, Kultur",
"Sport, Wellness", "Tourismus, Gastgewerbe")
temporär_betroffen <- c("Erziehung, Unterricht", "Gesundheit, Soziales", "Medien, Journalismus",
"Reparatur, Reinigung", "Strategie, Führung",
"Transport, Verkehr")
kaum_betroffen <- c("Administration, Organisation", "Forschung, Entwicklung",
"Finanzen, Recht", "Konstruktion, Baugewerbe", "Kontrolle, Sicherheit",
"Land- & Forstwirtschaft", "Politik, Verwaltung",
"Technik, Informatik")
# plot job types and loss of salary
plot_einbussen <- einbussen_df %>%
mutate(
betroffenheit = case_when(
arbtyp %in% schwer_betroffen ~ "schwer",
arbtyp %in% temporär_betroffen ~ "temporär",
arbtyp %in% kaum_betroffen ~ "kaum"),
betroffenheit = factor(betroffenheit, levels = c('schwer', 'temporär', 'kaum'))) %>%
ggplot(aes(y = mean_einbusse, x = Welle, col = betroffenheit)) +
geom_point(aes(size = n)) +
geom_line(aes(group = 1)) +
facet_wrap(facets = ~arbtyp, scales = 'free_x') +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
labs(title = "Mehr als ein Viertel der Berufskategorien hat im November noch mit Lohneinbussen zu kämpfen.",
subtitle = "Durchschnittliche Lohneinbussen nach Berufskategorie",
y = "durchschnittliche Lohneinbussen in %",
x = "Umfragemonat",
size = "Anzahl Respondenten",
col = "Betroffenheit",
caption = "Datenquelle: sotomo Corona-Monitor (Nov. 2020)") +
theme_clean() +
theme(axis.text.x = element_text(angle = 66, vjust = 1, hjust=1),
legend.position = 'bottom') +
scale_colour_manual(values = c("#FB5858", "#FBB258", "#90CD97"))
ggsave(filename = "blog/plots/plot_einbussen.png",
plot = plot_einbussen, width = 10, height = 8, units = 'in')
# aggregate job types
betroffen_df <- sotomo_df %>%
mutate(betroffenheit = case_when(
arbtyp %in% schwer_betroffen ~ "schwer",
arbtyp %in% temporär_betroffen ~ "temporär",
arbtyp %in% kaum_betroffen ~ "kaum"
)) %>%
# select relevant vars
select(id, betroffenheit, einkEinbusse, Welle, weight) %>%
drop_na() %>%
group_by(betroffenheit, Welle) %>%
summarise(n = n(),
# used weighted means!
mean_einbusse = weighted.mean(einkEinbusse, w = weight)) %>%
mutate(freq = n / sum(n)) %>%
ungroup() %>%
mutate(Welle = as_factor(Welle))
Datenaufbereitung: Grösste Angst
# Dataprep Fear ----
furcht_raw <- sotomo_df %>%
# exclude Swiss abroad
filter(kanton != "- Auslandschweizer/in -",
arbtyp != "") %>%
# select relevant vars
select(id, arbtyp, weight, Welle, starts_with("furchtPers"))
# max fear df
furchtMax <- furcht_raw %>%
select(-starts_with('furchtPersMin')) %>%
# use my own function to reshape variables
reshape_wide_columns(variable_name = 'furchtPersMax') %>%
rename('furchtValue' = furchtPersMax) %>%
filter(furchtValue != 'Nichts') %>%
mutate(furchtClass = 'max')
# min fear df
furchtMin <- furcht_raw %>%
select(-starts_with('furchtPersMax')) %>%
# use my own function to reshape variables
reshape_wide_columns(variable_name = 'furchtPersMin') %>%
rename('furchtValue' = furchtPersMin) %>%
filter(furchtValue != 'Nichts') %>%
mutate(furchtClass = 'min')
# join min and max fear
furcht_joined <- bind_rows(furchtMax, furchtMin) %>%
filter(furchtValue != "") %>%
# Welle string to factor
mutate(Welle = as_factor(Welle)) %>%
# recode betroffenheit
mutate(betroffenheit = case_when(
arbtyp %in% schwer_betroffen ~ "schwer",
arbtyp %in% temporär_betroffen ~ "temporär",
arbtyp %in% kaum_betroffen ~ "kaum"),
betroffenheit = factor(betroffenheit, levels = c("schwer", "temporär", "kaum"))) %>%
select(id, weight, Welle, arbtyp, betroffenheit,
furchtClass, furchtValue) %>%
arrange(arbtyp, Welle, id, furchtClass) %>%
# recode job types
mutate(furchtValue = recode(furchtValue,
"Arbeitsplatzverlust" = "Jobverlust",
"COVID-19-Erkrankung (Coronavirus)" = "COVID-19-Erkrankung",
"Konflikte im privaten Umfeld" = "Private Konflikte",
"Soziale Isolation / Einsamkeit" = "Soziale Isolation"))
# remove unneeded objects
rm(furcht_raw, furchtMax, furchtMin)
# Fear by Betroffenheit -----------------------------------------------
betroffenheit_furcht_df <- furcht_joined %>%
group_by(Welle, betroffenheit, furchtClass, furchtValue) %>%
summarise(n = sum(weight)) %>%
mutate(n = replace_na(n, 0),
freq = n / sum(n))
# check if some fears are not present for certain jobs & waves
betroffenheit_furcht_df %>% filter(is.na(n))
## # A tibble: 0 x 6
## # Groups: Welle, betroffenheit, furchtClass [0]
## # … with 6 variables: Welle <fct>, betroffenheit <fct>, furchtClass <chr>,
## # furchtValue <chr>, n <dbl>, freq <dbl>
betroffenheit_furcht_df %>% filter(is.na(freq))
## # A tibble: 0 x 6
## # Groups: Welle, betroffenheit, furchtClass [0]
## # … with 6 variables: Welle <fct>, betroffenheit <fct>, furchtClass <chr>,
## # furchtValue <chr>, n <dbl>, freq <dbl>
# check if some categories are missing
betroffenheit_furcht_df %>%
group_by(Welle, betroffenheit, furchtClass) %>%
summarise(n = n()) %>%
arrange(n)
## # A tibble: 30 x 4
## # Groups: Welle, betroffenheit [15]
## Welle betroffenheit furchtClass n
## <fct> <fct> <chr> <int>
## 1 Mär schwer max 6
## 2 Mär schwer min 6
## 3 Mär temporär max 6
## 4 Mär temporär min 6
## 5 Mär kaum max 6
## 6 Mär kaum min 6
## 7 Apr schwer max 6
## 8 Apr schwer min 6
## 9 Apr temporär max 6
## 10 Apr temporär min 6
## # … with 20 more rows
# does not seem to be the case, all jobclasses have 6 sorrows
# conclude that these NAs must be zeroes
Grafik 2: Grösste Angst nach Betroffenheitskategorie
# Biggest Fear by Betroffenheit
plot_furchtMax_betroffenheit <- betroffenheit_furcht_df %>%
filter(furchtClass == "max") %>%
ggplot(aes(x = Welle, y = freq, col = furchtValue, group = furchtValue)) +
geom_point() +
geom_line() +
facet_wrap(~betroffenheit) +
scale_y_continuous(labels = scales::percent) +
labs(title = "Angst vor Jobverlust und finanziellen Einbussen bei Schwerbetroffenen klar im Vordergrund.",
subtitle = "Grösste Angst nach Betroffenheit der Berufsklasse",
y = "Anteil in %",
col = "",
caption = "Datenquelle: sotomo Corona-Monitor (Nov. 2020)") +
theme_clean() +
theme(legend.position = 'bottom') +
scale_colour_manual(values = few_pal(palette = 'Light')(6))
ggsave(filename = "blog/plots/plot_furchtMax_betroffenheit.png",
plot = plot_furchtMax_betroffenheit, width = 10, height = 7, units = 'in')
Grafik 3: Grösste Angst nach Berufskategorie
# Fears by job types -------------------------------------------------------
arbtyp_furcht_df <- furcht_joined %>%
group_by(Welle, arbtyp, furchtClass, furchtValue) %>%
summarise(n = sum(weight)) %>%
mutate(n = replace_na(n, 0),
freq = n / sum(n))
# check if some fears are not present for certain jobs & waves
arbtyp_furcht_df %>% filter(is.na(n))
## # A tibble: 0 x 6
## # Groups: Welle, arbtyp, furchtClass [0]
## # … with 6 variables: Welle <fct>, arbtyp <chr>, furchtClass <chr>,
## # furchtValue <chr>, n <dbl>, freq <dbl>
arbtyp_furcht_df %>% filter(is.na(freq))
## # A tibble: 0 x 6
## # Groups: Welle, arbtyp, furchtClass [0]
## # … with 6 variables: Welle <fct>, arbtyp <chr>, furchtClass <chr>,
## # furchtValue <chr>, n <dbl>, freq <dbl>
# check if some categories are missing
arbtyp_furcht_df %>%
group_by(Welle, arbtyp, furchtClass) %>%
summarise(n = n()) %>%
arrange(n)
## # A tibble: 186 x 4
## # Groups: Welle, arbtyp [93]
## Welle arbtyp furchtClass n
## <fct> <chr> <chr> <int>
## 1 Mär Administration, Organisation max 6
## 2 Mär Administration, Organisation min 6
## 3 Mär Beratung, Verkauf max 6
## 4 Mär Beratung, Verkauf min 6
## 5 Mär Erziehung, Unterricht max 6
## 6 Mär Erziehung, Unterricht min 6
## 7 Mär Finanzen, Recht max 6
## 8 Mär Finanzen, Recht min 6
## 9 Mär Forschung, Entwicklung max 6
## 10 Mär Forschung, Entwicklung min 6
## # … with 176 more rows
# does not seem to be the case, all jobclasses have 6 sorrows
# conclude that these NAs must be zeroes
# max fear plot for all job types
plot_furchtMax_arbtyp <- arbtyp_furcht_df %>%
filter(furchtClass == "max") %>%
ggplot(aes(x = Welle, y = freq, col = furchtValue, group = furchtValue)) +
geom_point() +
geom_line() +
facet_wrap(~arbtyp) +
scale_y_continuous(labels = scales::percent) +
labs(title = "Grösste Angst nach Berufsklasse",
y = "Anteil in %",
x = "Umfragemonat",
col = "") +
theme_clean() +
theme(axis.text.x = element_text(angle = 66, vjust = 1, hjust=1),
legend.position = 'bottom') +
scale_colour_manual(values = few_pal(palette = 'Light')(6))
# max fear plot filtered
plot_furchtMax_arbtyp_filtered <- arbtyp_furcht_df %>%
filter(furchtClass == "max",
arbtyp %in% c("Gestaltung, Kommunikation",
"Tourismus, Gastgewerbe",
"Kunst, Kultur")) %>%
ggplot(aes(x = Welle, y = freq, col = furchtValue, group = furchtValue)) +
geom_point() +
geom_line() +
facet_wrap(~arbtyp)+
scale_y_continuous(labels = scales::percent) +
labs(title = "Ist die Angst vor einer Ansteckung tiefer, wenn kein Home-Office möglich ist?",
subtitle = "Grösste Angst nach Berufsklasse, innerhalb der Schwerbetroffenen",
y = "Anteil in %",
x = "Umfragemonat",
col = "",
caption = "Datenquelle: sotomo Corona-Monitor (Nov. 2020)") +
theme_clean() +
theme(legend.position = 'bottom')+
scale_colour_manual(values = few_pal(palette = 'Light')(6))
ggsave(filename = "blog/plots/plot_furchtMax_arbtyp_filtered.png",
plot = plot_furchtMax_arbtyp_filtered, width = 10, height = 7, units = 'in')