Social support and sports social behavior

Autor

Emma Dulovičová

Publikované

27. októbra 2026

1 Predstavenie projektu

1.1 Téma projektu a motivácia

Štúdia sa zaoberá vzťahom medzi vnímanou sociálnou podporou a správaním vysokoškolských študentov v športe, pričom skúma aj úlohu sociálnej úzkosti a psychickej odolnosti. Na základe dotazníkových údajov od 1 157 vysokoškolských študentov analyzuje, či sociálna podpora súvisí s prosociálnym správaním, teda pomáhaním a spoluprácou, a s antisociálnym správaním, napríklad s konaním namiereným proti ostatným.

Túto tému som si vybrala aj z osobného záujmu, pretože sa momentálne pripravujem na svoj prvý polmaratón a behanie sa stalo neoddeliteľnou súčasťou môjho života. Zaujíma ma preto nielen fyzická stránka športu, ale aj to, ako môžu sociálne vzťahy, podpora okolia a psychická odolnosť súvisieť so správaním a športovými aktivitami.

1.2 Ciele projektu

Cieľom projektu je analyzovať dostupné údaje o sociálnej podpore a správaní vysokoškolských študentov v športe pomocou štatistických metód v prostredí R. Na základe vytvorených tabuliek, grafov a základných štatistických ukazovateľov sa projekt zameria na preskúmanie súvislostí medzi sociálnou podporou, prosociálnym a antisociálnym správaním a na prehľadné vizuálne znázornenie získaných výsledkov.

Dáta pre analýzu budú získané z databázy Na analýzu budem využívať databázu vo formáte Excel, ktorú som stiahla z platformy Mendeley Data spolu s podkladmi k vybranej štúdii. Databáza je dostupná tu: Údaje importujem do prostredia R, skontrolujem ich štruktúru a prípadné chýbajúce hodnoty a následne vytvorím základné štatistické prehľady a grafické vizualizácie.

“Running is alone time that lets my brain unspool.” – Rob Haneisen

2 Údaje a databáza

2.1 Import údajov

library(readxl)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(janitor)

Attaching package: 'janitor'
The following objects are masked from 'package:stats':

    chisq.test, fisher.test
library(knitr)
library(kableExtra)

Attaching package: 'kableExtra'
The following object is masked from 'package:dplyr':

    group_rows
library(ggplot2)

# Import Excel databázy
udaje <- read_excel("data/data.xlsx")

# Úprava názvov stĺpcov
udaje <- udaje %>%
  clean_names()

# Základná kontrola databázy
head(udaje)
# A tibble: 6 × 9
     no sex   year      age psychological_resili…¹ social_anxiety social_support
  <dbl> <chr> <chr>   <dbl>                  <dbl>          <dbl>          <dbl>
1     1 Male  First-…    19                    106             58             77
2     2 Male  First-…    19                    105             58             77
3     3 Male  First-…    19                    106             58             77
4     4 Male  First-…    19                    106             58             77
5     5 Male  Second…    20                    105             58             77
6     6 Male  First-…    19                    106             58             77
# ℹ abbreviated name: ¹​psychological_resilienc
# ℹ 2 more variables: prosocial_behavior_in_sport <dbl>,
#   antisocial_behavior_in_sport <dbl>
names(udaje)
[1] "no"                           "sex"                         
[3] "year"                         "age"                         
[5] "psychological_resilienc"      "social_anxiety"              
[7] "social_support"               "prosocial_behavior_in_sport" 
[9] "antisocial_behavior_in_sport"
str(udaje)
tibble [1,157 × 9] (S3: tbl_df/tbl/data.frame)
 $ no                          : num [1:1157] 1 2 3 4 5 6 7 8 9 10 ...
 $ sex                         : chr [1:1157] "Male" "Male" "Male" "Male" ...
 $ year                        : chr [1:1157] "First-year" "First-year" "First-year" "First-year" ...
 $ age                         : num [1:1157] 19 19 19 19 20 19 19 19 19 19 ...
 $ psychological_resilienc     : num [1:1157] 106 105 106 106 105 106 104 104 104 104 ...
 $ social_anxiety              : num [1:1157] 58 58 58 58 58 58 56 56 56 56 ...
 $ social_support              : num [1:1157] 77 77 77 77 77 77 76 76 76 76 ...
 $ prosocial_behavior_in_sport : num [1:1157] 34 27 33 33 33 33 34 33 34 31 ...
 $ antisocial_behavior_in_sport: num [1:1157] 61 67 61 61 67 61 64 64 64 64 ...
# Počet riadkov a stĺpcov
dim(udaje)
[1] 1157    9

2.2 Kontrola chýbajúcich hodnôt

Tabuľka poskytuje prehľad o počte chýbajúcich hodnôt v jednotlivých premenných, vďaka čomu môžeme jednoducho identifikovať, ktoré údaje sú neúplné a vyžadujú si ďalšiu kontrolu.

# Vytvorenie prehľadu chýbajúcich hodnôt
chybanie <- data.frame(
  Premenna = names(udaje),
  Pocet_chybajucich = colSums(is.na(udaje))
)

# Zoradenie od najväčšieho počtu chýbajúcich hodnôt
chybanie <- chybanie %>%
  arrange(desc(Pocet_chybajucich))

# Farebne upravená tabuľka
kable(
  chybanie,
  caption = "Prehľad chýbajúcich hodnôt v databáze",
  col.names = c("Premenná", "Počet chýbajúcich hodnôt"),
  digits = 0
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  ) %>%
  row_spec(0, bold = TRUE, background = "#DCE6F1") %>%
  column_spec(2, bold = TRUE)
Prehľad chýbajúcich hodnôt v databáze
Premenná Počet chýbajúcich hodnôt
no no 0
sex sex 0
year year 0
age age 0
psychological_resilienc psychological_resilienc 0
social_anxiety social_anxiety 0
social_support social_support 0
prosocial_behavior_in_sport prosocial_behavior_in_sport 0
antisocial_behavior_in_sport antisocial_behavior_in_sport 0

2.3 Graf chýbajúcich hodnôt

Graficky znázornenie umožňuje rýchlejšie porovnať počet chýbajúcich hodnôt medzi jednotlivými premennými a prehľadnejšie posúdiť kvalitu databázy pred samotnou štatistickou analýzou.

ggplot(
  chybanie,
  aes(
    x = reorder(Premenna, Pocet_chybajucich),
    y = Pocet_chybajucich
  )
) +
  geom_col(fill = "#6482AD", width = 0.7) +
  coord_flip() +
  labs(
    title = "Chýbajúce hodnoty v databáze",
    subtitle = "Počet nevyplnených údajov podľa premennej",
    x = "Premenná",
    y = "Počet chýbajúcich hodnôt"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", size = 15),
    plot.subtitle = element_text(color = "grey40"),
    panel.grid.minor = element_blank()
  )

2.4 Potrebné balíky

#| label: instalacia #| eval: false

install.packages(c( “readxl”, “janitor”, “dplyr”, “ggplot2”, “broom”, “knitr”, “kableExtra” ))

#| label: nacitanie

cesta <- “data/data.xlsx”

if (!file.exists(cesta)) { stop(“Súbor data/data.xlsx sa nenašiel. Skontrolujte jeho umiestnenie.”) }

udaje <- read_excel(cesta) |> clean_names()

cat(“Počet respondentov:”, nrow(udaje), “”) cat(“Počet premenných:”, ncol(udaje), “”)

head(udaje, 6) |> kable( format = “html”, digits = 3, row.names = FALSE, caption = “Prvých šesť riadkov databázy” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

#| label: prehlad-premennych

prehľad_premennych <- data.frame( Premenna = names(udaje), Typ = sapply(udaje, function(x) class(x)[1]), Pocet_chybajucich = sapply(udaje, function(x) sum(is.na(x))) )

prehľad_premennych |> kable( format = “html”, row.names = FALSE, col.names = c( “Premenná”, “Typ údajov”, “Počet chýbajúcich hodnôt” ), caption = “Prehľad premenných a ich dátových typov” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

cat(“Názvy stĺpcov v databáze:”) print(names(udaje))

#| label: chybajuce-hodnoty

chybajuce <- data.frame( Premenna = names(udaje), Pocet_NA = sapply(udaje, function(x) sum(is.na(x))), Podiel_NA_percent = sapply( udaje, function(x) mean(is.na(x)) * 100 ) )

chybajuce |> kable( format = “html”, digits = 2, row.names = FALSE, col.names = c( “Premenná”, “Počet chýbajúcich hodnôt”, “Podiel chýbajúcich hodnôt (%)” ), caption = “Chýbajúce hodnoty v pôvodnej databáze” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

#| label: graf-chybajucich #| fig-cap: “Počet chýbajúcich hodnôt podľa premennej.” #| fig-width: 9 #| fig-height: 5

ggplot( chybajuce, aes(x = reorder(Premenna, Pocet_NA), y = Pocet_NA) ) + geom_col(fill = “steelblue”) + coord_flip() + labs( x = “Premenná”, y = “Počet chýbajúcich hodnôt”, title = “Kontrola úplnosti údajov” ) + theme_minimal(base_size = 12)

#| label: opisna-statistika

ciselne_premenne <- names(udaje)[sapply(udaje, is.numeric)]

if (length(ciselne_premenne) > 0) {

opisna_statistika <- data.frame( Premenna = ciselne_premenne, Pocet = sapply( udaje[ciselne_premenne], function(x) sum(!is.na(x)) ), Minimum = sapply( udaje[ciselne_premenne], function(x) if (all(is.na(x))) NA_real_ else min(x, na.rm = TRUE) ), Median = sapply( udaje[ciselne_premenne], function(x) if (all(is.na(x))) NA_real_ else median(x, na.rm = TRUE) ), Priemer = sapply( udaje[ciselne_premenne], function(x) if (all(is.na(x))) NA_real_ else mean(x, na.rm = TRUE) ), Smerodajna_odchylka = sapply( udaje[ciselne_premenne], function(x) if (sum(!is.na(x)) < 2) NA_real_ else sd(x, na.rm = TRUE) ), Maximum = sapply( udaje[ciselne_premenne], function(x) if (all(is.na(x))) NA_real_ else max(x, na.rm = TRUE) ) )

opisna_statistika |> kable( format = “html”, digits = 3, row.names = FALSE, caption = “Opisná štatistika číselných premenných” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

} else {

cat(“V databáze sa nenašli číselné premenné.”)

}

#| label: priprava-skore

najdi_premenne <- function(vzory, nazvy) { unique(unlist( lapply( vzory, function(vzor) { grep(vzor, nazvy, ignore.case = TRUE, value = TRUE) } ) )) }

vytvor_skore <- function(data, vzory, nazov) {

kandidati <- najdi_premenne(vzory, names(data)) kandidati <- kandidati[sapply(data[kandidati], is.numeric)]

if (length(kandidati) == 0) { return(list(data = data, prem = NA_character_)) }

vzor_skore <- “total|sum|mean|score|average|overall|composite|celk|priemer|skore” kandidati_skore <- kandidati[ grepl(vzor_skore, kandidati, ignore.case = TRUE) ]

if (length(kandidati_skore) > 0) {

vybrana <- kandidati_skore[1]
data[[nazov]] <- data[[vybrana]]

} else {

matica <- data[candidati]
data[[nazov]] <- rowMeans(matica, na.rm = TRUE)
data[[nazov]][rowSums(!is.na(matica)) == 0] <- NA_real_

}

list(data = data, prem = nazov) }

vysledok_podpora <- vytvor_skore( udaje, c(“psss”, “social_support”, “socialsupport”, “support”), “socialna_podpora” )

udaje <- vysledok_podpora\(data prem_podpora <- vysledok_podpora\)prem

vysledok_prosocialne <- vytvor_skore( udaje, c(“prosocial”, “pro_social”, “prosocialne”), “prosocialne_spravanie” )

udaje <- vysledok_prosocialne\(data prem_prosocialne <- vysledok_prosocialne\)prem

vysledok_antisocialne <- vytvor_skore( udaje, c(“antisocial”, “anti_social”, “antisocialne”), “antisocialne_spravanie” )

udaje <- vysledok_antisocialne\(data prem_antisocialne <- vysledok_antisocialne\)prem

vysledok_uzkost <- vytvor_skore( udaje, c(“social_anxiety”, “socialanxiety”, “(^|)sas($|)”, “uzkost”), “socialna_uzkost” )

udaje <- vysledok_uzkost\(data prem_uzkost <- vysledok_uzkost\)prem

vysledok_odolnost <- vytvor_skore( udaje, c(“cd_risc”, “cdrisc”, “resilience”, “odolnost”), “psychicka_odolnost” )

udaje <- vysledok_odolnost\(data prem_odolnost <- vysledok_odolnost\)prem

rozpoznane <- data.frame( Konstruk = c( “Sociálna podpora”, “Prosociálne správanie”, “Antisociálne správanie”, “Sociálna úzkosť”, “Psychická odolnosť” ), Premenna_v_analyze = c( prem_podpora, prem_prosocialne, prem_antisocialne, prem_uzkost, prem_odolnost ) )

rozpoznane |> kable( format = “html”, row.names = FALSE, col.names = c(“Konštrukt”, “Použitá premenná”), caption = “Automaticky identifikované premenné” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

#| label: graf-podpora-prosocialne #| fig-cap: “Vzťah medzi sociálnou podporou a prosociálnym správaním.” #| fig-width: 8 #| fig-height: 5

if (!is.na(prem_podpora) && !is.na(prem_prosocialne)) {

graf_data <- udaje |> filter( !is.na(.data[[prem_podpora]]), !is.na(.data[[prem_prosocialne]]) )

ggplot( graf_data, aes( x = .data[[prem_podpora]], y = .data[[prem_prosocialne]] ) ) + geom_point(color = “steelblue”, size = 2, alpha = 0.6) + labs( x = “Sociálna podpora”, y = “Prosociálne správanie”, title = “Sociálna podpora a prosociálne správanie” ) + theme_minimal(base_size = 13)

} else {

cat(“Graf nemožno vytvoriť, pretože sa nepodarilo rozpoznať potrebné premenné.”)

}

#| label: jednoducha-regresia-prosocialne

model1 <- NULL data_model1 <- NULL

if (!is.na(prem_podpora) && !is.na(prem_prosocialne)) {

data_model1 <- udaje |> filter( is.finite(.data[[prem_podpora]]), is.finite(.data[[prem_prosocialne]]) )

if ( nrow(data_model1) >= 3 && length(unique(data_model1[[prem_podpora]])) > 1 ) {

model1 <- lm(
  reformulate(prem_podpora, response = prem_prosocialne),
  data = data_model1
)

tidy(model1)[c("term", "estimate")] |>
  kable(
    format = "html",
    digits = 4,
    row.names = FALSE,
    col.names = c("Člen modelu", "Odhad koeficienta"),
    caption = "Jednoduchá regresia prosociálneho správania"
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )

} else {

cat("Na odhad jednoduchej regresie nie je dostatok vhodných údajov.")

}

} else {

cat(“Jednoduchú regresiu nemožno odhadnúť bez potrebných premenných.”)

}

#| label: regresna-priamka-prosocialne #| fig-cap: “Bodový graf s odhadnutou regresnou priamkou.” #| fig-width: 8 #| fig-height: 5

if (!is.null(model1)) {

ggplot( data_model1, aes( x = .data[[prem_podpora]], y = .data[[prem_prosocialne]] ) ) + geom_point(color = “steelblue”, alpha = 0.6) + geom_abline( intercept = coef(model1)[1], slope = coef(model1)[2], color = “firebrick”, linewidth = 1 ) + labs( x = “Sociálna podpora”, y = “Prosociálne správanie”, title = “Odhadnutá regresná priamka” ) + theme_minimal(base_size = 13)

} else {

cat(“Regresnú priamku nemožno zobraziť bez odhadnutého modelu.”)

}

#| label: jednoducha-regresia-antisocialne

model_anti <- NULL data_model_anti <- NULL

if (!is.na(prem_podpora) && !is.na(prem_antisocialne)) {

data_model_anti <- udaje |> filter( is.finite(.data[[prem_podpora]]), is.finite(.data[[prem_antisocialne]]) )

if ( nrow(data_model_anti) >= 3 && length(unique(data_model_anti[[prem_podpora]])) > 1 ) {

model_anti <- lm(
  reformulate(prem_podpora, response = prem_antisocialne),
  data = data_model_anti
)

tidy(model_anti)[c("term", "estimate")] |>
  kable(
    format = "html",
    digits = 4,
    row.names = FALSE,
    col.names = c("Člen modelu", "Odhad koeficienta"),
    caption = "Jednoduchá regresia antisociálneho správania"
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )

} else {

cat("Na odhad modelu nie je dostatok vhodných údajov.")

}

} else {

cat(“Regresiu nemožno odhadnúť bez potrebných premenných.”)

}

#| label: viacnasobna-regresia

model <- NULL data_model <- NULL

potrebne_premenne <- c( prem_antisocialne, prem_podpora, prem_uzkost, prem_odolnost )

if ( all(!is.na(potrebne_premenne)) && all(potrebne_premenne %in% names(udaje)) ) {

data_model <- udaje |> filter( if_all( all_of(potrebne_premenne), ~ is.finite(.x) ) )

if ( nrow(data_model) >= 5 && all(sapply( data_model[potrebne_premenne], function(x) length(unique(x)) > 1 )) ) {

model <- lm(
  reformulate(
    c(prem_podpora, prem_uzkost, prem_odolnost),
    response = prem_antisocialne
  ),
  data = data_model
)

tidy(model)[c("term", "estimate")] |>
  kable(
    format = "html",
    digits = 6,
    row.names = FALSE,
    col.names = c("Člen modelu", "Odhad koeficienta"),
    caption = "Viacnásobná regresia antisociálneho správania"
  ) |>
  kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )

} else {

cat(
  "Na viacnásobnú regresiu nie je dostatok vhodných údajov ",
  "alebo niektorá premenná nemá dostatočnú variabilitu."
)

}

} else {

cat( “Viacnásobnú regresiu nemožno zostaviť, pretože sa nepodarilo”, “identifikovať všetky potrebné premenné.” )

}

#| label: suhrn-modelu

if (!is.null(model)) {

suhrn_modelu <- glance(model)

suhrn_modelu[c(“nobs”, “r.squared”, “sigma”)] |> kable( format = “html”, digits = 3, row.names = FALSE, col.names = c( “Počet pozorovaní”, “R²”, “Odhad SD rezíduí” ), caption = “Základné charakteristiky viacnásobného modelu” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

} else {

cat( “Súhrn viacnásobného modelu nie je dostupný,”, “pretože sa model nepodarilo odhadnúť.” )

}

#| label: skutocnost-predikcia

if (!is.null(model)) {

porovnanie <- data.frame( Skutocna_hodnota = model.response(model.frame(model)), Predikcia = fitted(model), Reziduum = residuals(model) )

head(porovnanie, 10) |> kable( format = “html”, digits = 3, row.names = FALSE, col.names = c( “Skutočná hodnota”, “Predikcia”, “Rezíduum” ), caption = “Porovnanie skutočných a predikovaných hodnôt” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

} else {

cat( “Porovnanie nie je dostupné, pretože sa nepodarilo”, “odhadnúť viacnásobný model.” )

}

#| label: predikcia-jednoducha

if (!is.null(model1)) {

rozsah_podpory <- range( data_model1[[prem_podpora]], na.rm = TRUE )

nove_udaje <- data.frame( hodnota = seq( rozsah_podpory[1], rozsah_podpory[2], length.out = 3 ) )

names(nove_udaje) <- prem_podpora

nove_udaje$Predikcia <- predict( model1, newdata = nove_udaje )

nove_udaje |> kable( format = “html”, digits = 3, row.names = FALSE, col.names = c( “Sociálna podpora”, “Predikcia prosociálneho správania” ), caption = “Predikcie jednoduchého regresného modelu” ) |> kable_styling( bootstrap_options = c(“striped”, “hover”), full_width = FALSE )

} else {

cat( “Predikciu nemožno vypočítať, pretože jednoduchý model”, “nie je dostupný.” )

}

2.5 Záver

V projekte som pripravila analýzu údajov o sociálnej podpore a správaní v športe pomocou programu R. Najprv som načítala údaje, skontrolovala štruktúru databázy a chýbajúce hodnoty a následne som vytvorila opisnú štatistiku.

V ďalších častiach som sa zamerala na grafické znázornenie vzťahov a na odhad jednoduchých a viacnásobných lineárnych regresných modelov. Pomocou funkcií lm(), tidy() a glance() možno preskúmať smer a veľkosť odhadnutých vzťahov a základné charakteristiky modelu. Funkcie fitted(), residuals() a predict() umožňujú porovnávať skutočné hodnoty s predikciami a vytvárať odhady pre zadané hodnoty vysvetľujúcich premenných.

Pri interpretácii výsledkov je potrebné overiť, či boli správne identifikované súhrnné skóre jednotlivých škál a či zvolený model zodpovedá výskumnej otázke. Automatické vytvorenie priemeru z položiek je vhodné iba vtedy, ak položky skutočne patria do rovnakej škály a ich kódovanie umožňuje takúto agregáciu. Ak sú niektoré položky obrátene kódované alebo databáza obsahuje už vypočítané súhrnné skóre, postup treba upraviť podľa dokumentácie zdroja.

Regresné modely v tejto práci slúžia na skúmanie štatistických súvislostí. Bez ďalších predpokladov a vhodného výskumného dizajnu z nich nemožno vyvodzovať príčinné závery.