# Zhlukovanie

library(factoextra)   # fviz_pca

data <- read.csv("03_krajiny.csv")
View(data)
# zdroje: ourworldindata.org, data.worldbank.org
# populacie a pocty umrti z roznych pricin za rok 2019

# Iba europske krajiny
krajiny <- c(
"Albania", "Latvia",
"Andorra", 
"Armenia", "Lithuania",
"Austria", "Luxembourg",
"Azerbaijan", "Malta",
"Belarus", "Moldova",
"Belgium", "Monaco",
"Bosnia and Herzegovina", "Montenegro",
"Bulgaria", "Netherlands",
"Croatia", "Norway",
"Cyprus", "Poland",
"Czechia", "Portugal",
"Denmark", "Romania",
"Estonia", "Russia",
"Finland", "San Marino",
"North Macedonia", "Serbia",
"France", "Slovakia",
"Georgia", "Slovenia",
"Germany", "Spain",
"Greece", "Sweden",
"Hungary", "Sweden",
"Iceland", "Switzerland",
"Ireland", "Turkey",
"Italy", "Ukraine",
"United Kingdom")

data <- data[data$Entity %in% krajiny, ]
View(data)

# Iba data o umrtiach
indexy <- (5:ncol(data))[-5]  
  # vyhodit malariu lebo ta je vsade 0
X0 <- data[, indexy]
rownames(X0) <- data$Entity

###

# K-means
res.kmeans <- kmeans(X0, centers=4)
which(res.kmeans$cluster == 1)
which(res.kmeans$cluster == 2)
which(res.kmeans$cluster == 3)
which(res.kmeans$cluster == 4)

# viac-menej na zaklade poctu obyvatelov!

# Pocty umrti na 1000 obyvatelov
X <- data[, indexy] * 1000 / data$population_2019
rownames(X) <- data$Entity
View(X)

# Preskalovanie na jednotkovu disperziu (a nulovy priemer)
# - aby najcastejsie choroby nedominovali
X <- scale(X)

res.kmeans <- kmeans(X, centers=4)
which(res.kmeans$cluster == 1)
which(res.kmeans$cluster == 2)
which(res.kmeans$cluster == 3)
which(res.kmeans$cluster == 4)

# Vykreslenie pomocou PCA
krajiny.pca <- prcomp(X) # uz su naskalovane
fviz_pca(krajiny.pca, geom.ind="text", col.ind=factor(res.kmeans$cluster), geom.var="none")

# ... spustit viackrat: vsimnite si rozne vysledky

# Multi-start
res.kmeans <- kmeans(X, centers=4, nstart=25)

fviz_pca(krajiny.pca, geom.ind="text", col.ind=factor(res.kmeans$cluster), geom.var="none")

# Vykreslenie s premennymi
fviz_pca(krajiny.pca, geom="text", col.ind=factor(res.kmeans$cluster), col.var="black")

# Kolko zhlukov?
wss <- rep("NA", 10)
for (k in 1:10) {
  set.seed(159)
  wss[k] <- kmeans(X, centers = k, nstart = 25)$tot.withinss
}
plot(
  1:10, wss,
  type = "b",
  xlab = "Number of clusters (K)",
  ylab = "Total within-cluster sum of squares"
)

# 2 zhluky
set.seed(159)
res.kmeans <- kmeans(X, centers = 2, nstart = 25)
fviz_pca(krajiny.pca, geom="text", col.ind=factor(res.kmeans$cluster), col.var="black")

# Dobrovolna DU:
# - pozrite sa na k-medoids a porovnajte vysledky

###

# Aglomerativne zhlukovanie
d <- dist(X0) # matica vzdialenosti
res <- hclust(d, method="complete")

# Dendrogram
plot(res)

# ... zase na zaklade poctu obyvatelov

# Pocty na 1000 obyvatelov:
d <- dist(X)
res <- hclust(d, method="complete")

# Dendrogram
plot(res)

# Rozseknutie na zhluky
zhluky <- cutree(res, k=5)   # na "k" zhlukov
  # da sa nastavit vyska rozseknutia namiesto "k"

# Ako sme ich rozdelili
plot(res)
rect.hclust(res, k=5, border=2:(max(zhluky)+1))

rownames(X)[zhluky == 1] # krajiny v 1. zhluku
# atd.

# Vykreslenie pomocou PCA
krajiny.pca <- prcomp(X) # uz su naskalovane
fviz_pca(krajiny.pca, geom.ind="text", col.ind=factor(zhluky), geom.var="none")

# s premennymi
fviz_pca(krajiny.pca, geom="text", col.ind=factor(zhluky), col.var="black")

# Dobrovolna DU:
# - Rko (a zrejme aj Python) vedia vystupy kreslit do mapy: 
#   vykreslite ziskane zhluky do mapky
#
# - vyskusajte zhlukovanie s neskalovanymi datami (teda bez scale(X))
# - v com je to pre tieto data podla vas lepsie/horsie?