Niniejsza analiza przedstawia związek między stylem życia studentów, czynnikami demograficznymi i akademickimi a samopoczuciem młodych dorosłych. Celem raportu jest identyfikacja powodów, które powodują pogorszenie zdrowia psychicznego u badanej grupy.
Dane pochodzą ze strony kaggle. Zostały zebrane za pomocą elektronicznych ankiet rozesłanych studentom kierunków informatycznych. Odpowiedzi studentów oczyszczono, zanonimizowano i ujednolicono. Analiza tych danych jest istotna, ponieważ zdrowie psychiczne młodych dorosłych pogorszyło się w ostatnich latach, a zrozumienie przyczyn tego stanu może pomóc w szukaniu rozwiązań.
library(tidyverse)
library(knitr)
library(DT)
library(readr)
library(RColorBrewer)
library(patchwork)
library(fmsb)
library(plotly)
library(ggcorrplot)
Poniższa interaktywna tabela przedstawia pełen zbiór danych zawierający 21 kolumn. Pozwala ona na wgląd w surowe informacje o każdym ze studentów.
DT::datatable(studenci,
options = list(scrollX = TRUE),
caption = "Pełen zbiór danych")
Do dalszej części badania wybrano zmienne mające kluczowy wpływ na zdrowie psychiczne. Nazwy kolumn zostały przetłumaczone dla zwiększenia czytelności raportu.
dane_wybrane <- studenci %>%
select(gender, age, cgpa, average_sleep, academic_pressure, depression) %>%
rename(
Płeć = gender,
Wiek = age,
"Średnia ocen" = cgpa,
"Średni sen" = average_sleep,
"Presja akademicka" = academic_pressure,
"Depresja" = depression
)
DT::datatable(dane_wybrane, caption = "Podstawowe wskaźniki zdrowia psychicznego i nauki")
W celu przygotowania danych do analizy przeprowadzono konfigruację typów zmiennych.
studenci_analiza <- studenci %>%
mutate(
gender = as.factor(gender),
university = as.factor(university),
degree_level = as.factor(degree_level),
degree_major = as.factor(degree_major),
campus_discrimination = as.factor(campus_discrimination),
academic_year = as.factor(academic_year),
cgpa = as.factor(cgpa),
residential_status = as.factor(residential_status),
sports_engagement = as.factor(sports_engagement),
average_sleep = as.factor(average_sleep),
stress_relief_activities = as.character(stress_relief_activities),
academic_workload = as.numeric(academic_workload),
academic_pressure = as.numeric(academic_pressure),
financial_concerns = as.numeric(financial_concerns),
study_satisfaction = as.numeric(study_satisfaction),
social_relationships = as.numeric(social_relationships),
depression = as.numeric(depression),
anxiety = as.numeric(anxiety),
isolation = as.numeric(isolation),
future_insecurity = as.numeric(future_insecurity),
age = as.numeric(age)
)
ggplot(studenci_analiza, aes(x = gender, fill = gender)) +
geom_bar() +
scale_fill_manual(values = c("Female" = "#FFB6C1", "Male" = "#ADD8E6")) +
scale_x_discrete(labels = c("Female" = "Kobiety", "Male" = "Mężczyźni")) +
labs(title = "Struktura płci", x = "Płeć", y = "Liczba studentów") +
theme_minimal() +
theme(legend.position = "none") #ukrycie legendy
ggplot(studenci_analiza, aes(x = degree_major, fill = degree_major)) +
geom_bar() +
scale_fill_brewer(palette = "Pastel1") +
scale_x_discrete(labels = c("Computer Science" = "Informatyka", "Information Technology" = "Technologie IT",
"Software Engineering" = "Inżynieria oprogramowania",
"Data Science" = "Analiza danych")) +
labs(title = "Rozkład kierunków studiów", x = "Kierunek studiów", y = "Liczba studentów") +
theme_minimal() +
theme(legend.position = "none")
ggplot(studenci_analiza, aes(x = age)) +
geom_histogram(binwidth = 1, fill = "#eda8e0", color = "white") +
geom_vline(aes(xintercept = mean(age)),
color = "skyblue",
size = 1) +
scale_x_continuous(breaks = seq(17, 26, by = 1)) +
annotate("text",
x = mean(studenci_analiza$age) + 1,
y = 5,
label = paste("Średnia wieku:", round(mean(studenci_analiza$age), 0)),
color = "black") +
labs(title = "Rozkład wieku z zaznaczoną średnią", x = "Wiek", y = "Liczba studentów") +
theme_minimal()
ggplot(studenci_analiza, aes(x = academic_year, fill = academic_year)) +
geom_bar() +
scale_fill_brewer(palette = "Pastel1", direction = -1) + #bierze od tylu kolory z palety
scale_x_discrete(labels = c("1st year" = "Pierwszy rok",
"2nd year" = "Drugi Rok",
"3rd year" = "Trzeci Rok",
"4th year" = "Czwarty Rok")) +
labs(title = "Rok studiów", x = "Rok studiów", y = "Liczba studentów") +
theme_minimal() +
theme(legend.position = "none")
wykres1 <- studenci_analiza %>%
group_by(average_sleep) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = average_sleep, y = srednia, fill = average_sleep)) +
ylim(0, 5) +
geom_bar(stat = "identity") +
scale_fill_manual(values = brewer.pal(9, "Pastel1")[c(7, 8, 1)]) +
theme_minimal() + theme(legend.position = "none") +
scale_x_discrete(labels = c("2-4 hrs" = "2-4 h", "4-6 hrs" = "4-6 h", "7-8 hrs" = "7-8 h")) +
labs(title = "Sen", x = "Średnia długość snu", y = "Średni poziom nasilenia objawów depresyjnych")
wykres2 <- studenci_analiza %>%
group_by(sports_engagement) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = sports_engagement, y = srednia, fill = sports_engagement)) +
ylim(0, 5) +
geom_bar(stat = "identity") + #zeby sam nie liczyl, tylko wzial z sredniej
scale_fill_manual(values = brewer.pal(9, "Pastel1")[c(3, 4, 5, 6)]) +
scale_x_discrete(labels = c("1-3 times" = "1-3", "4-6 times" = "4-6", "7+ times" = "7+", "No Sports" = "Brak sportu")) +
theme_minimal() + theme(legend.position = "none") +
labs(title = "Sport",x = "Średnia ilość treningów w tygodniu", y = "")
wykres1 + wykres2
wykres1 <- studenci_analiza %>%
group_by(gender) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = gender, y = srednia, fill = gender)) +
geom_bar(stat = "identity") +
ylim(0, 5) +
scale_fill_manual(values = c("Female" = "#FFB6C1", "Male" = "#ADD8E6")) +
theme_minimal() + theme(legend.position = "none") +
scale_x_discrete(labels = c("Female" = "Kobiety", "Male" = "Mężczyźni")) +
labs(title = "Płeć", x = "Płeć", y = "Średni poziom nasilenia objawów depresyjnych")
srednie_wiek <- studenci_analiza %>%
group_by(age) %>%
summarise(srednia = mean(depression))
wykres2 <- ggplot(srednie_wiek, aes(x = age, y = srednia)) +
geom_col(fill = "#eda8e0", color = "white") +
scale_x_continuous(breaks = seq(17, 26, by = 1)) +
theme_minimal() +
labs(title = "Wiek", x = "Wiek",
y = "")
wykres1 + wykres2
wykres1 <- studenci_analiza %>%
group_by(residential_status) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = residential_status, y = srednia, fill = residential_status)) +
geom_bar(stat = "identity") +
ylim(0, 5) +
scale_fill_manual(values = c("On-Campus" = "#a0e092", "Off-Campus" = "#82dce8")) +
theme_minimal() + theme(legend.position = "none") +
scale_x_discrete(labels = c("On-Campus" = "Na terenie kampusu", "Off-Campus" = "Poza terenem kampusu")) +
labs(title = "Miejsce zamieszkania", x = "Zakwaterowanie", y = "Średni poziom nasilenia objawów depresyjnych")
srednie_problemy <- studenci_analiza %>%
group_by(financial_concerns) %>%
summarise(srednia = mean(depression))
wykres2 <- ggplot(srednie_problemy, aes(x = financial_concerns, y = srednia)) +
geom_col(fill = "#ebeb9d", color = "white") +
scale_x_continuous(breaks = seq(0, 5, by = 1)) +
ylim(0, 5) +
xlim(0, 5) +
theme_minimal() +
labs(title = "Stopień obaw finansowych", y = "",
x = "Poczucie trudności materialnych")
wykres1 + wykres2
rokstudiow <- studenci_analiza %>%
group_by(academic_year) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = academic_year, y = srednia, fill = academic_year)) +
geom_bar(stat = "identity") +
ylim(0, 5) +
coord_flip() +
scale_fill_brewer(palette = "Pastel1", direction = -1) +
theme_minimal() + theme(legend.position = "none") +
scale_x_discrete(labels = c("1st year" = "Pierwszy rok",
"2nd year" = "Drugi Rok",
"3rd year" = "Trzeci Rok",
"4th year" = "Czwarty Rok")) +
labs(title = "Rok studiów", x = "Rok studiów", y = "")
kierunek <- studenci_analiza %>%
group_by(degree_major) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = degree_major, y = srednia, fill = degree_major)) +
geom_bar(stat = "identity") +
ylim(0, 5) +
coord_flip() +
scale_fill_brewer(palette = "Pastel1") +
scale_x_discrete(labels = c("Computer Science" = "Informatyka", "Information Technology" = "Technologie IT",
"Software Engineering" = "Inżynieria oprogramowania",
"Data Science" = "Analiza danych")) +
theme_minimal() + theme(legend.position = "none") +
labs(title = "Kierunek Studiów", x = "Kierunek Studiów", y = "")
(rokstudiow + kierunek) +
plot_annotation(caption = "Średni poziom nasilenia objawów depresyjnych") &
theme(plot.caption = element_text(size = 10, hjust = 0.5)) # centrowanie podpisu
satysfakcja <- studenci_analiza %>%
group_by(study_satisfaction) %>%
summarise(srednia = mean(depression))
satysfakcjaznauki <- ggplot(satysfakcja, aes(x = study_satisfaction, y = srednia)) +
geom_col(fill = "#8bf0e9", color = "white") +
scale_x_continuous(breaks = seq(0, 5, by = 1)) +
ylim(0, 5) +
xlim(0, 5) +
theme_minimal() +
labs(title = "Stopień satysfakcji z nauki", y = "Średni poziom nasilenia objawów depresyjnych",
x = "Poziom poczucia satysfakcji z nauki")
sredniaocen <- studenci_analiza %>%
group_by(cgpa) %>%
summarise(srednia = mean(depression)) %>%
ggplot(aes(x = cgpa, y = srednia, fill = cgpa)) +
geom_bar(stat = "identity") +
ylim(0, 5) +
scale_fill_manual(values = brewer.pal(9, "Pastel1")[c(2, 9, 7, 5, 8, 1)]) +
theme_minimal() + theme(legend.position = "none") +
labs(title = "Średnia ocen", x = "Średnia ocen", y = "")
satysfakcjaznauki + sredniaocen
presja <- studenci_analiza %>%
group_by(academic_pressure) %>%
summarise(srednia = mean(depression))
presjanauka <- ggplot(presja, aes(x = academic_pressure, y = srednia)) +
geom_col(fill = brewer.pal(9, "Pastel1")[3],, color = "white") +
scale_x_continuous(breaks = seq(0, 5, by = 1)) +
ylim(0, 5) +
xlim(0, 5) +
theme_minimal() +
labs(title = "Stopień presji akademickiej", y = "Średni poziom nasilenia objawów depresyjnych",
x = "Poziom odczuwania presji spowodowanej nauką")
praca <- studenci_analiza %>%
group_by(academic_workload) %>%
summarise(srednia = mean(depression))
pracanauka <- ggplot(praca, aes(x = academic_workload, y = srednia)) +
geom_col(fill = "#c689e0", color = "white") +
scale_x_continuous(breaks = seq(0, 5, by = 1)) +
ylim(0, 5) +
xlim(0, 5) +
theme_minimal() +
labs(title = "Poziom obciążenia nauką", y = "",
x = "Poczucie natłoku pracy")
presjanauka + pracanauka
Wykres prezentuje wielowymiarowy profil obciążeń psychicznych studenta. Równomierny rozkład wyników na siatce wskazuje na współwystępowanie depresji, lęku, izolacji i niepewności przyszłości na zbliżonym poziomie.
radar_data <- studenci_analiza %>%
summarise(
Depresja = mean(depression),
Lęk = mean(anxiety),
Izolacja = mean(isolation),
`Niepewność\nprzyszłości` = mean(future_insecurity)
)
radar_final <- rbind(rep(4,4), rep(2,4), radar_data) #to mowi powtorz 4 razy liczbe 4 i powtorz 4 razy 2
#na poczatku trzeba wziac max i min
par(mar = c(1, 1, 2, 1)) #marginesy: dol, lewo, gora, prawo
radarchart(radar_final,
axistype = 1, #typy osi
pcol = "#FF69B4", # Kolor linii
pfcol = rgb(255, 105, 180, alpha = 100, maxColorValue = 255), # Wypełnienie (różowy z przezroczystością 0.4)
plwd = 3, # grubosc linii
cglcol = "grey80", #kKolor siatki
cglty = 1, # viagla linia siatki
axislabcol = "grey50",
caxislabels = seq(2, 4, 0.5), # skala od 0 do 5, co 1
cglwd = 0.8, #grubosc linii siatki
vlcex = 1.1, # Wielkość czcionki nazw zmiennych
title = "Profil obciążeń psychicznych przeciętnego studenta"
)
Mapa cieplna pozwala przanalizować stopień korelacj między różnymi rodzajami obciążeń psychicznych. Zestawienie to pozwala zauważyć silny związek między depresją a lękiem oraz depresją i izolacją.
macierz <- cor(studenci_analiza[, c("depression", "anxiety", "isolation", "future_insecurity")])
nazwy <- c("Depresja", "Lęk", "Izolacja", "Niepewność przyszłości")
par(mar = c(1, 1, 2, 1))
colnames(macierz) <- nazwy
rownames(macierz) <- nazwy
ggcorrplot(macierz,
lab = TRUE, #wypisuje wynik na kratce
colors = c("#96c4e3", "white", "#FF69B4"),
title = "Związek między problemami",
hc.order = TRUE, outline.color = "white")
Wykres obrazuje strukturę strategii radzenia sobie ze stresem. Rozkład ten wykazuje, że najczęstszymi sposobami radzenia sobie ze stresem są Aktywności Religijne, Rozrywka Online oraz Kontakty Społeczne.
fig <- studenci_analiza %>%
separate_rows(stress_relief_activities, sep = ", ") %>%
mutate(stress_relief_activities = recode(stress_relief_activities, "Online Entertainment" = "Rozrywka Online", "Religious Activities" = "Aktywności Religijne", "Social Connections" = "Kontakty Społeczne", "Outdoor Activities" = "Aktywności na świeżym powietrzu", "Sports and Fitness" = "Sport i Fitness", "Nothing" = "Nic", "Sleep" = "Sen", "Creative Outlets" = "Kreatywne ujście")) %>%
plot_ly(x = ~stress_relief_activities,
type = 'histogram',
marker = list(color = 'hotpink')) %>%
layout(title = 'Sposoby radzenia sobie ze stresem',
plot_bgcolor = 'white',
paper_bgcolor = 'white',
xaxis = list(
title = "Czynność",
gridcolor = 'grey80',
zerolinecolor = 'grey80' #kolor linii 0
),
yaxis = list(
title = "Liczba Studentów",
gridcolor = 'grey80',
zerolinecolor = 'grey80'
)
)
fig
Schemat pokazuje związek między strategią radzenia sobie ze stresem, a nasileniem objawów depresyjnych. Stosunkowo równomierny rozkład wskazuje na brak dużego związku między sposobem regulacji emocji, a pogorszeniem nastroju.
fig <- studenci_analiza %>%
separate_rows(stress_relief_activities, sep = ", ") %>%
mutate(stress_relief_activities = recode(stress_relief_activities, "Online Entertainment" = "Rozrywka Online",
"Religious Activities" = "Aktywności Religijne",
"Social Connections" = "Kontakty Społeczne",
"Outdoor Activities" = "Aktywności na świeżym powietrzu",
"Sports and Fitness" = "Sport i Fitness",
"Nothing" = "Nic", "Sleep" = "Sen",
"Creative Outlets" = "Kreatywne ujście")) %>%
group_by(stress_relief_activities) %>%
summarise(srednia = mean(depression)) %>%
plot_ly(x = ~stress_relief_activities, y = ~ srednia,
type = 'bar', #histogram sam liczy i policzylby l studentow zamiast depresji
marker = list(color = 'hotpink')) %>%
layout(title = 'Sposoby radzenia sobie ze stresem',
plot_bgcolor = 'white',
paper_bgcolor = 'white',
xaxis = list(
title = "Czynność",
gridcolor = 'grey80',
zerolinecolor = 'grey80' #kolor linii 0
),
yaxis = list(
title = "Średni poziom nasilenia objawów depresyjnych",
gridcolor = 'grey80',
zerolinecolor = 'grey80'
)
)
fig
Poniższe zestawienie wizualizuje silną zależność między lękiem, izolacją i depresją.
pal <- c("#7586e6", "#47d1de", "#81d699", "#e5f069", "#f04141")
fig <- plot_ly(data = studenci_analiza, x = ~anxiety, y = ~isolation, color = ~as.factor(depression), colors = pal,
type = 'scatter', # wymusza typ wykresu
mode = 'markers', #zeby byly kropki
marker = list(size = 10)) %>%
layout(
title = list(text = "Relacja poziomu lęku i izolacji względem depresji"),
xaxis = list(title = "Poziom odczuwanego lęku", gridcolor = 'grey80'),
yaxis = list(title = "Poziom izolacji społecznej", gridcolor = 'grey80'),
plot_bgcolor = 'white',
paper_bgcolor = 'white',
legend = list(title = list(text = "Poziom depresji")))
fig
Na podstawie przeprowadzonej analizy można sformułować następujące wnioski: