library(knitr)
library(kableExtra)
library(stats)
rm(list = ls())
V tejto úlohe robím zhlukovú (klastrovú) analýzu na
údajoch z databázy
WDI – Education, Health & Employment (súbor
data/wdi_data.csv).
Zameriam sa na vybrané východoeurópske a severské krajiny a budem ich porovnávať podľa:
health_exp – Current health expenditure (% of
GDP),educ_prim – výdavky na primárne vzdelávanie (podiel
aktuálnych výdavkov),educ_sec – výdavky na sekundárne vzdelávanie,educ_ter – výdavky na terciárne vzdelávanie.Cieľom je zistiť, ktoré krajiny sú si navzájom podobné z hľadiska týchto ukazovateľov a ako sa dajú rozdeliť do niekoľkých homogénnych zhlukov (klastrov).
Najprv načítam údaje, vyberiem rok 2015 a konkrétne
krajiny
(východná + severná Európa), podobne ako to robí učiteľ, len na mojej
databáze.
# načítanie WDI databázy
udaje_raw <- read.csv(
"data/wdi_data.csv",
dec = ".",
sep = ",",
header = TRUE,
check.names = FALSE,
stringsAsFactors = FALSE
)
# vybrané krajiny (východná + severná Európa)
krajiny <- c(
"Poland", "Hungary", "Latvia", "Lithuania",
"Croatia", "Slovenia", "Austria", "Serbia",
"Montenegro", "Ukraine", "Bulgaria", "Romania",
"Moldova", "Finland", "Sweden", "Denmark", "Estonia"
)
# vyberiem rok 2015 a tieto krajiny
udaje2015_all <- subset(
udaje_raw,
Time == 2015 & `Country Name` %in% krajiny
)
# názvy stĺpcov podľa WDI
health_col <- "Current health expenditure (% of GDP) [SH.XPD.CHEX.GD.ZS]"
prim_col <- "Current education expenditure, primary (% of total expenditure in primary public institutions) [SE.XPD.CPRM.ZS]"
sec_col <- "Current education expenditure, secondary (% of total expenditure in secondary public institutions) [SE.XPD.CSEC.ZS]"
ter_col <- "Current education expenditure, tertiary (% of total expenditure in tertiary public institutions) [SE.XPD.CTER.ZS]"
# vyberiem potrebné stĺpce
udaje2015 <- udaje2015_all[, c("Country Name", health_col, prim_col, sec_col, ter_col)]
# premenujem na kratšie názvy
names(udaje2015) <- c("country", "health_exp", "educ_prim", "educ_sec", "educ_ter")
# imputácia chýbajúcich hodnôt mediánom
for (col in c("health_exp", "educ_prim", "educ_sec", "educ_ter")) {
med <- median(udaje2015[[col]], na.rm = TRUE)
udaje2015[[col]][is.na(udaje2015[[col]])] <- med
}
# nastavím názvy riadkov podľa krajín a zmažem stĺpec country
rownames(udaje2015) <- udaje2015$country
udaje2015$country <- NULL
udaje2015
## health_exp educ_prim educ_sec educ_ter
## Austria 10.37 94.20646 97.50381 91.83001
## Denmark 10.34 94.20646 93.58111 95.85167
## Finland 9.65 87.68691 89.62616 95.85167
## Sweden 10.80 94.45156 93.58111 96.39751
kable(
udaje2015,
caption = "Tabuľka 1: Výber krajín a ukazovateľov z databázy WDI (rok 2015).",
digits = 2
) %>%
kable_styling(full_width = FALSE)
| health_exp | educ_prim | educ_sec | educ_ter | |
|---|---|---|---|---|
| Austria | 10.37 | 94.21 | 97.50 | 91.83 |
| Denmark | 10.34 | 94.21 | 93.58 | 95.85 |
| Finland | 9.65 | 87.69 | 89.63 | 95.85 |
| Sweden | 10.80 | 94.45 | 93.58 | 96.40 |
V Tabuľke 1 vidno, že všetky štyri krajiny majú veľmi vysoké výdavky na vzdelávanie aj zdravotníctvo. Rozdiely sú skôr jemné:
Austria má výrazne vysoké výdavky na sekundárne vzdelávanie (najvyššie hodnoty educ_sec).
Denmark a Sweden majú podobnú úroveň vo všetkých štyroch ukazovateľoch, čo sa už na prvý pohľad javí ako dvojica „podobných“ krajín.
Finland má o niečo nižšie výdavky na primárne aj sekundárne vzdelávanie a zároveň nižšie výdavky na zdravotníctvo, hoci pri terciárnom vzdelávaní zaostáva len mierne.
Tieto drobné rozdiely sa následne odrazia v zhlukovej analýze.
Aby boli premenné porovnateľné a jedna premenná „neťahala“ zhlukovanie len tým, že má väčšie čísla, použijem z-škálovanie:
\[ z = \frac{x - \mu}{\sigma} \]
Tým dosiahnem, že všetky premenné majú priemer 0 a smerodajnú odchýlku 1.
udaje_z <- scale(udaje2015)
summary(udaje_z)
## health_exp educ_prim educ_sec educ_ter
## Min. :-1.3457 Min. :-1.49908 Min. :-1.227247 Min. :-1.48888
## 1st Qu.:-0.2576 1st Qu.:-0.01855 1st Qu.:-0.304931 1st Qu.:-0.06444
## Median : 0.1367 Median : 0.47496 Median : 0.002507 Median : 0.41037
## Mean : 0.0000 Mean : 0.00000 Mean : 0.000000 Mean : 0.00000
## 3rd Qu.: 0.3942 3rd Qu.: 0.49351 3rd Qu.: 0.307438 3rd Qu.: 0.47481
## Max. : 1.0723 Max. : 0.54917 Max. : 1.222233 Max. : 0.66814
Použijem:
# euklidovská vzdialenosť
dist_euclid <- dist(udaje_z, method = "euclidean")
# hierarchické zhlukovanie – Wardova metóda
hc_ward <- hclust(dist_euclid, method = "ward.D2")
plot(
hc_ward,
main = "Dendrogram – Wardova metóda (Euklidovská vzdialenosť)",
xlab = "Krajiny",
sub = ""
)
# pre ilustráciu vyznačím 3 zhluky červeným rámikom
rect.hclust(hc_ward, k = 3, border = "red")
Z dendrogramu (Wardova metóda, euklidovská vzdialenosť) vidím:
Najbližšie k sebe sú krajiny Denmark a Sweden – spájajú sa už pri veľmi malej výške, čo znamená, že vo všetkých ukazovateľoch sú si najpodobnejšie.
Austria sa k tejto dvojici pripája až pri vyššej výške – je podobná, ale predsa len trochu odlišná (najmä vyšším podielom výdavkov na sekundárne vzdelávanie).
Finland stojí osamotene a pripája sa až úplne nakoniec, takže jeho profil výdavkov je z tejto štvorice najšpecifickejší (nižšie zdravotné výdavky a nižšie výdavky na primárne/sekundárne vzdelávanie).
Pri reze dendrogramu na tri zhluky (červené rámiky) dostávam:
zhluk: Austria,
zhluk: Denmark + Sweden,
zhluk: Finland.
Zvolím si 3 zhluky a priradím každú krajinu do jedného z nich.
clusters3 <- cutree(hc_ward, k = 3)
clusters_table <- data.frame(
krajina = rownames(udaje2015),
zhluk = factor(clusters3)
)
kable(
clusters_table[order(clusters_table$zhluk), ],
caption = "Tabuľka 2: Rozdelenie krajín do troch zhlukov.",
align = c("l", "c")
) %>%
kable_styling(full_width = FALSE)
| krajina | zhluk | |
|---|---|---|
| Austria | Austria | 1 |
| Denmark | Denmark | 2 |
| Sweden | Sweden | 2 |
| Finland | Finland | 3 |
Takto vidím, ktoré konkrétne krajiny patria do rovnakého zhluku.
Teraz si pozriem priemerné hodnoty ukazovateľov v jednotlivých zhlukoch, aby som zistila, čím sa tieto skupiny líšia.
cluster_means <- aggregate(udaje2015, by = list(zhluk = clusters3), FUN = mean)
kable(
cluster_means,
caption = "Tabuľka 3: Priemerné hodnoty ukazovateľov v jednotlivých zhlukoch.",
digits = 2
) %>%
kable_styling(full_width = FALSE)
| zhluk | health_exp | educ_prim | educ_sec | educ_ter |
|---|---|---|---|---|
| 1 | 10.37 | 94.21 | 97.50 | 91.83 |
| 2 | 10.57 | 94.33 | 93.58 | 96.12 |
| 3 | 9.65 | 87.69 | 89.63 | 95.85 |
Zhluk 1 (Austria)
veľmi vysoké výdavky na sekundárne vzdelávanie (educ_sec),
zdravotné výdavky (health_exp) sú mierne nižšie ako v zhluku Denmark + Sweden, ale stále vysoké,
terciárne vzdelávanie je na dobrej úrovni, hoci o trochu nižšie než v škandinávskom zhluku.
Zhluk 2 (Denmark + Sweden)
má najvyššie výdavky na zdravotníctvo a zároveň najvyššie výdavky na terciárne vzdelávanie (educ_ter),
primárne aj sekundárne vzdelávanie sú vysoké a veľmi podobné, čo potvrdzuje, že tieto dve krajiny tvoria prirodzený spoločný zhluk.
Zhluk 3 (Finland)
má najnižšie výdavky na zdravotníctvo aj najnižšie výdavky na primárne a sekundárne vzdelávanie,
zároveň má relatívne vysoký podiel výdavkov na terciárne vzdelávanie, takže sa profilom odlišuje: šetrí skôr na nižších stupňoch, no nešetrí na najvyššom vzdelaní.
V tejto úlohe som na údajoch z databázy WDI (rok 2015) pre vybrané východo- a seversko-európske krajiny:
Takto získané zhluky interpretujem ako skupiny krajín s podobnou štruktúrou výdavkov na zdravotníctvo a vzdelávanie. Tento prístup by som vedela použiť aj na iné roky alebo na ďalšie indikátory z WDI, ak by som chcela analýzu rozšíriť.