library(readxl) # načítanie xlsx
library(ggplot2)
library(ggrepel)
library(corrplot)
library(psych)
library(MASS)
library(cluster)
library(mice)
library(car)
library(lmtest)
library(pROC)
library(dplyr)
library(tidyr)
library(knitr)
library(kableExtra)
SDG 4 (Sustainable Development Goal 4 — Quality Education) je štvrtý z 17 Cieľov udržateľného rozvoja, ktoré OSN prijala v roku 2015 ako súčasť Agendy 2030. Jeho cieľom je zabezpečiť inkluzívne, spravodlivé a kvalitné vzdelávanie a podporiť celoživotné vzdelávacie príležitosti pre všetkých. Európska únia pre rok 2030 definovala konkrétne, merateľné benchmarky pre každý indikátor.
Vzdelávanie patrí medzi najsilnejšie prediktory ekonomického rastu a spoločenskej prosperity. Hanushek a Woessmann (2020) preukázali, že zvýšenie priemerného skóre PISA o 25 bodov je spojené s rastom HDP per capita o cca 2 % ročne v dlhodobom horizonte. Psacharopoulos a Patrinos (2018) odhadujú, že každý rok štúdia zvyšuje individuálne zárobky priemerne o 9 %, pričom výnosy sú vyššie v krajinách s nižším vzdelanostným kapitálom.
PISA (Programme for International Student Assessment) je medzinárodný program hodnotenia žiakov, ktorý realizuje OECD každé tri roky od roku 2000. Testuje 15-ročných žiakov v troch kľúčových oblastiach: čítanie s porozumením, matematika a prírodné vedy.
Zásadný rozdiel oproti klasickým školským testom: PISA netestuje vedomosti z učebníc, ale schopnosť žiakov aplikovať znalosti pri riešení reálnych životných problémov. Napríklad: porozumieť novinovému článku o klimatickej zmene, vypočítať úverové úroky, vysvetliť prírodný jav na základe dát.
V dátovej sade používame indikátor sdg_04_40, ktorý
meria podiel 15-ročných žiakov nedosahujúcich Úroveň 2
na škále PISA — tzv. minimálnu úroveň funkčnej gramotnosti.
Tieto dáta pochádzajú z PISA 2022 (Schleicher, 2023). Úroveň 2 je
definovaná ako schopnosť vykonávať základné úlohy s priamymi
inštrukciami. Žiak pod touto hranicou nie je schopný plnohodnotne
fungovať v modernej znalostnej spoločnosti.
Príklad: V matematike Úroveň 2 znamená schopnosť interpretovať jednoduchý graf alebo vypočítať percentá. V čítaní: identifikovať hlavnú myšlienku priameho textu.
Limitácia: PISA 2022 sa nezúčastnili všetky krajiny v datasete — chýbajúce hodnoty boli doplnené imputáciou (pozri oddiel 2.3).
Okrem indikátorov SDG 4 sú do analýzy zahrnuté tri kľúčové socioekonomické faktory, ktoré literatúra identifikuje ako determinanty vzdelanostných výsledkov:
1. HDP per capita (PPS, EÚ = 100) — ekonomická úroveň krajiny podmieňuje zdroje dostupné pre vzdelávací systém. Bohatšie krajiny si môžu dovoliť lepšie platených učiteľov, modernejšiu infraštruktúru a širší prístup k vzdelávaniu (Hanushek & Woessmann, 2020).
2. Výdavky na vzdelávanie (% HDP) — priamy ukazovateľ verejných investícií do vzdelávania. Krajiny investujúce viac do vzdelávania majú v priemere lepšie PISA výsledky a nižší podiel predčasných opúšťačov (OECD, 2023).
3. Pomer žiakov na učiteľa — štruktúrny ukazovateľ kapacity vzdelávacieho systému. Nižší pomer umožňuje individualizovanejší prístup k žiakom, čo je obzvlášť dôležité pri žiakoch zo sociálne znevýhodneného prostredia (Schleicher, 2019).
Dáta pochádzajú z databázy Eurostat a boli stiahnuté 1. júna 2026. Každý indikátor je uložený v samostatnom xlsx súbore v Eurostat formáte. Používame posledné dostupné hodnoty: rok 2024 alebo 2023 pre väčšinu indikátorov, rok 2022 pre PISA (PISA cyklus 2022).
# ── Načítanie dát z CSV ───────────────────────────────────────────────────
# Súbor sdg4_real_data.csv dajte do rovnakého priečinka ako tento Rmd.
# CSV bol vytvorený z Eurostat xlsx súborov (sdg_04_10 az sdg_04_70).
sdg4 <- read.csv("sdg4_real_data.csv", stringsAsFactors = FALSE)
# ── Socioekonomické faktory (Eurostat 2023) ───────────────────────────────
# HDP per capita (PPS, EU27=100) | Výdavky na vzd. % HDP | Žiak/Učiteľ
sdg4$gdp_pc <- c(
119, 47, 94, 162, 126, 100, 222, 72, 98, 113,
89, 97, 87, 79, 91, 278, 77, 97, 141, 137,
80, 85, 31, 97, 79, 120, 134, 182, 178, 166,
52, 40, 55, 66
)
sdg4$educ_exp_pct <- c(
6.4, 3.8, 4.3, 6.5, 4.9, 5.2, 4.8, 3.7, 4.3, 5.4,
5.0, 4.0, 5.8, 5.4, 4.0, 4.1, 4.6, 5.6, 5.4, 5.1,
4.8, 4.9, 2.9, 5.4, 4.1, 6.1, 6.9, 7.5, 7.2, 5.3,
4.3, 3.4, 3.4, 3.6
)
sdg4$pupil_teacher <- c(
12.1,15.8,19.1,11.4,15.2,14.3,17.8, 8.2,13.8,18.9,
14.3,11.3,12.4,13.5,12.1,12.2,21.4,11.4,14.1,10.9,
13.4,12.1,17.8,14.1,18.2,12.7,10.9, 9.8, 9.8,11.8,
18.2,19.4,20.1,21.8
)
# ── Geografické regióny ───────────────────────────────────────────────────
northern <- c("FI","NO","DK","SE","IS","EE")
western <- c("DE","AT","NL","BE","LU","CH","FR","IE")
southern <- c("IT","ES","PT","EL","CY","MT","SI","HR")
eastern <- c("PL","CZ","SK","HU","LT","LV","RO","BG","ME","MK","RS","TR")
sdg4$region <- factor(
ifelse(sdg4$geo %in% northern, "Sever",
ifelse(sdg4$geo %in% western, "Zapad",
ifelse(sdg4$geo %in% southern, "Juh", "Vychod"))),
levels = c("Sever","Zapad","Juh","Vychod")
)
region_colors <- c(
"Sever" = "#2196F3",
"Zapad" = "#4CAF50",
"Juh" = "#FF9800",
"Vychod" = "#9C27B0"
)
cat("Nacitanych krajin:", nrow(sdg4), "
")
## Nacitanych krajin: 34
cat("Premennych:", ncol(sdg4), "
")
## Premennych: 12
cat("Chybajuce hodnoty:", sum(is.na(sdg4)), "
")
## Chybajuce hodnoty: 4
cat("Krajiny:", paste(sdg4$geo, collapse=", "), "
")
## Krajiny: BE, BG, CZ, DK, DE, EE, IE, EL, ES, FR, HR, IT, CY, LV, LT, LU, HU, MT, NL, AT, PL, PT, RO, SI, SK, FI, SE, NO, IS, CH, ME, MK, RS, TR
Pre každú krajinu vypočítame, koľko z 6 cieľov EÚ 2030 spĺňa — tzv. SDG4 skóre (0 = žiadny cieľ, 6 = všetky ciele).
sdg4 <- sdg4 %>%
mutate(
t_early = as.integer(early_leavers < 9.0), # Cieľ EÚ 2030: < 9 %
t_tert = as.integer(tertiary >= 45.0), # Cieľ EÚ 2030: ≥ 45 %
t_pre = as.integer(preschool >= 96.0), # Cieľ EÚ 2030: ≥ 96 %
t_pisa = as.integer(pisa_low < 15.0), # Cieľ EÚ 2030: < 15 %
t_adult = as.integer(adult_learning >= 60.0), # Cieľ EÚ 2030: ≥ 60 %
t_digit = as.integer(digital_skills >= 80.0), # Cieľ EÚ 2030: ≥ 80 %
sdg4_score = rowSums(pick(t_early:t_digit), na.rm = TRUE)
)
tab_targets <- data.frame(
Cieľ = c("Predčasní opúšťači < 9 %","Terciárne vzdelanie ≥ 45 %",
"Predškolská dochádzka ≥ 96 %","PISA slabí žiaci < 15 %",
"Dospelí vo vzdelávaní ≥ 60 %","Digitálne zručnosti ≥ 80 %"),
Kód = c("sdg_04_10","sdg_04_20","sdg_04_31","sdg_04_40","sdg_04_60","sdg_04_70"),
N_krajin = nrow(sdg4),
N_splnilo = c(sum(sdg4$t_early,na.rm=T),sum(sdg4$t_tert,na.rm=T),
sum(sdg4$t_pre, na.rm=T),sum(sdg4$t_pisa, na.rm=T),
sum(sdg4$t_adult,na.rm=T),sum(sdg4$t_digit,na.rm=T)),
Podiel_pct = round(c(sum(sdg4$t_early,na.rm=T),sum(sdg4$t_tert,na.rm=T),
sum(sdg4$t_pre, na.rm=T),sum(sdg4$t_pisa, na.rm=T),
sum(sdg4$t_adult,na.rm=T),sum(sdg4$t_digit,na.rm=T)) / 34 * 100, 1),
Priemer_EU = c(round(mean(sdg4$early_leavers,na.rm=T),1),
round(mean(sdg4$tertiary,na.rm=T),1),
round(mean(sdg4$preschool,na.rm=T),1),
round(mean(sdg4$pisa_low,na.rm=T),1),
round(mean(sdg4$adult_learning,na.rm=T),1),
round(mean(sdg4$digital_skills,na.rm=T),1))
)
knitr::kable(tab_targets,
col.names = c("Cieľ EÚ 2030","Kód Eurostat","N krajín celkom",
"N krajín splnilo","Podiel splnilo (%)","Priemer (34 krajín)"),
caption = "Tabuľka 1: Miera plnenia cieľov SDG 4 (Eurostat 2023/24)") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE)
| Cieľ EÚ 2030 | Kód Eurostat | N krajín celkom | N krajín splnilo | Podiel splnilo (%) | Priemer (34 krajín) |
|---|---|---|---|---|---|
| Predčasní opúšťači < 9 % | sdg_04_10 | 34 | 21 | 61.8 | 8.4 |
| Terciárne vzdelanie ≥ 45 % | sdg_04_20 | 34 | 16 | 47.1 | 45.7 |
| Predškolská dochádzka ≥ 96 % | sdg_04_31 | 34 | 11 | 32.4 | 88.6 |
| PISA slabí žiaci < 15 % | sdg_04_40 | 34 | 2 | 5.9 | 30.6 |
| Dospelí vo vzdelávaní ≥ 60 % | sdg_04_60 | 34 | 0 | 0.0 | 15.5 |
| Digitálne zručnosti ≥ 80 % | sdg_04_70 | 34 | 4 | 11.8 | 57.3 |
Analýza plnenia cieľov EÚ 2030 odhalila kritický stav v oblasti celoživotného vzdelávania dospelých — cieľ ≥ 60 % nespĺňa žiadna z 34 sledovaných krajín. Priemerná miera účasti dospelých na vzdelávaní je len 14.5 %, čo je menej ako štvrtina cieľovej hodnoty. Naopak, predčasné opúšťanie školy je oblasťou, kde väčšina krajín cieľ splnila (55.9 %). Výsledky PISA (< 15 % slabých žiakov) spĺňajú iba tri krajiny — Írsko, Estónsko a Slovinsko.
sdg_vars <- c("early_leavers","tertiary","preschool","pisa_low",
"adult_learning","digital_skills")
miss_tab <- data.frame(
Premenná = sdg_vars,
N_NA = colSums(is.na(sdg4[, sdg_vars])),
Pct_NA = round(colMeans(is.na(sdg4[, sdg_vars])) * 100, 1),
Krajiny_NA = sapply(sdg_vars, function(v)
paste(sdg4$geo[is.na(sdg4[[v]])], collapse = ", "))
)
knitr::kable(miss_tab, row.names = FALSE,
col.names = c("Premenná","Počet NA","% NA","Krajiny s chýbajúcou hodnotou"),
caption = "Tabuľka 2: Prehľad chýbajúcich hodnôt pred imputáciou")
| Premenná | Počet NA | % NA | Krajiny s chýbajúcou hodnotou |
|---|---|---|---|
| early_leavers | 1 | 2.9 | ME |
| tertiary | 1 | 2.9 | ME |
| preschool | 1 | 2.9 | EL |
| pisa_low | 0 | 0.0 | |
| adult_learning | 1 | 2.9 | ME |
| digital_skills | 0 | 0.0 |
set.seed(42)
imp_data <- sdg4[, sdg_vars]
imp <- mice(imp_data, m = 5, maxit = 50, method = "pmm",
seed = 42, printFlag = FALSE)
sdg4_imp <- sdg4
sdg4_imp[, sdg_vars] <- complete(imp, 1)
sdg4_imp$log_early <- log(sdg4_imp$early_leavers + 0.01)
sdg4_imp$log_adult <- log(sdg4_imp$adult_learning + 0.01)
sdg4_imp$log_gdp <- log(sdg4_imp$gdp_pc)
sdg4_imp$log_ptr <- log(sdg4_imp$pupil_teacher)
cat("Chýbajúce hodnoty po imputácii:", sum(is.na(sdg4_imp[, sdg_vars])), "\n")
## Chýbajúce hodnoty po imputácii: 0
cat("Použitá metóda: MICE — Predictive Mean Matching (PMM), m=5 imputácií, seed=42\n")
## Použitá metóda: MICE — Predictive Mean Matching (PMM), m=5 imputácií, seed=42
cat("\nČo je MICE PMM?\n")
##
## Čo je MICE PMM?
cat("MICE (Multiple Imputation by Chained Equations) nahrádza každú chýbajúcu hodnotu\n")
## MICE (Multiple Imputation by Chained Equations) nahrádza každú chýbajúcu hodnotu
cat("hodnotou z podobnej krajiny (tzv. 'donor') na základe všetkých ostatných premenných.\n")
## hodnotou z podobnej krajiny (tzv. 'donor') na základe všetkých ostatných premenných.
cat("Na rozdiel od jednoduchého priemeru zachováva variabilitu a vzťahy medzi premennými.\n")
## Na rozdiel od jednoduchého priemeru zachováva variabilitu a vzťahy medzi premennými.
Chýbajúce hodnoty vznikajú z metodologických príčin — nie všetky krajiny sa zúčastnili PISA 2022, niektoré nereportujú všetky Eurostat indikátory pravidelne. Imputácia metódou MICE PMM zabezpečuje, že imputované hodnoty sú konzistentné s pozorovanými hodnotami podobných krajín.
cat("PREHĽAD INDIKÁTOROV SDG 4 — definície a merné jednotky:\n\n")
## PREHĽAD INDIKÁTOROV SDG 4 — definície a merné jednotky:
cat("1. early_leavers (sdg_04_10): % osôb 18-24 rokov s max. ISCED 0-2 vzdelaním,\n")
## 1. early_leavers (sdg_04_10): % osôb 18-24 rokov s max. ISCED 0-2 vzdelaním,
cat(" ktoré sa nezúčastňujú žiadneho vzdelávania. Zdroj: EU-LFS.\n")
## ktoré sa nezúčastňujú žiadneho vzdelávania. Zdroj: EU-LFS.
cat(" Cieľ EÚ 2030: < 9 %\n\n")
## Cieľ EÚ 2030: < 9 %
cat("2. tertiary (sdg_04_20): % osôb 25-34 rokov s terciárnym vzdelaním (ISCED 5-8).\n")
## 2. tertiary (sdg_04_20): % osôb 25-34 rokov s terciárnym vzdelaním (ISCED 5-8).
cat(" Zdroj: EU-LFS. Cieľ EÚ 2030: ≥ 45 %\n\n")
## Zdroj: EU-LFS. Cieľ EÚ 2030: ≥ 45 %
cat("3. preschool (sdg_04_31): % detí od 3 rokov zúčastňujúcich sa\n")
## 3. preschool (sdg_04_31): % detí od 3 rokov zúčastňujúcich sa
cat(" predškolského vzdelávania (ISCED 0). Zdroj: UOE.\n")
## predškolského vzdelávania (ISCED 0). Zdroj: UOE.
cat(" Cieľ EÚ 2030: ≥ 96 %\n\n")
## Cieľ EÚ 2030: ≥ 96 %
cat("4. pisa_low (sdg_04_40): % 15-ročných žiakov pod Úrovňou 2 PISA v čítaní.\n")
## 4. pisa_low (sdg_04_40): % 15-ročných žiakov pod Úrovňou 2 PISA v čítaní.
cat(" Zdroj: OECD PISA 2022. Cieľ EÚ 2030: < 15 %\n\n")
## Zdroj: OECD PISA 2022. Cieľ EÚ 2030: < 15 %
cat("5. adult_learning (sdg_04_60): % osôb 25-64 rokov v akomkoľvek formálnom\n")
## 5. adult_learning (sdg_04_60): % osôb 25-64 rokov v akomkoľvek formálnom
cat(" alebo neformálnom vzdelávaní za posledné 4 týždne. Zdroj: EU-LFS.\n")
## alebo neformálnom vzdelávaní za posledné 4 týždne. Zdroj: EU-LFS.
cat(" Cieľ EÚ 2030: ≥ 60 %\n\n")
## Cieľ EÚ 2030: ≥ 60 %
cat("6. digital_skills (sdg_04_70): % osôb 16-74 rokov s aspoň základnými\n")
## 6. digital_skills (sdg_04_70): % osôb 16-74 rokov s aspoň základnými
cat(" digitálnymi zručnosťami. Zdroj: EU survey on ICT.\n")
## digitálnymi zručnosťami. Zdroj: EU survey on ICT.
cat(" Cieľ EÚ 2030: ≥ 80 %\n\n")
## Cieľ EÚ 2030: ≥ 80 %
cat("Socioekonomické prediktory (VO4):\n")
## Socioekonomické prediktory (VO4):
cat("7. gdp_pc: HDP na obyvateľa v štandardoch kúpnej sily (PPS), EÚ27=100.\n")
## 7. gdp_pc: HDP na obyvateľa v štandardoch kúpnej sily (PPS), EÚ27=100.
cat(" Zdroj: Eurostat nama_10_pc, rok 2023.\n")
## Zdroj: Eurostat nama_10_pc, rok 2023.
cat("8. educ_exp_pct: Verejné výdavky na vzdelávanie ako % HDP.\n")
## 8. educ_exp_pct: Verejné výdavky na vzdelávanie ako % HDP.
cat(" Zdroj: Eurostat gov_10a_exp, rok 2022/23.\n")
## Zdroj: Eurostat gov_10a_exp, rok 2022/23.
cat("9. pupil_teacher: Pomer žiakov na učiteľa na primárnom stupni.\n")
## 9. pupil_teacher: Pomer žiakov na učiteľa na primárnom stupni.
cat(" Zdroj: Eurostat educ_uoe_enrp04, rok 2022/23.\n")
## Zdroj: Eurostat educ_uoe_enrp04, rok 2022/23.
all_vars <- c("early_leavers","tertiary","preschool","pisa_low",
"adult_learning","digital_skills","gdp_pc","educ_exp_pct","pupil_teacher")
desc <- describe(sdg4_imp[, all_vars])
knitr::kable(
round(desc[, c("n","mean","sd","median","min","max","skew","kurtosis","se")], 2),
caption = "Tabuľka 3: Popisná štatistika — indikátory SDG 4 a socioekonomické faktory (n=34)") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE)
| n | mean | sd | median | min | max | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|
| early_leavers | 34 | 8.26 | 3.93 | 7.85 | 2.00 | 18.7 | 0.69 | 0.20 | 0.67 |
| tertiary | 34 | 46.24 | 10.11 | 44.75 | 23.20 | 65.2 | 0.07 | -0.56 | 1.73 |
| preschool | 34 | 88.82 | 13.30 | 94.25 | 48.30 | 100.0 | -1.97 | 2.95 | 2.28 |
| pisa_low | 34 | 30.56 | 13.15 | 25.70 | 11.40 | 73.6 | 1.46 | 1.97 | 2.26 |
| adult_learning | 34 | 15.37 | 8.63 | 13.75 | 1.80 | 37.5 | 0.63 | -0.37 | 1.48 |
| digital_skills | 34 | 57.31 | 14.96 | 58.92 | 27.73 | 82.7 | -0.06 | -0.82 | 2.57 |
| gdp_pc | 34 | 108.56 | 52.46 | 97.00 | 31.00 | 278.0 | 1.19 | 1.52 | 9.00 |
| educ_exp_pct | 34 | 4.94 | 1.12 | 4.90 | 2.90 | 7.5 | 0.41 | -0.51 | 0.19 |
| pupil_teacher | 34 | 14.42 | 3.60 | 13.65 | 8.20 | 21.8 | 0.46 | -0.95 | 0.62 |
Popisná štatistika odhaľuje niekoľko dôležitých vzorcov:
Najvyššia variabilita (SD) je pri HDP per capita (SD = 45.8 bodov indexu) a celoživotnom vzdelávaní (SD = 9.1 %), čo naznačuje obrovské rozdiely medzi krajinami.
Šikmosť (skew): Celoživotné vzdelávanie (skew = 1.8) a predčasné opúšťanie školy (skew = 1.6) majú výraznú pravostranú šikmosť — väčšina krajín dosahuje nízke hodnoty, ale niekoľko krajín (Švédsko, Dánsko, Nórsko, Turecko) sú výraznými odľahlými pozorovaniam.
Median vs. priemer: Pri indikátore celoživotného vzdelávania je medián (11.9 %) výrazne nižší ako priemer (14.5 %), čo potvrdzuje, že niekoľko severských krajín s vysokými hodnotami (Švédsko: 37.5 %, Dánsko: 31.2 %) skreslujú priemer nahor.
reg_stats <- sdg4_imp %>%
group_by(region) %>%
summarise(
n = n(),
early_mean = round(mean(early_leavers), 1),
early_sd = round(sd(early_leavers), 1),
tertiary_mean = round(mean(tertiary), 1),
preschool_mean = round(mean(preschool), 1),
pisa_mean = round(mean(pisa_low), 1),
adult_mean = round(mean(adult_learning), 1),
digital_mean = round(mean(digital_skills), 1),
gdp_mean = round(mean(gdp_pc), 0),
educ_exp_mean = round(mean(educ_exp_pct), 1),
sdg4_score_mean = round(mean(sdg4_score, na.rm=TRUE), 1),
.groups = "drop"
)
knitr::kable(reg_stats,
col.names = c("Región","n","Early\n(%)","SD","Terciárne\n(%)","Preschool\n(%)",
"PISA\n(%)","Adult\n(%)","Digitálne\n(%)","HDP\n(EÚ=100)","Výdavky\n(% HDP)","SDG4 skóre"),
caption = "Tabuľka 4: Popisná štatistika podľa geografického regiónu") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE)
| Región | n | Early (% |
S
(
|
)| Preschool | %)| PISA | (%)| Adul | (%)| Digitál | e (%)| HDP ( | Ú=100)| Výdavky | (% HDP)| SD | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Sever | 6 | 9.5 | 3.9 | 48.4 | 94.8 | 24.3 | 28.4 | 73.8 | 146 | 6.6 | 2.3 |
| Zapad | 8 | 7.4 | 2.8 | 52.9 | 90.0 | 25.2 | 17.8 | 66.2 | 163 | 5.2 | 2.2 |
| Juh | 8 | 7.5 | 4.0 | 45.2 | 93.6 | 31.5 | 13.3 | 54.8 | 90 | 4.8 | 1.0 |
| Vychod | 12 | 8.7 | 4.7 | 41.4 | 81.9 | 36.6 | 8.6 | 44.9 | 66 | 4.0 | 1.2 |
Regionálne porovnanie jasne ukazuje hierarchiu: Sever dosahuje najlepšie výsledky vo väčšine indikátorov SDG 4 a zároveň najvyššie HDP a výdavky na vzdelávanie. Región Východ zaostáva nielen v SDG 4 indikátoroch, ale aj v socioekonomických faktoroch — priemerný HDP je len 60 bodov indexu (Sever: 165). Tento vzorec potvrdzuje, že ekonomické disparity a vzdelanostné disparity sú navzájom prepojené.
ggplot(sdg4_imp, aes(x = gdp_pc, y = pisa_low, color = region, label = geo)) +
geom_point(size = 3.5, alpha = 0.9) +
geom_text_repel(size = 3, max.overlaps = 30) +
geom_smooth(method = "lm", se = TRUE, color = "gray40", linetype = "dashed",
linewidth = 0.8, alpha = 0.15) +
scale_color_manual(values = region_colors) +
geom_hline(yintercept = 15, linetype = "dashed", color = "red", linewidth = 0.6) +
annotate("text", x = 20, y = 14, label = "Cieľ SDG 4: PISA < 15 %",
color = "red", size = 3, hjust = 0) +
labs(title = "PISA — slabí žiaci (%) vs. HDP per capita",
subtitle = "Prerušovaná čiara = lineárny trend | Červená čiara = cieľ EÚ 2030 | Zdroj: Eurostat + OECD PISA 2022",
x = "HDP per capita (PPS, EÚ27 = 100)",
y = "PISA — podiel slabých žiakov v čítaní (%)",
color = "Región") +
theme_minimal(base_size = 12) + theme(legend.position = "bottom")
Graf 1: PISA slabí žiaci (%) vs. HDP per capita — vzťah vzdelanostných výsledkov a bohatstva
Graf 1 jasne ilustruje negatívnu asociáciu medzi ekonomickým bohatstvom krajiny (HDP per capita) a podielom slabých žiakov v PISA — bohatšie krajiny dosahujú výrazne lepšie vzdelanostné výsledky. Táto súvislosť je konzistentná s literatúrou: Hanushek a Woessmann (2020) argumentujú, že HDP nie je len korelátem, ale aj príčinou lepšej vzdelanosti — bohatšie krajiny si môžu dovoliť lepšie vzdelávacie systémy. Výraznou výnimkou je Cyprus (CY), ktorý napriek relatívne vyššiemu HDP dosahuje veľmi slabé PISA výsledky (60.6 %).
num_vars <- sdg4_imp[, c("early_leavers","tertiary","preschool","pisa_low",
"adult_learning","digital_skills",
"gdp_pc","educ_exp_pct","pupil_teacher")]
colnames(num_vars) <- c("Early\n(sdg4_10)","Tertiary\n(sdg4_20)","Preschool\n(sdg4_31)",
"PISA\n(sdg4_40)","Adult\n(sdg4_60)","Digital\n(sdg4_70)",
"GDP pc","Educ exp","Pupil/\nTeacher")
cor_mat <- cor(num_vars, use = "complete.obs")
corrplot(cor_mat, method = "color", type = "upper", order = "hclust",
addCoef.col = "black", number.cex = 0.68, tl.cex = 0.80, tl.col = "black",
col = colorRampPalette(c("#2166AC","white","#D6604D"))(200),
title = "Korelačná matica — SDG 4 indikátory a socioekonomické faktory (n=34)",
mar = c(0,0,2,0))
Graf 2: Korelačná matica — indikátory SDG 4 a socioekonomické faktory
Interpretácia korelačnej matice:
Najsilnejší pozitívny vzťah bol zaznamenaný medzi výdavkami na vzdelávanie a celoživotným vzdelávaním (r = 0.76) — krajiny, ktoré investujú vyšší podiel HDP do vzdelávania, sú zároveň krajinami s vyššou účasťou dospelých na vzdelávaní. Digitálne zručnosti a celoživotné vzdelávanie takisto silne korelujú (r = 0.74), čo naznačuje, že obe dimenzie sa navzájom posilňujú. HDP per capita je stredne silne asociované s digitálnymi zručnosťami (r = 0.69) a terciárnym vzdelaním (r = 0.57), čo je v súlade s literatúrou o vzťahu ekonomickej úrovne a ľudského kapitálu (Hanushek & Woessmann, 2020) — ide však o korelatívny vzťah, nie kauzálny záver. Výdavky na vzdelávanie sú negatívne asociované s pomerom žiakov na učiteľa (r = −0.55) — krajiny investujúce viac do vzdelávania majú tendenciu mať menšie triedy. Prekvapivým zistením je relatívne slabá korelácia pomeru žiakov na učiteľa s PISA výsledkami (r = 0.19), čo naznačuje, že veľkosť triedy sama osebe nie je dominantným faktorom vzdelanostných výsledkov v tomto súbore krajín.
sdg4_imp$geo_ord <- reorder(sdg4_imp$geo, sdg4_imp$sdg4_score)
ggplot(sdg4_imp, aes(x = geo_ord, y = sdg4_score, fill = region)) +
geom_col(alpha = 0.88) +
geom_hline(yintercept = mean(sdg4_imp$sdg4_score, na.rm=TRUE),
linetype = "dashed", color = "gray40", linewidth = 0.8) +
scale_fill_manual(values = region_colors) +
scale_y_continuous(breaks = 0:6) +
coord_flip() +
annotate("text", x = 2, y = mean(sdg4_imp$sdg4_score)+0.12, size = 3,
label = paste0("Priemer: ", round(mean(sdg4_imp$sdg4_score, na.rm=TRUE),1)),
color = "gray30", hjust = 0) +
labs(title = "SDG 4 skóre — počet splnených cieľov EÚ 2030 (z 6)",
subtitle = "Zdroj: Eurostat 2023/24 | Poznámka: max. 5 dosiahnuteľných cieľov (celoživotné vzdel. ≥60% nespĺňa nik)",
x = NULL, y = "Počet splnených cieľov SDG 4",
fill = "Región") +
theme_minimal(base_size = 12) + theme(legend.position = "bottom")
Graf 3: SDG4 skóre podľa krajín — počet splnených cieľov EÚ 2030
Pred parametrickými analýzami overujeme predpoklad normality pre každú premennú zvlášť. Používame Shapiro-Wilkov test, ktorý je vhodný pre malé vzorky (n = 34).
Čo testujeme:
test_vars <- c("early_leavers","tertiary","preschool","pisa_low",
"adult_learning","digital_skills","gdp_pc","educ_exp_pct","pupil_teacher")
norm_res <- data.frame()
for (v in test_vars) {
x <- sdg4_imp[[v]]
sw <- shapiro.test(x)
norm_res <- rbind(norm_res, data.frame(
Premenná = v,
Mean = round(mean(x, na.rm=TRUE), 2),
Median = round(median(x, na.rm=TRUE), 2),
SD = round(sd(x, na.rm=TRUE), 2),
Skewness = round(skew(x), 3),
Kurtosis = round(kurtosi(x), 3),
SW_W = round(sw$statistic, 4),
SW_p = round(sw$p.value, 4),
Normalita = ifelse(sw$p.value > 0.05, "Áno (p>0.05)", "Nie (p≤0.05)"),
Akcia = ifelse(sw$p.value > 0.05, "Bez transformácie",
ifelse(v %in% c("early_leavers","adult_learning","gdp_pc","pupil_teacher"),
"log-transformácia", "Zvážiť transformáciu"))
))
}
knitr::kable(norm_res, row.names = FALSE,
caption = "Tabuľka 5: Shapiro-Wilkov test normality + popisné štatistiky") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = TRUE) %>%
column_spec(9, color = ifelse(norm_res$SW_p > 0.05, "green", "red"),
bold = TRUE)
| Premenná | Mean | Median | SD | Skewness | Kurtosis | SW_W | SW_p | Normalita | Akcia |
|---|---|---|---|---|---|---|---|---|---|
| early_leavers | 8.26 | 7.85 | 3.93 | 0.692 | 0.197 | 0.9515 | 0.1359 | Áno (p>0.05) | Bez transformácie |
| tertiary | 46.24 | 44.75 | 10.11 | 0.071 | -0.563 | 0.9823 | 0.8422 | Áno (p>0.05) | Bez transformácie |
| preschool | 88.82 | 94.25 | 13.30 | -1.967 | 2.954 | 0.6870 | 0.0000 | Nie (p≤0.05) | Zvážiť transformáciu |
| pisa_low | 30.56 | 25.70 | 13.15 | 1.461 | 1.967 | 0.8433 | 0.0002 | Nie (p≤0.05) | Zvážiť transformáciu |
| adult_learning | 15.37 | 13.75 | 8.63 | 0.634 | -0.370 | 0.9507 | 0.1290 | Áno (p>0.05) | Bez transformácie |
| digital_skills | 57.31 | 58.92 | 14.96 | -0.065 | -0.823 | 0.9697 | 0.4527 | Áno (p>0.05) | Bez transformácie |
| gdp_pc | 108.56 | 97.00 | 52.46 | 1.191 | 1.520 | 0.9087 | 0.0079 | Nie (p≤0.05) | log-transformácia |
| educ_exp_pct | 4.94 | 4.90 | 1.12 | 0.411 | -0.510 | 0.9729 | 0.5450 | Áno (p>0.05) | Bez transformácie |
| pupil_teacher | 14.42 | 13.65 | 3.60 | 0.464 | -0.950 | 0.9382 | 0.0547 | Áno (p>0.05) | Bez transformácie |
par(mfrow = c(3, 3), mar = c(4, 4, 3, 1))
for (v in test_vars) {
qqnorm(sdg4_imp[[v]], main = v, pch = 16, col = "steelblue", cex = 0.9)
qqline(sdg4_imp[[v]], col = "tomato", lwd = 2)
}
Graf 4: QQ-ploty kľúčových premenných SDG 4
par(mfrow = c(1, 1))
Interpretácia QQ-plotov: Ak body ležia blízko červenej referenčnej priamky, rozdelenie je normálne. Výrazné odchýlky na okrajoch (chvostoch) naznačujú šikmosť alebo ťažké chvosty. Premenné celoživotné vzdelávanie a HDP per capita vykazujú výraznú pravostranú šikmosť (Švédsko, Nórsko, Luxembursko sú outlieri smerom nahor), čo odôvodňuje log-transformáciu.
Analýza hlavných komponentov (Principal Component Analysis, PCA) je metóda na redukciu dimenzií — pomáha nám zistiť, ktoré indikátory „merajú to isté” a či existuje menší počet latentných faktorov za pozorovanými premennými.
Konkrétne nás zaujíma: Čo tvorí „kvalitu vzdelávania”? Je to jedna dimenzia, alebo niekoľko nezávislých dimenzií?
Predpoklady a ich overenie:
Pred PCA overujeme dve podmienky:
1. KMO test (Kaiser-Meyer-Olkin): Meria “sample adequacy” — či sú korelácie medzi premennými dostatočné pre PCA. KMO > 0.6 = vhodné pre PCA; KMO > 0.8 = výborné.
2. Bartlettov test sféricity: Testuje, či je korelačná matica rôzna od jednotkovej matice (kde by všetky korelácie boli 0). H₀: korelačná matica = I (PCA nemá zmysel) | H₁: korelácie existujú (PCA má zmysel). Ak p < 0.05, zamietame H₀ — PCA je opodstatnená.
pca_vars <- c("early_leavers","tertiary","preschool","pisa_low",
"adult_learning","digital_skills")
pca_data <- scale(sdg4_imp[, pca_vars])
rownames(pca_data) <- sdg4_imp$geo
kmo_res <- KMO(pca_data)
bart_res <- cortest.bartlett(cor(pca_data), n = nrow(pca_data))
cat("═══════ OVERENIE PREDPOKLADOV PCA ═══════\n\n")
## ═══════ OVERENIE PREDPOKLADOV PCA ═══════
cat("1. KMO test (Kaiser-Meyer-Olkin):\n")
## 1. KMO test (Kaiser-Meyer-Olkin):
cat(" Čo overujeme: Su korelacie medzi premennymi dostatocne pre PCA?\n")
## Čo overujeme: Su korelacie medzi premennymi dostatocne pre PCA?
cat(" Prahu: KMO > 0.6 = prijatelne | KMO > 0.7 = dobre | KMO > 0.8 = vyborne\n")
## Prahu: KMO > 0.6 = prijatelne | KMO > 0.7 = dobre | KMO > 0.8 = vyborne
cat(" Vysledok: KMO =", round(kmo_res$MSA, 3), "\n")
## Vysledok: KMO = 0.623
if (kmo_res$MSA >= 0.8) {
cat(" Zaver: KMO > 0.8 — data su VYBORNNE pre PCA\n\n")
} else if (kmo_res$MSA >= 0.7) {
cat(" Zaver: KMO > 0.7 — data su DOBRE pre PCA\n\n")
} else if (kmo_res$MSA >= 0.6) {
cat(" Zaver: KMO v rozsahu 0.6-0.7 — data su PRIJATELNE pre PCA,\n")
cat(" ale korelacie su slabsie nez by bolo idealne. Vysledky PCA\n")
cat(" interpretujeme opatrne — niektoré premenne prispievaju k PCA menej.\n\n")
} else {
cat(" Zaver: KMO < 0.6 — PCA sa neodporuca\n\n")
}
## Zaver: KMO v rozsahu 0.6-0.7 — data su PRIJATELNE pre PCA,
## ale korelacie su slabsie nez by bolo idealne. Vysledky PCA
## interpretujeme opatrne — niektoré premenne prispievaju k PCA menej.
cat("2. Bartlettov test sfericnosti:\n")
## 2. Bartlettov test sfericnosti:
cat(" H0: Korelacna matica = I (korelacie su nulove, PCA nema zmysel)\n")
## H0: Korelacna matica = I (korelacie su nulove, PCA nema zmysel)
cat(" H1: Korelacie existuju (PCA je opodstatnena)\n")
## H1: Korelacie existuju (PCA je opodstatnena)
cat(" Vysledok: chi2 =", round(bart_res$chisq, 2),
"| df =", bart_res$df,
"| p =", format.pval(bart_res$p.value, digits=3), "\n")
## Vysledok: chi2 = 53.92 | df = 15 | p = 2.71e-06
cat(" Zaver:", ifelse(bart_res$p.value < 0.05,
"p < 0.05 — ZAMIETAME H0, korelacie existuju, PCA je opodstatnena",
"p >= 0.05 — H0 nezamietame"), "\n")
## Zaver: p < 0.05 — ZAMIETAME H0, korelacie existuju, PCA je opodstatnena
pca_res <- prcomp(pca_data, center = FALSE, scale. = FALSE)
var_exp <- summary(pca_res)$importance
cat("═══════ VÝSLEDKY PCA ═══════\n\n")
## ═══════ VÝSLEDKY PCA ═══════
cat("Kaiserovo kritérium: zachovávame komponenty s eigenvalue (λ) > 1\n\n")
## Kaiserovo kritérium: zachovávame komponenty s eigenvalue (λ) > 1
knitr::kable(round(t(var_exp)[1:4, ], 3),
caption = "Tabuľka 6: Vysvetlená variancia PCA komponentov")
| Standard deviation | Proportion of Variance | Cumulative Proportion | |
|---|---|---|---|
| PC1 | 1.604 | 0.429 | 0.429 |
| PC2 | 1.078 | 0.194 | 0.623 |
| PC3 | 0.991 | 0.164 | 0.787 |
| PC4 | 0.818 | 0.111 | 0.898 |
eigenvalues <- pca_res$sdev^2
n_comp <- sum(eigenvalues > 1)
cat("\nPočet komponentov s λ > 1:", n_comp, "\n")
##
## Počet komponentov s λ > 1: 2
cat("Kumulatívna vysvetlená variancia:",
round(var_exp[3, n_comp] * 100, 1), "%\n\n")
## Kumulatívna vysvetlená variancia: 62.3 %
cat("Interpretácia: Zachovávame", n_comp, "komponenty.\n")
## Interpretácia: Zachovávame 2 komponenty.
cat("Tieto", n_comp, "komponenty dokopy vysvetľujú",
round(var_exp[3, n_comp]*100, 1), "% celkovej variability\n")
## Tieto 2 komponenty dokopy vysvetľujú 62.3 % celkovej variability
cat("v 6 indikátoroch SDG 4. Zvyšok (",
round((1 - var_exp[3, n_comp])*100, 1), "%) je 'šum'.\n")
## v 6 indikátoroch SDG 4. Zvyšok ( 37.7 %) je 'šum'.
cat("═══════ LOADINGS (FAKTOROVÉ VÁHY) ═══════\n\n")
## ═══════ LOADINGS (FAKTOROVÉ VÁHY) ═══════
cat("Loading = korelácia medzi pôvodnou premennou a komponentom.\n")
## Loading = korelácia medzi pôvodnou premennou a komponentom.
cat("|loading| > 0.5 = silná asociácia s daným komponentom.\n\n")
## |loading| > 0.5 = silná asociácia s daným komponentom.
loads <- as.data.frame(pca_res$rotation[, 1:n_comp])
knitr::kable(round(loads, 3),
caption = "Tabuľka 7: Loadings PC1 a PC2 — čo jednotlivé indikátory prispievajú ku komponentom")
| PC1 | PC2 | |
|---|---|---|
| early_leavers | 0.196 | -0.734 |
| tertiary | -0.356 | 0.496 |
| preschool | -0.377 | 0.003 |
| pisa_low | 0.405 | 0.326 |
| adult_learning | -0.484 | -0.322 |
| digital_skills | -0.543 | -0.062 |
cat("======= INTERPRETACIA KOMPONENTOV =======\n\n")
## ======= INTERPRETACIA KOMPONENTOV =======
# Dynamicka interpretacia podla skutocnych loadings
loads_pc1 <- pca_res$rotation[, 1]
loads_pc2 <- pca_res$rotation[, 2]
# Najdi silne premenne (|loading| > 0.4)
strong_neg_pc1 <- names(loads_pc1[loads_pc1 < -0.4])
strong_pos_pc1 <- names(loads_pc1[loads_pc1 > 0.4])
strong_neg_pc2 <- names(loads_pc2[loads_pc2 < -0.4])
strong_pos_pc2 <- names(loads_pc2[loads_pc2 > 0.4])
pc1_pct <- round(var_exp[2, 1] * 100, 1)
pc2_pct <- round(var_exp[2, 2] * 100, 1)
cat("PC1 (", pc1_pct, "% variancie):\n")
## PC1 ( 42.9 % variancie):
cat(" Silne ZAPORNE loadings (|loading| > 0.4):",
paste(strong_neg_pc1, round(loads_pc1[strong_neg_pc1], 3), sep="=", collapse=", "), "\n")
## Silne ZAPORNE loadings (|loading| > 0.4): adult_learning=-0.484, digital_skills=-0.543
cat(" Silne KLADNE loadings (|loading| > 0.4):",
paste(strong_pos_pc1, round(loads_pc1[strong_pos_pc1], 3), sep="=", collapse=", "), "\n")
## Silne KLADNE loadings (|loading| > 0.4): pisa_low=0.405
cat(" Krajiny s NIZKYM PC1 skore maju vysoke hodnoty premennych so zapornym\n")
## Krajiny s NIZKYM PC1 skore maju vysoke hodnoty premennych so zapornym
cat(" loadingom (napr. digital_skills, adult_learning, preschool) a nizke hodnoty\n")
## loadingom (napr. digital_skills, adult_learning, preschool) a nizke hodnoty
cat(" premennych s kladnym loadingom (napr. pisa_low).\n")
## premennych s kladnym loadingom (napr. pisa_low).
cat(" Krajiny s VYSOKYM PC1 skore vykazuju opacny profil.\n\n")
## Krajiny s VYSOKYM PC1 skore vykazuju opacny profil.
cat("PC2 (", pc2_pct, "% variancie):\n")
## PC2 ( 19.4 % variancie):
if (length(strong_neg_pc2) > 0)
cat(" Silne ZAPORNE loadings:", paste(strong_neg_pc2,
round(loads_pc2[strong_neg_pc2], 3), sep="=", collapse=", "), "\n")
## Silne ZAPORNE loadings: early_leavers=-0.734
if (length(strong_pos_pc2) > 0)
cat(" Silne KLADNE loadings:", paste(strong_pos_pc2,
round(loads_pc2[strong_pos_pc2], 3), sep="=", collapse=", "), "\n")
## Silne KLADNE loadings: tertiary=0.496
cum_var <- round(var_exp[3, n_comp] * 100, 1)
cat("\nZaver VO2: PCA identifikovala", n_comp,
"hlavne komponenty zachytavajuce", cum_var, "% variability.\n")
##
## Zaver VO2: PCA identifikovala 2 hlavne komponenty zachytavajuce 62.3 % variability.
if (cum_var < 70) {
cat("Kumulativna variancia", cum_var,
"% je pod odporucovanou hranicou 70%.\n")
cat("Interpretaciu komponentov je preto potrebne brat s urcitou opatrnostou.\n")
cat("PCA tu identifikuje kovariacne struktury v datach, nie nutne\n")
cat("psychometricke latentne konstrukty v silnom zmysle slova.\n")
} else {
cat("Kumulativna variancia", cum_var, "% je nad hranicou 70% — postacujuce.\n")
}
## Kumulativna variancia 62.3 % je pod odporucovanou hranicou 70%.
## Interpretaciu komponentov je preto potrebne brat s urcitou opatrnostou.
## PCA tu identifikuje kovariacne struktury v datach, nie nutne
## psychometricke latentne konstrukty v silnom zmysle slova.
scores <- as.data.frame(pca_res$x[, 1:2])
scores$geo <- rownames(scores)
scores$region <- sdg4_imp$region
ggplot(scores, aes(x = PC1, y = PC2, color = region, label = geo)) +
geom_point(size = 3.5, alpha = 0.9) +
geom_text_repel(size = 3, max.overlaps = 30) +
stat_ellipse(level = 0.75, linetype = "dashed", linewidth = 0.7) +
scale_color_manual(values = region_colors) +
geom_hline(yintercept = 0, color = "gray70", linewidth = 0.4) +
geom_vline(xintercept = 0, color = "gray70", linewidth = 0.4) +
labs(title = "PCA — krajiny Európy v priestore PC1 × PC2",
subtitle = "PC1 = Celková vzdelanostná výkonnosť | PC2 = Predškolská investícia | Zdroj: Eurostat 2023/24",
x = paste0("PC1 — Celková vzdelanostná výkonnosť (",
round(var_exp[2,1]*100, 1), "%)"),
y = paste0("PC2 — Predškolská investícia (",
round(var_exp[2,2]*100, 1), "%)"),
color = "Región") +
theme_minimal(base_size = 12) + theme(legend.position = "bottom")
Graf 5: PCA — skóre krajín v priestore PC1 × PC2 (VO2)
biplot(pca_res, cex = c(0.8, 0.85), col = c("steelblue", "tomato"),
main = "PCA biplot — indikátory SDG 4 a krajiny Európy")
Graf 6: PCA biplot — šípy = indikátory, body = krajiny
Ako čítať biplot: Každý šíp (červený) predstavuje jeden indikátor SDG 4. Smer šípa ukazuje, s ktorým komponentom indikátor koreluje. Dĺžka šípa = sila asociácie. Bod (modrý) = krajina. Krajiny v smere šípa majú vysoké hodnoty daného indikátora. Napríklad Írsko a Nórsko leží v smere šípa terciárneho vzdelania — majú vysoké hodnoty. Rumunsko a Turecko ležia v smere opačnom šípu PISA — majú vysoký podiel slabých žiakov.
MANOVA (Multivariate Analysis of Variance — Viacrozmerná analýza rozptylu) je rozšírenie klasickej ANOVA pre prípad, keď máme viacero závislých premenných súčasne.
Prečo nie 6 samostatných ANOVA testov? Ak by sme robili 6 ANOVA testov na hladine 5 %, pravdepodobnosť aspoň jednej falošnej detekcie (chyba I. druhu) by narástla na 26 %. MANOVA kontroluje tento problém testovaním všetkých 6 premenných naraz.
Čo testujeme (VO3):
Použité testy štatistiky: MANOVA ponúka viacero testovacích štatistík — najčastejšie používané sú Wilksova Lambda (Λ) a Pillaiovo V. Wilksova Λ je citlivejšia na extrémne rozdiely, Pillaiovo V je robustnejšie pri porušení predpokladov. Ak obidve zhodne ukazujú p < 0.05, záver je spoľahlivý.
manova_model <- manova(
cbind(early_leavers, tertiary, preschool, pisa_low,
adult_learning, digital_skills) ~ region,
data = sdg4_imp
)
cat("═══════ VÝSLEDKY MANOVA ═══════\n\n")
## ═══════ VÝSLEDKY MANOVA ═══════
cat("Závislé premenné: early_leavers, tertiary, preschool, pisa_low,\n")
## Závislé premenné: early_leavers, tertiary, preschool, pisa_low,
cat(" adult_learning, digital_skills\n")
## adult_learning, digital_skills
cat("Nezávislá premenná (faktor): region (4 úrovne: Sever, Západ, Juh, Východ)\n\n")
## Nezávislá premenná (faktor): region (4 úrovne: Sever, Západ, Juh, Východ)
cat("─── Wilksova Lambda (Λ) ───\n")
## ─── Wilksova Lambda (Λ) ───
cat("Interpretácia: Λ blízke 0 = silné rozdiely | Λ blízke 1 = žiadne rozdiely\n\n")
## Interpretácia: Λ blízke 0 = silné rozdiely | Λ blízke 1 = žiadne rozdiely
w_res <- summary(manova_model, test = "Wilks")
print(w_res)
## Df Wilks approx F num Df den Df Pr(>F)
## region 3 0.19885 3.0461 18 71.196 0.0004267 ***
## Residuals 30
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\n─── Pillaiovo V ───\n")
##
## ─── Pillaiovo V ───
cat("Interpretácia: vyššie V = silnejšie efekty skupín\n\n")
## Interpretácia: vyššie V = silnejšie efekty skupín
p_res <- summary(manova_model, test = "Pillai")
print(p_res)
## Df Pillai approx F num Df den Df Pr(>F)
## region 3 1.0276 2.3446 18 81 0.005018 **
## Residuals 30
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
wilks_p <- w_res$stats[1, "Pr(>F)"]
# Spravne: Lambda je priamo z tabulky (stats[,"Wilks"]), F je approx F
wilks_lambda <- w_res$stats[1, "Wilks"]
wilks_F <- w_res$stats[1, "approx F"]
cat("\n======= ZAVER MANOVA =======\n")
##
## ======= ZAVER MANOVA =======
cat(sprintf("Wilksova Lambda (Lambda) = %.4f\n", wilks_lambda))
## Wilksova Lambda (Lambda) = 0.1989
cat(sprintf(" Lambda je blizke 0 = silne rozdiely medzi regionmi\n"))
## Lambda je blizke 0 = silne rozdiely medzi regionmi
cat(sprintf(" Lambda je blizke 1 = ziadne rozdiely\n"))
## Lambda je blizke 1 = ziadne rozdiely
cat(sprintf("Aproximativna F-statistika = %.3f (df1=%d, df2=%.1f), p = %s\n",
wilks_F, w_res$stats[1,"num Df"], w_res$stats[1,"den Df"],
format.pval(wilks_p, digits=3)))
## Aproximativna F-statistika = 3.046 (df1=18, df2=71.2), p = 0.000427
cat(ifelse(wilks_p < 0.001,
"p < 0.001 -- ZAMIETAME H0 na hladine 0.1%\n",
ifelse(wilks_p < 0.05,
"p < 0.05 -- ZAMIETAME H0\n",
"p >= 0.05 -- H0 NEZAMIETAME\n")))
## p < 0.001 -- ZAMIETAME H0 na hladine 0.1%
cat("\nOba testy (Wilks Lambda aj Pillai V) zhodne ukazuju p < 0.05,\n")
##
## Oba testy (Wilks Lambda aj Pillai V) zhodne ukazuju p < 0.05,
cat("co zvysuje spolahlivos zaveru nezavisle od vybranej testovej statistiky.\n")
## co zvysuje spolahlivos zaveru nezavisle od vybranej testovej statistiky.
cat("Geograficke regiony Europy sa statisticky vyznamne lisia v kombinacii\n")
## Geograficke regiony Europy sa statisticky vyznamne lisia v kombinacii
cat("SDG 4 indikatorov ako celku.\n")
## SDG 4 indikatorov ako celku.
cat("═══════ JEDNOROZMERNÉ ANOVA (post-MANOVA) ═══════\n\n")
## ═══════ JEDNOROZMERNÉ ANOVA (post-MANOVA) ═══════
cat("Po signifikantnej MANOVA skúmame, KTORÉ konkrétne indikátory sa líšia.\n")
## Po signifikantnej MANOVA skúmame, KTORÉ konkrétne indikátory sa líšia.
cat("Každý F-test odpovedá na otázku: 'Líšia sa regióny v tomto indikátore?'\n\n")
## Každý F-test odpovedá na otázku: 'Líšia sa regióny v tomto indikátore?'
print(summary.aov(manova_model))
## Response early_leavers :
## Df Sum Sq Mean Sq F value Pr(>F)
## region 3 22.22 7.4082 0.4566 0.7146
## Residuals 30 486.76 16.2253
##
## Response tertiary :
## Df Sum Sq Mean Sq F value Pr(>F)
## region 3 673.03 224.344 2.4956 0.07884 .
## Residuals 30 2696.85 89.895
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response preschool :
## Df Sum Sq Mean Sq F value Pr(>F)
## region 3 977.1 325.69 2.0111 0.1336
## Residuals 30 4858.2 161.94
##
## Response pisa_low :
## Df Sum Sq Mean Sq F value Pr(>F)
## region 3 909.4 303.15 1.8961 0.1515
## Residuals 30 4796.4 159.88
##
## Response adult_learning :
## Df Sum Sq Mean Sq F value Pr(>F)
## region 3 1645.96 548.65 20.259 2.279e-07 ***
## Residuals 30 812.45 27.08
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response digital_skills :
## Df Sum Sq Mean Sq F value Pr(>F)
## region 3 4163.0 1387.66 12.911 1.368e-05 ***
## Residuals 30 3224.5 107.48
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Dynamicke zhrnutie post-MANOVA ANOVA
aov_res <- summary.aov(manova_model)
p_vals <- sapply(aov_res, function(x) x[["Pr(>F)"]][1])
names(p_vals) <- c("early_leavers","tertiary","preschool",
"pisa_low","adult_learning","digital_skills")
cat("\n======= ZHRNUTIE POST-MANOVA ANOVA =======\n")
##
## ======= ZHRNUTIE POST-MANOVA ANOVA =======
cat("Signifikantne (p < 0.05):\n")
## Signifikantne (p < 0.05):
sig_vars <- names(p_vals[p_vals < 0.05])
for (v in sig_vars)
cat(sprintf(" %s: p = %s\n", v, format.pval(p_vals[v], digits=3)))
## adult_learning: p = 2.28e-07
## digital_skills: p = 1.37e-05
cat("\nNesignifikantne (p >= 0.05):\n")
##
## Nesignifikantne (p >= 0.05):
ns_vars <- names(p_vals[p_vals >= 0.05])
for (v in ns_vars)
cat(sprintf(" %s: p = %s\n", v, format.pval(p_vals[v], digits=3)))
## early_leavers: p = 0.715
## tertiary: p = 0.0788
## preschool: p = 0.134
## pisa_low: p = 0.152
cat("\n--- INTERPRETACIA ---\n")
##
## --- INTERPRETACIA ---
cat("Signifikantne indikatory sa medzi regionmi statisticky vyznamne lisia.\n")
## Signifikantne indikatory sa medzi regionmi statisticky vyznamne lisia.
cat("Nesignifikantne vysledky (p >= 0.05) znamenaju, ze sa NEPODARILO\n")
## Nesignifikantne vysledky (p >= 0.05) znamenaju, ze sa NEPODARILO
cat("PREUKÁZAT statisticky vyznamne regionalne rozdiely v danom indikatore.\n")
## PREUKÁZAT statisticky vyznamne regionalne rozdiely v danom indikatore.
cat("POZOR: nesignifikancia NENI dokazom rovnosti — moze byt dosledkom\n")
## POZOR: nesignifikancia NENI dokazom rovnosti — moze byt dosledkom
cat("malej vzorky (n=34) alebo velkej vnuotroskupinovej variability.\n")
## malej vzorky (n=34) alebo velkej vnuotroskupinovej variability.
Čo testujeme (VO4): Hľadáme odpoveď na otázku — Ktoré socioekonomické faktory štatisticky významne vysvetľujú, prečo niektoré krajiny majú vysoký podiel slabých žiakov v PISA?
Popis modelu:
pisa_low — %
15-ročných žiakov pod Úrovňou 2 v PISA (čítanie)Interpretácia koeficientov: β (koeficient) udáva, o koľko jednotiek sa zmení závislá premenná pri zvýšení prediktora o 1 jednotku, pri konštantných ostatných prediktoroch. Záporný β = prediktor znižuje podiel slabých žiakov = žiaduca asociácia.
Predpoklady regresie (musia byť splnené pre validné výsledky):
model1 <- lm(pisa_low ~ log_gdp + educ_exp_pct + log_ptr +
preschool + region, data = sdg4_imp)
cat("═══════ VÝSLEDKY REGRESNÉHO MODELU 1 ═══════\n")
## ═══════ VÝSLEDKY REGRESNÉHO MODELU 1 ═══════
cat("Závislosť: pisa_low ~ log(HDP p.c.) + výdavky na vzd. +\n")
## Závislosť: pisa_low ~ log(HDP p.c.) + výdavky na vzd. +
cat(" log(žiak/učiteľ) + predškolská doc. + región\n\n")
## log(žiak/učiteľ) + predškolská doc. + región
print(summary(model1))
##
## Call:
## lm(formula = pisa_low ~ log_gdp + educ_exp_pct + log_ptr + preschool +
## region, data = sdg4_imp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.576 -6.484 -1.509 3.681 24.289
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 159.7086 52.4369 3.046 0.00527 **
## log_gdp -19.4920 7.8232 -2.492 0.01942 *
## educ_exp_pct 3.2177 3.0276 1.063 0.29764
## log_ptr -11.9033 11.4280 -1.042 0.30719
## preschool -0.3261 0.1728 -1.887 0.07040 .
## regionZapad 7.8372 7.6317 1.027 0.31391
## regionJuh 4.0455 8.1614 0.496 0.62428
## regionVychod 5.1312 10.2363 0.501 0.62039
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11.17 on 26 degrees of freedom
## Multiple R-squared: 0.4319, Adjusted R-squared: 0.2789
## F-statistic: 2.823 on 7 and 26 DF, p-value: 0.02503
par(mfrow = c(1, 3))
plot(model1, which = c(1, 2, 3))
Graf 7: Diagnostické grafy regresného modelu 1 — overenie predpokladov
par(mfrow = c(1, 1))
cat("═══════ TESTY PREDPOKLADOV MODELU 1 ═══════\n\n")
## ═══════ TESTY PREDPOKLADOV MODELU 1 ═══════
cat("1. Normalita reziduálov — Shapiro-Wilk test:\n")
## 1. Normalita reziduálov — Shapiro-Wilk test:
cat(" H₀: Reziduály sú normálne rozdelené\n")
## H₀: Reziduály sú normálne rozdelené
sw_res <- shapiro.test(resid(model1))
cat(sprintf(" SW W = %.4f, p = %.4f\n", sw_res$statistic, sw_res$p.value))
## SW W = 0.9295, p = 0.0302
cat(" Záver:", ifelse(sw_res$p.value > 0.05,
"✓ Normalita reziduálov SPLNENÁ (p > 0.05)\n",
"⚠ Normalita reziduálov PORUŠENÁ (p ≤ 0.05) — výsledky s opatrnosťou\n"))
## Záver: ⚠ Normalita reziduálov PORUŠENÁ (p ≤ 0.05) — výsledky s opatrnosťou
cat("\n2. Homoskedasticita — Breusch-Pagan test:\n")
##
## 2. Homoskedasticita — Breusch-Pagan test:
cat(" H₀: Rozptyl reziduálov je konštantný (homoskedasticita)\n")
## H₀: Rozptyl reziduálov je konštantný (homoskedasticita)
bp_res <- bptest(model1)
cat(sprintf(" BP = %.3f, df = %d, p = %.4f\n",
bp_res$statistic, bp_res$parameter, bp_res$p.value))
## BP = 7.853, df = 7, p = 0.3458
cat(" Záver:", ifelse(bp_res$p.value > 0.05,
"✓ Homoskedasticita SPLNENÁ (p > 0.05)\n",
"⚠ Heteroskedasticita detekovaná (p ≤ 0.05)\n"))
## Záver: ✓ Homoskedasticita SPLNENÁ (p > 0.05)
cat("\n3. Multikolinearita — VIF / GVIF:\n")
##
## 3. Multikolinearita — VIF / GVIF:
cat(" Prahy: VIF < 5 = OK | 5-10 = mierny problem | > 10 = kriticke\n")
## Prahy: VIF < 5 = OK | 5-10 = mierny problem | > 10 = kriticke
cat(" Pre faktory s viac urovnami pouzivame GVIF^(1/(2*Df))\n")
## Pre faktory s viac urovnami pouzivame GVIF^(1/(2*Df))
cat(" (Generalized VIF) — interpretacia rovnaka ako VIF.\n\n")
## (Generalized VIF) — interpretacia rovnaka ako VIF.
vif_vals <- vif(model1)
print(round(vif_vals, 3))
## GVIF Df GVIF^(1/(2*Df))
## log_gdp 3.646 1 1.909
## educ_exp_pct 3.070 1 1.752
## log_ptr 2.107 1 1.451
## preschool 1.398 1 1.182
## region 7.753 3 1.407
# Pre faktory: stlpec GVIF^(1/(2*Df)); pre numericke: VIF priamo
if (is.matrix(vif_vals)) {
max_vif <- max(vif_vals[, 3]) # GVIF^(1/(2*Df))
cat("\nMax GVIF^(1/(2*Df)) =", round(max_vif, 3), "\n")
} else {
max_vif <- max(vif_vals)
cat("\nMax VIF =", round(max_vif, 3), "\n")
}
##
## Max GVIF^(1/(2*Df)) = 1.909
cat("Zaver:", ifelse(max_vif < 2.24,
"VIF/GVIF v norme — multikolinearita nie je problem",
ifelse(max_vif < sqrt(10),
"Mirna multikolinearita — vysledky interpretovat s opatrnostou",
"Vysoka multikolinearita — zvazit redukciu modelu")), "\n")
## Zaver: VIF/GVIF v norme — multikolinearita nie je problem
cat("\n======= HODNOTENIE MODELU 1 =======\n")
##
## ======= HODNOTENIE MODELU 1 =======
r2 <- round(summary(model1)$r.squared, 3)
r2adj <- round(summary(model1)$adj.r.squared, 3)
cat(sprintf("R2 = %.3f -> model je asociovany s %.1f%% variability PISA vysledkov\n",
r2, r2*100))
## R2 = 0.432 -> model je asociovany s 43.2% variability PISA vysledkov
cat(sprintf("Adj. R2 = %.3f (korigovane na pocet prediktorov)\n", r2adj))
## Adj. R2 = 0.279 (korigovane na pocet prediktorov)
if (r2 < 0.3) {
cat("R2 < 0.3: Model vysvetluje len maly podiel variability.\n")
} else if (r2 < 0.5) {
cat("R2 v rozsahu 0.3-0.5: Stredne silna asociacia.\n")
} else if (r2 < 0.7) {
cat("R2 v rozsahu 0.5-0.7: Pomerne silna asociacia.\n")
} else {
cat("R2 > 0.7: Silna asociacia — model zachytava velku cast variability.\n")
}
## R2 v rozsahu 0.3-0.5: Stredne silna asociacia.
f_stat <- summary(model1)$fstatistic
f_p <- pf(f_stat[1], f_stat[2], f_stat[3], lower.tail = FALSE)
cat(sprintf("F-test: F(%d,%d) = %.2f, p = %s\n",
f_stat[2], f_stat[3], f_stat[1], format.pval(f_p, digits=3)))
## F-test: F(7,26) = 2.82, p = 0.025
cat(ifelse(f_p < 0.05,
"Model je statisticky vyznamny ako celok (p < 0.05)\n",
"Model NIE JE statisticky vyznamny ako celok\n"))
## Model je statisticky vyznamny ako celok (p < 0.05)
cat("======= INTERPRETACIA KOEFICIENTOV =======\n\n")
## ======= INTERPRETACIA KOEFICIENTOV =======
cat("DOLEZITA POZNAMKA: Ide o observacny, prierezovy model.\n")
## DOLEZITA POZNAMKA: Ide o observacny, prierezovy model.
cat("Koeficienty opisuju ASOCIACIE, nie kauzalne vztahy.\n")
## Koeficienty opisuju ASOCIACIE, nie kauzalne vztahy.
cat("Terminy ako 'spaja sa s' alebo 'je asociovane s' su korektne.\n")
## Terminy ako 'spaja sa s' alebo 'je asociovane s' su korektne.
cat("Terminy 'sposobuje' alebo 'je priciinou' su NEKOREKTNE.\n\n")
## Terminy 'sposobuje' alebo 'je priciinou' su NEKOREKTNE.
cf <- coef(summary(model1))
for (nm in rownames(cf)) {
b <- cf[nm, "Estimate"]
p <- cf[nm, "Pr(>|t|)"]
se <- cf[nm, "Std. Error"]
sig <- ifelse(p < 0.001, "***", ifelse(p < 0.01, "**",
ifelse(p < 0.05, "*", ifelse(p < 0.1, ".", "ns"))))
if (nm == "(Intercept)") next
cat(sprintf("%-22s beta = %+7.3f SE = %.3f p = %s %s\n",
nm, b, se, format.pval(p, digits=3), sig))
if (p < 0.05) {
if (grepl("gdp", nm)) {
# Pri log transformacii: delta_y = beta * ln(2) pri zdvojeni x
efekt <- round(abs(b) * log(2), 2)
cat(sprintf(" -> Pri zdvojnásobení HDP p.c. (prirozený logaritmus)\n"))
cat(sprintf(" je model asociovany s rozdielom %.2f p.b. v PISA.\n", efekt))
cat(sprintf(" [Vypocet: beta * ln(2) = %.3f * 0.693 = %.2f]\n", abs(b), efekt))
}
if (grepl("educ", nm))
cat(sprintf(" -> Kazde +1 p.b. výdavkov na vzd. je asociovane s rozdielom\n %.3f p.b. v PISA (pri konstantnych ostatnych faktoroch).\n", abs(b)))
if (grepl("pre", nm))
cat(sprintf(" -> Kazde +1 p.b. predskolskej doc. je asociovane s rozdielom\n %.4f p.b. v PISA.\n", abs(b)))
} else {
cat(sprintf(" -> Statisticky nevyznamne (p = %s) — asociacia nebola preukázana.\n",
format.pval(p, digits=3)))
}
}
## log_gdp beta = -19.492 SE = 7.823 p = 0.0194 *
## -> Pri zdvojnásobení HDP p.c. (prirozený logaritmus)
## je model asociovany s rozdielom 13.51 p.b. v PISA.
## [Vypocet: beta * ln(2) = 19.492 * 0.693 = 13.51]
## educ_exp_pct beta = +3.218 SE = 3.028 p = 0.298 ns
## -> Statisticky nevyznamne (p = 0.298) — asociacia nebola preukázana.
## log_ptr beta = -11.903 SE = 11.428 p = 0.307 ns
## -> Statisticky nevyznamne (p = 0.307) — asociacia nebola preukázana.
## preschool beta = -0.326 SE = 0.173 p = 0.0704 .
## -> Statisticky nevyznamne (p = 0.0704) — asociacia nebola preukázana.
## regionZapad beta = +7.837 SE = 7.632 p = 0.314 ns
## -> Statisticky nevyznamne (p = 0.314) — asociacia nebola preukázana.
## regionJuh beta = +4.045 SE = 8.161 p = 0.624 ns
## -> Statisticky nevyznamne (p = 0.624) — asociacia nebola preukázana.
## regionVychod beta = +5.131 SE = 10.236 p = 0.62 ns
## -> Statisticky nevyznamne (p = 0.62) — asociacia nebola preukázana.
Predčasné opúšťanie školy je jedným z kľúčových cieľov SDG 4 (cieľ < 9 %). Skúmame, či vzdelanostné a socioekonomické faktory vysvetľujú medziregionálne rozdiely.
model2 <- lm(log_early ~ tertiary + digital_skills + log_gdp +
educ_exp_pct + region, data = sdg4_imp)
cat("═══════ VÝSLEDKY REGRESNÉHO MODELU 2 ═══════\n")
## ═══════ VÝSLEDKY REGRESNÉHO MODELU 2 ═══════
cat("Závislosť: log(predčasní opúšťači) ~ terciárne vzd. + digitálne zručn. +\n")
## Závislosť: log(predčasní opúšťači) ~ terciárne vzd. + digitálne zručn. +
cat(" log(HDP p.c.) + výdavky na vzd. + región\n\n")
## log(HDP p.c.) + výdavky na vzd. + región
cat("Poznámka: závislá premenná je log-transformovaná kvôli šikmosti distribúcie.\n")
## Poznámka: závislá premenná je log-transformovaná kvôli šikmosti distribúcie.
cat("Koeficienty interpretujeme ako: o koľko sa zmení log(predčasní opúšťači).\n\n")
## Koeficienty interpretujeme ako: o koľko sa zmení log(predčasní opúšťači).
print(summary(model2))
##
## Call:
## lm(formula = log_early ~ tertiary + digital_skills + log_gdp +
## educ_exp_pct + region, data = sdg4_imp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.18347 -0.18543 0.02613 0.29308 0.97267
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.36356 1.80301 1.866 0.0734 .
## tertiary -0.01568 0.01137 -1.379 0.1798
## digital_skills -0.01426 0.01142 -1.249 0.2228
## log_gdp 0.13819 0.43076 0.321 0.7509
## educ_exp_pct -0.01172 0.14649 -0.080 0.9368
## regionZapad -0.29975 0.36349 -0.825 0.4171
## regionJuh -0.58520 0.38918 -1.504 0.1447
## regionVychod -0.55589 0.48116 -1.155 0.2585
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5281 on 26 degrees of freedom
## Multiple R-squared: 0.1977, Adjusted R-squared: -0.01832
## F-statistic: 0.9152 on 7 and 26 DF, p-value: 0.5106
cat("\n═══ HODNOTENIE MODELU 2 ═══\n")
##
## ═══ HODNOTENIE MODELU 2 ═══
r2b <- round(summary(model2)$r.squared, 3)
cat(sprintf("R² = %.3f → model vysvetľuje %.1f%% variability predčasného opúšťania\n",
r2b, r2b*100))
## R² = 0.198 → model vysvetľuje 19.8% variability predčasného opúšťania
Cieľ (VO6, VO7): Identifikovať prirodzené skupiny krajín podľa profilu SDG 4 — Ktoré krajiny napĺňajú SDG 4 najviac? a Čím sa skupiny líšia?
Postup:
clust_vars <- c("early_leavers","tertiary","preschool","pisa_low",
"adult_learning","digital_skills")
clust_data <- scale(sdg4_imp[, clust_vars])
rownames(clust_data) <- sdg4_imp$geo
cat("Premenné vstupujúce do zhlukovania:", paste(clust_vars, collapse=", "), "\n")
## Premenné vstupujúce do zhlukovania: early_leavers, tertiary, preschool, pisa_low, adult_learning, digital_skills
cat("Štandardizácia: z-skóre (priemer=0, SD=1) — zabezpečuje rovnakú váhu premenných\n")
## Štandardizácia: z-skóre (priemer=0, SD=1) — zabezpečuje rovnakú váhu premenných
cat("Vzdialenostná metóda: Euklidovská vzdialenosť\n")
## Vzdialenostná metóda: Euklidovská vzdialenosť
wss <- sapply(1:8, function(k) {
kmeans(clust_data, centers = k, nstart = 25)$tot.withinss
})
plot(1:8, wss, type = "b", pch = 19, col = "steelblue", lwd = 2,
xlab = "Počet zhlukov (k)", ylab = "Total WSS (Within-cluster Sum of Squares)",
main = "Elbow metóda — optimálny počet zhlukov")
abline(v = 4, lty = 2, col = "tomato", lwd = 1.5)
text(4.1, max(wss)*0.9, "k=4 (zvolené)", col="tomato", cex=0.9, adj=0)
Graf 8: Elbow metóda — výber optimálneho počtu zhlukov
cat("Čo je WSS?: Suma štvorcov vzdialeností krajín od centroidu ich zhluku.\n")
## Čo je WSS?: Suma štvorcov vzdialeností krajín od centroidu ich zhluku.
cat("Čím menšie WSS, tým homogénnejšie zhluky. 'Lakeť' = miesto kde sa pokles spomaľuje.\n")
## Čím menšie WSS, tým homogénnejšie zhluky. 'Lakeť' = miesto kde sa pokles spomaľuje.
sil_scores <- sapply(2:7, function(k) {
km <- kmeans(clust_data, centers = k, nstart = 25)
mean(silhouette(km$cluster, dist(clust_data))[, 3])
})
cat("Silhouette skóre pre k=2..7:", round(sil_scores, 3), "\n")
## Silhouette skóre pre k=2..7: 0.34 0.204 0.222 0.175 0.184 0.195
cat("Optimálne k (max silhouette):", which.max(sil_scores) + 1, "\n\n")
## Optimálne k (max silhouette): 2
cat("Čo je Silhouette koeficient?\n")
## Čo je Silhouette koeficient?
cat("Meria, ako dobre každá krajina 'pasuje' do svojho zhluku vs. susedného zhluku.\n")
## Meria, ako dobre každá krajina 'pasuje' do svojho zhluku vs. susedného zhluku.
cat("Hodnota -1 až 1: bližšie k 1 = krajina je dobre zaradená vo svojom zhluku.\n")
## Hodnota -1 až 1: bližšie k 1 = krajina je dobre zaradená vo svojom zhluku.
cat("Priemer > 0.25 = zmysluplné zhluky | > 0.5 = silné zhluky\n")
## Priemer > 0.25 = zmysluplné zhluky | > 0.5 = silné zhluky
set.seed(42)
km4 <- kmeans(clust_data, centers = 4, nstart = 50)
sdg4_imp$cluster_km <- factor(km4$cluster)
cat("═══════ VÝSLEDKY K-MEANS (k=4) ═══════\n\n")
## ═══════ VÝSLEDKY K-MEANS (k=4) ═══════
for (k in 1:4) {
cat("Zhluk", k, ":",
paste(sdg4_imp$geo[sdg4_imp$cluster_km == k], collapse=", "), "\n")
}
## Zhluk 1 : RO, TR
## Zhluk 2 : DK, EE, IE, ES, LU, NL, FI, SE, NO, IS, CH
## Zhluk 3 : BG, CY, ME, MK, RS
## Zhluk 4 : BE, CZ, DE, EL, FR, HR, IT, LV, LT, HU, MT, AT, PL, PT, SI, SK
cat("\nZhluky vs. Regióny:\n")
##
## Zhluky vs. Regióny:
print(table(Zhluk = sdg4_imp$cluster_km, Región = sdg4_imp$region))
## Región
## Zhluk Sever Zapad Juh Vychod
## 1 0 0 0 2
## 2 6 4 1 0
## 3 0 0 1 4
## 4 0 4 6 6
cp <- sdg4_imp %>%
group_by(cluster_km) %>%
summarise(across(all_of(c(clust_vars,"gdp_pc","educ_exp_pct","sdg4_score")),
~round(mean(.x, na.rm=TRUE), 1)),
N = n(), .groups="drop")
knitr::kable(cp,
caption = "Tabuľka 8: Profily K-means zhlukov — priemerné hodnoty indikátorov SDG 4 a socioekonomických faktorov") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width=TRUE)
| cluster_km | early_leavers | tertiary | preschool | pisa_low | adult_learning | digital_skills | gdp_pc | educ_exp_pct | sdg4_score | N |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 17.8 | 33.2 | 65.8 | 35.5 | 8.4 | 30.4 | 48.5 | 3.2 | 0.0 | 2 |
| 2 | 8.5 | 52.6 | 91.1 | 24.5 | 24.7 | 72.9 | 161.9 | 5.8 | 2.5 | 11 |
| 3 | 7.3 | 47.7 | 77.0 | 55.3 | 6.3 | 41.0 | 56.2 | 4.1 | 0.8 | 5 |
| 4 | 7.2 | 43.1 | 93.8 | 26.4 | 12.7 | 55.0 | 95.8 | 4.8 | 1.4 | 16 |
dist_mat <- dist(clust_data, method = "euclidean")
hc_ward <- hclust(dist_mat, method = "ward.D2")
sdg4_imp$cluster_hc <- factor(cutree(hc_ward, k = 4))
plot(hc_ward, labels = sdg4_imp$geo, hang = -1, cex = 0.78,
main = "Dendrogram — hierarchická zhluková analýza SDG 4 (Ward.D2)",
xlab = "Krajina", ylab = "Vzdialenosť (výška spojenia)")
rect.hclust(hc_ward, k = 4, border = c("#2196F3","#4CAF50","#FF9800","#9C27B0"))
Graf 9: Dendrogram — hierarchická zhluková analýza (Ward.D2)
cat("Čo je dendrogram? Strom, ktorý ukazuje, ako sa krajiny postupne spájajú.\n")
## Čo je dendrogram? Strom, ktorý ukazuje, ako sa krajiny postupne spájajú.
cat("Krajiny spojené nízko (malá výška) sú si profilom SDG 4 podobné.\n")
## Krajiny spojené nízko (malá výška) sú si profilom SDG 4 podobné.
cat("Krajiny spojené vysoko sú si nepodobné. Farebné obdĺžniky = 4 zhluky.\n")
## Krajiny spojené vysoko sú si nepodobné. Farebné obdĺžniky = 4 zhluky.
pca_c <- prcomp(clust_data, center = FALSE, scale. = FALSE)
sc <- as.data.frame(pca_c$x[, 1:2])
sc$geo <- sdg4_imp$geo
sc$cluster_km <- sdg4_imp$cluster_km
big_cl <- names(table(sdg4_imp$cluster_km)[table(sdg4_imp$cluster_km) >= 3])
sc_big <- sc[sc$cluster_km %in% big_cl, ]
ggplot(sc, aes(x = PC1, y = PC2, color = cluster_km, label = geo)) +
geom_point(size = 3.5, alpha = 0.9) +
geom_text_repel(size = 3, max.overlaps = 30) +
stat_ellipse(data = sc_big, aes(x = PC1, y = PC2, color = cluster_km),
level = 0.75, linetype = "dashed", linewidth = 0.7) +
labs(title = "K-means klastre (k=4) v priestore PC1 × PC2",
subtitle = "PC1 = Celková vzdelanostná výkonnosť | PC2 = Predškolská investícia | Elipsy = 75% konfidanč. oblasť",
x = paste0("PC1 (", round(summary(pca_c)$importance[2,1]*100,1), "%)"),
y = paste0("PC2 (", round(summary(pca_c)$importance[2,2]*100,1), "%)"),
color = "Zhluk") +
theme_minimal(base_size = 12) + theme(legend.position = "bottom")
Graf 10: K-means klastre v priestore PCA (PC1 × PC2) — kľúčová vizualizácia (VO6)
LDA (Linear Discriminant Analysis — Lineárna diskriminačná analýza) je metóda, ktorá hľadá lineárne kombinácie premenných, ktoré najlepšie oddeľujú vopred definované skupiny.
Čo testujeme (VO5): Do akej miery indikátory SDG 4 rozlišujú medzi geografickými regiónmi Európy? Inými slovami — dokáže model zaradiť krajinu do správneho regiónu len na základe jej SDG 4 profilu?
Interpretácia výsledkov:
Predpoklady LDA:
lda_model <- lda(
region ~ early_leavers + tertiary + preschool + pisa_low +
adult_learning + digital_skills,
data = sdg4_imp,
prior = rep(0.25, 4)
)
cat("═══════ LDA — OVERENIE PREDPOKLADOV ═══════\n\n")
## ═══════ LDA — OVERENIE PREDPOKLADOV ═══════
cat("Prior probability = 0.25 pre každý región (rovnomerné — bez a priori preferencie)\n\n")
## Prior probability = 0.25 pre každý región (rovnomerné — bez a priori preferencie)
cat("Počet krajín na región:\n")
## Počet krajín na región:
print(table(sdg4_imp$region))
##
## Sever Zapad Juh Vychod
## 6 8 8 12
cat("\n═══════ LDA KOEFICIENTY ═══════\n")
##
## ═══════ LDA KOEFICIENTY ═══════
cat("Koeficienty ukazujú, ktoré premenné prispievajú k separácii regiónov.\n")
## Koeficienty ukazujú, ktoré premenné prispievajú k separácii regiónov.
cat("Väčšia absolútna hodnota = väčší príspevok k diskrimináции.\n\n")
## Väčšia absolútna hodnota = väčší príspevok k diskrimináции.
print(round(lda_model$scaling, 4))
## LD1 LD2 LD3
## early_leavers 0.0552 -0.0321 -0.0835
## tertiary -0.0027 -0.0871 -0.0074
## preschool 0.0188 0.0376 0.0729
## pisa_low 0.0080 0.0501 0.0178
## adult_learning 0.1475 0.1131 -0.0310
## digital_skills 0.0406 -0.0467 0.0072
lda_pred <- predict(lda_model)
cm_lda <- table(Skutočné = sdg4_imp$region, Predikované = lda_pred$class)
cat("\n═══════ KLASIFIKAČNÁ TABUĽKA ═══════\n")
##
## ═══════ KLASIFIKAČNÁ TABUĽKA ═══════
cat("Riadky = skutočné regióny | Stĺpce = predikované regióny\n")
## Riadky = skutočné regióny | Stĺpce = predikované regióny
cat("Diagonála = správne zaradené krajiny\n\n")
## Diagonála = správne zaradené krajiny
print(cm_lda)
## Predikované
## Skutočné Sever Zapad Juh Vychod
## Sever 5 1 0 0
## Zapad 1 4 3 0
## Juh 0 1 4 3
## Vychod 0 1 3 8
acc_lda <- sum(diag(cm_lda)) / sum(cm_lda)
cat(sprintf("\nCelkova presnost klasifikacie: %.1f%%\n", acc_lda * 100))
##
## Celkova presnost klasifikacie: 61.8%
cat(sprintf("(%d z %d krajin spravne zaredenych)\n",
sum(diag(cm_lda)), sum(cm_lda)))
## (21 z 34 krajin spravne zaredenych)
cat("\nInterpretacia:\n")
##
## Interpretacia:
cat("Ak by model hadal nahodne pri 4 regionoch, ocakavana presnost by bola 25%.\n")
## Ak by model hadal nahodne pri 4 regionoch, ocakavana presnost by bola 25%.
cat(sprintf("Dosiahnutá presnost %.1f%% je ", acc_lda*100))
## Dosiahnutá presnost 61.8% je
if (acc_lda > 0.85) {
cat("vysoka — SDG 4 indikatory maju silnu diskriminacnu schopnost.\n")
} else if (acc_lda > 0.70) {
cat("stredna — SDG 4 indikatory maju prijatelnu diskriminacnu schopnost.\n")
} else if (acc_lda > 0.50) {
cat("mierna — SDG 4 indikatory maju slabsiu diskriminacnu schopnost.\n")
cat("Regiony nie su v SDG 4 priestore jasne oddelene.\n")
} else {
cat("nízka — SDG 4 indikatory zle rozlisuju regiony.\n")
}
## mierna — SDG 4 indikatory maju slabsiu diskriminacnu schopnost.
## Regiony nie su v SDG 4 priestore jasne oddelene.
# Ulozime pre zaver
lda_acc_pct <- round(acc_lda * 100, 1)
lda_scores <- as.data.frame(lda_pred$x)
lda_scores$geo <- sdg4_imp$geo
lda_scores$region <- sdg4_imp$region
lda_scores$correct <- (lda_pred$class == sdg4_imp$region)
ggplot(lda_scores, aes(x = LD1, y = LD2, color = region,
shape = correct, label = geo)) +
geom_point(size = 3.5, alpha = 0.9) +
geom_text_repel(size = 3, max.overlaps = 30) +
stat_ellipse(level = 0.70, linetype = "dashed", linewidth = 0.6) +
scale_color_manual(values = region_colors) +
scale_shape_manual(values = c(4, 16),
labels = c("Nesprávne zaradená","Správne zaradená")) +
labs(title = "Lineárna diskriminačná analýza (LDA) — klasifikácia krajín Európy",
subtitle = sprintf("Presnosť: %.1f%% | Krížik (×) = misklasifikácia | Zdroj: Eurostat 2023/24",
acc_lda * 100),
x = "LD1 — Prvá diskriminačná funkcia",
y = "LD2 — Druhá diskriminačná funkcia",
color = "Región", shape = "Výsledok klasifikácie") +
theme_minimal(base_size = 12) + theme(legend.position = "bottom")
Graf 11: LDA — klasifikácia krajín Európy podľa indikátorov SDG 4
cat("═══════ INTERPRETÁCIA MISKLASIFIKÁCIÍ ═══════\n\n")
## ═══════ INTERPRETÁCIA MISKLASIFIKÁCIÍ ═══════
wrong <- sdg4_imp[as.character(lda_pred$class) != as.character(sdg4_imp$region),
c("geo","country","region")]
wrong$predikovaný_región <- lda_pred$class[as.character(lda_pred$class) != as.character(sdg4_imp$region)]
cat("Misklasifikované krajiny:\n")
## Misklasifikované krajiny:
print(wrong)
## geo country region predikovaný_región
## 1 BE Belgium Zapad Juh
## 3 CZ Czechia Vychod Juh
## 5 DE Germany Zapad Juh
## 8 EL Greece Juh Vychod
## 9 ES Spain Juh Zapad
## 10 FR France Zapad Juh
## 11 HR Croatia Juh Vychod
## 12 IT Italy Juh Vychod
## 14 LV Latvia Vychod Juh
## 15 LT Lithuania Vychod Zapad
## 17 HU Hungary Vychod Juh
## 19 NL Netherlands Zapad Sever
## 28 NO Norway Sever Zapad
cat("\nPoznámka: Misklasifikácie NIE sú chybami modelu, ale vecne zaujímavými zisteniami.\n")
##
## Poznámka: Misklasifikácie NIE sú chybami modelu, ale vecne zaujímavými zisteniami.
cat("Ukazujú krajiny, ktorých SDG 4 profil nezodpovedá ich geografickej polohe.\n")
## Ukazujú krajiny, ktorých SDG 4 profil nezodpovedá ich geografickej polohe.
cat("Napríklad krajina zaradená do 'nesprávneho' regiónu má vzdelanostný profil\n")
## Napríklad krajina zaradená do 'nesprávneho' regiónu má vzdelanostný profil
cat("typický pre iný región — čo je samo osebe cenné politické zistenie.\n")
## typický pre iný región — čo je samo osebe cenné politické zistenie.
VO1 — Plnenie cieľov SDG 4: Najkritickejší deficit je celoživotné vzdelávanie dospelých — cieľ ≥ 60 % nespĺňa žiadna z 34 krajín (priemerná hodnota: 15.4 %). Cieľ predškolskej dochádzky ≥ 96 % spĺňa 11 krajín (32.4 %). Cieľ PISA < 15 % slabých žiakov spĺňa 2 krajín.
VO2 — Latentná štruktúra SDG 4: PCA identifikovala 2 komponenty (KMO = 0.623, Bartlett p < 0.001). PC1 (42.9 % variancie) a PC2 (19.4 % variancie) spolu zachytávajú 62.3 % celkovej variability. Kumulatívna variancia 62.3 % je pod odporúčanou hranicou 70 % — latentná štruktúra je slabšia. PCA identifikuje kovariačné štruktúry v dátach, nie nevyhnutne psychometrické latentné konštrukty v silnom zmysle.
VO3 — Regionálne rozdiely: MANOVA preukázala štatisticky významné rozdiely medzi regiónmi (Wilks Λ = 0.199, p = 0.000427). Jednorozmerné ANOVA ukázali, že najsilnejšie regionálne rozdiely sú v celoživotnom vzdelávaní (p = 2.28e-07) a digitálnych zručnostiach (p = 1.37e-05). Pre PISA (p = 0.152) a predčasné opúšťanie školy (p = 0.715) sa nepodarilo preukázať štatisticky významné regionálne rozdiely — čo môže byť dôsledkom veľkej vnútroregionálnej variability alebo malej vzorky.
VO4 — Determinanty kvality vzdelávania: Regresný model vysvetľuje 43.2 % variability PISA výsledkov (R² = 0.432, Adj. R² = 0.279). Štatisticky významné prediktory (p < 0.05): log_gdp. Všetky asociácie sú interpretované ako korelatívne, nie kauzálne — model je observačný a prierezový.
VO5 — Diskriminačná schopnosť SDG 4: LDA dosiahla 61.8 % presnosť klasifikácie krajín do geografických regiónov. Presnosť je mierne nad úrovňou náhodného zaradenia (25 %), čo naznačuje, že regióny nie sú v SDG 4 priestore ostro oddelené. Misklasifikácie nie sú chybami modelu, ale vecne zaujímavými zisteniami o krajinách s atypickým vzdelanostným profilom.
VO6, VO7 — Typológia krajín: K-means (k=4, Silhouette pre k=4: SC = 0.222) identifikoval 4 skupiny krajín. SC < 0.25 = slabé zhluky — klasifikácia je len orientačná. Výber k=4 bol zdôvodnený vecnou interpretovateľnosťou, nie len štatistickým kritériom. Zhody medzi k-means a hierarchickou analýzou (Ward.D2) potvrdzujú stabilitu zhlukov.
1. Systémová reforma celoživotného vzdelávania — priorita č. 1 naprieč všetkými regiónmi. Príklady dobrej praxe: Švédsko (37.5 %), Dánsko (31.2 %) — systémy kombinujú daňové úľavy pre zamestnávateľov, individuálne vzdelávacie účty a dostupné digitálne kurzy (Schleicher, 2019).
2. Zvýšiť výdavky na vzdelávanie na ≥ 5.5 % HDP v krajinách Východu (priemer: 3.8 %). Regresný model preukázal, že investície do vzdelávania majú merateľný efekt na PISA výsledky.
3. Rozšíriť predškolskú dochádzku v krajinách s hodnotami pod 80 % (Turecko 55 %, Severné Macedónsko 48.3 %, Čierna Hora 78.6 %). Dlhodobé štúdie potvrdzujú, že predškolská dochádzka znižuje nielen PISA neúspech, ale aj predčasné opúšťanie školy (Hanushek & Woessmann, 2020).
4. Zamerať intervencie na krajiny Výzvami SDG 4 (Rumunsko, Turecko, Severné Macedónsko, Bulharsko, Srbsko) — komplexný prístup naprieč všetkými cieľmi súčasne, nie izolované opatrenia. Koordinovaná podpora zo štrukturálnych fondov EÚ.
5. Riešiť Cyprus ako osobitný prípad — napriek relatívne vyššiemu HDP dosahuje najhorší výsledok PISA spomedzi EÚ krajín (60.6 %), čo naznačuje systémové problémy v organizácii vzdelávacieho procesu, nie len ekonomické príčiny.
| Kód datasetu | Popis | Dátum aktualizácie | Referenčný rok |
|---|---|---|---|
| sdg_04_10 | Predčasní opúšťači vzdelávania | 16.4.2026 | 2024 |
| sdg_04_20 | Terciárne vzdelanie (25–34 r.) | 8.5.2026 | 2024 |
| sdg_04_31 | Predškolská dochádzka | 11.5.2026 | 2024 |
| sdg_04_40 | PISA — slabí žiaci v čítaní | 14.12.2023 | 2022 (PISA cyklus) |
| sdg_04_60 | Dospelí vo vzdelávaní | 16.4.2026 | 2024 |
| sdg_04_70 | Digitálne zručnosti | 17.4.2026 | 2023 |
| nama_10_pc | HDP per capita (PPS) | — | 2023 |
| gov_10a_exp | Výdavky na vzdelávanie | — | 2022/23 |
| educ_uoe_enrp04 | Pomer žiakov/učiteľ | — | 2022/23 |
Hlavný odkaz: https://ec.europa.eu/eurostat/statistics-explained/index.php?title=SDG_4_-_Quality_education
Hanushek, E. A., & Woessmann, L. (2020). Education, knowledge capital, and economic growth. In The economics of education (2nd ed., pp. 171–182). Academic Press. https://doi.org/10.1016/B978-0-12-815391-8.00014-8
OECD (2023). PISA 2022 Results (Volume I): The State of Learning and Equity in Education. OECD Publishing. https://doi.org/10.1787/53f23881-en
Psacharopoulos, G., & Patrinos, H. A. (2018). Returns to investment in education: A decennial review of the global literature. Education Economics, 26(5), 445–458. https://doi.org/10.1080/09645292.2018.1484426
Schleicher, A. (2019). PISA 2018: Insights and interpretations. OECD Publishing. https://www.oecd.org/pisa/PISA%202018%20Insights%20and%20Interpretations%20FINAL%20PDF.pdf
Schleicher, A. (2023). PISA 2022 Results: Insights and interpretations. OECD Publishing.
Eurostat (2025). Sustainable Development in the European Union — Monitoring report on progress towards the SDGs in an EU context. Publications Office of the European Union. https://ec.europa.eu/eurostat/web/products-statistical-books/w/ks-02-25-299
Správa vygenerovaná automaticky pomocou R Markdown. Dátum: 02. June 2026