library(knitr)
library(kableExtra)
library(stats)

rm(list = ls())

Úvod

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:

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).


1. Príprava údajov

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

Tabuľka 1 – Moja databáza pre zhlukovanie

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)
Tabuľka 1: Výber krajín a ukazovateľov z databázy WDI (rok 2015).
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.


2. Štandardizácia premenných (z-skóre)

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

3. Hierarchická zhluková analýza

Použijem:

# euklidovská vzdialenosť
dist_euclid <- dist(udaje_z, method = "euclidean")

# hierarchické zhlukovanie – Wardova metóda
hc_ward <- hclust(dist_euclid, method = "ward.D2")

Dendrogram

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.


4. Rozdelenie krajín do zhlukov

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)
Tabuľka 2: Rozdelenie krajín do troch zhlukov.
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.


5. Profil jednotlivých zhlukov

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)
Tabuľka 3: Priemerné hodnoty ukazovateľov v jednotlivých zhlukoch.
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

Stručná interpretácia

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í.


6. Záver

V tejto úlohe som na údajoch z databázy WDI (rok 2015) pre vybrané východo- a seversko-európske krajiny:

  1. vybrala štyri ukazovatele súvisiace so zdravotníctvom a vzdelávaním,
  2. štandardizovala premenné pomocou z-skóre,
  3. zostavila hierarchickú zhlukovú analýzu pomocou Euklidovskej vzdialenosti a Wardovej metódy,
  4. z dendrogramu som zvolila tri zhluky a každú krajinu som do nich priradila,
  5. porovnala priemerné hodnoty ukazovateľov v zhlukoch.

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ť.