Setup

knitr::opts_chunk$set(warning = FALSE)
knitr::opts_chunk$set(message = FALSE)
knitr::opts_chunk$set(tidy = FALSE)

Packages laden

p_needed <- c("haven", "tidyverse", "texreg", "psych", "RColorBrewer", "ggalt", "gridExtra", "glm.predict")
lapply(p_needed, library, character.only = TRUE)

rm(list = ls())

Datensatz

Die Datenaufbereitung ist in einem separaten RMD-File zu finden.

shp <- read_csv("shp_aufbereitet.csv", show_col_types = FALSE)

Teilnahmerate

Bei wievielen Wellen hat eine Person durchschnittlich am SHP teilgenommen?

shp_unique <- shp %>% 
  filter(!AGE>26) %>% # diese Linie entfernen, falls man alle Beobachtungen will  
  filter(!duplicated(IDPERS)) 
# -> 19'151 Personen haben in mind. einem Jahr bei der Umfrage teilgenommen, 6221 davon waren unter 26 Jahre

participation_counts <- shp %>%
  filter(!AGE>26) %>% 
  group_by(IDPERS) %>%
  summarize(participation_count = n_distinct(YEAR)) %>% 
  mutate(mean = mean(participation_count), # Mean 5.2 für alle Alter, 2.9 für U26
         median = median(participation_count), # Median 3 für alle Alter, 2 für U26
         var = var(participation_count),
         sd = sd(participation_count))
hist(participation_counts$participation_count) 

round(prop.table(table(participation_counts$participation_count)),2) 
## 
##    1    2    3    4    5    6    7    8    9   10   11 
## 0.35 0.22 0.14 0.08 0.06 0.05 0.04 0.03 0.02 0.01 0.01
# -> Die allermeisten haben nur 1-3x an der Umfrage teilgenommen 
# Alle Alter: 25% nur 1x, 42% bis und mit 2x, 60% bis und mit 3x
# U26: 35% nur 1x, 57% bis und mit 2x, 81% bis und mit 3x

Obwohl es sich beim SHP um Paneldaten handelt, gibt es insgesamt eher wenige wiederholte Messungen der gleichen Personen, besonders wenn man nur die jüngeren Personen beachtet. Deshalb, und auch um die kommenden Analysen zu vereinfachen, ignoriere ich den Fakt dass es teilweise die gleichen Personendaten sind, und behandle alle Observationen als individuell. Das heisst konkret, dass ich z.B. keine Mixed Models rechne mit der Personen-ID als Cluster.

Vergleichbarkeit der Generationengruppen

Um statistisch signifikante Unterschiede zwischen den Generationen feststellen zu können, muss ich die Gruppen auf folgende Bedingungen hin überprüfen:

  • Zeitraum: Wurden die Daten (etwa) zur gleichen Zeit erhoben? -> Ja, 2002-2022 (mit wenigen Ausnahmen).
  • Grösse: Sind die Gruppen etwa gleich gross? -> Nein, viel weniger Gen Z.
  • Exogene Variablen: Ist die Verteilung der Merkmale, an denen ich nicht direkt interessiert bin, aber die einen Einfluss auf die unabhängigen Variablen haben könnten, in den Gruppen ungefähr gleich? -> Beim Geschlecht ja, ansonsten nein. Das hat vor allem mit der Ungleichheit der Altersverteilung zu tun (denn Bildung, Einkommen, Zivilstand und Kinder haben hängt alles vom Alter ab).

Zusätzlich gibt es für die Interpretation das APC-Problem (vom engl. age-period-cohort identification problem) zu beachten. Über den Geburtsjahrgang einer Person hängen Alter, hist. Periode bzw. Zeitpunkt der Befragung und die Zugehörigkeit zu einer Geburtenkohorte (Generation) unausweichlich miteinander zusammen. Dies macht es extrem schwierig, die Effekte auseinanderzuhalten für die Erklärung eines Phänomens. Im Bezug auf Unterschiede in der Arbeitsmotivation hat sich beispielsweise Schroeder (2023) gefragt: Ändert sie sich tatsächlich, weil man einer anderen Generation angehört? Oder ändert sie sich eher deshalb, weil man in einem gewissen Alter/Lebensabschnitt ist, oder weil sich über die Zeit hinweg die allgemeine Arbeitseinstellung in der Gesellschaft verändert hat? Das APC-Problem verkompliziert meine Analyse, da damit auch der Erhebungszeitraum und die Verteilung der exogenen Variable “Alter” betroffen ist für die Vergleichbarkeit der Generationen. Schroeder (2023) testet dies anhand von Multi-Level-Regressionen mit Daten von 584.217 Personen, die im Rahmen des Integrated Values Survey in 113 Ländern über zw. 1981 und 2022 erhoben wurden. Er stellt fest, dass der Generationeneffekt nicht mehr siginifikant ist, wenn Alter, Alter im Quadrat und Befragungsjahr als Kontrollen eingeführt werden.

Für meine Analyse steht die Gen Z und die Arbeit im Vordergrund. Dessen Einstellungen und Verhalten bez. Arbeit gilt es im Vergleich zu den anderen Generationen zu überprüfen. In der Schweiz schliessen die meisten ihre obl. Schulzeit mit 15 Jahren ab; und da die meisten eine Lehre machen, ist der Beginn der Berufstätigkeit meistens mit 16. Die lässt sich auch in meinen SHP-Daten bestätigen - der Wert für das erste Quartal der Variable “WORKSTART”, bei der die Befragten ihr Alter beim Berufseinstieg angegeben haben, ist 16 Jahre:

## Alter beim Berufseinstieg ----

summary(shp$WORKSTART, na.rm = T) # alle
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    6.00   16.00   17.00   18.84   21.00   96.00   16942

Dementsprechend ist der erste Jahrgang der Gen Z (1996) frühestens ab 2012 erwerbstätig, vorher existieren keine Werte. Im Vergleich dazu hatte der älteste Jahrgang der Gen Y oder Millenials (1981) ihren Berufseintieg 1997. Leider ist dies ausserhalb meines Datenzeitraums, aber mit jüngeren Jahrgängen der Gen Y gibt es trotzdem eine gemeinsame Fläche mit der Gen Z für Vergleiche. Bei der Gen X decken sich dessen jüngsten Jahrgänge im Alter mit den ältesten Jahrgängen der Gen Z im vorliegenden Datenzeitraum. Da dies aber sehr wenige Beobachtungen für die Gen X sind, und der Vergleich zw. ältester Jahrgänge und jüngste Jahrgänge nicht ganz fair ist, verzichte ich auf eine Analyse der Gen X. Entsprechend dieser Logik mache ich auch keine Aussagen über die noch älteren Generationen.

Auf der anderen Seite ist mein Datenzeitraum auch gegen hinten beschränkt, und zwar auf das Jahr 2022. In diesem Jahr wurde der älteste Jahrgang der Gen Z 26 Jahre alt. Ich fokussiere mich in meiner Analyse deshalb auch den Lebensabschnitts des Berufseinstiegs (Alter 16-26), da Aussagen darüber hinaus in Bezug auf die Gen Z eigentlich nicht möglich sind (ausser man würde mit Daten der anderen Generationen inferieren, aber dies geht gegen mein Interesse, genau Unterschiede in den Generationen zu untersuchen). Da Hochschulabgänger oft erst mit Ende 20 ins Berufsleben einsteigen, ist die Aussagekraft über diese Gruppe leider etwas klein, aber dafür gibt es andere Vorteile.

# Subset mit Gen Z + Gen Y im Lebensabschnitt "Berufseinstieg"
shp_u26 <- shp %>% 
  filter(!AGE>26) %>% 
  filter(GEN %in% c("Gen Y ('81-'95)", "Gen Z ('96-'10)")) %>% 
  mutate(GEN = factor(GEN, 
                      level = c("Gen Y ('81-'95)", "Gen Z ('96-'10)")))

Der Vorteil beim Fokus auf 16-26 Jährige ist es auch, dass damit automatisch der Bias von Age-Effekt auf den Cohort-Effekt (Stichwort: APC-Problem) vermindert wird. Hier als Veranschaulichung die Variable “EXHAUST”, bei der die Befragten angaben, wie erschöpft sie nach der Arbeit sind, um z.B. Hobbies nachzugehen (Skala 0 bzw. “gar nicht” - 10 bzw. “komplett”):

# Referenzkategorie auf Gen Z wechseln
shp <- shp %>% 
  mutate(GEN_rev=fct_relevel(GEN,c("Gen Alpha ('10-heute)", "Gen Z ('96-'10)",
                                   "Gen Y ('81-'95)", "Gen X ('66-'80)",
                                   "Babyboomer ('56-'65)", "Traditionals ('22-'55)")))
shp_u26 <- shp_u26 %>% 
  mutate(GEN_rev=fct_relevel(GEN,c("Gen Z ('96-'10)",
                                   "Gen Y ('81-'95)")))
# Lineare Regression zu EXHAUST

lm1_EXHAUST <- lm(EXHAUST ~ GEN_rev, data = shp) # GEN-Effekt allein

lm2_EXHAUST <- lm(EXHAUST ~ GEN_rev + AGE + AGE2 + YEAR, data = shp) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

lm3_EXHAUST <- lm(EXHAUST ~ GEN_rev, data = shp_u26) # GEN-Effekt allein bzw. AGE etwas kontrolliert durch filter==AGE<26

lm4_EXHAUST <- lm(EXHAUST ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(list(lm1_EXHAUST, lm2_EXHAUST, lm3_EXHAUST, lm4_EXHAUST),
          custom.model.names = c("shp, M1", "shp, M2", "shp_u26, M3", "shp_u26, M4"))
## 
## ==================================================================================
##                              shp, M1       shp, M2       shp_u26, M3   shp_u26, M4
## ----------------------------------------------------------------------------------
## (Intercept)                      4.27 ***    -16.45 ***      4.27 ***    -26.42 * 
##                                 (0.03)        (4.92)        (0.03)       (11.03)  
## GEN_revGen Y ('81-'95)           0.13 ***     -0.04         -0.06         -0.01   
##                                 (0.04)        (0.05)        (0.04)        (0.07)  
## GEN_revGen X ('66-'80)           0.31 ***     -0.06                               
##                                 (0.03)        (0.07)                              
## GEN_revBabyboomer ('56-'65)      0.27 ***     -0.04                               
##                                 (0.04)        (0.09)                              
## AGE                                            0.07 ***                    0.14   
##                                               (0.01)                      (0.09)  
## AGE2                                          -0.00 ***                   -0.00   
##                                               (0.00)                      (0.00)  
## YEAR                                           0.01 ***                    0.01 **
##                                               (0.00)                      (0.01)  
## ----------------------------------------------------------------------------------
## R^2                              0.00          0.00          0.00          0.00   
## Adj. R^2                         0.00          0.00          0.00          0.00   
## Num. obs.                    99632         99632         17424         17424      
## ==================================================================================
## *** p < 0.001; ** p < 0.01; * p < 0.05

Im ersten Modell verwende ich den gesamten shp-Datensatz und nur die Generationen (GEN) als unabhängige Variable, um die Varianzen bei EXHAUST zu erklären. Obwohl der Generationen-Effekt bzw. die Unterschiede zw. den Generationen klein sind, sind sie signifikant. Sobald ich Alter (AGE), quadriertes Alter (AGE2) und Jahr (YEAR) aber als Kontrolle in das Modell einfliessen lasse, ist der Kohorteneffekt für keine Generation mehr signifikant (Modell 2). In Modell 3 kontrolliere ich schon allein durch den Datensatz, der auf 16-26 Jährige gefiltert wurde, für das Alter. Man sieht, dass dadurch auch kein siginifanter Generationeneffekt existiert. 16-26 ist aber ein Lebensabschnitt, in dem viele neue Veränderungen passieren, oft von einem Jahr aufs nächste - deshalb binde ich in Modell 4 die Alterskontrollen nochmals kontinuierlich ein. Weil das Alter hier auch nicht mehr signifikant ist, interpretiere ich es als Kontrolle genug, wenn ich die Alter 16-26 in einer gemeinsamen Gruppe behalte. Ein weiterer Vorteil entsteht durch diese Beschränkung auch bez. der Verteilung der exogenen Variablen (Bildung, Anstellungstyp, Einkommen, Zivilstand, Kinder) gleichmässiger, da diese stark mit dem Alter zusammenhängen. Zum Beispiel war das durchschnittliche Heiratsalter in der Schweiz 2002 ca. 28 Jahre für Frauen und ca. 30 Jahre für Männer, seit dem ist sie konstant und linear gestiegen auf 30 bzw. 32 Jahre im 2022 (BFS 2023) - mit der Begrezung auf Jugendliche bis 26 Jahre ist der Lebensabschnitt als ledige Person, die vermutlich weniger Verantwortung trägt und somit wohl auch eine andere Beziehung zur Arbeit hat als verheiratete Personen. 16-26 ist auch annähernd gleich wie 15-25 - laut Karl Mannheim, der das Konzept der Generationen definierte, stellt die Altersspanne 15-25 als den prägenden Lebensabschnitt einer Person dar (Schröder 2023). Prägende Ereignisse während den prägenden Jahren sind erst überhaupt der Grund, warum laut ihm eine Generation entsteht.

Exogene Variablen:

# Funktionen für Merkmalverteilungen ----
verteilung <- function(data, vari){
  p <- data %>% 
    group_by(GEN) %>% 
    filter(!is.na({{vari}})) %>% 
    count({{vari}}) %>%
    mutate(prop = n/sum(n),
           rprop = round(prop,2)
    ) 
}

verteilung_prop_barplot <- function(data, vari){
  p <- data %>% 
    ggplot(aes(y = prop, x = {{vari}}, fill = {{vari}})) +
    geom_bar(stat = "identity", position = "dodge") +
    facet_wrap(~ GEN) +
    scale_y_continuous(labels = scales::percent_format(accuracy = 1), 
                       breaks = c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1), 
                       limits = c(0,1)
                       ) +
    theme_minimal() +
    theme(legend.position = "none")
}

verteilung_densityplot <- function(data, vari){
  p <- data %>%
    group_by(GEN) %>%
    ggplot(aes(x = {{vari}},
               y = reorder(GEN, {{vari}}),
               fill = GEN)) + 
    scale_x_continuous(n.breaks = 10) +
    ggridges::stat_density_ridges(bandwidth = 0.6,
                                  quantile_lines = TRUE,   # Median Indikator hinzufügen
                                  quantiles = (0.5)) + 
    theme_minimal() +
    theme(axis.text.y = element_blank(),
          axis.ticks.y = element_blank())
}
## Geschlechterverteilung der Generationengruppen ----
verteilung_sex <- verteilung(shp_u26, SEX)
verteilung_sex_plot <- verteilung_prop_barplot(verteilung_sex, SEX) + 
  labs(title = "Merkmalverteilung: SEX",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "")
verteilung_sex_plot

## Alterverteilung der Generationengruppen ----
verteilung_age <- verteilung(shp_u26, AGE)
verteilung_age_plot <- verteilung_densityplot(shp_u26, AGE) + 
  labs(title = "Merkmalverteilung: AGE",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "Abs. Häufigkeit")
verteilung_age_plot

## Bildungsverteilung der Generationengruppen ----
verteilung_edu <- verteilung(shp_u26, EDU_HIGH)
verteilung_edu1_plot <- verteilung_prop_barplot(verteilung_edu, EDU_HIGH) +
  coord_flip() +
  labs(title = "Merkmalverteilung: EDU_HIGH",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "")
verteilung_edu1_plot

verteilung_edu2_plot <- verteilung_densityplot(shp_u26, EDU_YEAR) + 
  labs(title = "Merkmalverteilung: EDU_YEAR",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "Abs. Häufigkeit")
verteilung_edu2_plot

## Verteilung des Zivilstands der Generationengruppen ----
verteilung_civ <- verteilung(shp_u26, CIVIL)
verteilung_civ_plot <- verteilung_prop_barplot(verteilung_civ, CIVIL) + 
  labs(title = "Merkmalverteilung: CIVIL",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "")
verteilung_civ_plot

## Verteilung des Kinderhabens der Generationengruppen ----
verteilung_kids <- verteilung(shp_u26, KIDS)
verteilung_kids_plot <- verteilung_prop_barplot(verteilung_kids, KIDS) + 
  labs(title = "Merkmalverteilung: KIDS",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "")
verteilung_kids_plot 

## Einkommensverteilung der Generationengruppen ----
verteilung_income <- verteilung(shp_u26, INCOME_NET)
verteilung_income_plot <- verteilung_densityplot(shp_u26, INCOME_NET) + 
  scale_x_continuous(limits=c(0, 100000)) +
  labs(title = "Merkmalverteilung: INCOME_NET",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "Abs. Häufigkeit")
verteilung_income_plot

## Teilzeit ----
verteilung_parttime <- verteilung(shp_u26, PARTTIME)
verteilung_parttime_plot <- verteilung_prop_barplot(verteilung_parttime, PARTTIME) + 
  labs(title = "Merkmalverteilung: PARTTIME",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "")
verteilung_parttime_plot

Bezüglich der Generationengruppen-Grösse sind nur etwa halb so viele Gen Z (35%) im Datensatz wie Gen Y (65%). Dies ist ein enormer Unterschied, weshalb ich mir überlegt habe, dies via Matching-Methoden (z.B. Propensity Score Matching) auszugleichen. Ich habe mich dann aber dagegen entschieden, da es (je nach genauer Methode) zu noch kleineren Samples führen kann und diese Datenmanipulation auch wieder Verzerrungen hervorbringen kann.

Grösse:

# Grösse der Generationengruppen für gesamtes shp
table(shp$GEN) # 6100 Z, 24104 Y, 37588 X, 32226 Boomer
## 
## Babyboomer ('56-'65)      Gen X ('66-'80)      Gen Y ('81-'95) 
##                32226                37588                24104 
##      Gen Z ('96-'10) 
##                 6100
round(prop.table(table(shp$GEN)),2)*100 # 6% Z, 24% Y, 38% X, 32% Boomer
## 
## Babyboomer ('56-'65)      Gen X ('66-'80)      Gen Y ('81-'95) 
##                   32                   38                   24 
##      Gen Z ('96-'10) 
##                    6
# Grösse der Generationengruppen für U26
table(shp_u26$GEN) # 6100 Z, 11425 Y
## 
## Gen Y ('81-'95) Gen Z ('96-'10) 
##           11425            6100
round(prop.table(table(shp_u26$GEN)),2)*100 # 35% Z, 65% Y
## 
## Gen Y ('81-'95) Gen Z ('96-'10) 
##              65              35

STEREOTYP 1: Gen Z = faul?

WORK_HOURS

Erste Eindrücke:

shp_u26$WORK_HOURS <- ifelse(shp_u26$WORK_HOURS < 0, NA, shp_u26$WORK_HOURS) 

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$WORK_HOURS, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars     n  mean    sd median trimmed  mad min max range skew kurtosis   se
## X1    1 10520 34.67 14.55     42   36.44 4.45   1  96    95   -1     0.06 0.14
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n  mean    sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 5153 32.99 15.33     40   34.65 7.41   1  95    94 -0.85    -0.27 0.21
hist(shp_u26$WORK_HOURS)

# Verteilung ist nicht normal, sondern left-skewed -> nicht-parametrische Analyse

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(WORK_HOURS, na.rm=T),
            median = median(WORK_HOURS, na.rm=T),
            sd = sd(WORK_HOURS, na.rm=T)) %>% 
  ungroup %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=WORK_HOURS, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(GEN~YEAR) +
  labs(title = "Arbeitsstunden pro Woche",
       subtitle = "pro Jahr und Generation, in h",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# -> Die Within-Group-Variance unterscheidet sich ein wenig von Jahr zu Jahr. Grundsätzlich arbeiten die allermeisten 40h (Median). Mehr als das machen die meisten nicht, sondern eher weniger.
# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$WORK_HOURS ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value    Pr(>F)    
## group     1  21.699 3.216e-06 ***
##       15671                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für WORK_HOURS sind unterschiedlich zw. Gen Y & Gen Z (weil p-Wert signifikant), d.h. signifikante Between-Group-Variance.
# Mann-Withney U Test (weil Nicht-Parametrisch & Heterogene Varianz), um Signifikanz der Unterschiede zu prüfen
library(rstatix)
shp_u26 %>%
  wilcox_test(WORK_HOURS ~ GEN,
              detailed = TRUE) %>% 
  glimpse()
## Rows: 1
## Columns: 12
## $ estimate    <dbl> 0.999962
## $ .y.         <chr> "WORK_HOURS"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 10520
## $ n2          <int> 5153
## $ statistic   <dbl> 29390845
## $ p           <dbl> 5.73e-18
## $ conf.low    <dbl> 5.387342e-05
## $ conf.high   <dbl> 0.9999617
## $ method      <chr> "Wilcoxon"
## $ alternative <chr> "two.sided"
# -> signifikanter Effekt
# Effektgrösse
ef_WORK_HOURS <- shp_u26 %>% 
  wilcox_effsize(WORK_HOURS ~ GEN,
                   ci = TRUE)
effectsize::interpret_r(ef_WORK_HOURS$effsize) 
## Effect size (r) 
##    "very small" 
## (Rules: funder2019)
# -> sehr kleine Effektgrösse

Plots:

# Lineplot über Zeit mit allen Datenpunkten ----
shp_u26 %>%
  #Plot
  ggplot(aes(y=WORK_HOURS, x = YEAR, colour = GEN)) +
  #geom_point(alpha=0.1) +
  geom_smooth(method = "lm") +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Arbeitszeit pro Woche",
       subtitle = "pro Jahr und Generation, in h",
       x = "",
       y = "Arbeitsstunden pro Woche") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(WORK_HOURS, na.rm=T),
            median = median(WORK_HOURS, na.rm=T),
            sd = sd(WORK_HOURS, na.rm=T),
            perc25 = quantile(WORK_HOURS, 0.25, na.rm=T),
            perc75 = quantile(WORK_HOURS, 0.75, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN, fill = GEN)) +
  geom_point() +
  geom_line() +
  #geom_ribbon(aes(ymin = perc25, ymax = perc75), alpha=0.2) +
  #geom_smooth(method = "lm") +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  scale_y_continuous(limits = c(0,45)) +
  labs(title = "Durchschnittliche Arbeitszeit pro Woche",
       subtitle = "pro Jahr und Generation, in h",
       x = "",
       y = "⌀ Arbeitsstunden pro Woche") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten, nicht gefiltert nach Alter ----
shp %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(WORK_HOURS, na.rm=T),
            median = median(WORK_HOURS, na.rm=T),
            sd = sd(WORK_HOURS, na.rm=T),
            perc25 = quantile(WORK_HOURS, 0.25, na.rm=T),
            perc75 = quantile(WORK_HOURS, 0.75, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN, fill = GEN)) +
  geom_point() +
  geom_line() +
  #geom_ribbon(aes(ymin = perc25, ymax = perc75), alpha=0.2) +
  #geom_smooth(method = "lm") +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  scale_y_continuous(limits = c(0,45)) +
  labs(title = "Durchschnittliche Arbeitszeit pro Woche",
       subtitle = "pro Jahr und Generation, in h",
       x = "",
       y = "⌀ Arbeitsstunden pro Woche") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# -> Im Vergleich zum Lineplot nur mit 16-26-Jährigen sind die Unterschiede zwischen den Generationen, wenn auch minimal, kleiner geworden. Dies fasse ich als erneute Bestätigung, dass die Beschränkung auf junge Personen im Datensatz richtig war.

# -> Bei allen drei Visualisierungen ist zu sehen, dass die (durchsch.) Arbeitszeit für alle Generationen mit der Zeit ganz wenig kürzer wird.

Regression & Vorhergesagte Werte:

Als Robustness Check rechne ich jeweils noch eine Regression, mit der ich vorhergesagte Werte von und marginale Effekte zwischen den Generationen berechnen kann. Da ich das Alter hier doch auch nochmals als kontinuierliche Kontrollvariable berücksichtige (statt mich nur auf den Filter AGE = 16 bis 26 zu verlassen), kann es leichte Differenzen bei den Effekten geben. Hier komme ich auf dasselbe Ergebnis wie oben, dass es einen signifikanten, aber sehr kleinen Generationenunterschied gibt bei der Anzahl Arbeitsstunden pro Woche. In der Grafik sieht man dies daran, dass sich die Konfidenzitervalle sich (zumindest für einige Jahre) nicht überlappen.

Für das Reporting im Blog verwende ich aber keine Grafiken, die auf die Regression zurückzuführen sind, sondern zeige die deskriptiven Ergebnisse als Lineplot (s. oben). Dies weil, die deskriptiven Plots dieselben Tendenzen aufzeigen und für die durchschnittliche Leserschaft einfacher ist zu verstehen.

lm_WORK_HOURS <- lm(WORK_HOURS ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_WORK_HOURS)
## 
## ====================================
##                         Model 1     
## ------------------------------------
## (Intercept)               206.65 ** 
##                           (68.43)   
## GEN_revGen Y ('81-'95)      1.06 *  
##                            (0.41)   
## AGE                        -3.50 ***
##                            (0.58)   
## AGE2                        0.08 ***
##                            (0.01)   
## YEAR                       -0.07 *  
##                            (0.03)   
## ------------------------------------
## R^2                         0.01    
## Adj. R^2                    0.01    
## Num. obs.               15673       
## ====================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_WORK_HOURS <- predicts(lm_WORK_HOURS, c("F", "mean", "mean", "2002-2022"))

v_predicted_WORK_HOURS %>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_WORK_HOURS <- predicts(lm_WORK_HOURS, c("F", "mean", "mean", "2002-2022"), 
                                     position = 1)

WORK_HOURS_DIF

Erste Eindrücke:

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$WORK_HOURS_DIF, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars    n mean    sd median trimmed mad min max range skew kurtosis   se
## X1    1 9928  1.8 10.96      0    1.09   0 -65 101   166 0.25    13.97 0.11
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n mean    sd median trimmed mad min max range  skew kurtosis   se
## X1    1 4833 0.99 11.45      0    0.79   0 -65  83   148 -0.22    11.35 0.16
hist(shp_u26$WORK_HOURS_DIF)

# normalverteilt -> parametrisch

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(WORK_HOURS_DIF, na.rm=T),
            median = median(WORK_HOURS_DIF, na.rm=T),
            sd = sd(WORK_HOURS_DIF, na.rm=T)) %>% 
  ungroup %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=WORK_HOURS_DIF, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(~YEAR) +
  labs(title = "Differenz Soll- & Echt-Arbeitzeit pro Woche",
       subtitle = "pro Jahr und Generation, in h",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$WORK_HOURS_DIF ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value Pr(>F)
## group     1  0.9701 0.3247
##       14759
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für WORK_HOURS_DIF sind NICHT unterschiedlich zw. Gen Y & Gen Z (weil p-Wert NICHT signifikant).
# t-Test
shp_u26 %>% t_test(WORK_HOURS_DIF ~ GEN,
                var.equal = TRUE,
                detailed = TRUE) %>%
  glimpse()
## Rows: 1
## Columns: 15
## $ estimate    <dbl> 0.8050348
## $ estimate1   <dbl> 1.795931
## $ estimate2   <dbl> 0.9908959
## $ .y.         <chr> "WORK_HOURS_DIF"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 9928
## $ n2          <int> 4833
## $ statistic   <dbl> 4.12689
## $ p           <dbl> 3.7e-05
## $ df          <dbl> 14759
## $ conf.low    <dbl> 0.4226721
## $ conf.high   <dbl> 1.187397
## $ method      <chr> "T-test"
## $ alternative <chr> "two.sided"
# -> Unterschied ist signifikant
# Effektgrösse
ef_WORK_HOURS_DIF <- shp_u26 %>%
      cohens_d(WORK_HOURS_DIF ~ GEN,
             var.equal = TRUE,
             ci = TRUE)

effectsize::interpret_cohens_d(ef_WORK_HOURS_DIF$effsize)
##    Cohen's d 
## "very small" 
## (Rules: cohen1988)
# -> Unterschied ist sehr klein

Plot & Prozente:

verteilung_WORK_HOURS_DIF <- verteilung(shp_u26, WORK_HOURS_DIF)
verteilung_WORK_HOURS_DIF_plot <- verteilung_densityplot(shp_u26, WORK_HOURS_DIF) + 
  labs(title = "Merkmalverteilung: WORK_HOURS_DIF",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "Abs. Häufigkeit") + 
  theme_minimal() +
  theme(plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")
verteilung_WORK_HOURS_DIF_plot

shp_u26 %>% 
  ggplot(aes(x=WORK_HOURS_DIF, colour=GEN)) + 
  geom_density(alpha=0.1) +
  theme_minimal() 

# as.factor & Prozente
shp_u26 <- shp_u26 %>% 
  mutate(WORK_HOURS_DIF_fac = case_when(
    WORK_HOURS_DIF < 0 ~ "im Minus",
    WORK_HOURS_DIF %in% 0 ~ "auf Null",
    WORK_HOURS_DIF > 0 ~ "im Plus"
  ))

round(prop.table(table(shp_u26$GEN, shp_u26$WORK_HOURS_DIF_fac),1),2)*100
##                  
##                   auf Null im Minus im Plus
##   Gen Y ('81-'95)       54        7      38
##   Gen Z ('96-'10)       57       10      33

Regression & Vorhergesagte Werte:

lm_WORK_HOURS_DIF <- lm(WORK_HOURS_DIF ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_WORK_HOURS_DIF)
## 
## ===================================
##                         Model 1    
## -----------------------------------
## (Intercept)                33.81   
##                           (53.06)  
## GEN_revGen Y ('81-'95)      0.07   
##                            (0.32)  
## AGE                         1.46 **
##                            (0.46)  
## AGE2                       -0.03 * 
##                            (0.01)  
## YEAR                       -0.03   
##                            (0.03)  
## -----------------------------------
## R^2                         0.01   
## Adj. R^2                    0.01   
## Num. obs.               14761      
## ===================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_WORK_HOURS_DIF <- predicts(lm_WORK_HOURS_DIF, c("F", "mean", "mean", "2002-2022"))

v_predicted_WORK_HOURS_DIF %>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_WORK_HOURS_DIF <- predicts(lm_WORK_HOURS_DIF, c("F", "mean", "mean", "2002-2022"),
                                         position = 1)

STEREOTYP 2: Gen Z = nicht loyal?

JOB_CHANGE (in den letzten 12 Monaten)

round(prop.table(table(shp_u26$GEN, shp_u26$JOB_CHANGE),1),2)*100
##                  
##                   Ja Nein
##   Gen Y ('81-'95)  2   98
##   Gen Z ('96-'10)  2   98

JOB_CHANGE_REAS

df_JOB_CHANGE_REAS <-as.data.frame(round(prop.table(table(shp_u26$GEN, shp_u26$JOB_CHANGE_REAS),1),2)) %>%  
  pivot_wider(names_from = Var1, values_from = Freq) %>% 
  filter(!`Gen Z ('96-'10)` %in% 0) 


#Visualisierung rangiert nach Gen Z
dumbbell_JOB_CHANGE_REAS <- ggplot(df_JOB_CHANGE_REAS) +
  aes(y = reorder(Var2, `Gen Z ('96-'10)`), x = `Gen Z ('96-'10)`, xend = `Gen Y ('81-'95)`) +
  geom_dumbbell(size = 1.5, size_x = 2, size_xend = 2, color = "gray71", 
                colour_x = "#0f6599", colour_xend = "#d7191c") +
  labs(title = "Gründe für Jobwechsel", 
       subtitle = "nach Generationen, in %",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  scale_x_continuous(labels = scales::percent) +
  theme_minimal() +
  theme(plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot") +
  geom_text(data = filter(df_JOB_CHANGE_REAS, Var2 == "Ausbildung, Praktikum, Studium (Ende, Anfang, Abbruch, Weiterbildung)"),
            aes(x=`Gen Z ('96-'10)`, y = Var2, label = "Gen Z"),
            color = "#0f6599", size = 3, vjust = -1.5) +
  geom_text(data = filter(df_JOB_CHANGE_REAS, Var2 == "Ausbildung, Praktikum, Studium (Ende, Anfang, Abbruch, Weiterbildung)"),
            aes(x=`Gen Y ('81-'95)`, y = Var2, label = "Gen Y"),
            color = "#d7191c", size = 3, vjust = -1.5)
dumbbell_JOB_CHANGE_REAS

STEREOTYP 3: Gen Z = balancierter (Work-Life-Balance)?

DISCONNECT

Erste Eindrücke:

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$DISCONNECT, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars     n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 11392 2.48 2.46      2    2.17 2.97   0  10    10 0.81    -0.22 0.02
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 6036 2.46 2.45      2    2.14 2.97   0  10    10 0.86    -0.06 0.03
hist(shp_u26$DISCONNECT)

# nicht normalverteilt -> nicht parametrisch

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(DISCONNECT, na.rm=T),
            median = median(DISCONNECT, na.rm=T),
            sd = sd(DISCONNECT, na.rm=T)) %>% 
  ungroup %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=DISCONNECT, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(~YEAR) +
  labs(title = "Schwierigkeit, sich von Arbeit zu trennen",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$DISCONNECT ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value Pr(>F)
## group     1  0.6796 0.4097
##       17426
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für DISCONNECT sind NICHT unterschiedlich zw. Gen Y & Gen Z (weil p-Wert NICHT signifikant).
# Mann-Withney U Test (weil Nicht-Parametrisch & Heterogene Varianz), um Signifikanz der Unterschiede zu prüfen
library(rstatix)
shp_u26 %>%
  wilcox_test(DISCONNECT ~ GEN,
              detailed = TRUE) %>% 
  glimpse()
## Rows: 1
## Columns: 12
## $ estimate    <dbl> 2.193308e-05
## $ .y.         <chr> "DISCONNECT"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 11392
## $ n2          <int> 6036
## $ statistic   <dbl> 34483998
## $ p           <dbl> 0.739
## $ conf.low    <dbl> -4.128818e-05
## $ conf.high   <dbl> 3.647266e-05
## $ method      <chr> "Wilcoxon"
## $ alternative <chr> "two.sided"
# -> kein signifikanter Effekt, dementsprechend berechne ich auch keine Effektgrösse

Plot:

# Lineplot über Zeit mit allen Datenpunkten ----
shp_u26 %>%
  #Plot
  ggplot(aes(y=DISCONNECT, x = YEAR, colour = GEN)) +
  #geom_point(alpha=0.1) +
  geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Schwierigkeit, sich von Arbeit zu trennen",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(DISCONNECT, na.rm=T),
            median = median(DISCONNECT, na.rm=T),
            sd = sd(DISCONNECT, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Schwierigkeit, sich von Arbeit zu trennen",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten, nicht gefiltert nach Alter ----
shp %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(DISCONNECT, na.rm=T),
            median = median(DISCONNECT, na.rm=T),
            sd = sd(DISCONNECT, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Schwierigkeit, sich von Arbeit zu trennen",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

Regression & Vorhergesagte Werte:

lm_DISCONNECT <- lm(DISCONNECT ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_DISCONNECT)
## 
## ===================================
##                         Model 1    
## -----------------------------------
## (Intercept)               -26.93 * 
##                           (10.68)  
## GEN_revGen Y ('81-'95)     -0.13 * 
##                            (0.06)  
## AGE                        -0.11   
##                            (0.09)  
## AGE2                        0.01 **
##                            (0.00)  
## YEAR                        0.01 **
##                            (0.01)  
## -----------------------------------
## R^2                         0.03   
## Adj. R^2                    0.03   
## Num. obs.               17428      
## ===================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_DISCONNECT <- predicts(lm_DISCONNECT, c("F", "mean", "mean", "2002-2022"))

v_predicted_DISCONNECT %>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_DISCONNECT <- predicts(lm_DISCONNECT, c("F", "mean", "mean", "2002-2022"),
                                     position = 1)

EXHAUST

Erste Eindrücke:

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$EXHAUST, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars     n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 11387 4.21 2.48      4    4.21 2.97   0  10    10 0.06    -0.75 0.02
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 6037 4.27 2.54      4    4.28 2.97   0  10    10 0.01    -0.81 0.03
hist(shp_u26$EXHAUST)

# einigermassen normalverteilt -> parametrisch

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(EXHAUST, na.rm=T),
            median = median(EXHAUST, na.rm=T),
            sd = sd(EXHAUST, na.rm=T)) %>% 
  ungroup #%>% 
  #filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  #filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=EXHAUST, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(~YEAR) +
  labs(title = "Erschöpfungsgrad nach Arbeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$EXHAUST ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value   Pr(>F)   
## group     1  7.2483 0.007104 **
##       17422                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für EXHAUST sind unterschiedlich zw. Gen Y & Gen Z (weil p-Wert signifikant).
# t-Test
shp_u26 %>% t_test(EXHAUST ~ GEN,
                var.equal = FALSE,
                detailed = TRUE) %>%
  glimpse()
## Rows: 1
## Columns: 15
## $ estimate    <dbl> -0.06113067
## $ estimate1   <dbl> 4.21384
## $ estimate2   <dbl> 4.274971
## $ .y.         <chr> "EXHAUST"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 11387
## $ n2          <int> 6037
## $ statistic   <dbl> -1.525268
## $ p           <dbl> 0.127
## $ df          <dbl> 12046.04
## $ conf.low    <dbl> -0.1396913
## $ conf.high   <dbl> 0.01742994
## $ method      <chr> "T-test"
## $ alternative <chr> "two.sided"
# -> Unterschied ist nicht signifikant, also berechne ich auch keine Effektgrösse

Plot:

# Lineplot über Zeit mit allen Datenpunkten ----
shp_u26 %>%
  #Plot
  ggplot(aes(y=EXHAUST, x = YEAR, colour = GEN)) +
  #geom_point(alpha=0.1) +
  geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Erschöpfungsgrad nach Arbeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(EXHAUST, na.rm=T),
            median = median(EXHAUST, na.rm=T),
            sd = sd(EXHAUST, na.rm=T)) %>% 
#Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Erschöpfungsgrad nach Arbeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten, nicht gefiltert nach Alter ----
shp %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(EXHAUST, na.rm=T),
            median = median(EXHAUST, na.rm=T),
            sd = sd(EXHAUST, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Erschöpfungsgrad nach Arbeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

Regression & Vorhergesagte Werte:

lm_EXHAUST <- lm(EXHAUST ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_EXHAUST)
## 
## ===================================
##                         Model 1    
## -----------------------------------
## (Intercept)               -26.42 * 
##                           (11.03)  
## GEN_revGen Y ('81-'95)     -0.01   
##                            (0.07)  
## AGE                         0.14   
##                            (0.09)  
## AGE2                       -0.00   
##                            (0.00)  
## YEAR                        0.01 **
##                            (0.01)  
## -----------------------------------
## R^2                         0.00   
## Adj. R^2                    0.00   
## Num. obs.               17424      
## ===================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_EXHAUST <- predicts(lm_EXHAUST, c("F", "mean", "mean", "2002-2022"))

v_predicted_EXHAUST %>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_EXHAUST <- predicts(lm_EXHAUST, c("F", "mean", "mean", "2002-2022"),
                                position = 1)

SAT_FREE

Erste Eindrücke:

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$SAT_FREE, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars     n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 11088 6.56 2.27      7    6.67 1.48   0  10    10 -0.44    -0.21 0.02
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 5933 6.59 2.19      7    6.67 1.48   0  10    10 -0.42    -0.16 0.03
hist(shp_u26$SAT_FREE)

# nicht normalverteilt -> nicht parametrisch

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_FREE, na.rm=T),
            median = median(SAT_FREE, na.rm=T),
            sd = sd(SAT_FREE, na.rm=T)) %>% 
  ungroup %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=SAT_FREE, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(~YEAR) +
  labs(title = "Zufriedenheit mit Freizeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$SAT_FREE ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value   Pr(>F)   
## group     1  9.7021 0.001844 **
##       17019                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für SAT_FREE sind unterschiedlich zw. Gen Y & Gen Z (weil p-Wert signifikant).
# Mann-Withney U Test (weil Nicht-Parametrisch & Heterogene Varianz), um Signifikanz der Unterschiede zu prüfen
library(rstatix)
shp_u26 %>%
  wilcox_test(SAT_FREE ~ GEN,
              detailed = TRUE) %>% 
  glimpse()
## Rows: 1
## Columns: 12
## $ estimate    <dbl> -8.115041e-05
## $ .y.         <chr> "SAT_FREE"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 11088
## $ n2          <int> 5933
## $ statistic   <dbl> 32850500
## $ p           <dbl> 0.889
## $ conf.low    <dbl> -4.810397e-05
## $ conf.high   <dbl> 4.65107e-05
## $ method      <chr> "Wilcoxon"
## $ alternative <chr> "two.sided"
# -> kein signifikanter Effekt, dementsprechend berechne ich auch keine Effektgrösse

Plot:

# Lineplot über Zeit mit allen Datenpunkten ----
shp_u26 %>%
  #Plot
  ggplot(aes(y=SAT_FREE, x = YEAR, colour = GEN)) +
  #geom_point(alpha=0.1) +
  geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Zufridenheit mit Freizeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_FREE, na.rm=T),
            median = median(SAT_FREE, na.rm=T),
            sd = sd(SAT_FREE, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Zufridenheit mit Freizeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten, nicht gefiltert nach Alter ----
shp %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_FREE, na.rm=T),
            median = median(SAT_FREE, na.rm=T),
            sd = sd(SAT_FREE, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Zufridenheit mit Freizeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

Regression & Vorhergesagte Werte:

lm_SAT_FREE <- lm(SAT_FREE ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_SAT_FREE)
## 
## ==================================
##                         Model 1   
## ----------------------------------
## (Intercept)                11.40  
##                           (10.03) 
## GEN_revGen Y ('81-'95)     -0.05  
##                            (0.06) 
## AGE                         0.17 *
##                            (0.08) 
## AGE2                       -0.00 *
##                            (0.00) 
## YEAR                       -0.00  
##                            (0.00) 
## ----------------------------------
## R^2                         0.00  
## Adj. R^2                    0.00  
## Num. obs.               17021     
## ==================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_SAT_FREE <- predicts(lm_SAT_FREE, c("F", "mean", "mean", "2002-2022"))

v_predicted_DISCONNECT%>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_SAT_FREE <- predicts(lm_SAT_FREE, c("F", "mean", "mean", "2002-2022"),
                                     position = 1)

SAT_HOBBY

Erste Eindrücke:

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$SAT_HOBBY, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars     n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 11087 7.71 1.84      8     7.9 1.48   0  10    10 -0.98     1.38 0.02
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 5930 7.68 1.84      8    7.85 1.48   0  10    10 -0.92     1.28 0.02
hist(shp_u26$SAT_HOBBY)

# nicht normalverteilt -> nicht parametrisch

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_HOBBY, na.rm=T),
            median = median(SAT_HOBBY, na.rm=T),
            sd = sd(SAT_HOBBY, na.rm=T)) %>% 
  ungroup %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  filter(YEAR %in% c(2002,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=SAT_HOBBY, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(~YEAR) +
  labs(title = "Zufriedenheit mit Hobbies",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2002-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$SAT_HOBBY ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value  Pr(>F)  
## group     1  2.9321 0.08685 .
##       17015                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für SAT_HOBBY sind ganz wenig unterschiedlich zw. Gen Y & Gen Z (weil p-Wert knapp signifikant).
# Mann-Withney U Test (weil Nicht-Parametrisch & Heterogene Varianz), um Signifikanz der Unterschiede zu prüfen
library(rstatix)
shp_u26 %>%
  wilcox_test(SAT_HOBBY ~ GEN,
              detailed = TRUE) %>% 
  glimpse()
## Rows: 1
## Columns: 12
## $ estimate    <dbl> 1.444944e-05
## $ .y.         <chr> "SAT_HOBBY"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 11087
## $ n2          <int> 5930
## $ statistic   <dbl> 33376595
## $ p           <dbl> 0.0922
## $ conf.low    <dbl> -2.741965e-05
## $ conf.high   <dbl> 3.159556e-05
## $ method      <chr> "Wilcoxon"
## $ alternative <chr> "two.sided"
# -> kein signifikanter Effekt, dementsprechend berechne ich auch keine Effektgrösse

Plot:

# Lineplot über Zeit mit allen Datenpunkten ----
shp_u26 %>%
  #Plot
  ggplot(aes(y=SAT_HOBBY, x = YEAR, colour = GEN)) +
  #geom_point(alpha=0.1) +
  geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Zufridenheit mit Hobbies",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_HOBBY, na.rm=T),
            median = median(SAT_HOBBY, na.rm=T),
            sd = sd(SAT_HOBBY, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Zufridenheit mit Hobbies",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten, nicht gefiltert nach Alter ----
shp %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_HOBBY, na.rm=T),
            median = median(SAT_HOBBY, na.rm=T),
            sd = sd(SAT_HOBBY, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Zufridenheit mit Hobbies",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

Regression & Vorhergesagte Werte:

lm_SAT_HOBBY <- lm(SAT_HOBBY ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_SAT_HOBBY)
## 
## ====================================
##                         Model 1     
## ------------------------------------
## (Intercept)                43.65 ***
##                            (8.21)   
## GEN_revGen Y ('81-'95)     -0.03    
##                            (0.05)   
## AGE                        -0.34 ***
##                            (0.07)   
## AGE2                        0.01 ***
##                            (0.00)   
## YEAR                       -0.02 ***
##                            (0.00)   
## ------------------------------------
## R^2                         0.01    
## Adj. R^2                    0.01    
## Num. obs.               17017       
## ====================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_SAT_HOBBY <- predicts(lm_SAT_HOBBY, c("F", "mean", "mean", "2002-2022"))

v_predicted_DISCONNECT%>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_SAT_HOBBY <- predicts(lm_SAT_HOBBY, c("F", "mean", "mean", "2002-2022"),
                                     position = 1)

STEREOTYP 4: Gen Z = weniger zufrieden (da fordernder, höhere Ansprüche an Job)?

SAT_JOB

Erste Eindrücke:

# deskriptive Statistiken pro Generationsgruppe
describeBy(shp_u26$SAT_JOB, shp_u26$GEN)
## 
##  Descriptive statistics by group 
## group: Gen Y ('81-'95)
##    vars     n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 10756 7.78 1.53      8     7.9 1.48   0  10    10 -0.94     1.92 0.01
## ------------------------------------------------------------ 
## group: Gen Z ('96-'10)
##    vars    n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 6017 7.87 1.56      8       8 1.48   0  10    10 -0.99     2.04 0.02
hist(shp_u26$SAT_JOB)

# nicht normalverteilt -> nicht parametrisch

Varianzanalyse:

# Boxplot inkl. mean
mean <- shp_u26 %>% 
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_JOB, na.rm=T),
            median = median(SAT_JOB, na.rm=T),
            sd = sd(SAT_JOB, na.rm=T)) %>% 
  ungroup %>% 
  filter(YEAR %in% c(2004,2007,2010,2012,2017,2022)) # nur alle 5 Jahre, damit Grafik leserlicher ist

shp_u26 %>% 
  filter(YEAR %in% c(2004,2007,2010,2012,2017,2022)) %>% 
  ggplot(aes(y=SAT_JOB, x = GEN, colour=GEN)) +
  #geom_jitter(alpha = 0.1) +
  geom_boxplot() +
  geom_point(data = mean,
             aes(x = GEN, y = mean),
             shape = 13,
             size = 2) +
  facet_grid(~YEAR) +
  labs(title = "Zufriedenheit mit Job",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2004-2022, 16-26J",
       x = "",
       y = "") +
  theme(legend.position = "bottom",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

# Levene Test um zu testen, ob die Varianzen von den Gruppen (Generationen) homogen sind
car::leveneTest(shp_u26$SAT_JOB ~ shp_u26$GEN)
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value Pr(>F)
## group     1  2.1321 0.1443
##       16771
# Nullhypothese: es gibt keine sign. Unterschiede
# Altenativhypothese: es gibt (mind. 1) sign. Unterschied

#-> Varianzen für SAT_JOB sind NICHT unterschiedlich zw. Gen Y & Gen Z (weil p-Wert NICHT signifikant).
# Mann-Withney U Test (weil Nicht-Parametrisch & Homogene Varianz), um Signifikanz der Unterschiede zu prüfen
library(rstatix)
shp_u26 %>%
  wilcox_test(SAT_JOB ~ GEN,
              detailed = TRUE) %>% 
  glimpse()
## Rows: 1
## Columns: 12
## $ estimate    <dbl> -1.812488e-05
## $ .y.         <chr> "SAT_JOB"
## $ group1      <chr> "Gen Y ('81-'95)"
## $ group2      <chr> "Gen Z ('96-'10)"
## $ n1          <int> 10756
## $ n2          <int> 6017
## $ statistic   <dbl> 31187033
## $ p           <dbl> 6.06e-05
## $ conf.low    <dbl> -9.075913e-05
## $ conf.high   <dbl> -2.463057e-05
## $ method      <chr> "Wilcoxon"
## $ alternative <chr> "two.sided"
# -> kein signifikanter Effekt, dementsprechend berechne ich auch keine Effektgrösse

Plot:

# Lineplot über Zeit mit allen Datenpunkten ----
shp_u26 %>%
  #Plot
  ggplot(aes(y=SAT_JOB, x = YEAR, colour = GEN)) +
  #geom_point(alpha=0.1) +
  geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Zufridenheit mit Job",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_JOB, na.rm=T),
            median = median(SAT_JOB, na.rm=T),
            sd = sd(SAT_JOB, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Zufridenheit mit Job",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(size = 14, face = 2, margin = margin(0, 0, 2, 0), hjust = 0),
        plot.title.position = "plot")

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten, nicht gefiltert nach Alter ----
shp %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(SAT_JOB, na.rm=T),
            median = median(SAT_JOB, na.rm=T),
            sd = sd(SAT_JOB, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  #geom_smooth(method = "lm") +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), limits=c(2002,2022)) +
  labs(title = "Durchsch. Zufridenheit mit Job",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom")

Regression & Vorhergesagte Werte:

lm_SAT_JOB <- lm(SAT_JOB ~ GEN_rev + AGE + AGE2 + YEAR, data = shp_u26) # GEN-Effekt kontrolliert nach AGE, AGE2, YEAR

screenreg(lm_SAT_JOB)
## 
## ====================================
##                         Model 1     
## ------------------------------------
## (Intercept)                42.55 ***
##                            (7.21)   
## GEN_revGen Y ('81-'95)     -0.08 *  
##                            (0.04)   
## AGE                        -0.71 ***
##                            (0.06)   
## AGE2                        0.02 ***
##                            (0.00)   
## YEAR                       -0.01 ***
##                            (0.00)   
## ------------------------------------
## R^2                         0.02    
## Adj. R^2                    0.02    
## Num. obs.               16773       
## ====================================
## *** p < 0.001; ** p < 0.01; * p < 0.05
v_predicted_SAT_JOB <- predicts(lm_SAT_JOB, c("F", "mean", "mean", "2002-2022"))

v_predicted_DISCONNECT%>% 
  ggplot(aes(x = YEAR, y = mean, fill = GEN_rev, colour = GEN_rev)) +
  geom_line() +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2)

dcv_predicted_SAT_JOB <- predicts(lm_SAT_JOB, c("F", "mean", "mean", "2002-2022"),
                                     position = 1)

Plots für Blogbeitrag

# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
p1 <- shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(WORK_HOURS, na.rm=T),
            median = median(WORK_HOURS, na.rm=T),
            sd = sd(WORK_HOURS, na.rm=T),
            perc25 = quantile(WORK_HOURS, 0.25, na.rm=T),
            perc75 = quantile(WORK_HOURS, 0.75, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN, fill = GEN)) +
  geom_point() +
  geom_line() +
  scale_x_continuous(breaks = scales::breaks_width(1), expand=c(0,0.7)) +
  scale_y_continuous(limits = c(0,45)) +
  scale_color_manual(values=c("magenta", "cyan")) +
  scale_fill_manual(values=c("magenta", "cyan")) +
  labs(title = "Durchschnittliche Arbeitszeit pro Woche",
       subtitle = "pro Jahr und Generation, in h",
       caption = "Daten: SHP, 2002-2022, 16-26 Jährige",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        plot.title = element_text(size = 14, face = 2),
        legend.margin=margin(c(-10,0,0,0))
        )
# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
p2 <- shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(DISCONNECT, na.rm=T),
            median = median(DISCONNECT, na.rm=T),
            sd = sd(DISCONNECT, na.rm=T)) %>% 
  #Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), expand=c(0,0.7)) +
  scale_color_manual(values=c("magenta", "cyan")) +
  scale_fill_manual(values=c("magenta", "cyan")) +
  labs(title = "Durchschnittliche Schwierigkeit, sich von Arbeit zu trennen",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2002-2022, 16-26 Jährige",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        plot.title = element_text(size = 14, face = 2),
        legend.margin=margin(c(-10,0,0,0))
        )
# Lineplot über Zeit nur mit jährlichen Durchschnittswerten ----
p3 <- shp_u26 %>% 
  #Durchschnitt berechnen
  group_by(YEAR, GEN) %>% 
  summarize(mean = mean(EXHAUST, na.rm=T),
            median = median(EXHAUST, na.rm=T),
            sd = sd(EXHAUST, na.rm=T)) %>% 
#Plot
  ggplot(aes(x = YEAR, y = mean, colour = GEN)) +
  geom_point() +
  geom_line() +
  scale_y_continuous(limits=c(0,10)) +
  scale_x_continuous(breaks = scales::breaks_width(1), expand=c(0,0.7)) +
  scale_color_manual(values=c("magenta", "cyan")) +
  scale_fill_manual(values=c("magenta", "cyan")) +
  labs(title = "Durchschnittlicher Erschöpfungsgrad nach Arbeit",
       subtitle = "pro Jahr und Generation, 0=gar nicht & 10=absolut",
       caption = "Daten: SHP, 2002-2022, 16-26 Jährige",
       x = "",
       y = "") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        plot.title = element_text(size = 14, face = 2),
        legend.margin=margin(c(-10,0,0,0))
        )
p1

p2

p3

Referenzen:

BFS (2023). Heiratshäufigkeit. https://www.bfs.admin.ch/bfs/de/home/statistiken/bevoelkerung/heiraten-eingetragene-partnerschaften-scheidungen/heiratshaeufigkeit.html

Schröder, M. (2023). Work Motivation Is Not Generational but Depends on Age and Period. J Bus Psychol. https://doi.org/10.1007/s10869-023-09921-8