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")
