Cieľom práce je spracovať a zhrnúť ekonometrické kroky na reálnych
dátach v R (Posit Cloud).
Analyzujem ročné údaje o miere nezamestnanosti (v % pracovnej sily) pre
tri krajiny: Czechia, Germany, Slovakia v období
2014–2024.
V práci odhadujem lineárny regresný model, overujem základné predpoklady
(heteroskedasticita, multikolinearita, špecifikácia, vplyvné
pozorovania) a ako doplnkovú metódu uvádzam zhlukovú
analýzu.
Použité dáta sú v súbore
une_rt_a__custom_18708117_linear.csv (Eurostat, ročná
frekvencia, vek 15–74 rokov, pohlavie Total).
data_path <- "une_rt_a__custom_18708117_linear.csv"
raw <- read.csv(data_path, check.names = FALSE, stringsAsFactors = FALSE)
d <- subset(
raw,
freq == "Annual" &
age == "From 15 to 74 years" &
sex == "Total" &
geo %in% c("Czechia", "Germany", "Slovakia")
)
d$TIME_PERIOD <- as.integer(d$TIME_PERIOD)
d$OBS_VALUE <- as.numeric(d$OBS_VALUE)
d <- d[order(d$TIME_PERIOD, d$geo), ]
wide <- reshape(
d[, c("TIME_PERIOD", "geo", "OBS_VALUE")],
idvar = "TIME_PERIOD",
timevar = "geo",
direction = "wide"
)
names(wide) <- gsub("^OBS_VALUE\\.", "", names(wide))
names(wide)[names(wide) == "TIME_PERIOD"] <- "Year"
wide <- wide[order(wide$Year), ]
row.names(wide) <- NULL
wide$t <- wide$Year - min(wide$Year)
wide$D_break <- as.integer(wide$Year >= 2020)
knitr::kable(head(wide, 11), digits = 2, caption = "Dáta v širokom tvare (2014–2024)")
| Year | Czechia | Germany | Slovakia | t | D_break |
|---|---|---|---|---|---|
| 2014 | 6.1 | 4.7 | 13.1 | 0 | 0 |
| 2015 | 5.1 | 4.4 | 11.5 | 1 | 0 |
| 2016 | 4.0 | 3.9 | 9.6 | 2 | 0 |
| 2017 | 2.9 | 3.5 | 8.1 | 3 | 0 |
| 2018 | 2.2 | 3.2 | 6.5 | 4 | 0 |
| 2019 | 2.0 | 2.9 | 5.7 | 5 | 0 |
| 2020 | 2.6 | 3.6 | 6.7 | 6 | 1 |
| 2021 | 2.8 | 3.6 | 6.8 | 7 | 1 |
| 2022 | 2.2 | 3.1 | 6.1 | 8 | 1 |
| 2023 | 2.6 | 3.1 | 5.8 | 9 | 1 |
| 2024 | 2.6 | 3.4 | 5.3 | 10 | 1 |
Komentár:
Najprv som načítala export Eurostatu a prefiltrovala ho na ročné údaje
pre vek 15–74 (Total) a krajiny Czechia, Germany, Slovakia. Následne som
dáta prehodila do „wide“ tvaru, aby bol každý rok jeden riadok a každá
krajina samostatný stĺpec. Pridala som časový trend t a
dummy premennú D_break od roku 2020, aby som vedela
lineárne zachytiť možný zlom.
countries <- c("Czechia", "Germany", "Slovakia")
desc <- data.frame(
Krajina = countries,
n = sapply(countries, function(v) sum(!is.na(wide[[v]]))),
priemer = sapply(countries, function(v) mean(wide[[v]], na.rm = TRUE)),
sd = sapply(countries, function(v) sd(wide[[v]], na.rm = TRUE)),
minimum = sapply(countries, function(v) min(wide[[v]], na.rm = TRUE)),
maximum = sapply(countries, function(v) max(wide[[v]], na.rm = TRUE))
)
knitr::kable(desc, digits = 2, caption = "Deskriptívne štatistiky miery nezamestnanosti (%)")
| Krajina | n | priemer | sd | minimum | maximum | |
|---|---|---|---|---|---|---|
| Czechia | Czechia | 11 | 3.19 | 1.32 | 2.0 | 6.1 |
| Germany | Germany | 11 | 3.58 | 0.56 | 2.9 | 4.7 |
| Slovakia | Slovakia | 11 | 7.75 | 2.58 | 5.3 | 13.1 |
Komentár:
Deskriptívne štatistiky mi dávajú prvý prehľad o úrovni a variabilite
nezamestnanosti v jednotlivých krajinách. Vidím priemery, smerodajné
odchýlky aj extrémy, čo je dôležité pred tým, než začnem modelovať.
matplot(
wide$Year,
cbind(wide$Czechia, wide$Germany, wide$Slovakia),
type = "l",
lty = 1,
lwd = 2,
col = unname(cols_countries),
xlab = "Rok",
ylab = "Nezamestnanosť (%)",
main = "Miera nezamestnanosti (2014–2024): Czechia, Germany, Slovakia"
)
legend("topright",
legend = names(cols_countries),
col = unname(cols_countries),
lty = 1,
lwd = 2,
bty = "n")
abline(v = 2020, lty = 2, col = "gray40")
mtext("Prerušovaná čiara = rok 2020", side = 3, line = 0.2, cex = 0.85, col = "gray40")
Komentár:
Graf ukazuje vývoj nezamestnanosti v čase pre všetky tri krajiny.
Prerušovanou čiarou som vyznačila rok 2020, ktorý beriem ako jednoduchý
bod zlomu (zmena podmienok na trhu práce). Táto vizualizácia je dôležitá
aj pre rozhodnutie, či má zmysel do modelu pridať dummy premennú.
boxplot(
list(
Czechia = wide$Czechia,
Germany = wide$Germany,
Slovakia = wide$Slovakia
),
col = unname(cols_countries),
border = "gray30",
ylab = "Nezamestnanosť (%)",
main = "Boxplot miery nezamestnanosti (2014–2024)"
)
Komentár:
Boxplot porovnáva rozdelenie nezamestnanosti medzi krajinami. Vidím
medián, rozptyl (IQR) a prípadné odľahlé hodnoty. Je to rýchly spôsob,
ako posúdiť, ktorá krajina má stabilnejší vývoj a ktorá väčšie
výkyvy.
num_vars <- wide[, c("Czechia","Germany","Slovakia","t","D_break")]
C <- cor(num_vars, use = "complete.obs")
knitr::kable(round(C, 3), caption = "Korelačná matica numerických veličín")
| Czechia | Germany | Slovakia | t | D_break | |
|---|---|---|---|---|---|
| Czechia | 1.000 | 0.965 | 0.970 | -0.747 | -0.458 |
| Germany | 0.965 | 1.000 | 0.944 | -0.727 | -0.379 |
| Slovakia | 0.970 | 0.944 | 1.000 | -0.873 | -0.596 |
| t | -0.747 | -0.727 | -0.873 | 1.000 | 0.866 |
| D_break | -0.458 | -0.379 | -0.596 | 0.866 | 1.000 |
pal <- colorRampPalette(c("#2166ac", "white", "#b2182b"))(200)
layout(matrix(c(1,2), 1, 2), widths = c(4, 1))
par(mar = c(6, 6, 3, 1))
image(
x = 1:ncol(C),
y = 1:nrow(C),
z = t(C)[, nrow(C):1],
col = pal,
zlim = c(-1, 1),
axes = FALSE,
main = "Heatmap korelačnej matice"
)
axis(1, at = 1:ncol(C), labels = colnames(C), las = 2)
axis(2, at = 1:nrow(C), labels = rev(rownames(C)), las = 2)
box()
for (i in 1:nrow(C)) {
for (j in 1:ncol(C)) {
text(j, nrow(C) - i + 1, labels = sprintf("%.2f", C[i, j]), cex = 0.9)
}
}
par(mar = c(6, 2, 3, 4))
y_leg <- seq(-1, 1, length.out = 200)
z_leg <- matrix(y_leg, nrow = 1)
image(
x = 1,
y = y_leg,
z = z_leg,
col = pal,
axes = FALSE,
xlab = "",
ylab = ""
)
axis(4, at = seq(-1, 1, by = 0.5), las = 2)
mtext("korelácia", side = 4, line = 2)
layout(1)
par(mar = c(5, 4, 4, 2) + 0.1)
Komentár:
Korelačná matica ukazuje lineárnu závislosť medzi numerickými
premennými. Heatmapa mi pomáha rýchlo identifikovať silné pozitívne a
negatívne korelácie. Zároveň je to prvá kontrola možnej multikolinearity
(ak by boli regresory medzi sebou príliš silno korelované).
yoy <- data.frame(
Year = wide$Year[-1],
Czechia_pp = diff(wide$Czechia),
Germany_pp = diff(wide$Germany),
Slovakia_pp = diff(wide$Slovakia)
)
knitr::kable(yoy, digits = 2, caption = "Medziročné zmeny nezamestnanosti (v percentuálnych bodoch)")
| Year | Czechia_pp | Germany_pp | Slovakia_pp |
|---|---|---|---|
| 2015 | -1.0 | -0.3 | -1.6 |
| 2016 | -1.1 | -0.5 | -1.9 |
| 2017 | -1.1 | -0.4 | -1.5 |
| 2018 | -0.7 | -0.3 | -1.6 |
| 2019 | -0.2 | -0.3 | -0.8 |
| 2020 | 0.6 | 0.7 | 1.0 |
| 2021 | 0.2 | 0.0 | 0.1 |
| 2022 | -0.6 | -0.5 | -0.7 |
| 2023 | 0.4 | 0.0 | -0.3 |
| 2024 | 0.0 | 0.3 | -0.5 |
Komentár:
Medziročné zmeny (v percentuálnych bodoch) ukazujú, kedy boli v
jednotlivých krajinách najvýraznejšie skoky. Pomáha mi to interpretovať
„šoky“ v dátach a lepšie chápať, prečo môže byť vhodné uvažovať o
zlome.
Ako závislú premennú volím nezamestnanosť na Slovensku. Vysvetľujúce premenné sú nezamestnanosť v Nemecku a Česku a časový trend. Zároveň dopĺňam dummy premennú D_break (od roku 2020), ktorá predstavuje jednoduchú lineárnu kvantifikáciu možného zlomu v úrovni.
m0 <- lm(Slovakia ~ Germany + Czechia + t, data = wide)
m1 <- lm(Slovakia ~ Germany + Czechia + t + D_break, data = wide)
summary(m1)
##
## Call:
## lm(formula = Slovakia ~ Germany + Czechia + t + D_break, data = wide)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.24844 -0.08361 -0.01078 0.04232 0.34312
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.83788 1.95448 3.499 0.01285 *
## Germany -0.55902 0.68183 -0.820 0.44363
## Czechia 1.46797 0.24881 5.900 0.00105 **
## t -0.44194 0.09392 -4.705 0.00331 **
## D_break 0.95797 0.46306 2.069 0.08403 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2394 on 6 degrees of freedom
## Multiple R-squared: 0.9948, Adjusted R-squared: 0.9914
## F-statistic: 288.6 on 4 and 6 DF, p-value: 5.507e-07
Komentár:
Najprv odhadujem základný model bez zlomu (m0) a následne model so
zlomom (m1). Model m1 umožní zachytiť posun úrovne nezamestnanosti na
Slovensku po roku 2020, pričom zároveň kontrolujem vplyv Nemecka, Česka
a trendu v čase.
anova_tab <- anova(m0, m1)
knitr::kable(anova_tab, digits = 4, caption = "Porovnanie m0 vs. m1 (prínos dummy D_break)")
| Res.Df | RSS | Df | Sum of Sq | F | Pr(>F) |
|---|---|---|---|---|---|
| 7 | 0.5893 | NA | NA | NA | NA |
| 6 | 0.3440 | 1 | 0.2453 | 4.2799 | 0.084 |
Komentár:
Porovnanie m0 a m1 (ANOVA) mi povie, či pridanie dummy premennej
významne zlepšuje model. Ak áno, znamená to, že zlom od roku 2020 má v
dátach zmysel a je vhodné ho v modeli ponechať.
wide$pred_m1 <- predict(m1)
plot(
wide$Year, wide$Slovakia,
type = "b", pch = 16,
col = col_sk,
xlab = "Rok", ylab = "Nezamestnanosť Slovakia (%)",
main = "Skutočné vs. predikované hodnoty (m1)"
)
lines(wide$Year, wide$pred_m1, lty = 2, lwd = 2, col = col_sk)
legend(
"topright",
legend = c("Skutočné (Slovakia)", "Predikované (m1)"),
col = c(col_sk, col_sk),
lty = c(1, 2),
pch = c(16, NA),
lwd = c(1, 2),
bty = "n"
)
Komentár:
Graf porovnáva skutočné hodnoty nezamestnanosti na Slovensku s
predikciami modelu m1. Ak sa krivky približne prekrývajú, model má dobrú
schopnosť približne opisovať dáta. Výrazné odchýlky môžu signalizovať,
že model niečo nezachytáva (napr. nelinearitu alebo iné faktory).
grp <- ifelse(wide$D_break == 1, "Od 2020", "Pred 2020")
cols_pts <- cols_period[grp]
par(mfrow = c(1, 2))
plot(
wide$Germany, wide$Slovakia,
pch = 16, col = cols_pts,
xlab = "Germany (%)", ylab = "Slovakia (%)",
main = "Slovakia vs Germany"
)
abline(lm(Slovakia ~ Germany, data = wide), lwd = 2, col = "gray20")
legend("topleft", legend = names(cols_period), col = unname(cols_period), pch = 16, bty = "n")
plot(
wide$Czechia, wide$Slovakia,
pch = 16, col = cols_pts,
xlab = "Czechia (%)", ylab = "Slovakia (%)",
main = "Slovakia vs Czechia"
)
abline(lm(Slovakia ~ Czechia, data = wide), lwd = 2, col = "gray20")
legend("topleft", legend = names(cols_period), col = unname(cols_period), pch = 16, bty = "n")
par(mfrow = c(1, 1))
Komentár:
Scatter grafy ukazujú vzťah Slovenska s Nemeckom a Českom, pričom body
sú farebne rozlíšené podľa obdobia pred/od roku 2020. Takto sa dá
vizuálne posúdiť, či sa vzťah po roku 2020 zmenil a či dáva zmysel
pracovať so zlomovou premennou.
par(mfrow = c(2,2))
plot(m1)
par(mfrow = c(1,1))
Komentár:
Diagnostické grafy sú základná kontrola predpokladov lineárneho modelu:
(1) rezíduá vs fitted pre variabilitu a prípadnú heteroskedasticitu, (2)
Q-Q plot pre normalitu rezíduí, (3) Scale-Location pre rozptyl rezíduí,
(4) Cookova vzdialenosť pre vplyvné pozorovania. Pri malom počte rokov
beriem grafy ako orientačné a interpretujem ich spolu s testami.
plot(
fitted(m1), resid(m1),
pch = 16, col = "gray35",
xlab = "Fitted hodnoty",
ylab = "Rezíduá",
main = "Diagnostika heteroskedasticity: Rezíduá vs fitted"
)
abline(h = 0, lty = 2, col = "gray40")
lines(lowess(fitted(m1), resid(m1)), lwd = 2, col = col_sk)
legend("topright", legend = c("LOWESS"), col = c(col_sk), lwd = 2, bty = "n")
Komentár:
Ak sa rozptyl rezíduí mení s úrovňou fitted hodnôt (napr. lievikovitý
tvar), môže ísť o heteroskedasticitu. LOWESS krivka pomáha vidieť
systematický vzor v rezíduách.
lmtest::bptest(m1)
##
## studentized Breusch-Pagan test
##
## data: m1
## BP = 4.7529, df = 4, p-value = 0.3136
Komentár:
Breusch–Pagan test formálne testuje, či je rozptyl rezíduí konštantný.
Pri p-hodnote nižšej než 0.05 by som heteroskedasticitu považovala za
prítomnú.
lmtest::coeftest(m1, vcov. = sandwich::vcovHC(m1, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.837878 1.856966 3.6823 0.0103027 *
## Germany -0.559017 0.656813 -0.8511 0.4273666
## Czechia 1.467966 0.234331 6.2645 0.0007682 ***
## t -0.441943 0.080514 -5.4891 0.0015304 **
## D_break 0.957969 0.490066 1.9548 0.0984055 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Komentár:
Robustné štandardné chyby poskytujú konzistentné odhady variability aj v
prípade heteroskedasticity. Koeficienty sa nemenia, menia sa štandardné
chyby a tým aj t-testy/p-hodnoty.
X <- wide[, c("Germany", "Czechia", "t", "D_break")]
knitr::kable(round(cor(X), 3), caption = "Korelačná matica regresorov")
| Germany | Czechia | t | D_break | |
|---|---|---|---|---|
| Germany | 1.000 | 0.965 | -0.727 | -0.379 |
| Czechia | 0.965 | 1.000 | -0.747 | -0.458 |
| t | -0.727 | -0.747 | 1.000 | 0.866 |
| D_break | -0.379 | -0.458 | 0.866 | 1.000 |
Komentár:
Silné korelácie medzi regresormi môžu spôsobovať multikolinearitu, ktorá
vedie k nestabilným odhadom koeficientov (väčšie štandardné chyby a
horšia interpretácia).
vif_manual <- function(model){
X <- model.matrix(model)
X <- X[, colnames(X) != "(Intercept)", drop = FALSE]
vifs <- sapply(seq_len(ncol(X)), function(j){
yj <- X[, j]
xj <- X[, -j, drop = FALSE]
r2 <- summary(lm(yj ~ xj))$r.squared
1/(1-r2)
})
data.frame(Premenná = colnames(X), VIF = as.numeric(vifs))
}
knitr::kable(vif_manual(m1), digits = 3, caption = "VIF – kontrola multikolinearity")
| Premenná | VIF |
|---|---|
| Germany | 25.435 |
| Czechia | 18.821 |
| t | 16.927 |
| D_break | 10.201 |
Komentár:
VIF ukazuje, o koľko sa „nafukuje“ variancia odhadu koeficientu kvôli
koreláciám s ostatnými regresormi. Vyššie hodnoty znamenajú vyšší
problém s multikolinearitou.
lmtest::resettest(m1, power = 2:3, type = "fitted")
##
## RESET test
##
## data: m1
## RESET = 0.089311, df1 = 2, df2 = 4, p-value = 0.9163
Komentár:
RESET test orientačne kontroluje, či model nie je nesprávne
špecifikovaný (napr. chýbajú nelineárne členy). Interpretujem ho spolu s
grafmi, keďže vzorka je malá.
Pri C+R grafoch môžu byť pozorovateľné odklony od priamky. Preto je v modeli zahrnutá aj dummy premenná (D_break) ako jednoduchá lineárna kvantifikácia zlomu od roku 2020.
cr_plot <- function(model, xname, col_line = "gray20", col_smooth = col_sk) {
b <- coef(model)[xname]
x <- model$model[[xname]]
pr <- residuals(model) + b * x
plot(
x, pr,
pch = 16, col = "gray35",
xlab = xname,
ylab = "Component + Residual",
main = paste("C+R graf:", xname)
)
abline(lm(pr ~ x), lwd = 2, col = col_line)
lines(lowess(x, pr), lwd = 2, col = col_smooth)
legend("topleft", legend = c("Lineárny trend", "LOWESS"), col = c(col_line, col_smooth), lwd = 2, bty = "n")
}
par(mfrow = c(2,2))
cr_plot(m1, "Germany")
cr_plot(m1, "Czechia")
cr_plot(m1, "t")
cr_plot(m1, "D_break")
par(mfrow = c(1,1))
Komentár:
C+R grafy kombinujú čiastkový (lineárny) efekt regresora a rezíduá. Ak
LOWESS krivka viditeľne odbieha od priamky, môže to naznačovať
nelinearitu alebo štrukturálnu zmenu. V tomto prípade odklony pozorujem,
a preto som použila dummy premennú ako lineárnu kvantifikáciu zlomu.
cd <- cooks.distance(m1)
plot(
cd, type = "h", lwd = 2,
xlab = "Pozorovanie (index)", ylab = "Cookova vzdialenosť",
main = "Cookova vzdialenosť (m1)",
col = "gray35"
)
abline(h = 4/length(cd), lty = 2, col = col_sk)
infl <- which(cd > 4/length(cd))
infl_tab <- data.frame(
Index = infl,
Year = wide$Year[infl],
CookD = cd[infl]
)
if (length(infl) == 0) {
cat("Neboli identifikované výrazne vplyvné pozorovania podľa pravidla 4/n.\n")
} else {
knitr::kable(infl_tab, digits = 4, caption = "Vplyvné pozorovania podľa Cookovej vzdialenosti")
}
| Index | Year | CookD | |
|---|---|---|---|
| 7 | 7 | 2020 | 0.7812 |
| 9 | 9 | 2022 | 0.4201 |
Komentár:
Cookova vzdialenosť ukazuje, či niektoré pozorovanie výrazne ovplyvňuje
odhad modelu. Ak sa vplyvné pozorovanie objaví, je vhodné ho bližšie
skontrolovať a interpretovať, prečo je odlišné.
V tejto časti vytvorím prierezový dataset pre rok 2024 a vykonám hierarchické zhlukovanie (Ward.D2): výber prierezu, štandardizácia, vzdialenosti, dendrogram, priradenie klastrov a rozklad variability (TSS, WSS, BSS).
d2024 <- wide[wide$Year == 2024, c("Czechia", "Germany", "Slovakia")]
x <- as.numeric(d2024[1, ])
names(x) <- colnames(d2024)
udaje <- data.frame(Unemployment = x)
row.names(udaje) <- names(x)
knitr::kable(udaje, digits = 1, caption = "Prierezové údaje – nezamestnanosť v roku 2024 (%)")
| Unemployment | |
|---|---|
| Czechia | 2.6 |
| Germany | 3.4 |
| Slovakia | 5.3 |
Komentár:
Z pôvodného časového datasetu som vybrala iba rok 2024, čím vznikli
prierezové údaje (jedna hodnota na krajinu). Takto viem krajiny porovnať
a rozdeliť do klastrov podľa podobnosti.
udaje_scaled <- scale(udaje)
dist_mat <- dist(udaje_scaled)
hc <- hclust(dist_mat, method = "ward.D2")
plot(
hc,
main = "Hierarchické zhlukovanie krajín podľa miery nezamestnanosti (Ward.D2)",
xlab = "",
sub = ""
)
k <- 2
rect.hclust(hc, k = k, border = "gray40")
Komentár:
Najprv som údaje štandardizovala, aby zhlukovanie nebolo ovplyvnené
mierkou. Následne som spočítala vzdialenosti a použila Wardovu metódu,
ktorá minimalizuje vnútroklastrovú variabilitu. Dendrogram ukazuje,
ktoré krajiny sú si najbližšie.
klaster_membership <- cutree(hc, k = k)
klaster_tab <- data.frame(
Krajina = row.names(udaje),
Nezamestnanosť = as.numeric(udaje$Unemployment),
Klaster = as.integer(klaster_membership),
row.names = NULL
)
knitr::kable(klaster_tab, digits = 2, caption = "Priradenie krajín do klastrov (k = 2)")
| Krajina | Nezamestnanosť | Klaster |
|---|---|---|
| Czechia | 2.6 | 1 |
| Germany | 3.4 | 1 |
| Slovakia | 5.3 | 2 |
Komentár:
Tabuľka ukazuje výsledné priradenie krajín do klastrov. Pri k = 2 je
výsledok interpretovateľný ako rozdelenie na krajiny s nižšou vs. vyššou
nezamestnanosťou v roku 2024.
descriptives <- aggregate(
udaje$Unemployment,
by = list(klaster = klaster_membership),
FUN = function(z) c(n = length(z), mean = mean(z), sd = sd(z), min = min(z), max = max(z))
)
descriptives <- data.frame(
klaster = descriptives$klaster,
n = descriptives$x[, "n"],
mean_unemp = descriptives$x[, "mean"],
sd_unemp = descriptives$x[, "sd"],
min_unemp = descriptives$x[, "min"],
max_unemp = descriptives$x[, "max"]
)
knitr::kable(descriptives, digits = 2, caption = "Deskriptívne štatistiky miery nezamestnanosti podľa klastrov")
| klaster | n | mean_unemp | sd_unemp | min_unemp | max_unemp |
|---|---|---|---|---|---|
| 1 | 2 | 3.0 | 0.57 | 2.6 | 3.4 |
| 2 | 1 | 5.3 | NA | 5.3 | 5.3 |
Komentár:
Deskriptívne štatistiky klastrov mi pomáhajú interpretovať, čím sa
skupiny líšia. Vidím priemernú nezamestnanosť v klastri a rozptyl.
ssq <- function(x, m) sum((x - m)^2)
var_names <- colnames(udaje_scaled)
TSS <- sapply(var_names, function(v) {
ssq(udaje_scaled[, v], mean(udaje_scaled[, v]))
})
WSS <- sapply(var_names, function(v) {
x <- udaje_scaled[, v]
sum(tapply(x, klaster_membership, function(z) ssq(z, mean(z))))
})
BSS <- TSS - WSS
variab_tab <- data.frame(
Variable = var_names,
TSS = TSS,
WSS = WSS,
BSS = BSS,
BSS_over_TSS = BSS / TSS
)
knitr::kable(variab_tab, digits = 3, caption = "Rozklad variability (TSS, WSS, BSS) pre mieru nezamestnanosti")
| Variable | TSS | WSS | BSS | BSS_over_TSS | |
|---|---|---|---|---|---|
| Unemployment | Unemployment | 2 | 0.166 | 1.834 | 0.917 |
Komentár:
Rozklad variability (TSS, WSS, BSS) ukazuje, koľko variability
vysvetľuje rozdelenie do klastrov. Pomer BSS/TSS vyjadruje, aký podiel
celkovej variability je „medzi klastrami“.
Na ročných údajoch o miere nezamestnanosti (2014–2024) pre Czechia, Germany a Slovakia som vykonala popis dát (trend, boxplot, korelácie vrátane heatmap) a odhadla regresný model, kde bola závislá premenná nezamestnanosť na Slovensku a vysvetľujúce premenné boli nezamestnanosť v Nemecku a Česku, časový trend a dummy premenná D_break od roku 2020.
Model som skontrolovala pomocou diagnostických grafov a štandardných
testov: heteroskedasticita (graf rezíduí + Breusch–Pagan + robustné
štandardné chyby), multikolinearita (korelácie a VIF), špecifikácia
(RESET), vplyvné pozorovania (Cookova vzdialenosť) a C+R grafy.
Ako doplnkovú metódu som spracovala zhlukovú analýzu prierezových údajov
pre rok 2024 pomocou Wardovej metódy a vyhodnotila klastry aj rozklad
variability (TSS, WSS, BSS).
UNE_RT_A (ročné údaje o miere
nezamestnanosti; export do CSV)lmtest,
sandwich)