Cel i pytania badawcze

Celem raportu jest sprawdzenie, jak średni dzienny czas korzystania z social mediów (Avg_Daily_Usage_Hours) wiąże się z:

Pytania badawcze:

  1. Czy osoby z wyższym czasem korzystania mają wyższy poziom uzależnienia?
  2. Czy wyższy czas korzystania wiąże się z krótszym snem?
  3. Czy wyższy czas korzystania wiąże się z gorszym zdrowiem psychicznym?
  4. Czy wyższy czas korzystania wiąże się z większą liczbą konfliktów?
  5. Czy osoby, które mówią „Yes” (wpływa na naukę), różnią się od „No” (czas, sen, uzależnienie itp.)?

1. Wstęp i opis danych

Analiza została wykonana na zbiorze danych dotyczących korzystania z mediów społecznościowych przez studentów. Temat jest istotny, ponieważ w grupie studentów intensywne korzystanie z social mediów może nakładać się na obowiązki akademickie, rytm dobowy oraz funkcjonowanie psychiczne. W literaturze często wskazuje się m.in. mechanizmy takie jak: rozproszenie uwagi, odkładanie zadań (prokrastynacja), skracanie snu przez używanie telefonu wieczorem oraz stres społeczny związany z porównywaniem się lub konfliktami online.

Zmienne w zbiorze mają w dużej części charakter samoopisowy (deklaracje respondentów). Oznacza to, że raport opisuje zależności obserwacyjne w danych, natomiast nie pozwala na wnioskowanie o przyczynowości (korelacja ≠ przyczyna). Dodatkowo część konstruktów (np. dobrostan psychiczny czy uzależnienie) jest przedstawiona w formie skróconych wskaźników punktowych, dlatego w analizie skupiamy się na porównaniach i kierunku zależności, a nie na „diagnozie” klinicznej.

Zgodnie z opisem zadania, celem zbioru jest pokazanie, w jaki sposób korzystanie z social mediów może wiązać się z codziennym funkcjonowaniem studentów, w szczególności z obszarami takimi jak: wyniki w nauce, jakość snu oraz dobrostan psychiczny. Dane zawierają odpowiedzi studentów z kilku krajów i są przygotowane w formie „czystego” pliku CSV, gotowego do analizy.

Zbiór obejmuje 705 obserwacji (respondentów) oraz 13 zmiennych. W pliku nie występują braki danych (NA). To ułatwia analizę porównawczą oraz estymację modeli.

W danych można wyróżnić trzy grupy zmiennych:

  1. Cechy demograficzne i tło: Age (wiek), Gender (płeć), Academic_Level (poziom edukacji), Country (kraj), Relationship_Status (status związku).
  2. Korzystanie z social mediów: Avg_Daily_Usage_Hours (średni dzienny czas korzystania), Most_Used_Platform (najczęściej używana platforma) oraz Affects_Academic_Performance (deklaracja wpływu na wyniki w nauce: Yes/No).
  3. Wskaźniki w formie skali punktowej: Mental_Health_Score, Conflicts_Over_Social_Media oraz Addicted_Score. W interpretacji przyjmujemy standardowe założenie: wyższa wartość oznacza większe nasilenie danego zjawiska.

W dalszej części raportu czas korzystania z social mediów (Avg_Daily_Usage_Hours) traktujemy jako zmienną kluczową, a pozostałe wskaźniki analizujemy zarówno opisowo (korelacje i wykresy), jak i porównawczo (testy t dla grup Yes/No). Dodatkowo zastosowano modele: liniowy (dla Addicted_Score) oraz logistyczny (dla prawdopodobieństwa odpowiedzi „Yes”), aby sprawdzić, czy zależności utrzymują się po uwzględnieniu kilku cech jednocześnie.

Podstawowe charakterystyki liczbowe próby:

W kolejnych częściach raportu przedstawiono: (1) podstawowe przygotowanie danych, (2) statystyki opisowe, (3) korelacje i wykresy zależności z czasem korzystania, (4) porównanie grup Yes/No testami t-Studenta, a na końcu modele (liniowy i logistyczny) jako uzupełnienie analizy.

1.1 Podgląd danych

Liczba wierszy: 705
Liczba kolumn: 13

Szybki opis zmiennych: typ danych, liczba braków i liczba unikalnych wartości
zmienna typ braki_NA unikalne
Student_ID numeric 0 705
Age numeric 0 7
Gender character 0 2
Academic_Level character 0 3
Country character 0 110
Avg_Daily_Usage_Hours numeric 0 67
Most_Used_Platform character 0 12
Affects_Academic_Performance character 0 2
Sleep_Hours_Per_Night numeric 0 59
Mental_Health_Score numeric 0 6
Relationship_Status character 0 3
Conflicts_Over_Social_Media numeric 0 6
Addicted_Score numeric 0 8

Podgląd pierwszych 8 wierszy danych
Student_ID Age Gender Academic_Level Country Avg_Daily_Usage_Hours Most_Used_Platform Affects_Academic_Performance Sleep_Hours_Per_Night Mental_Health_Score Relationship_Status Conflicts_Over_Social_Media Addicted_Score
1 19 Female Undergraduate Bangladesh 5.2 Instagram Yes 6.5 6 In Relationship 3 8
2 22 Male Graduate India 2.1 Twitter No 7.5 8 Single 0 3
3 20 Female Undergraduate USA 6.0 TikTok Yes 5.0 5 Complicated 4 9
4 18 Male High School UK 3.0 YouTube No 7.0 7 Single 1 4
5 21 Male Graduate Canada 4.5 Facebook Yes 6.0 6 In Relationship 2 7
6 19 Female Undergraduate Australia 7.2 Instagram Yes 4.5 4 Complicated 5 9
7 23 Male Graduate Germany 1.5 LinkedIn No 8.0 9 Single 0 2
8 20 Female Undergraduate Brazil 5.8 Snapchat Yes 6.0 6 In Relationship 2 8

Ten chunk to szybki check, czy dane wczytały się poprawnie:

  • nrow() i ncol() mówią, ile jest obserwacji i zmiennych,
  • tabela metadanych pokazuje typ danych, liczbę braków (NA) i liczbę unikalnych wartości,
  • na końcu jest podgląd kilku pierwszych wierszy, żeby złapać oczywiste błędy.

To ważne, bo jeśli na tym etapie coś jest „nie tak”, to późniejsze wykresy, testy i modele mogą wyjść błędnie.

2. Czyszczenie danych

# Zmiennym kategorycznym ustawiamy factor
cat_cols <- c(
  "Gender", "Academic_Level", "Country", "Most_Used_Platform",
  "Affects_Academic_Performance", "Relationship_Status"
)
cat_cols <- intersect(cat_cols, names(d))

d <- d %>%
  mutate(across(all_of(cat_cols), as.factor)) %>%
  mutate(
    # porządek poziomów Yes/No (żeby w tabelach zawsze było No -> Yes)
    Affects_Academic_Performance = forcats::fct_relevel(Affects_Academic_Performance, "No", "Yes"),
    # kraj: zostaw top 10, reszta = Other
    Country = forcats::fct_lump_n(Country, n = 10, other_level = "Other")
  )

# szybka kontrola braków
colSums(is.na(d))
##                   Student_ID                          Age 
##                            0                            0 
##                       Gender               Academic_Level 
##                            0                            0 
##                      Country        Avg_Daily_Usage_Hours 
##                            0                            0 
##           Most_Used_Platform Affects_Academic_Performance 
##                            0                            0 
##        Sleep_Hours_Per_Night          Mental_Health_Score 
##                            0                            0 
##          Relationship_Status  Conflicts_Over_Social_Media 
##                            0                            0 
##               Addicted_Score 
##                            0

W tym chuncku przygotowujemy dane do analizy (tak, żeby później grupowanie i wykresy działały przewidywalnie).

3. Statystyki opisowe

Statystyki opisowe dla zmiennych liczbowych
Zmienna n srednia mediana sd min max
Addicted_Score 705 6.44 7.0 1.59 2.0 9.0
Age 705 20.66 21.0 1.40 18.0 24.0
Avg_Daily_Usage_Hours 705 4.92 4.8 1.26 1.5 8.5
Conflicts_Over_Social_Media 705 2.85 3.0 0.96 0.0 5.0
Mental_Health_Score 705 6.23 6.0 1.11 4.0 9.0
Sleep_Hours_Per_Night 705 6.87 6.9 1.13 3.8 9.6

W tym chuncku liczymy statystyki opisowe dla wszystkich zmiennych liczbowych.

Wynik stats_tbl to jedna tabela, która pozwala szybko porównać skale i rozrzut zmiennych (np. ile średnio śpią, ile godzin spędzają w SM i jaki jest poziom uzależnienia).

4. Korelacje

W tym punkcie oceniam zależności pomiędzy wybranymi zmiennymi liczbowymi. Ponieważ część zmiennych ma charakter dyskretny/porządkowy (np. skale punktowe 0–10), zastosowano korelację rang Spearmana (rho), która jest odporna na nieliniowość i lepiej pasuje do takich danych niż korelacja Pearsona.

mtext(“Korelacje rang Spearmana (puste pola: p > 0.05)”, side = 3, line = 0.2, cex = 0.9) Macierz pokazuje ogólny obraz zależności pomiędzy zmiennymi. Wartości dodatnie oznaczają, że wraz ze wzrostem jednej zmiennej rośnie druga, a wartości ujemne oznaczają zależność odwrotną. Zastosowane “puste pola” (p > 0.05) pomagają odróżnić zależności statystycznie istotne od nieistotnych. Dodatkowo uporządkowanie metodą klastrowania (hclust) grupuje zmienne o podobnym profilu zależności, co ułatwia interpretację.

4.1 Korelacje: czas w SM vs reszta

Korelacje Spearmana: czas korzystania z SM (h/d) vs pozostałe zmienne (korekta Holm)
Zmienna rho p p_adj
Uzależnienie 0.84 0.000 0.000
Sen (h/noc) -0.81 0.000 0.000
Zdrowie psychiczne -0.80 0.000 0.000
Konflikty w SM 0.80 0.000 0.000
Wiek -0.10 0.007 0.007

Najsilniejsze zależności dotyczą obszaru uzależnienia, konfliktów, snu oraz zdrowia psychicznego. Dla czasu w SM otrzymano m.in.:

uzależnienie: rho = 0.84, p_adj = <0.001

konflikty w SM: rho = 0.80, p_adj = <0.001

sen: rho = -0.81, p_adj = <0.001

zdrowie psychiczne: rho = -0.80, p_adj = <0.001

wiek: rho = -0.10, p_adj = 0.007

W praktyce oznacza to, że większy czas w SM współwystępuje z wyższym uzależnieniem i większą liczbą konfliktów, natomiast jest powiązany z krótszym snem oraz niższą oceną zdrowia psychicznego. Zależność wieku z czasem w SM jest słaba.

4.2 Wizualizacja korelacji (lollipop)

Aby uniknąć problemu “nakładania punktów” (typowego dla wykresów rozrzutu przy danych dyskretnych) przedstawiono korelacje w formie wykresu lollipop, który jest bardziej czytelny i porównywalny.

Wykres potwierdza wnioski z tabeli: najsilniejsze dodatnie zależności dotyczą uzależnienia i konfliktów, natomiast najsilniejsze ujemne zależności dotyczą snu i zdrowia psychicznego. Taka forma prezentacji ułatwia szybkie porównanie siły relacji bez błędnych wrażeń wizualnych, które często pojawiają się przy wykresach rozrzutu dla danych dyskretnych.

4.3 TOP 10 korelacji

TOP 10 najsilniejszych korelacji (Spearman)
Zmienna_1 Zmienna_2 rho p
Uzależnienie Zdrowie psych. -0.95 <0.001
Uzależnienie Konflikty 0.95 <0.001
Konflikty Zdrowie psych. -0.91 <0.001
Uzależnienie Czas (h/d) 0.84 <0.001
Sen (h) Czas (h/d) -0.81 <0.001
Zdrowie psych. Czas (h/d) -0.80 <0.001
Konflikty Czas (h/d) 0.80 <0.001
Uzależnienie Sen (h) -0.79 <0.001
Zdrowie psych. Sen (h) 0.73 <0.001
Konflikty Sen (h) -0.72 <0.001

Wyniki analizy korelacji wskazują na istotne statystycznie oraz jednocześnie silne zależności pomiędzy czasem korzystania z mediów społecznościowych a kluczowymi wskaźnikami funkcjonowania badanych osób, w szczególności snem, oceną zdrowia psychicznego, liczbą konfliktów związanych z SM oraz poziomem uzależnienia. Oznacza to, że czas spędzany w SM nie jest zmienną neutralną opisowo, lecz współwystępuje z szeregiem konsekwencji lub cech, które mogą być interpretowane jako potencjalne obszary ryzyka (np. krótszy sen, gorszy dobrostan psychiczny, większa liczba konfliktów) oraz nasilonego problematycznego używania (wysoki wynik uzależnienia). Jednocześnie należy zaznaczyć, że sama korelacja nie umożliwia wnioskowania o kierunku zależności ani o mechanizmie przyczynowym. W praktyce równie możliwe są scenariusze, w których dłuższy czas w SM wpływa na sen i dobrostan, jak i takie, w których gorszy dobrostan lub problemy ze snem sprzyjają większemu korzystaniu z SM, a także scenariusze z udziałem zmiennych pośredniczących i zakłócających.

Z punktu widzenia dalszej części raportu uzyskane zależności stanowią uzasadnienie dla analiz pogłębionych, takich jak porównania grup (np. osoby o niskim i wysokim czasie korzystania), a także modelowanie wielowymiarowe, w którym można jednocześnie uwzględnić kilka predyktorów i ocenić ich niezależny wkład. Warto jednak zachować ostrożność metodologiczną, ponieważ bardzo silne korelacje pomiędzy częścią wskaźników mogą prowadzić do współliniowości w modelach regresyjnych i obniżać stabilność estymacji parametrów. Dlatego w kolejnych etapach analizy zasadne jest sprawdzenie tego zjawiska (np. poprzez diagnostykę VIF) oraz ewentualne ograniczenie liczby silnie skorelowanych zmiennych lub wybór wskaźników reprezentatywnych. Podsumowując, analiza korelacji dostarcza spójnego obrazu współzależności badanych cech i stanowi solidny punkt wyjścia do dalszych wniosków, przy zachowaniu poprawnej interpretacji statystycznej.

5. Wykresy

W tej sekcji przedstawiono analizę wizualną zależności pomiędzy czasem korzystania z social mediów (Avg_Daily_Usage_Hours) a wybranymi wynikami dotyczącymi funkcjonowania studentów (uzależnienie, sen, dobrostan psychiczny, konflikty). Celem jest wstępne rozpoznanie kierunku i siły związku oraz sprawdzenie, czy w danych widać trendy, które potem testujemy w części statystycznej.

Wykorzystano porównanie grup czasu w SM (np. <=2h, 2–4h, …), pokazane jako boxploty z punktami (jitter). Takie podejście jest bardziej czytelne dla zmiennych w skali punktowej 0–10 (uzależnienie, zdrowie psychiczne, konflikty), bo wartości są dyskretne i na wykresach nie powstają „paski” jak przy klasycznym scatter.

Ważne: są to zależności obserwacyjne. Nawet jeśli trend jest wyraźny, nie oznacza to jeszcze związku przyczynowego (możliwe zmienne trzecie, np. styl życia, stres, obowiązki).

# Skale punktowe (np. 0-10) są dyskretne/porządkowe.
# Dlatego poniżej porównujemy je w grupach czasu spędzanego w SM.
if ("Avg_Daily_Usage_Hours" %in% names(d)) {
  d <- d %>%
    mutate(
      Usage_Group = cut(
        Avg_Daily_Usage_Hours,
        breaks = c(-Inf, 2, 4, 6, 8, Inf),
        labels = c("<=2 h", "2-4 h", "4-6 h", "6-8 h", ">8 h"),
        right = TRUE
      )
    )
}

5.1 Czas w SM vs uzależnienie

# Czas w SM (w grupach) vs uzależnienie (skala 0-10)

ggplot(d, aes(x = Usage_Group, y = Addicted_Score)) +
  geom_boxplot() +
  geom_jitter(width = 0.15, alpha = 0.25) +
  labs(
    title = "Czas w social mediach a poziom uzależnienia (porównanie grup)",
    x = "Czas w SM (godz./dzień, grupy)",
    y = "Wskaźnik uzależnienia (0-10)"
  )

Ten wykres sprawdza, czy osoby spędzające więcej czasu w social mediach mają wyższy wynik Addicted_Score.

  • Patrzymy głównie na medianę (linia w środku pudełka). Jeśli mediana rośnie wraz z grupą czasu, to sugeruje, że dłuższe korzystanie wiąże się z wyższym uzależnieniem.
  • Jeżeli pudełka mocno się nakładają, to różnice między grupami są raczej słabe (duży rozrzut indywidualny).

5.2 Czas w SM vs sen

# Czas w SM (w grupach) vs sen

ggplot(d, aes(x = Usage_Group, y = Sleep_Hours_Per_Night)) +
  geom_boxplot() +
  geom_jitter(width = 0.15, alpha = 0.25) +
  labs(
    title = "Czas w social mediach a sen (porównanie grup)",
    x = "Czas w SM (godz./dzień, grupy)",
    y = "Sen (godz./noc)"
  )

Ten wykres pokazuje związek między czasem w SM a liczbą godzin snu.

  • Jeśli mediany snu są niższe w grupach z większym czasem w SM, to sugeruje, że więcej SM idzie w parze z krótszym snem.
  • Rozrzut w grupach pokazuje, że sen zależy też od innych czynników (czas w SM nie tłumaczy wszystkiego).

5.3 Czas w SM vs zdrowie psychiczne

# Czas w SM (w grupach) vs zdrowie psychiczne (skala 0-10)

ggplot(d, aes(x = Usage_Group, y = Mental_Health_Score)) +
  geom_boxplot() +
  geom_jitter(width = 0.15, alpha = 0.25) +
  labs(
    title = "Czas w social mediach a zdrowie psychiczne (porównanie grup)",
    x = "Czas w SM (godz./dzień, grupy)",
    y = "Wskaźnik zdrowia psychicznego (0-10)"
  )

Ten wykres sprawdza, czy wraz ze wzrostem czasu korzystania z SM zmienia się Mental_Health_Score.

  • Jeśli mediany są niższe w grupach z większym czasem w SM, to sugeruje gorszy wynik zdrowia psychicznego przy dłuższym korzystaniu (w tej skali).
  • Jeżeli pudełka są podobne w każdej grupie, to wizualnie wygląda to na słabą zależność.

5.4 Czas w SM vs konflikty

# Czas w SM (w grupach) vs konflikty (skala 0-10)

ggplot(d, aes(x = Usage_Group, y = Conflicts_Over_Social_Media)) +
  geom_boxplot() +
  geom_jitter(width = 0.15, alpha = 0.25) +
  labs(
    title = "Czas w social mediach a konflikty przez SM (porównanie grup)",
    x = "Czas w SM (godz./dzień, grupy)",
    y = "Konflikty przez SM (0-10)"
  )

Ten wykres pokazuje, czy częstsze korzystanie z social mediów wiąże się z większą liczbą konfliktów Conflicts_Over_Social_Media.

  • Jeśli mediany konfliktów rosną wraz z grupą czasu w SM, to sugeruje dodatnią zależność.
  • Gdy w każdej grupie jest duży rozrzut, oznacza to, że konflikty zależą też od innych rzeczy (np. styl korzystania, relacje, stres).

5.5 Struktura wyboru platform

Wykres pokazuje strukturę najczęściej wybieranych platform w próbie. Taka informacja pomaga zrozumieć, gdzie studenci spędzają najwięcej czasu i które kanały mogą być kluczowe przy interpretacji kolejnych zależności. To opis rozkładu w badanej grupie, bez wniosków o przyczynowości.

5.6 Rozkład czasu korzystania z social mediów

Histogram przedstawia rozkład czasu spędzanego w social mediach. W praktyce oceniamy tu, czy większość osób skupia się przy niższych wartościach (np. kilka godzin), czy występuje ogon po stronie wysokich wartości (pojedyncze osoby z bardzo długim czasem). To ważne przy doborze testów i interpretacji średniej.

5.7 Czas w social mediach a poziom uzależnienia

Wykres pokazuje zależność pomiędzy czasem korzystania a wskaźnikiem uzależnienia. Jeśli widoczny jest trend rosnący, sugeruje to dodatni związek: więcej czasu częściej idzie w parze z wyższym wynikiem uzależnienia. To nadal zależność korelacyjna, nie dowód przyczyny.

5.8 Sen a poziom uzależnienia

Wykres zestawia długość snu z poziomem uzależnienia. Często w danych tego typu widać, że niższy sen współwystępuje z wyższym uzależnieniem. Interpretujemy to jako współwystępowanie cech w próbie, a nie pewny wpływ jednej zmiennej na drugą.

5.9 Czas w social mediach w grupach „Yes/No”

Porównanie pudełkowe pokazuje różnice w czasie korzystania między grupami „Yes/No” (np. deklarowany wpływ na naukę). Patrzymy na medianę, rozrzut i obserwacje odstające. Jeśli rozkłady wyraźnie się rozjeżdżają, to jest to argument za istotną różnicą między grupami.

5.10 Rozkład wskaźnika uzależnienia

Histogram wskaźnika uzależnienia pokazuje, jak rozkłada się wynik w badanej próbie. Dzięki temu widać, czy większość osób ma wyniki umiarkowane, czy są skupienia przy wysokich wartościach. To pomaga ocenić „profil” próby i potencjalne wartości odstające.

5.11 Uzależnienie w grupach „Yes/No”

Wykres pudełkowy porównuje poziom uzależnienia w dwóch grupach „Yes/No”. Różnice w medianie i rozrzucie to szybka wizualna informacja o tym, czy deklaracje uczestników idą w parze z innym poziomem uzależnienia. Pełną ocenę wspiera później test statystyczny.

5.12 Uzależnienie a najczęściej używana platforma

Wykres pokazuje, czy poziom uzależnienia różni się między platformami (np. TikTok, Instagram itd.). To może sugerować, że charakter korzystania jest inny zależnie od aplikacji. Trzeba pamiętać, że grupy mogą mieć różne liczebności, co wpływa na stabilność porównań.

5.13 Wiek a uzależnienie

Wykres zestawia wiek z poziomem uzależnienia. W danych studenckich zakres wieku bywa wąski, więc silny trend nie zawsze musi się pojawić. Jeśli zależność jest słaba, to też jest wynik: wiek w tej próbie może nie różnicować uzależnienia w sposób wyraźny.

5.14 Diagnostyka modelu liniowego: reszty vs dopasowanie

To klasyczny wykres diagnostyczny dla modelu liniowego: reszty w funkcji wartości dopasowanych. Szukamy wzorca (np. „lejka” dla heteroskedastyczności) lub nieliniowości. Jeśli punkty są w miarę losowo rozrzucone wokół zera, założenia modelu są bardziej wiarygodne.

5.15 Diagnostyka modelu liniowego: wykres Q–Q

Wykres Q–Q służy do oceny, czy reszty modelu liniowego są zbliżone do rozkładu normalnego. Punkty blisko prostej sugerują zgodność z normalnością, a odchylenia na końcach mogą wskazywać na grube ogony lub obserwacje odstające. To wpływa na interpretację testów w modelu.

5.16 Korelacje między zmiennymi (corrplot)

Macierz korelacji pokazuje siłę i kierunek zależności liniowych między zmiennymi. Najbardziej „intensywne” pola wskazują pary o najsilniejszym związku. Taki wykres jest też szybkim sposobem na wychwycenie współliniowości przed modelowaniem.

5.17 Krzywa ROC dla modelu logistycznego

Krzywa ROC ocenia jakość klasyfikacji w modelu logistycznym (trade-off między czułością i swoistością). Im bardziej krzywa „idzie do lewego górnego rogu”, tym lepiej model rozróżnia klasy. To ocena predykcyjna, a nie dowód relacji przyczynowej. ## 6. Testy statystyczne {#ttest}

# Porównanie grup Yes vs No

vars_yesno <- c(
  "Avg_Daily_Usage_Hours",
  "Sleep_Hours_Per_Night",
  "Addicted_Score",
  "Mental_Health_Score",
  "Conflicts_Over_Social_Media",
  "Age"
)
vars_yesno <- intersect(vars_yesno, names(d))

res_t <- purrr::map(vars_yesno, ~t.test(reformulate("Affects_Academic_Performance", response = .x), data = d))

names(res_t) <- vars_yesno

# Wyniki (skrót)
purrr::imap(res_t, ~broom::tidy(.x))
## $Avg_Daily_Usage_Hours
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>
## 1    -1.73      3.80      5.54     -25.4 3.23e-99      647.    -1.87     -1.60
## # ℹ 2 more variables: method <chr>, alternative <chr>
## 
## $Sleep_Hours_Per_Night
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>
## 1     1.47      7.81      6.34      23.3 2.37e-88      662.     1.35      1.59
## # ℹ 2 more variables: method <chr>, alternative <chr>
## 
## $Addicted_Score
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic   p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
## 1    -2.87      4.60      7.46     -47.8 8.66e-204      582.    -2.98     -2.75
## # ℹ 2 more variables: method <chr>, alternative <chr>
## 
## $Mental_Health_Score
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic   p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
## 1     1.86      7.42      5.56      40.2 1.43e-180      667.     1.77      1.95
## # ℹ 2 more variables: method <chr>, alternative <chr>
## 
## $Conflicts_Over_Social_Media
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic   p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
## 1    -1.66      1.78      3.44     -42.5 1.91e-186      624.    -1.74     -1.59
## # ℹ 2 more variables: method <chr>, alternative <chr>
## 
## $Age
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl>
## 1    0.400      20.9      20.5      3.59 0.000357      488.    0.181     0.619
## # ℹ 2 more variables: method <chr>, alternative <chr>

W tym chuncku wykonujemy serię testów t-Studenta porównujących dwie grupy studentów:

  • grupa No: osoby, które deklarują, że social media nie wpływają na wyniki w nauce,
  • grupa Yes: osoby, które deklarują, że social media wpływają na wyniki w nauce.

Cała logika jest taka, żeby nie robić testu „ręcznie” dla każdej zmiennej osobno, tylko zrobić to automatycznie w pętli (tutaj pętla jest zrobiona przez purrr::map).

Co dokładnie dzieje się linijka po linijce:

  1. vars_yesno <- c(...) tworzy listę zmiennych liczbowych, które chcemy porównać między grupami. Są tu:

    • Avg_Daily_Usage_Hours (czas w social mediach),
    • Sleep_Hours_Per_Night (sen),
    • Addicted_Score (uzależnienie),
    • Mental_Health_Score (zdrowie psychiczne),
    • Conflicts_Over_Social_Media (konflikty),
    • Age (wiek).
  2. vars_yesno <- intersect(vars_yesno, names(d)) zostawia tylko te zmienne, które faktycznie istnieją w danych d. To jest zabezpieczenie, żeby raport nie wywalił błędu, jeśli jakaś nazwa byłaby inna.

  3. purrr::map(vars_yesno, ~t.test(...)) uruchamia test t dla każdej zmiennej z listy.

    • reformulate("Affects_Academic_Performance", response = .x) buduje formułę typu: ZMIENNA ~ Affects_Academic_Performance czyli np. Sleep_Hours_Per_Night ~ Affects_Academic_Performance.

    • t.test(..., data = d) wykonuje test t-Studenta porównujący średnie dwóch grup (Yes i No). Domyślnie w R jest to wersja Welcha, która nie zakłada równości wariancji.

  4. names(res_t) <- vars_yesno nadaje wynikom nazwy, żeby łatwiej było się w nich odnaleźć (wynik dla snu będzie pod nazwą Sleep_Hours_Per_Night itd.).

  5. purrr::imap(res_t, ~broom::tidy(.x)) konwertuje każdy wynik testu t do „czystej” tabelki.

W tabelkach zwykle pojawiają się m.in.:

  • estimate: różnica średnich (średnia w jednej grupie minus średnia w drugiej),
  • statistic: wartość statystyki t,
  • p.value: wartość p (czy różnica jest istotna statystycznie),
  • conf.low i conf.high: przedział ufności dla różnicy średnich,
  • parameter: stopnie swobody (df).

Jak to interpretować:

  • jeśli p.value jest małe (np. < 0.05), to średnie w grupach Yes i No różnią się istotnie statystycznie,
  • znak estimate mówi kierunek różnicy (czy grupa Yes ma średnio więcej czy mniej),
  • przedział ufności pokazuje, w jakim zakresie może być „prawdziwa” różnica średnich.

To porównanie jest ważne, bo pozwala sprawdzić, czy deklaracja „wpływa na naukę” idzie w parze z realnymi różnicami w zachowaniach i wskaźnikach (czas w SM, sen, uzależnienie, dobrostan, konflikty).

6.1 Średnie w grupach Yes/No

vars <- c(
  "Avg_Daily_Usage_Hours",
  "Sleep_Hours_Per_Night",
  "Addicted_Score",
  "Mental_Health_Score",
  "Conflicts_Over_Social_Media",
  "Age"
)
vars <- intersect(vars, names(d))

means_long <- d %>%
  select(Affects_Academic_Performance, all_of(vars)) %>%
  pivot_longer(
    cols = -Affects_Academic_Performance,
    names_to = "zmienna",
    values_to = "wartosc"
  ) %>%
  group_by(Affects_Academic_Performance, zmienna) %>%
  summarise(
    n = sum(!is.na(wartosc)),
    srednia = mean(wartosc, na.rm = TRUE),
    sd = sd(wartosc, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    wynik = sprintf("%.2f (%.2f)", srednia, sd)
  ) %>%
  select(Affects_Academic_Performance, zmienna, n, wynik)

knitr::kable(
  means_long,
  caption = "Średnie (SD) w grupach Affects_Academic_Performance (No/Yes)",
  align = "l"
)
Średnie (SD) w grupach Affects_Academic_Performance (No/Yes)
Affects_Academic_Performance zmienna n wynik
No Addicted_Score 252 4.60 (0.72)
No Age 252 20.92 (1.45)
No Avg_Daily_Usage_Hours 252 3.80 (0.77)
No Conflicts_Over_Social_Media 252 1.78 (0.45)
No Mental_Health_Score 252 7.42 (0.50)
No Sleep_Hours_Per_Night 252 7.81 (0.69)
Yes Addicted_Score 453 7.46 (0.83)
Yes Age 453 20.52 (1.35)
Yes Avg_Daily_Usage_Hours 453 5.54 (1.03)
Yes Conflicts_Over_Social_Media 453 3.44 (0.57)
Yes Mental_Health_Score 453 5.56 (0.72)
Yes Sleep_Hours_Per_Night 453 6.34 (0.97)

Ten chunk wylicza tabelę porównawczą dla grup No i Yes:

  • group_by(Affects_Academic_Performance) dzieli dane na dwie grupy.
  • n = n() podaje liczebność w każdej grupie.
  • across(..., srednia, sd) liczy średnią i odchylenie standardowe dla wskazanych zmiennych.
  • knitr::kable(...) formatuje wynik jako czytelną tabelę w raporcie.

6.2 Testy nieparametryczne i wielkość efektu

W testach t zakładamy (w uproszczeniu), że porównujemy średnie i że rozkłady nie są „totalnie dziwne”.
Dlatego dokładamy też wersję nieparametryczną (Wilcoxona), która jest bardziej odporna na odstające wartości.

Dodatkowo pokazuję Cohen’s d (wielkość efektu), żeby nie kończyć tylko na p-value.

Yes vs No: różnica średnich (Yes-No), p-value (t i Wilcox) oraz Cohen d
zmienna diff_mean_yes_minus_no t_p wilcox_p cohen_d
Avg_Daily_Usage_Hours 1.7343 0.0000 0.0000 1.8378
Sleep_Hours_Per_Night -1.4694 0.0000 0.0000 -1.6699
Addicted_Score 2.8661 0.0000 0.0000 3.6094
Mental_Health_Score -1.8639 0.0000 0.0000 -2.8669
Conflicts_Over_Social_Media 1.6620 0.0000 0.0000 3.1252
Age -0.4001 0.0004 0.0004 -0.2885

Jak czytać tabelę: - diff_mean_yes_minus_no > 0: grupa Yes ma średnio więcej (np. więcej godzin, wyższy Addicted_Score). - cohen_d: im większa wartość bezwzględna, tym mocniejszy efekt (w praktyce często: ok. 0.2 mały, 0.5 średni, 0.8 duży).

6.3 Zależności dla zmiennych kategorycznych (Chi-kwadrat)

Tu sprawdzamy, czy odpowiedź Yes/No w Affects_Academic_Performance jest powiązana np. z płcią, poziomem studiów, platformą itd.
Oprócz p-value pokazujemy V Cramera jako miarę siły związku.

cramers_v <- function(tab) {
  cs <- suppressWarnings(chisq.test(tab, correct = FALSE))
  chi2 <- as.numeric(cs$statistic)
  n <- sum(tab)
  r <- nrow(tab); k <- ncol(tab)
  sqrt(chi2 / (n * (min(r - 1, k - 1))))
}

cat_tests <- c("Gender","Academic_Level","Most_Used_Platform","Relationship_Status")
cat_tests <- intersect(cat_tests, names(d))

if ("Affects_Academic_Performance" %in% names(d) && length(cat_tests) > 0) {
  chi_tbl <- purrr::map_dfr(cat_tests, function(v) {
    tab <- table(d$Affects_Academic_Performance, d[[v]])
    cs <- suppressWarnings(chisq.test(tab))
    tibble(
      zmienna = v,
      chi2_p = cs$p.value,
      cramers_v = cramers_v(tab)
    )
  }) %>% mutate(across(where(is.numeric), ~round(.x, 4)))

  chi_tbl %>%
    knitr::kable(
      digits = 4,
      caption = "Chi-kwadrat: Affects_Academic_Performance vs zmienne kategoryczne (plus V Cramera)"
    )
} else {
  cat("Brak Affects_Academic_Performance lub brak zmiennych kategorycznych do testu chi^2.")
}
Chi-kwadrat: Affects_Academic_Performance vs zmienne kategoryczne (plus V Cramera)
zmienna chi2_p cramers_v
Gender 0.5631 0.0247
Academic_Level 0.0045 0.1237
Most_Used_Platform 0.0000 0.6077
Relationship_Status 0.0000 0.1795

Interpretacja wyników:

  • chi2_p (p-value) mówi, czy w próbie widać istotną zależność między Yes/No a daną zmienną kategoryczną.
  • cramers_v mówi o sile związku: wartości bliskie 0 to słaby związek, większe wartości to mocniejszy związek.

W praktyce może być tak, że p-value wyjdzie małe (bo próba jest duża), ale V Cramera będzie małe, czyli zależność istnieje, ale jest raczej słaba.

6.4 Różnice między wieloma grupami (Kruskal-Wallis)

Test t jest dla dwóch grup. Jeśli mamy więcej grup (np. różne platformy), to robimy Kruskal-Wallis.
Potem (gdy wyjdzie istotnie) można dorzucić porównania parami (Wilcoxon + poprawka BH).

if ("Most_Used_Platform" %in% names(d) && "Addicted_Score" %in% names(d)) {
  d_pl <- d %>% mutate(Most_Used_Platform = fct_lump_n(Most_Used_Platform, n = 6, other_level = "Other"))
  kw1 <- kruskal.test(Addicted_Score ~ Most_Used_Platform, data = d_pl)
  kw1

  pw1 <- suppressWarnings(pairwise.wilcox.test(
    d_pl$Addicted_Score, d_pl$Most_Used_Platform,
    p.adjust.method = "BH", exact = FALSE
  ))
  pw1
} else {
  cat("Brak Most_Used_Platform lub Addicted_Score.")
}
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  d_pl$Addicted_Score and d_pl$Most_Used_Platform 
## 
##           Facebook Instagram LinkedIn TikTok  Twitter WhatsApp
## Instagram 9.7e-07  -         -        -       -       -       
## LinkedIn  2.5e-09  1.5e-11   -        -       -       -       
## TikTok    < 2e-16  9.9e-09   1.6e-13  -       -       -       
## Twitter   0.4704   0.0015    2.2e-05  1.1e-08 -       -       
## WhatsApp  2.7e-12  2.2e-05   5.7e-12  0.7225  1.3e-07 -       
## Other     0.5856   4.3e-05   1.7e-06  1.9e-15 0.5707  2.5e-12 
## 
## P value adjustment method: BH
if ("Academic_Level" %in% names(d) && "Addicted_Score" %in% names(d)) {
  kw2 <- kruskal.test(Addicted_Score ~ Academic_Level, data = d)
  kw2

  pw2 <- suppressWarnings(pairwise.wilcox.test(
    d$Addicted_Score, d$Academic_Level,
    p.adjust.method = "BH", exact = FALSE
  ))
  pw2
} else {
  cat("Brak Academic_Level lub Addicted_Score.")
}
## 
##  Pairwise comparisons using Wilcoxon rank sum test with continuity correction 
## 
## data:  d$Addicted_Score and d$Academic_Level 
## 
##               Graduate High School
## High School   2.7e-10  -          
## Undergraduate 0.035    5.2e-07    
## 
## P value adjustment method: BH

Jak czytać wynik Kruskala:

  • najpierw patrzymy na wynik kruskal.test() (p-value). Jeśli jest istotny, to znaczy, że co najmniej dwie grupy różnią się rozkładem Addicted_Score,
  • potem pairwise.wilcox.test() pokazuje, które pary grup się różnią (p-value jest już z poprawką BH).

To podejście jest sensowne, gdy grup jest więcej niż 2 i nie chcemy zakładać normalności rozkładów.

7. Modele

W tej sekcji przechodzimy od prostych porównań (korelacje, wykresy, testy t) do modelowania statystycznego, czyli próbujemy opisać zależności „bardziej formalnie” i jednocześnie uwzględnić kilka czynników naraz.

Dlaczego to jest potrzebne?

Modele pozwalają:

W raporcie używamy dwóch modeli:

  1. Model liniowy (lm): gdy zmienna wynikowa jest liczbowa i ciągła. Tutaj przewidujemy Addicted_Score.
  2. Model logistyczny (glm binomial): gdy zmienna wynikowa jest binarna (Yes/No). Tutaj przewidujemy prawdopodobieństwo odpowiedzi „Yes” w Affects_Academic_Performance.

7.1 Model liniowy

# Model liniowy: co wpływa na Addicted_Score

# platformy grupujemy: top 6 + Other

d_m1 <- d %>%
  mutate(Most_Used_Platform = forcats::fct_lump_n(Most_Used_Platform, n = 6, other_level = "Other"))

m1 <- lm(
  Addicted_Score ~ Avg_Daily_Usage_Hours + Sleep_Hours_Per_Night + Mental_Health_Score +
    Conflicts_Over_Social_Media + Affects_Academic_Performance + Gender + Most_Used_Platform,
  data = d_m1
)

summary(m1)
## 
## Call:
## lm(formula = Addicted_Score ~ Avg_Daily_Usage_Hours + Sleep_Hours_Per_Night + 
##     Mental_Health_Score + Conflicts_Over_Social_Media + Affects_Academic_Performance + 
##     Gender + Most_Used_Platform, data = d_m1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.0460 -0.1973 -0.0222  0.1730  1.5510 
## 
## Coefficients:
##                                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      9.09311    0.33566  27.091  < 2e-16 ***
## Avg_Daily_Usage_Hours            0.11301    0.02330   4.850 1.53e-06 ***
## Sleep_Hours_Per_Night           -0.17312    0.02003  -8.645  < 2e-16 ***
## Mental_Health_Score             -0.58158    0.02817 -20.644  < 2e-16 ***
## Conflicts_Over_Social_Media      0.41796    0.03551  11.771  < 2e-16 ***
## Affects_Academic_PerformanceYes  0.58716    0.05212  11.265  < 2e-16 ***
## GenderMale                       0.06371    0.02724   2.339 0.019642 *  
## Most_Used_PlatformInstagram      0.03388    0.04088   0.829 0.407466    
## Most_Used_PlatformLinkedIn      -0.07194    0.08862  -0.812 0.417183    
## Most_Used_PlatformTikTok         0.15412    0.04571   3.372 0.000789 ***
## Most_Used_PlatformTwitter       -0.20112    0.06767  -2.972 0.003062 ** 
## Most_Used_PlatformWhatsApp      -0.21077    0.06046  -3.486 0.000521 ***
## Most_Used_PlatformOther         -0.19451    0.05030  -3.867 0.000121 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3261 on 692 degrees of freedom
## Multiple R-squared:  0.9585, Adjusted R-squared:  0.9578 
## F-statistic:  1332 on 12 and 692 DF,  p-value: < 2.2e-16
car::vif(m1)
##                                  GVIF Df GVIF^(1/(2*Df))
## Avg_Daily_Usage_Hours        5.684387  1        2.384195
## Sleep_Hours_Per_Night        3.372006  1        1.836302
## Mental_Health_Score          6.417863  1        2.533350
## Conflicts_Over_Social_Media  7.661222  1        2.767891
## Affects_Academic_Performance 4.137715  1        2.034138
## Gender                       1.230406  1        1.109237
## Most_Used_Platform           2.906094  6        1.092972

W tym chuncku budujemy model liniowy, gdzie zmienną objaśnianą jest Addicted_Score (poziom uzależnienia), a zmiennymi objaśniającymi są m.in. czas w SM, sen, zdrowie psychiczne, konflikty oraz cechy jakościowe.

  1. d_m1 <- d %>% mutate(...) tworzy kopię danych do modelu. Jedyna zmiana dotyczy platformy:
    • forcats::fct_lump_n(Most_Used_Platform, n = 6, other_level = "Other") zostawia 6 najczęstszych platform, a pozostałe łączy do kategorii Other.
    • To ułatwia estymację i interpretację, bo nie tworzymy w modelu kilkunastu bardzo rzadkich kategorii (które dawałyby niestabilne współczynniki).
  2. m1 <- lm(...) dopasowuje klasyczną regresję liniową metodą najmniejszych kwadratów (OLS).
    • Wzór ma postać: Addicted_Score ~ ....
    • Współczynnik przy Avg_Daily_Usage_Hours mówi, jak średnio zmienia się Addicted_Score, gdy czas w SM rośnie o 1 godzinę, przy założeniu, że pozostałe zmienne w modelu są stałe.
    • Analogicznie współczynniki przy Sleep_Hours_Per_Night, Mental_Health_Score i Conflicts_Over_Social_Media opisują ich „częściowy” związek z uzależnieniem.
    • Zmienne jakościowe (Affects_Academic_Performance, Gender, Most_Used_Platform) są kodowane jako zestaw zmiennych zero-jedynkowych (R robi to automatycznie dla factorów). Współczynniki interpretujemy jako różnice względem kategorii bazowej.
  3. summary(m1) wyświetla podsumowanie modelu:
    • oszacowane współczynniki (Estimate),
    • błędy standardowe (Std. Error),
    • statystyki t i p-value (czy efekt jest istotny statystycznie),
    • dopasowanie modelu (R-squared, Adjusted R-squared) i test ogólny (F-statistic).
  4. car::vif(m1) liczy wskaźniki VIF (Variance Inflation Factor), czyli sprawdza współliniowość predyktorów.
    • Gdy VIF jest wysokie, to znaczy, że zmienne objaśniające są mocno ze sobą skorelowane, a wtedy współczynniki mogą być mniej stabilne.
    • W praktyce często przyjmuje się, że wartości około 1–5 są zwykle ok, a dużo wyższe mogą być problemem.

Ten model traktujemy jako uzupełnienie analizy: pokazuje, czy obserwowane zależności (z wykresów i korelacji) utrzymują się, gdy uwzględniamy kilka czynników naraz.

7.2 Model logistyczny

# Model logistyczny: co zwiększa szansę, że ktoś odpowie "Yes" (wpływa na naukę)

m_logit <- glm(
  Affects_Academic_Performance ~ Avg_Daily_Usage_Hours + Sleep_Hours_Per_Night + Age + Gender + Academic_Level,
  data = d,
  family = binomial()
)

# OR = iloraz szans
or_tbl <- broom::tidy(m_logit, exponentiate = TRUE, conf.int = TRUE) %>%
  transmute(
    term = term,
    OR = estimate,
    OR_low = conf.low,
    OR_high = conf.high,
    p.value = p.value
  )

or_tbl
# ROC + AUC
pr <- predict(m_logit, type = "response")
roc_obj <- pROC::roc(d$Affects_Academic_Performance, pr, levels = c("No", "Yes"), direction = "<")
auc_val <- as.numeric(pROC::auc(roc_obj))

# OR-y do tekstu (dla 2 najważniejszych zmiennych)
or_usage <- or_tbl$OR[or_tbl$term == "Avg_Daily_Usage_Hours"][1]
or_sleep <- or_tbl$OR[or_tbl$term == "Sleep_Hours_Per_Night"][1]

plot(roc_obj, main = paste0("ROC (AUC = ", round(auc_val, 3), ")"))

W tym chuncku budujemy model logistyczny, czyli model dla zmiennej wynikowej typu Yes/No. Celem jest oszacowanie, które czynniki zwiększają (lub zmniejszają) prawdopodobieństwo, że student odpowie “Yes” w Affects_Academic_Performance (czyli że social media wpływają na wyniki w nauce).

Co tu się dzieje po kolei:

  1. m_logit <- glm(..., family = binomial()) dopasowuje regresję logistyczną.
    • W modelu zmienną objaśnianą jest Affects_Academic_Performance.
    • Predyktory to: Avg_Daily_Usage_Hours, Sleep_Hours_Per_Night, Age, Gender, Academic_Level.
    • family = binomial() mówi R, że to jest model dla zmiennej binarnej. W praktyce modeluje on logarytm ilorazu szans (log-odds) odpowiedzi “Yes”.
  2. Tabela OR (ilorazy szans):
    • broom::tidy(m_logit, exponentiate = TRUE, conf.int = TRUE) pobiera współczynniki modelu i od razu je “odlogarytmowuje” (exponentiate = TRUE).
    • Dzięki temu zamiast współczynników w log-odds dostajemy OR (odds ratio, iloraz szans).
    • conf.int = TRUE dodaje przedziały ufności dla OR.
    • transmute(...) wybiera tylko te kolumny, które są najbardziej czytelne w raporcie: nazwa zmiennej (term), OR, dolna i górna granica przedziału ufności oraz p-value.
    • or_tbl wyświetla gotową tabelę.
    Jak czytać OR:
    • OR > 1: wzrost zmiennej zwiększa szanse odpowiedzi “Yes”.
    • OR < 1: wzrost zmiennej zmniejsza szanse odpowiedzi “Yes”.
    • Przykład: OR = 1.20 dla czasu w SM oznacza, że +1 godzina dziennie zwiększa szanse odpowiedzi “Yes” o ok. 20% (przy stałych pozostałych zmiennych).
  3. Ocena jakości predykcji (ROC i AUC):
    • predict(m_logit, type = "response") liczy przewidywane prawdopodobieństwa odpowiedzi “Yes” dla każdej osoby (liczby od 0 do 1).
    • pROC::roc(...) tworzy krzywą ROC, czyli porównuje czułość i swoistość dla różnych progów klasyfikacji.
    • auc(roc_obj) liczy AUC (pole pod krzywą). AUC bliskie 0.5 oznacza brak zdolności rozróżniania, a im bliżej 1.0, tym lepsza klasyfikacja.
    • plot(roc_obj, ...) rysuje krzywą ROC. Opcjonalnie można dodać linię odniesienia abline(a=0,b=1,lty=2), która pokazuje wynik „losowy” (punkt odniesienia).

Ten chunk jest więc podsumowaniem w formie modelu: pokazuje, które czynniki są statystycznie istotne w przewidywaniu odpowiedzi “Yes” oraz jak dobrze model ogólnie rozróżnia osoby z grupy Yes i No.

8. Wnioski

Na podstawie statystyk opisowych, korelacji, wykresów oraz testów porównujących grupy (Yes/No) można sformułować następujące wnioski:

  1. Czas korzystania z social mediów jest dodatnio powiązany z poziomem uzależnienia. W danych wraz ze wzrostem Avg_Daily_Usage_Hours rośnie Addicted_Score (korelacja dodatnia; wyższe wartości w grupach większego czasu w SM) (rho Spearmana = 0.838, p = 4.16^{-187}).

  2. Większe korzystanie z SM wiąże się z krótszym snem. Zależność Avg_Daily_Usage_Hours vs Sleep_Hours_Per_Night ma kierunek ujemny. (rho Spearmana = -0.814, p = 2.3^{-168}).

  3. Dobrostan psychiczny (mierzone Mental_Health_Score) współwystępuje z zachowaniami w SM. Wyższy czas korzystania jest powiązany z niższym Mental_Health_Score, a Mental_Health_Score jest ujemnie powiązany z Addicted_Score. W danych: czas vs zdrowie psychiczne ma rho = -0.802 (p = 2.2^{-159}), a zdrowie psychiczne vs uzależnienie ma rho = -0.95 (p = 0).

  4. Konflikty przez social media są wyższe przy większym czasie korzystania. Avg_Daily_Usage_Hours jest dodatnio powiązany z Conflicts_Over_Social_Media. (rho Spearmana = 0.803, p = 1.73^{-160}).

  5. Grupy Yes vs No różnią się istotnie statystycznie w kluczowych zmiennych (testy t-Studenta). Osoby z grupy „Yes” (deklaracja wpływu na naukę) mają przeciętnie:

    • wyższy czas korzystania z social mediów,
    • krótszy sen,
    • wyższy Addicted_Score,
    • niższy Mental_Health_Score,
    • wyższy poziom Conflicts_Over_Social_Media.

    Dla porównania średnich (Yes minus No):

    • czas w SM: 1.73 h/dzień,
    • sen: 1.47 h mniej,
    • Addicted_Score: 2.87 pkt,
    • Mental_Health_Score: 1.86 pkt mniej,
    • konflikty: 1.66 pkt.
  6. Model logistyczny sugeruje, że czas w SM i sen są ważnymi predyktorami odpowiedzi „Yes”. Przy kontroli wieku, płci i poziomu studiów wzrost Avg_Daily_Usage_Hours zwiększa szanse odpowiedzi „Yes” (OR = 5.84), a wzrost Sleep_Hours_Per_Night zmniejsza te szanse (OR = 0.33). Dodatkowo jakość klasyfikacji modelu (ROC) to AUC = 0.935.

Wyniki należy interpretować jako zależności obserwacyjne w badanej próbie. Raport nie rozstrzyga, czy social media powodują zmiany w śnie, dobrostanie psychicznym lub funkcjonowaniu w nauce.

Z perspektywy praktycznej wyniki sugerują, że działania ukierunkowane na higienę snu oraz ograniczanie czasu spędzanego w social mediach mogą być istotnym elementem profilaktyki (szczególnie w grupie osób deklarujących wpływ na naukę). Jednocześnie, ze względu na ograniczenia danych (samoopis i brak pomiaru w czasie), rekomendacje należy traktować jako wstępne i wymagające potwierdzenia w badaniach o silniejszym schemacie (np. panelowych).

9. Ograniczenia

Ograniczenia analizy wynikają głównie z charakteru danych oraz z przyjętych uproszczeń analitycznych. Poniższe punkty są kluczowe dla poprawnej interpretacji wyników.

  1. Charakter obserwacyjny (przekrojowy): dane pochodzą z jednego pomiaru, więc nie da się wnioskować o kierunku zależności ani o przyczynowości (korelacja ≠ przyczyna). Przykładowo: wyższy czas w SM może wiązać się z gorszym snem, ale równie dobrze gorszy sen może sprzyjać dłuższemu korzystaniu z telefonu.
  2. Samoopis i błąd deklaracji: czas korzystania, sen oraz ocena wpływu na naukę są deklarowane przez respondentów. Może to powodować:
    • błąd pamięci (niedokładne odtworzenie czasu),
    • błąd społecznej aprobaty (zaniżanie lub zawyżanie odpowiedzi),
    • różne rozumienie pytań przez respondentów. W efekcie oszacowane zależności mogą być osłabione lub przeszacowane.
  3. Brak informacji o doborze próby: bez opisu sposobu zbierania danych (losowo vs dobór wygodny) nie da się ocenić reprezentatywności. Wnioski odnoszą się do tej konkretnej próby i nie muszą przenosić się na wszystkich studentów.
  4. Ograniczony zakres wieku: w próbie występują osoby w wieku 18–24 lat. Taki zakres jest typowy dla studentów, ale ogranicza możliwość uogólnienia wyników na osoby starsze lub młodsze.
  5. Skale punktowe bez dokumentacji psychometrycznej: w raporcie przyjmujemy, że wyższy wynik oznacza większe nasilenie zjawiska, jednak bez informacji o konstrukcji skal (np. liczba pozycji, rzetelność, trafność) interpretacja poziomów i porównań może być ograniczona.
  6. Możliwe zmienne pominięte (confounding): w danych brakuje wielu czynników, które mogą jednocześnie wpływać na korzystanie z SM i wyniki (np. stres, obciążenie nauką, praca, wsparcie społeczne, cechy osobowości, stan zdrowia). To może prowadzić do błędnej interpretacji zależności jako „bezpośrednich”, mimo że częściowo wynikają z innych czynników.
  7. Wspólne źródło pomiaru (błąd wspólnej metody pomiaru): wiele zmiennych pochodzi z tego samego kwestionariusza w tym samym momencie. To może sztucznie wzmacniać związki między zmiennymi (np. osoba w gorszym nastroju może jednocześnie surowiej oceniać sen, dobrostan i wpływ SM).
  8. Uproszczenie zmiennej wynikowej „Yes/No”: Affects_Academic_Performance jest subiektywną oceną. Dwie osoby mogą rozumieć pytanie inaczej (np. „wpływ” jako spadek ocen, spadek koncentracji albo marnowanie czasu), a odpowiedź binarna nie oddaje skali zjawiska.
  9. Wielokrotne testowanie: wykonujemy kilka testów t-Studenta dla różnych zmiennych. Przy wielu testach rośnie ryzyko błędu I rodzaju (fałszywie istotne wyniki). Dlatego można rozważyć korektę p-value (np. Bonferroni/FDR), szczególnie jeśli analizujemy wiele zmiennych naraz.
  10. Założenia modeli (liniowy i logistyczny): modele zakładają określoną postać zależności (m.in. liniowość w predyktorach, niezależność obserwacji, brak silnej współliniowości). VIF pomaga ocenić współliniowość w modelu liniowym, ale nadal:
  1. Brak walidacji predykcyjnej: model logistyczny oceniamy na tych samych danych, na których go uczymy (AUC z ROC). Bez podziału train/test lub walidacji krzyżowej wynik AUC może być optymistyczny.

Z powyższych powodów raport należy traktować jako analizę eksploracyjną zależności w próbie, a nie jako dowód przyczynowo-skutkowy.

9.1 Rekomendacje

Żeby wnioski były mocniejsze i bardziej „twarde”, w kolejnych badaniach warto rozważyć:

  1. Obiektywny pomiar czasu w SM: np. zrzuty z „Screen Time/Digital Wellbeing” albo logi aplikacji (zamiast samej deklaracji).
  2. Badanie w czasie (panel/longitudinal): pomiar tych samych osób w kilku momentach pozwoli lepiej ocenić kierunek zależności (co było pierwsze: sen czy SM).
  3. Lepszy dobór próby i opis rekrutacji: np. losowanie warstwowe lub przynajmniej opis, skąd są respondenci (uczelnia, kierunek, rocznik), żeby ocenić reprezentatywność.
  4. „Twardsza” miara wyników w nauce: np. średnia ocen z USOS albo inny obiektywny wskaźnik (jeśli możliwe), zamiast samej odpowiedzi Yes/No.
  5. Walidowane narzędzia psychometryczne: użycie standardowych skal (np. do dobrostanu/uzależnienia) oraz raportowanie rzetelności (np. alfa Cronbacha).
  6. Rozszerzenie modelowania: sprawdzenie nieliniowości (np. splajny), interakcji (np. płeć × czas w SM), oraz odporność wyników na obserwacje odstające.
  7. Walidacja predykcyjna modeli: podział na zbiór treningowy/testowy lub walidacja krzyżowa, żeby ocenić, czy model „trzyma” poza próbką.
  8. Kontrola wielokrotnego testowania: formalna korekta p-value (Bonferroni/FDR) albo ograniczenie liczby testów do kluczowych hipotez.

Podsumowując, wskazane usprawnienia pozwoliłyby ograniczyć błąd pomiaru i ryzyko stronniczości (bias), a także zwiększyć możliwość uogólniania wyników na szerszą populację studentów. W szczególności dane zbierane w czasie oraz obiektywny pomiar czasu korzystania mogłyby pomóc lepiej rozdzielić, co jest potencjalną przyczyną, a co skutkiem. W efekcie kolejne badanie dawałoby mocniejsze wnioski i bardziej wiarygodne rekomendacje praktyczne.