# 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')