Celem raportu jest sprawdzenie, jak średni dzienny czas
korzystania z social mediów
(Avg_Daily_Usage_Hours) wiąże się z:
Addicted_Score),Sleep_Hours_Per_Night),Mental_Health_Score),Conflicts_Over_Social_Media),Affects_Academic_Performance, Yes/No).Pytania badawcze:
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:
Age (wiek),
Gender (płeć), Academic_Level (poziom
edukacji), Country (kraj), Relationship_Status
(status związku).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).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:
Addicted_Score): 2–9,
średnio 6.44,Affects_Academic_Performance): Yes 64.3%,
No 35.7%.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.
| 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 |
| 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 | Yes | 6.5 | 6 | In Relationship | 3 | 8 | |
| 2 | 22 | Male | Graduate | India | 2.1 | 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 | Yes | 6.0 | 6 | In Relationship | 2 | 7 | |
| 6 | 19 | Female | Undergraduate | Australia | 7.2 | Yes | 4.5 | 4 | Complicated | 5 | 9 | |
| 7 | 23 | Male | Graduate | Germany | 1.5 | 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,To ważne, bo jeśli na tym etapie coś jest „nie tak”, to późniejsze wykresy, testy i modele mogą wyjść błędnie.
# 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).
cat_cols <- c(...) tworzy listę kolumn, które
traktujemy jako kategorie (np. Gender,
Country, Most_Used_Platform).intersect(cat_cols, names(d)) zostawia tylko te nazwy,
które faktycznie istnieją w d. Dzięki temu chunk nie wywali
błędu, jeśli jakaś kolumna byłaby np. inaczej nazwana.mutate(across(all_of(cat_cols), as.factor)) zamienia
wskazane kolumny na typ factor. To jest ważne, bo:
ggplot łatwiej robić wykresy dla kategorii,forcats::fct_relevel(..., "No", "Yes") ustawia
kolejność poziomów w zmiennej Affects_Academic_Performance.
Dzięki temu w tabelach i wynikach porównań „No” jest bazą (najpierw), a
„Yes” jest drugie, co ułatwia interpretację.forcats::fct_lump_n(Country, n = 10, other_level = "Other")
zostawia 10 najczęstszych krajów, a resztę łączy do kategorii
Other. To zapobiega sytuacji, gdzie jest kilkadziesiąt
rzadkich krajów i wykresy/tabele stają się nieczytelne.colSums(is.na(d)) to kontrola jakości: pokazuje liczbę
braków (NA) w każdej kolumnie. Braki mogą występować albo nie, zależnie
od pliku, więc warto to zostawić.| 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.
num_tbl, czyli bierzemy z danych
d tylko kolumny liczbowe
(select(where(is.numeric))).Student_ID, jeśli występuje. To ważne, bo
identyfikator jest tylko numerem porządkowym i nie powinien być
analizowany jak normalna zmienna.summarise(across(...)) przechodzi po każdej
kolumnie i liczy zestaw podstawowych miar:
n liczba obserwacji (niepustych),srednia średnia arytmetyczna,mediana mediana,sd odchylenie standardowe,min wartość minimalna,max wartość maksymalna.na.rm = TRUE mówi R, żeby ignorować braki
danych (NA), więc obliczenia zadziałają poprawnie nawet jeśli braki się
pojawią..names = "{.col}_{.fn}" nadaje czytelne nazwy kolumnom
w tabeli wynikowej, np. Age_srednia, Age_sd
itd.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).
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ę.
| 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.
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.
| 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.
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
)
)
}# 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.
# 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.
# 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.
# 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.
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.
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.
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.
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ą.
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.
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.
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.
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ń.
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.
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.
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.
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.
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:
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:
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).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.
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.
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.).
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ć:
p.value jest małe (np. < 0.05), to średnie w
grupach Yes i No różnią się istotnie statystycznie,estimate mówi kierunek różnicy (czy grupa Yes ma
średnio więcej czy mniej),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).
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"
)| 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.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.
| 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).
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.")
}| 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.
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:
kruskal.test() (p-value).
Jeśli jest istotny, to znaczy, że co najmniej dwie
grupy różnią się rozkładem Addicted_Score,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.
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:
Addicted_Score.Affects_Academic_Performance.# 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
## 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.
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.m1 <- lm(...) dopasowuje klasyczną regresję liniową
metodą najmniejszych kwadratów (OLS).
Addicted_Score ~ ....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.Sleep_Hours_Per_Night,
Mental_Health_Score i
Conflicts_Over_Social_Media opisują ich „częściowy” związek
z uzależnieniem.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.summary(m1) wyświetla podsumowanie modelu:
car::vif(m1) liczy wskaźniki VIF (Variance Inflation
Factor), czyli sprawdza współliniowość predyktorów.
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.
# 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:
m_logit <- glm(..., family = binomial()) dopasowuje
regresję logistyczną.
Affects_Academic_Performance.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”.broom::tidy(m_logit, exponentiate = TRUE, conf.int = TRUE)
pobiera współczynniki modelu i od razu je “odlogarytmowuje”
(exponentiate = TRUE).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ę.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.
Na podstawie statystyk opisowych, korelacji, wykresów oraz testów porównujących grupy (Yes/No) można sformułować następujące wnioski:
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}).
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}).
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).
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}).
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:
Addicted_Score,Mental_Health_Score,Conflicts_Over_Social_Media.Dla porównania średnich (Yes minus No):
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).
Ograniczenia analizy wynikają głównie z charakteru danych oraz z przyjętych uproszczeń analitycznych. Poniższe punkty są kluczowe dla poprawnej interpretacji wyników.
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.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.
Żeby wnioski były mocniejsze i bardziej „twarde”, w kolejnych badaniach warto rozważyć:
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.