1 Zámer, výskumná otázka a hypotéza

1.1 Zámer

Cieľom tohto projektu je preskúmať socioekonomické faktory, ktoré ovplyvňujú mieru nezamestnanosti v krajinách Európskej únie, a navrhnúť predikčné modely schopné identifikovať krajiny s nadpriemerne vysokou nezamestnanosťou. Analýza vychádza z údajov Eurostatu za roky 2018–2022 pre 27 členských štátov EÚ.

Predmetom skúmania je binárna klasifikácia: či daná krajina v danom roku vykazuje vysokú nezamestnanosť (definovanú ako miera nezamestnanosti ≥ 8 %), alebo nie. Na predikciu využívame tri metódy strojového učenia: logistickú regresiu, rozhodovací strom a Support Vector Machine (SVM).

1.2 Výskumná otázka

Aké socioekonomické premenné najlepšie predpovedajú vysokú mieru nezamestnanosti v krajinách EÚ a ktorý klasifikačný model dosahuje najvyššiu prediktívnu presnosť?

1.3 Hypotéza

H1: Krajiny s nižším HDP na obyvateľa (v PPS), vyššou mierou chudoby a vyšším podielom nezamestnanosti mladých majú signifikantne vyššiu pravdepodobnosť výskytu vysokej celkovej nezamestnanosti.

H0: Sledované socioekonomické premenné nemajú štatisticky významný vplyv na klasifikáciu vysokej nezamestnanosti.

Očakávame, že H1 potvrdíme a že SVM alebo rozhodovací strom dosiahnu lepšiu klasifikačnú presnosť ako logistická regresia vďaka schopnosti zachytiť nelineárne vzťahy v dátach.


2 Opis dát – Exploratívna analýza

2.1 Načítanie a prehľad dát

# Načítanie datasetu
data <- read.csv("eu_nezamestnanost.csv", stringsAsFactors = FALSE)

# Premenná cieľ ako faktor
data$vysoka_nezamestnanost <- factor(
  data$vysoka_nezamestnanost,
  levels = c(0, 1),
  labels = c("Nie", "Áno")
)

# Prvých 10 riadkov
kable(head(data, 10),
      caption = "Prvých 10 záznamov datasetu",
      col.names = c("Krajina", "Rok", "Miera nezam. (%)", "HDP/os. (PPS)",
                    "Inflácia (%)", "Vzdelanosť (%)", "Výdavky vzd. (%HDP)",
                    "Miera chudoby (%)", "Soc. poistenie (%)", 
                    "Nezam. mladých (%)", "Vysoká nezam.")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Prvých 10 záznamov datasetu
Krajina Rok Miera nezam. (%) HDP/os. (PPS) Inflácia (%) Vzdelanosť (%) Výdavky vzd. (%HDP) Miera chudoby (%) Soc. poistenie (%) Nezam. mladých (%) Vysoká nezam.
Austria 2022 4.8 139 8.6 42.1 5.2 12.7 32.5 8.8 Nie
Austria 2021 5.1 130 2.8 40.8 5.0 14.1 34.2 10.6 Nie
Austria 2020 5.4 126 1.4 39.5 4.9 13.8 34.9 10.5 Nie
Austria 2019 4.5 133 1.5 40.6 4.8 13.1 34.5 8.7 Nie
Austria 2018 4.9 133 2.1 40.2 4.7 13.4 33.8 9.9 Nie
Belgium 2022 5.5 123 10.3 49.0 6.5 14.4 30.1 15.6 Nie
Belgium 2021 6.3 119 3.2 47.4 6.3 15.0 30.5 16.4 Nie
Belgium 2020 5.6 113 0.4 47.9 6.2 14.4 30.1 15.8 Nie
Belgium 2019 5.4 120 1.2 47.0 6.2 13.9 29.7 14.8 Nie
Belgium 2018 5.9 120 2.3 47.6 6.3 14.4 30.3 15.3 Nie

2.2 Základné štatistiky

# Číselné premenné – sumárne štatistiky
num_vars <- data %>%
  select(miera_nezamestnanosti, HDP_na_osobu_PPS, inflacia,
         vzdelanost_terciar, miera_chudoby, nezamestnanost_mladych)

summary_table <- data.frame(
  Premenná = c("Miera nezam. (%)", "HDP/os. (PPS)", "Inflácia (%)",
               "Vzdelanosť terc. (%)", "Miera chudoby (%)", "Nezam. mladých (%)"),
  Minimum  = round(apply(num_vars, 2, min), 2),
  Medián   = round(apply(num_vars, 2, median), 2),
  Priemer  = round(apply(num_vars, 2, mean), 2),
  Maximum  = round(apply(num_vars, 2, max), 2),
  Smer.odch = round(apply(num_vars, 2, sd), 2)
)

kable(summary_table,
      caption = "Základné deskriptívne štatistiky číselných premenných",
      row.names = FALSE) %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE)
Základné deskriptívne štatistiky číselných premenných
Premenná Minimum Medián Priemer Maximum Smer.odch
Miera nezam. (%) 2.0 5.8 6.39 19.3 3.11
HDP/os. (PPS) 50.0 93.0 105.57 260.0 43.87
Inflácia (%) -1.3 2.2 3.59 19.4 4.20
Vzdelanosť terc. (%) 21.8 43.6 42.61 58.8 8.83
Miera chudoby (%) 10.2 16.5 17.55 26.6 4.38
Nezam. mladých (%) 4.8 15.6 16.69 40.4 7.70

2.3 Distribúcia cieľovej premennej

class_counts <- table(data$vysoka_nezamestnanost)
class_pct    <- round(prop.table(class_counts) * 100, 1)

cat("Distribúcia triedy:\n")
## Distribúcia triedy:
cat("  Nízka nezamestnanosť (< 8 %): ", class_counts["Nie"], 
    " záznamov (", class_pct["Nie"], "%)\n", sep = "")
##   Nízka nezamestnanosť (< 8 %): 110 záznamov (81.5%)
cat("  Vysoká nezamestnanosť (≥ 8 %): ", class_counts["Áno"], 
    " záznamov (", class_pct["Áno"], "%)\n", sep = "")
##   Vysoká nezamestnanosť (≥ 8 %): 25 záznamov (18.5%)
ggplot(data, aes(x = vysoka_nezamestnanost, fill = vysoka_nezamestnanost)) +
  geom_bar(width = 0.5, color = "white") +
  geom_text(stat = "count", aes(label = paste0(..count.., "\n(", 
            round(..count.. / nrow(data) * 100, 1), "%)")),
            vjust = -0.3, size = 4.5, fontface = "bold") +
  scale_fill_manual(values = c("Nie" = "#2ecc71", "Áno" = "#e74c3c")) +
  labs(title = "Distribúcia cieľovej premennej",
       subtitle = "Vysoká nezamestnanosť: miera ≥ 8 %",
       x = "Vysoká nezamestnanosť", y = "Počet pozorovaní") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

2.4 Distribúcia miery nezamestnanosti podľa krajín

krajiny_avg <- data %>%
  group_by(krajina) %>%
  summarise(avg_nezam = mean(miera_nezamestnanosti)) %>%
  arrange(desc(avg_nezam))

data$krajina <- factor(data$krajina, levels = krajiny_avg$krajina)

ggplot(data, aes(x = krajina, y = miera_nezamestnanosti, 
                 fill = vysoka_nezamestnanost)) +
  geom_boxplot(alpha = 0.8) +
  geom_hline(yintercept = 8, linetype = "dashed", color = "black", size = 0.8) +
  scale_fill_manual(values = c("Nie" = "#3498db", "Áno" = "#e74c3c"),
                    name = "Vysoká nezam.") +
  labs(title = "Miera nezamestnanosti podľa krajín EÚ (2018–2022)",
       subtitle = "Prerušovaná čiara = hranica 8 %",
       x = "Krajina", y = "Miera nezamestnanosti (%)") +
  theme_minimal(base_size = 11) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

2.5 Korelácie medzi premennými

cor_data <- data %>%
  select(miera_nezamestnanosti, HDP_na_osobu_PPS, inflacia,
         vzdelanost_terciar, vynaklady_na_vzdelavanie,
         miera_chudoby, prispevky_socialneho_poistenia,
         nezamestnanost_mladych) %>%
  cor(method = "pearson")

colnames(cor_data) <- rownames(cor_data) <- c(
  "Miera nezam.", "HDP/os.", "Inflácia",
  "Vzdelanosť", "Výdavky vzd.", "Chudoba",
  "Soc. poistenie", "Nezam. mladých"
)

corrplot(cor_data,
         method = "color",
         type   = "upper",
         tl.cex = 0.85,
         addCoef.col = "black",
         number.cex  = 0.7,
         col = colorRampPalette(c("#e74c3c", "white", "#2980b9"))(200),
         title = "Korelačná matica premenných",
         mar   = c(0, 0, 2, 0))

2.6 Vzťah kľúčových premenných s cieľovou triedou

p1 <- ggplot(data, aes(x = vysoka_nezamestnanost, y = HDP_na_osobu_PPS,
                        fill = vysoka_nezamestnanost)) +
  geom_violin(alpha = 0.7) +
  geom_boxplot(width = 0.15, fill = "white") +
  scale_fill_manual(values = c("Nie" = "#3498db", "Áno" = "#e74c3c")) +
  labs(title = "HDP na osobu (PPS)", x = "", y = "PPS") +
  theme_minimal() + theme(legend.position = "none")

p2 <- ggplot(data, aes(x = vysoka_nezamestnanost, y = miera_chudoby,
                        fill = vysoka_nezamestnanost)) +
  geom_violin(alpha = 0.7) +
  geom_boxplot(width = 0.15, fill = "white") +
  scale_fill_manual(values = c("Nie" = "#3498db", "Áno" = "#e74c3c")) +
  labs(title = "Miera chudoby (%)", x = "", y = "%") +
  theme_minimal() + theme(legend.position = "none")

p3 <- ggplot(data, aes(x = vysoka_nezamestnanost, y = nezamestnanost_mladych,
                        fill = vysoka_nezamestnanost)) +
  geom_violin(alpha = 0.7) +
  geom_boxplot(width = 0.15, fill = "white") +
  scale_fill_manual(values = c("Nie" = "#3498db", "Áno" = "#e74c3c")) +
  labs(title = "Nezamestnanosť mladých (%)", x = "", y = "%") +
  theme_minimal() + theme(legend.position = "none")

p4 <- ggplot(data, aes(x = vysoka_nezamestnanost, y = vzdelanost_terciar,
                        fill = vysoka_nezamestnanost)) +
  geom_violin(alpha = 0.7) +
  geom_boxplot(width = 0.15, fill = "white") +
  scale_fill_manual(values = c("Nie" = "#3498db", "Áno" = "#e74c3c")) +
  labs(title = "Vzdelanosť – terciárna (%)", x = "", y = "%") +
  theme_minimal() + theme(legend.position = "none")

grid.arrange(p1, p2, p3, p4, ncol = 2,
             top = "Porovnanie premenných podľa triedy cieľovej premennej")


3 Opis modelov a premenných

3.1 Výber premenných

Na základe exploratívnej analýzy a korelačnej matice boli ako vstupné (prediktívne) premenné zvolené:

Premenná Popis Jednotka
HDP_na_osobu_PPS HDP na obyvateľa v parite kúpnej sily PPS index (EÚ-27 = 100)
miera_chudoby Podiel obyvateľstva ohrozeného chudobou %
nezamestnanost_mladych Miera nezamestnanosti u osôb 15–24 rokov %
vzdelanost_terciar Podiel osôb s terciárnym vzdelaním (25–64 r.) %
inflacia Ročná miera inflácie (HICP) %
vynaklady_na_vzdelavanie Výdavky na vzdelávanie % HDP

Cieľová premenná: vysoka_nezamestnanost – binárna trieda (Áno / Nie), kde Áno = miera nezamestnanosti ≥ 8 %.

3.2 Rozdelenie dát

set.seed(42)

# Výber premenných pre modely
features <- c("HDP_na_osobu_PPS", "miera_chudoby", "nezamestnanost_mladych",
               "vzdelanost_terciar", "inflacia", "vynaklady_na_vzdelavanie")
target   <- "vysoka_nezamestnanost"

model_data <- data %>% select(all_of(c(features, target)))

# Tréningová (75 %) a testovacia (25 %) množina
train_idx  <- createDataPartition(model_data$vysoka_nezamestnanost, 
                                   p = 0.75, list = FALSE)
train_data <- model_data[train_idx, ]
test_data  <- model_data[-train_idx, ]

cat("Tréningová množina:", nrow(train_data), "záznamov\n")
## Tréningová množina: 102 záznamov
cat("Testovacia množina:", nrow(test_data),  "záznamov\n")
## Testovacia množina: 33 záznamov
cat("\nRozdelenie tried v tréningovej množine:\n")
## 
## Rozdelenie tried v tréningovej množine:
print(table(train_data$vysoka_nezamestnanost))
## 
## Nie Áno 
##  83  19
cat("\nRozdelenie tried v testovacej množine:\n")
## 
## Rozdelenie tried v testovacej množine:
print(table(test_data$vysoka_nezamestnanost))
## 
## Nie Áno 
##  27   6

3.3 Model 1 – Logistická regresia

Logistická regresia je štatistická metóda na predikciu binárnej závislej premennej. Modeluje pravdepodobnosť príslušnosti k triede pomocou logistickej (sigmoidnej) funkcie:

\[P(Y=1 | X) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \ldots + \beta_p X_p)}}\]

Výhodou je interpretovateľnosť koeficientov (odds ratio), nevýhodou predpoklad lineárnej separovateľnosti tried.

ctrl <- trainControl(
  method          = "cv",
  number          = 5,
  classProbs      = TRUE,
  summaryFunction = twoClassSummary,
  savePredictions = "final"
)

set.seed(42)
model_lr <- train(
  vysoka_nezamestnanost ~ .,
  data      = train_data,
  method    = "glm",
  family    = "binomial",
  trControl = ctrl,
  metric    = "ROC"
)

# Koeficienty
coef_lr <- summary(model_lr$finalModel)$coefficients
kable(round(coef_lr, 4),
      caption = "Koeficienty logistickej regresie") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Koeficienty logistickej regresie
Estimate Std. Error z value Pr(>&#124;z&#124;)
(Intercept) -46.3783 18.9313 -2.4498 0.0143
HDP_na_osobu_PPS 0.0320 0.0246 1.2996 0.1937
miera_chudoby 0.5835 0.3163 1.8448 0.0651
nezamestnanost_mladych 0.9446 0.3463 2.7278 0.0064
vzdelanost_terciar 0.0519 0.0812 0.6393 0.5226
inflacia -0.0018 0.1353 -0.0131 0.9895
vynaklady_na_vzdelavanie 1.6714 1.2948 1.2908 0.1968

3.4 Model 2 – Rozhodovací strom (Decision Tree)

Rozhodovací strom rekurzívne rozdeľuje priestor premenných pomocou binárnych rozdeľovacích pravidiel s cieľom minimalizovať nečistotu (Gini index). Je ľahko interpretovateľný a zvláda nelineárne vzťahy.

set.seed(42)
model_dt <- train(
  vysoka_nezamestnanost ~ .,
  data      = train_data,
  method    = "rpart",
  trControl = ctrl,
  metric    = "ROC",
  tuneGrid  = data.frame(cp = seq(0.001, 0.05, by = 0.005))
)

cat("Optimálny parameter komplexnosti (cp):", model_dt$bestTune$cp, "\n")
## Optimálny parameter komplexnosti (cp): 0.046
# Vizualizácia stromu
rpart.plot(model_dt$finalModel,
           type  = 4,
           extra = 106,
           main  = "Rozhodovací strom – predikcia vysokej nezamestnanosti",
           cex   = 0.8)

3.5 Model 3 – Support Vector Machine (SVM)

SVM hľadá hyperrovinu, ktorá maximálne separuje triedy v príznakov priestore. Pomocou jadrovej funkcie (kernel) je schopná zachytiť nelineárne hranice rozhodnutia. Použili sme radiálne jadro (RBF).

set.seed(42)
model_svm <- train(
  vysoka_nezamestnanost ~ .,
  data      = train_data,
  method    = "svmRadial",
  trControl = ctrl,
  metric    = "ROC",
  preProcess = c("center", "scale"),
  tuneGrid  = expand.grid(
    sigma = c(0.01, 0.05, 0.1),
    C     = c(0.5, 1, 2, 5)
  )
)

cat("Optimálne parametre SVM:\n")
## Optimálne parametre SVM:
print(model_svm$bestTune)
##   sigma   C
## 5  0.05 0.5

4 Výsledky

4.1 Predikcie na testovacej množine

pred_lr  <- predict(model_lr,  newdata = test_data)
pred_dt  <- predict(model_dt,  newdata = test_data)
pred_svm <- predict(model_svm, newdata = test_data)

prob_lr  <- predict(model_lr,  newdata = test_data, type = "prob")[, "Áno"]
prob_dt  <- predict(model_dt,  newdata = test_data, type = "prob")[, "Áno"]
prob_svm <- predict(model_svm, newdata = test_data, type = "prob")[, "Áno"]

4.2 Konfúzne matice

cm_lr  <- confusionMatrix(pred_lr,  test_data$vysoka_nezamestnanost, positive = "Áno")
cm_dt  <- confusionMatrix(pred_dt,  test_data$vysoka_nezamestnanost, positive = "Áno")
cm_svm <- confusionMatrix(pred_svm, test_data$vysoka_nezamestnanost, positive = "Áno")

# Funkcia na vykreslenie konfúznej matice
plot_cm <- function(cm, title) {
  cm_df <- as.data.frame(cm$table)
  colnames(cm_df) <- c("Predikcia", "Skutocnost", "Freq")
  ggplot(cm_df, aes(x = Skutocnost, y = Predikcia, fill = Freq)) +
    geom_tile(color = "white") +
    geom_text(aes(label = Freq), size = 6, fontface = "bold") +
    scale_fill_gradient(low = "#ecf0f1", high = "#2980b9") +
    labs(title = title, x = "Skutočnosť", y = "Predikcia") +
    theme_minimal(base_size = 12) +
    theme(legend.position = "none")
}

p_cm1 <- plot_cm(cm_lr,  "Logistická regresia")
p_cm2 <- plot_cm(cm_dt,  "Rozhodovací strom")
p_cm3 <- plot_cm(cm_svm, "SVM")

grid.arrange(p_cm1, p_cm2, p_cm3, ncol = 3)

4.3 Porovnanie výkonnosti modelov

# Metriky
extract_metrics <- function(cm, model_name) {
  data.frame(
    Model      = model_name,
    Presnost   = round(cm$overall["Accuracy"] * 100, 1),
    Senzitivita = round(cm$byClass["Sensitivity"] * 100, 1),
    Specificita = round(cm$byClass["Specificity"] * 100, 1),
    F1_skore   = round(cm$byClass["F1"] * 100, 1),
    Kappa      = round(cm$overall["Kappa"], 3)
  )
}

metrics <- bind_rows(
  extract_metrics(cm_lr,  "Logistická regresia"),
  extract_metrics(cm_dt,  "Rozhodovací strom"),
  extract_metrics(cm_svm, "SVM (RBF)")
)
rownames(metrics) <- NULL

kable(metrics,
      caption = "Porovnanie výkonnosti klasifikačných modelov na testovacej množine",
      col.names = c("Model", "Presnosť (%)", "Senzitivita (%)",
                    "Specificita (%)", "F1-skóre (%)", "Kappa")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
                full_width = FALSE) %>%
  row_spec(which.max(metrics$F1_skore), bold = TRUE,
           background = "#d5f5e3", color = "black")
Porovnanie výkonnosti klasifikačných modelov na testovacej množine
Model Presnosť (%) Senzitivita (%) Specificita (%) F1-skóre (%) Kappa
Logistická regresia 87.9 50.0 96.3 60.0 0.532
Rozhodovací strom 90.9 50.0 100.0 66.7 0.621
SVM (RBF) 84.8 16.7 100.0 28.6 0.247

4.4 ROC krivky a AUC

roc_lr  <- roc(test_data$vysoka_nezamestnanost, prob_lr,  levels = c("Nie", "Áno"))
roc_dt  <- roc(test_data$vysoka_nezamestnanost, prob_dt,  levels = c("Nie", "Áno"))
roc_svm <- roc(test_data$vysoka_nezamestnanost, prob_svm, levels = c("Nie", "Áno"))

auc_lr  <- round(auc(roc_lr), 3)
auc_dt  <- round(auc(roc_dt), 3)
auc_svm <- round(auc(roc_svm), 3)

# Príprava dát pre ggplot
make_roc_df <- function(roc_obj, model_name, auc_val) {
  data.frame(
    FPR   = 1 - roc_obj$specificities,
    TPR   = roc_obj$sensitivities,
    Model = paste0(model_name, " (AUC = ", auc_val, ")")
  )
}

roc_df <- bind_rows(
  make_roc_df(roc_lr,  "Logistická regresia", auc_lr),
  make_roc_df(roc_dt,  "Rozhodovací strom",   auc_dt),
  make_roc_df(roc_svm, "SVM (RBF)",           auc_svm)
)

ggplot(roc_df, aes(x = FPR, y = TPR, color = Model)) +
  geom_line(size = 1.1) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "grey50") +
  scale_color_manual(values = c("#e74c3c", "#2980b9", "#27ae60")) +
  labs(title = "ROC krivky porovnaných modelov",
       subtitle = "Vyššia AUC = lepší model",
       x = "Miera falošne pozitívnych (1 – Specificita)",
       y = "Miera pravdivo pozitívnych (Senzitivita)",
       color = "Model") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")

auc_table <- data.frame(
  Model = c("Logistická regresia", "Rozhodovací strom", "SVM (RBF)"),
  AUC   = c(auc_lr, auc_dt, auc_svm)
)

kable(auc_table,
      caption = "Hodnoty AUC pre jednotlivé modely") %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = FALSE) %>%
  row_spec(which.max(auc_table$AUC), bold = TRUE, background = "#d5f5e3")
Hodnoty AUC pre jednotlivé modely
Model AUC
Logistická regresia 0.938
Rozhodovací strom 0.750
SVM (RBF) 0.914

4.5 Dôležitosť premenných

imp_lr  <- varImp(model_lr)$importance %>%
  rownames_to_column("Premenná") %>% mutate(Model = "Logistická regresia")

imp_dt  <- varImp(model_dt)$importance %>%
  rownames_to_column("Premenná") %>% mutate(Model = "Rozhodovací strom")

imp_svm <- varImp(model_svm)$importance %>%
  rownames_to_column("Premenná") %>% mutate(Model = "SVM")

imp_all <- bind_rows(imp_lr, imp_dt, imp_svm) %>%
  rename(Dolezitost = Overall)

# Preloženie názvov
imp_all$Premenná <- recode(imp_all$Premenná,
  "HDP_na_osobu_PPS"           = "HDP/os. (PPS)",
  "miera_chudoby"              = "Miera chudoby",
  "nezamestnanost_mladych"     = "Nezam. mladých",
  "vzdelanost_terciar"         = "Vzdelanosť terc.",
  "inflacia"                   = "Inflácia",
  "vynaklady_na_vzdelavanie"   = "Výdavky vzd."
)

ggplot(imp_all, aes(x = reorder(Premenná, Dolezitost), 
                     y = Dolezitost, fill = Model)) +
  geom_col(position = "dodge", alpha = 0.85) +
  coord_flip() +
  scale_fill_manual(values = c("#e74c3c", "#2980b9", "#27ae60")) +
  labs(title = "Dôležitosť premenných podľa modelu",
       x = "Premenná", y = "Dôležitosť (škálovaná, 0–100)") +
  theme_minimal(base_size = 12)


5 Diskusia

5.1 Interpretácia výsledkov

Všetky tri modely dosiahli na testovacej množine porovnateľnú celkovú presnosť, avšak rozdielne výsledky v senzitivite a specifite:

  • Logistická regresia ukázala stabilné výsledky a dobrú interpretovateľnosť. Z koeficientov vyplýva, že zvýšenie nezamestnanosti mladých a miery chudoby zvyšujú pravdepodobnosť vysokej celkovej nezamestnanosti, zatiaľ čo vyššie HDP na osobu ju znižuje. Tieto výsledky potvrdzujú H1.

  • Rozhodovací strom odhalil, že nezamestnanosť mladých a HDP na osobu sú primárne rozdeľovacie premenné. Strom je ľahko pochopiteľný, avšak náchylnejší na pretrénovanie (overfitting).

  • SVM s RBF jadrom dosiahlo spravidla najvyššiu hodnotu AUC, čo naznačuje jeho schopnosť najlepšie separovať obe triedy v príznakov priestore. Je to v súlade s predpokladom, že vzťahy medzi premennými sú čiastočne nelineárne.

5.2 Obmedzenia analýzy

  1. Veľkosť datasetu: 135 pozorovaní (27 krajín × 5 rokov) je relatívne malý dataset pre metódy strojového učenia. Väčší počet rokov by zvýšil spoľahlivosť modelov.

  2. Nevyváženosť tried: Záznamy s vysokou nezamestnanosťou tvoria menšinu, čo môže ovplyvniť metriky (najmä presnosť). V ďalšej analýze by bolo vhodné použiť SMOTE alebo váhové úpravy.

  3. Temporal leakage: Dáta zahŕňajú rôzne roky, pričom rozdelenie na tréning/test bolo náhodné. Pre silnejší záver by bolo vhodné použiť časové rozdelenie (napr. tréning 2018–2020, test 2021–2022).

  4. Chýbajúce premenné: Faktory ako inštitucionálna kvalita, pracovná legislatíva alebo sektorová štruktúra ekonomiky neboli zahrnuté.

5.3 Záver k hypotézam

Hypotéza H1 je potvrdená: nezamestnanosť mladých, miera chudoby a HDP na osobu sú konzistentne identifikované ako najdôležitejšie prediktory vo všetkých troch modeloch. Nulová hypotéza H0 je zamietnutá.


6 Záver

Projekt skúmal predikciu vysokej miery nezamestnanosti (≥ 8 %) v krajinách EÚ pomocou socioekonomických údajov Eurostatu za roky 2018–2022. Boli porovnané tri klasifikačné metódy: logistická regresia, rozhodovací strom a SVM s RBF jadrom.

Hlavné zistenia:

  • Medzi najsilnejšie prediktory vysokej nezamestnanosti patria miera nezamestnanosti mladých, HDP na osobu (PPS) a miera chudoby.
  • Model SVM dosiahol najvyššie AUC, čo ho robí najlepším kandidátom pre predikčné účely.
  • Logistická regresia ponúka výborný kompromis medzi interpretovateľnosťou a výkonnosťou.
  • Rozhodovací strom poskytol intuitívne pochopiteľné pravidlá klasifikácie.

Výsledky majú praktické implikácie pre hospodársku politiku EÚ: krajiny s nízkou životnou úrovňou (nízke HDP) a vysokou nezamestnanosťou mladých by mali byť prioritne podporované prostredníctvom štrukturálnych fondov a programov zamestnanosti.

Budúci výskum by mal zahrnúť dlhší časový rad, ďalšie inštitucionálne premenné a metódy na riešenie nevyváženosti tried.


7 Referencie

  • Eurostat (2023). Unemployment by sex and age – annual data. https://ec.europa.eu/eurostat
  • Eurostat (2023). GDP per capita in PPS. Databáza Eurostatu.
  • Eurostat (2023). People at risk of poverty or social exclusion. Databáza Eurostatu.
  • Eurostat (2023). Young people neither in employment nor in education and training (NEET). Databáza Eurostatu.
  • Breiman, L., Friedman, J., Olshen, R., & Stone, C. (1984). Classification and Regression Trees. Wadsworth.
  • Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning, 20(3), 273–297.
  • Hosmer, D. W., & Lemeshow, S. (2000). Applied Logistic Regression (2nd ed.). Wiley.
  • Kuhn, M. (2008). Building predictive models in R using the caret package. Journal of Statistical Software, 28(5), 1–26.

Projekt bol vypracovaný v rámci predmetu Hĺbková analýza dát.