###############################################################################################################
### domaci ukol - shluková analýza.

library(cluster)
library(magrittr)
library(ggplot2)
library(factoextra)
library(RColorBrewer)
library(vegan)

# Samostatny ukol 1: shluková analýza:
# Provedte shlukovou analyzu na datovem souboru "ryby.csv":
# 1) Zvolte vhodnou miru asociace mezi objekty, spocitejte asociacni matici.
# 2) Vyzkousejte algoritmus nejblizsiho a nejvzdalenejsiho souseda. Vykreslete dendrogramy. 
#    Ktera metoda dava nejlepsi vysledek? 
# 3) Rozdelte lokality do 4 shluku na zaklade metody nejvzdalenejsiho souseda. Uvedte pocet lokalit v jednotlivych shlucich.

ryby<-read.table('ryby.csv', sep=";", header=TRUE, dec=".",row.names=1)
head(ryby,10)

summary(ryby)

dist.ryby<-vegdist(ryby, "jac", binary=F) # vypocet asociacni matice na abundancich(poctech) druhu  = 1 - Sorensenův asymetrický koeficient podobnosti pro data abundancí
dist.ryby
?vegdist
par(mfrow = c(1,1))

# shlukova analyza pomoci algoritmu single linkage = metoda nejblizsiho souseda
dist.ryby.single <- hclust(dist.ryby, method="single") 
plot(dist.ryby.single, hang=-1)	    # vykresli dendrogram
fviz_dend(dist.ryby.single,				  # v dendrogramu je vykreslen vystup funkce hclust
          k = 4,						                # pomoci k definujeme pocet skupin, nebo pomoci h vzdalenost, kde maji byt shluky vytvoreny
          cex = 0.8,					            	# velikost popisku
          k_colors = brewer.pal(4,"Set1"),	# barvy pro jednotlive skupiny
          color_labels_by_k = TRUE, 			  # obarveni popisku
          rect = TRUE,					            # ohraniceni shluku
          horiz = T,					              # vykresli dendrogram horizontalne
          main = "Cluster Dendogram - single linkage")

# shlukova analyza pomoci algoritmu complete linkage = metoda nejvzdalenejsiho souseda 
dist.ryby.complete <- hclust(dist.ryby, method="complete") 
plot(dist.ryby.complete, hang=-1)	    # vykresli dendrogram
fviz_dend(dist.ryby.complete,				  # v dendrogramu je vykreslen vystup funkce hclust
          k = 4,						                # pomoci k definujeme pocet skupin, nebo pomoci h vzdalenost, kde maji byt shluky vytvoreny
          cex = 0.8,					            	# velikost popisku
          k_colors = brewer.pal(4,"Set1"),	# barvy pro jednotlive skupiny
          color_labels_by_k = TRUE, 			  # obarveni popisku
          rect = TRUE,					            # ohraniceni shluku
          horiz = T,					              # vykresli dendrogram horizontalne
          main = "Cluster Dendogram - single linkage")

ryby$complete <- cutree(dist.ryby.complete, k=4) #pridame vektor prirazeni objektu do shluku 
head(ryby)
table(ryby$complete)

#--------------------------------------------------------------------------------
# Samostatny ukol 2: validace shlukove analyzy:
# Který argoritmus je lepší (algritmus nejblizsiho a nejvzdalenejsiho souseda) pro shlukovou analyzu provedenou na datovem souboru ryby.

dist.ryby.single.cop <- cophenetic(dist.ryby.single)                               # vypocet kofeneticke matice
coe.single <- cor(dist.ryby, dist.ryby.single.cop, method="spearman")  # korelacni koeficient
dist.ryby.complete.cop <- cophenetic(dist.ryby.complete) 
coe.complete <- cor(dist.ryby, dist.ryby.complete.cop, method="spearman") 

coe.single; coe.complete

#--------------------------------------------------------------------------------
# Samostatny ukol 3: Otimalni pocet shluku
# Zjiste optimalni pocet shluku pro datovy soubor ryby pro algoritmus nejvzdalenejsiho souseda pomoci metody siluety.

silueta<-silhouette(cutree(dist.ryby.complete, k=4), dist.ryby) # vypocet siluety pro 4 shluky 
silueta
summary(silueta)$avg.width
fviz_silhouette(silueta) # vyobrazeni siluety pro 4 shluky

##vytvorit prazdny vektor
asw<-numeric(nrow(ryby)) 
asw

##naplnit vektor hodnotami "siluety"
for (k in 2:(nrow(ryby)-1)){
  sil <-silhouette(cutree(dist.ryby.complete, k=k), dist.ryby)
  asw[k]<-summary(sil)$avg.width
}
asw
k.best<-which.max(asw)
k.best
# Optimalni pocet shluku pro datovy soubor je 6 shluků

# Finalni vykresleni dendrogramu rozdeleneho do optimalniho poctu shluku 
fviz_dend(dist.ryby.complete,					
          k = 6,					
          cex = 0.8,						
          k_colors = brewer.pal(6,"Set1")[1:6],	
          color_labels_by_k = TRUE, 			
          rect = TRUE,					
          horiz=T)		

#--------------------------------------------------------------------------------
# Samostatny ukol 4 
# Zjiste optimalni pocet shluku pro datovy soubor ryby, pro algoritmus nejvzdalenejsiho souseda pomoci Mantelova testu.
# Porovnejte rozdeleni dat podle Mantelova testu a indexu siluety.  

grpdist<- function(X)
{
  require(cluster)
  gr<-as.data.frame(as.factor(X))
  distgr<-daisy(gr, "gower") # 0 pokud objekty nejsou spolu ve shluku, 1 pokud jsou spolu ve shluku - R prevadi na vzdalenosti (expressed as a dissimilarity)
  distgr
}

kt<-data.frame(k=1:nrow(ryby), r=0)
kt

for (i in 2: (nrow(ryby)-1)){ 
  gr<-cutree(dist.ryby.complete,i)
  distgr<-grpdist(gr)
  mt<-cor(dist.ryby,distgr, method="spearman")
  kt[i,2]<-mt
}
names(kt)
kt

k.best<-which.max(kt$r)
k.best
# Optimalni pocet shluku pro datovy soubor jsou 4 shluky

# Finalni vykresleni dendrogramu rozdeleneho do optimalniho poctu shluku 
fviz_dend(dist.ryby.complete,					
          k = 4,					
          cex = 0.8,						
          k_colors = brewer.pal(4,"Set1")[1:4],	
          color_labels_by_k = TRUE, 			
          rect = TRUE,					
          horiz=T)	

##### APLIKACE  SHLUKOVKY VE VIDEU
##### https://www.youtube.com/watch?v=QXOkPvFM6NU 16. minuta