Ich lade das ‘tidyverse’ Paket.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.1     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Ich lese den Datensatz ‘dat_v1.csv’ ein und speichere ihn als ‘dat’.

dat <- read_csv("dat_v1.csv")
## Rows: 300 Columns: 35
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (7): geschlecht, joblevel, vertragsart, familienstand, teamgroesse, kin...
## dbl (28): id, berufserfahrung, homeoffice_tage, arbeitsstunden, schlafdauer,...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Ich erstelle einen neuen, sauberen Datensatz ‘dat_clean’.

# --- 2. DATENAUFBEREITUNG (WRANGLING) ---

# Ich erstelle einen neuen, sauberen Datensatz 'dat_clean'.
# NEU: Ich filtere erst unmögliche Arbeitszeiten raus (alles über 100 Std ist unplausibel/falsch).
dat_clean <- dat %>%
  filter(arbeitsstunden <= 100) %>% 
  mutate(
    # Schritt A: Ich pole das Item 'pss2' um.
    # Grund: 'pss2' ist positiv formuliert ("Dinge im Griff"), die anderen negativ ("gestresst").
    pss2_revid = 6 - pss2,
    
    # Schritt B: Ich berechne den Stress-Score (PSS-4).
    PSS_4_Score = (pss1 + pss2_revid + pss3 + pss4) / 4
  )

Ich überprüfe kurz die neue Variable ‘PSS_4_Score’.

Grund: Plausibilitätscheck – liegen die Werte wirklich zwischen 1 und 5?

summary(dat_clean$PSS_4_Score)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.75    3.00    3.75    3.46    4.00    4.50

Ich berechne Kennwerte für die gesamte Stichprobe.

Grund: Überblick verschaffen über N, Mittelwerte (M) und Standardabweichungen (SD).

deskriptive_gesamt <- dat_clean %>%
  summarise(
    N = n(),
    M_Arbeit = mean(arbeitsstunden, na.rm = TRUE),
    SD_Arbeit = sd(arbeitsstunden, na.rm = TRUE),
    M_Stress = mean(PSS_4_Score, na.rm = TRUE),
    SD_Stress = sd(PSS_4_Score, na.rm = TRUE)
  )

Ich lasse mir das Ergebnis anzeigen.

print(deskriptive_gesamt)
## # A tibble: 1 × 5
##       N M_Arbeit SD_Arbeit M_Stress SD_Stress
##   <int>    <dbl>     <dbl>    <dbl>     <dbl>
## 1   291     38.2      4.99     3.46     0.625

Ich berechne die Kennwerte getrennt nach Geschlecht.

Grund: Das brauche ich für meine Nebenfrage (Vergleich Männer vs. Frauen).

deskriptive_geschlecht <- dat_clean %>%
  group_by(geschlecht) %>% 
  summarise(
    N = n(),
    M_Stress = mean(PSS_4_Score, na.rm = TRUE),
    SD_Stress = sd(PSS_4_Score, na.rm = TRUE)
  )

Ergebnis anzeigen.

print(deskriptive_geschlecht)
## # A tibble: 2 × 4
##   geschlecht     N M_Stress SD_Stress
##   <chr>      <int>    <dbl>     <dbl>
## 1 m            146     3.49     0.616
## 2 w            145     3.43     0.635

— HAUPTFRAGE (H1): Zusammenhang Arbeitszeit & Stress —

Ich berechne eine Korrelation (Pearson).

Grund: Beide Variablen (Arbeitsstunden und Stress-Score) sind metrisch.

test_h1 <- cor.test(dat_clean$arbeitsstunden, dat_clean$PSS_4_Score)
print(test_h1)
## 
##  Pearson's product-moment correlation
## 
## data:  dat_clean$arbeitsstunden and dat_clean$PSS_4_Score
## t = 1.1563, df = 289, p-value = 0.2485
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.04749123  0.18142615
## sample estimates:
##        cor 
## 0.06786055

Ich erstelle ein Streudiagramm (Scatterplot).

Grund: Ich will den Zusammenhang auch visuell prüfen (gibt es einen Trend?).

ggplot(dat_clean, aes(x = arbeitsstunden, y = PSS_4_Score)) +
  geom_point(alpha = 0.5) +               # Zeichnet die Punkte (leicht transparent)
  geom_smooth(method = "lm", color = "blue") + # Fügt eine lineare Trendlinie hinzu
  labs(
    title = "Zusammenhang von Arbeitszeit und Stress",
    x = "Wöchentliche Arbeitsstunden",
    y = "Stress (PSS-4 Score)"
  ) +
  theme_minimal() # Macht den Hintergrund schön schlicht
## `geom_smooth()` using formula = 'y ~ x'

— NEBENFRAGE (H2): Unterschied Männer vs. Frauen —

Ich berechne die Effektstärke Cohen’s d manuell.

Grund: Der t-Test gibt mir nur die Signifikanz, ich will aber auch die Relevanz wissen.

# 1. t-Test rechnen
# WICHTIG:'dat_clean'
test_h2 <- t.test(PSS_4_Score ~ geschlecht, data = dat_clean, var.equal = TRUE) 
print(test_h2)
## 
##  Two Sample t-test
## 
## data:  PSS_4_Score by geschlecht
## t = 0.70651, df = 289, p-value = 0.4804
## alternative hypothesis: true difference in means between group m and group w is not equal to 0
## 95 percent confidence interval:
##  -0.09253892  0.19617615
## sample estimates:
## mean in group m mean in group w 
##        3.486301        3.434483
# 2. Effektstärke Cohen's d berechnen
m_frauen <- deskriptive_geschlecht %>% filter(geschlecht == "w") %>% pull(M_Stress)
m_maenner <- deskriptive_geschlecht %>% filter(geschlecht == "m") %>% pull(M_Stress)

sd_gesamt <- sd(dat_clean$PSS_4_Score, na.rm = TRUE)

d_final <- (m_frauen - m_maenner) / sd_gesamt

print(paste("Cohen's d:", round(d_final, 2)))
## [1] "Cohen's d: -0.08"
# 3. Grafik zur Nebenfrage (H2): Boxplot
# Grund: Visualisierung der Verteilung (Mittelwerte und Streuung) für beide Gruppen.
ggplot(dat_clean, aes(x = geschlecht, y = PSS_4_Score, fill = geschlecht)) +
  geom_boxplot() +
  labs(
    title = "Stresslevel im Vergleich: Männer vs. Frauen",
    x = "Geschlecht",
    y = "Stress (PSS-4 Score)"
  ) +
  theme_minimal() +
  theme(legend.position = "none")