Skip to content

Instantly share code, notes, and snippets.

@mschnetzer
Created December 20, 2022 20:12
Show Gist options
  • Save mschnetzer/d9556aabb7909b8c8b54d3c0d9e78540 to your computer and use it in GitHub Desktop.
Save mschnetzer/d9556aabb7909b8c8b54d3c0d9e78540 to your computer and use it in GitHub Desktop.
Arbeitszeitrealitäten und -wünsche im Mikrozensus 2019 (https://twitter.com/matschnetzer/status/1605221105522073600)
library(tidyverse)
library(haven)
library(msthemes)
library(gganimate)
mz <- read_dta("mz2019.dta")
mz |> filter(xerwstat == 1, dbers <6, dstd < 999, balt %in% 20:69, aquartal == 4) |>
select(asbper, gewjahr, bsex, balt, dstd, dwstd) |>
mutate(status = case_when(
dstd == dwstd ~ "keep",
dstd < dwstd ~ "incr",
dstd > dwstd ~ "decr",
TRUE ~ NA_character_
)) |>
mutate(across(c(dstd,dwstd), as.numeric),
diffstd = abs(dstd - dwstd),
gender = fct_recode(factor(bsex), Männer = "1", Frauen = "2")) -> wunsch
plotdf <- wunsch |> filter(!status == "keep", dwstd > 0, dwstd <= 80, dstd <= 80) |>
mutate(id = row_number(), count = 1, color = dstd) |>
pivot_longer(c(dstd, dwstd), names_to = "state", values_to = "hours") |>
mutate(state = factor(state, levels = c("dstd", "dwstd")))
labdf <- tibble(state=c("dstd", "dwstd"),
label=c("Tatsächliche Stunden", "Gewünschte Stunden"))
means <- plotdf |> group_by(status, state, gender) |> summarise(mittel = mean(hours)) |>
mutate(label = case_when(state == "dstd" & status == "decr" ~ "Reduktion",
state == "dstd" & status == "incr" ~ "Erhöhung",
TRUE ~ NA_character_))
plot <- plotdf |> ggplot(aes(x = hours)) +
geom_jitter(aes(color = color, size = diffstd^2, y = 0.4), width = 0.4, alpha = 0.4) +
geom_density(aes(y = after_stat(density*8)), linewidth = 0.3, color = "black") +
geom_vline(aes(xintercept = mittel), data = means |> filter(status == "incr"),
linewidth = 1, color = "darkred") +
geom_vline(aes(xintercept = mittel), data = means |> filter(status == "decr"),
linewidth = 1, color = "darkblue") +
facet_wrap(~gender, nrow = 2) +
geom_label(aes(x = mittel, y = 0.9, label = label),
color = ifelse(means$status == "decr", "darkblue", "darkred"),
hjust = ifelse(means$status == "decr", 0, 1),
data = means, size=3) +
geom_label(aes(x = 80, y = 0.9, label = label, hjust = 1),
color=msc_palette[1], data = labdf, size=3) +
scale_color_gradientn(colors = MetBrewer::met.brewer(type = "continuous", name = "Hiroshige",
direction = -1), guide = "none") +
scale_size(guide = "none") +
scale_y_continuous(limits = c(NA, 1)) +
labs(x = "Wochenstunden", y = NULL,
title="Arbeitszeit und Arbeitszeitwünsche",
subtitle= str_wrap("Die Grafik zeigt die tatsächliche und gewünschte Wochenarbeitszeit nach Geschlechtern getrennt. Es werden nur Arbeitnehmer:innen mit Veränderungswünschen angezeigt und Wochenstunden zwischen 1 und 80 gefiltert. Die Größe der Punkte spiegelt das Ausmaß des Änderungswunsches wider. Die vertikalen Linien zeigen die Durchschnittsstunden nach Veränderungswunsch.", 130),
caption="Daten: Mikrozensus 2019, Statistik Austria. Grafik: @matschnetzer") +
theme_ms() +
theme(axis.text.y = element_blank(),
panel.grid.major.y = element_blank(),
plot.subtitle = element_text(size = 9, margin = margin(t = 10, b = 15, unit = "pt")),
plot.caption = element_text(margin = margin(t = 10, unit = "pt"))) +
transition_states(state, transition_length = 15, state_length = 20)
anim <- animate(plot, height = 6, width = 8, nframes = 100, res = 200, unit = "in")
anim_save("arbeitszeit.gif", anim)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment