En este paso vamos a leeer los datos que contiene la longitud el diametro y la edad de los pacientes solo dejaremos una variable cualitativa el posoperatorio

setwd('C:/Users/facu/Google Drive/Tesis Lic/Bibliografia no citable/Curso de R')
Datos <- read.table('BD_IMPLANTES_ORIC.csv',header = TRUE,sep = ';',dec = ',')




summary(Datos)
##       EDAD          LONGITUD        DIAMETRO       SEGUI_POSTOP
##  Min.   :17.00   Min.   : 1.00   Min.   : 2.800   EXITO  :845  
##  1st Qu.:39.00   1st Qu.: 8.50   1st Qu.: 3.300   FRACASO: 64  
##  Median :49.00   Median :10.00   Median : 3.750                
##  Mean   :50.13   Mean   :10.11   Mean   : 3.788                
##  3rd Qu.:60.00   3rd Qu.:11.50   3rd Qu.: 4.000                
##  Max.   :97.00   Max.   :15.00   Max.   :33.500

Vamos a usar la libreria FacotrMiner que contiene metodos exploratorios para el analisis de datos. Usaremos: PCA Analisis de componentes principales. HCPCA Analisis de clusteris jerarquico sobre las componentes principales

Y usaremos la libreria FactoExtra para la visualizaciony graficacion de los resultados.

Bibliografia FactoMineR: An R Package for Multivariate Analysis F. Husson, S. Le y J. 2008 Multivariate Exploratory Data Analysis and Data Mining Francois Husson, Julie Josse, Sebastien Le, Jeremy Mazet 2009

Exploratory Multivariate Analysis by Example Using R, Second Edition Escrito por Francois Husson,Sebastien Le,Jérôme 2017

suppressMessages(suppressWarnings(library(FactoMineR)))
library(factoextra)
## Warning: package 'factoextra' was built under R version 3.4.2
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.4.2
## Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ
# vamos a quitar la columna de posoperatorio para trabajar con datos cuantitativos

datos = Datos[,-4]



# npc cantidad de componentes, centrar y reducir con scale.unit,

res.pca <- PCA(datos,scale.unit = TRUE,ncp=5,graph = FALSE)

eig.val <- get_eigenvalue(res.pca)
eig.val
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  1.0368152         34.56051                    34.56051
## Dim.2  1.0242040         34.14013                    68.70064
## Dim.3  0.9389808         31.29936                   100.00000

Un método para determinar el número de componentes principales es mirar un Diagrama libre, que es el gráfico de los valores propios ordenados de mayor a menor. El número de componente se determina en el punto, más allá del cual los valores propios restantes son todos relativamente pequeños y de tamaño comparable (Jollife 2002, Peres-Neto, Jackson y Somers (2005) )

fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))

De la trama anterior, es posible que deseemos detenernos en el seguda componente principal. El 69% de la información (varianzas) contenida en los datos es retenida por los primeros dos componentes es principales. es un porcetaje aceptablemente grande.

La correlación entre una variable y un componente principal (PC) se usa como las coordenadas de la variable en la PC. La representación de variables difiere de la gráfica de las observaciones: las observaciones están representadas por sus proyecciones, pero las variables están representadas por sus correlaciones (Abdi y Williams 2010)

fviz_pca_var(res.pca, col.var = "black")

La trama anterior también se conoce como gráficos de correlación variable. Muestra las relaciones entre todas las variables. Se puede interpretar de la siguiente manera:

Las variables correlacionadas positivamente se agrupan juntas. Las variables negativamente correlacionadas se ubican en lados opuestos del origen de la trama (cuadrantes opuestos). La distancia entre las variables y el origen mide la calidad de las variables en el mapa de factores. Las variables que están lejos del origen están bien representadas en el mapa de factores.

Calidad de representación

La calidad de representación de las variables en el mapa de factores se denomina cos2 (coseno cuadrado, coordenadas cuadradas). Puede acceder al cos2 de la siguiente manera: Puede visualizar el cos2 de variables en todas las dimensiones usando el paquete corrplot:

library("corrplot")
## corrplot 0.84 loaded
var <- get_pca_var(res.pca)

corrplot(var$cos2, is.corr=FALSE)

Tenga en cuenta que,

Un alto cos2 indica una buena representación de la variable en el componente principal. En este caso, la variable se coloca cerca de la circunferencia del círculo de correlación.

Un bajo cos2 indica que la variable no está perfectamente representada por las PC. En este caso, la variable está cerca del centro del círculo.

Es posible colorear variables por sus valores cos2

# Color by cos2 values: quality on the factor map
fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE # Avoid text overlapping
             )

Graficos de Individuos

Al igual que las variables, también es posible colorear individuos por sus valores de cos2:

fviz_pca_ind(res.pca,
              col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07") ,
                repel = FALSE, select.var = list(cos2 = 0.6))

# analizamos las dimensiones 2,3

fviz_pca_ind(res.pca,
              col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07") ,
                repel = FALSE,axes = c(2,3), select.var = list(cos2 = 0.6))

# Color by cos2 values: quality on the factor map
fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE, # Avoid text overlapping,
              axes = c(2, 3)
             )

fviz_pca_biplot(res.pca, repel = FALSE,
                col.var = "#2E9FDF", # Variables color
                col.ind = "#696969"  # Individuals color
                , select.var = list(cos2 = 0.6)
                )

En líneas generales, un biplot se puede interpretar de la siguiente manera: un individuo que está en el mismo lado de una variable dada tiene un alto valor para esta variable; un individuo que está en el lado opuesto de una variable dada tiene un valor bajo para esta variable.

RESUMEN

En conclusión, describimos cómo realizar e interpretar el análisis de componentes principales (PCA). Computamos PCA usando la función PCA () [FactoMineR]. A continuación, usamos el paquete factoextra R para producir una visualización basada en ggplot2 de los resultados de PCA.

CLUSTERING JERARQUICA Enlace máximo o completo : la distancia entre dos clústeres se define como el valor máximo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos en el grupo 2. Tiende a producir grupos más compactos.

El método de varianza mínima de Ward : minimiza la varianza total dentro del grupo. En cada paso, se fusionan el par de clústeres con una distancia mínima entre los clústeres.

Por lo general, se prefiere la vinculación completa y el método de Ward.

USANDO ALGORITMO DEL SALTO MAXIMO

res.hcc <- hclust(dist(datos),method = "complete")

fviz_dend(res.hcc, k = 3, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # color labels by groups
          rect = TRUE # Add rectangle around groups
          )
## Warning in get_col(col, k): Length of color vector was longer than the
## number of clusters - first k elements are used

hicimos un hclust con el metodo = complete.

USANDO ALGORITMO DEL ward

res.hcw <- hclust(dist(datos),method = "ward.D2")

fviz_dend(res.hcw, k = 4, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07","#8835DC"),
          color_labels_by_k = TRUE, # color labels by groups
          rect = TRUE # Add rectangle around groups
          )
## Warning in get_col(col, k): Length of color vector was longer than the
## number of clusters - first k elements are used

también podemos visualizar el resultado en un diagrama de dispersión. Las observaciones se representan mediante puntos en la trama, utilizando componentes principales. Se dibuja un marco alrededor de cada grupo

grp <- cutree(res.hcw, k = 4)

fviz_cluster(list(data = datos, cluster = grp),
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"), 
             ellipse.type = "convex", # Concentration ellipse
             repel = FALSE, # Avoid label overplotting (slow)
             show.clust.cent = FALSE, ggtheme = theme_minimal())

Interpretacion

library(rattle)
## Warning: package 'rattle' was built under R version 3.4.2
## Rattle: A free graphical interface for data science with R.
## Versión 5.1.0 Copyright (c) 2006-2017 Togaware Pty Ltd.
## Escriba 'rattle()' para agitar, sacudir y  rotar sus datos.
#vamos a calcular los centros de graveda de cada cluster
centros <- centers.hclust(datos,res.hcw,nclust = 4,use.median = FALSE)
centros
##          EDAD  LONGITUD DIAMETRO
## [1,] 56.15891  9.988372 3.971512
## [2,] 28.40000 10.480952 3.845714
## [3,] 70.20225 10.019663 3.619101
## [4,] 42.39402 10.143342 3.725408

Para intreptrar mejor vamsos ahcer un grafico tipo araña con los centros de gravedad de cada cluster

row.names(centros)<-c("Cluster 1" ,"Cluster 2" ,"Cluster 3","Cluster 4")
centros <- as.data.frame(centros)
maximos <- apply(centros,2,max)
minimos <- apply(centros,2,min)
centros <- rbind(maximos,centros)
centros <-rbind(minimos,centros)
centros
##               EDAD  LONGITUD DIAMETRO
## 1         28.40000  9.988372 3.619101
## 11        70.20225 10.480952 3.971512
## Cluster 1 56.15891  9.988372 3.971512
## Cluster 2 28.40000 10.480952 3.845714
## Cluster 3 70.20225 10.019663 3.619101
## Cluster 4 42.39402 10.143342 3.725408
library(fmsb)

radarchart(centros,maxmin = TRUE, axistype = 4, axislabcol = "slategray4",
           centerzero = FALSE,seg = 8,cglcol = "gray67",
           pcol = c("black","red","green","blue"),
           plty = 1,
           plwd = 5,
           title = "comparacion de clusteres"
           )


legenda <- legend(1.5,1,legend = c("Cluster 1","Cluster2","Cluster 3","Cluster 4"),
                  seg.len=1.4,
                  title = "clusteres",
                  pch=21,
                  bty = "n",lwd = 3, y.intersp = 1,horiz = FALSE,
                  col=c("black","red","green","blue"))

CLUSTERING JERQUICO SOBRE LAS COMPONENTES PRINCIPALES

# Compute hierarchical clustering on principal components
   res.hcpc <- HCPC(res.pca, graph = FALSE)
#vamos a ver que componentes principales son mas representativas en el cluster
plot.HCPC(res.hcpc,choice = "bar")

Para visualizar el dendrograma generado por la agrupación jerárquica, usaremos la función fviz_dend()

fviz_dend(res.hcpc, 
          cex = 0.7,                     # Label size
          palette = "jco",               # Color palette see ?ggpubr::ggpar
          rect = TRUE, rect_fill = FALSE, # Add rectangle around groups
          rect_border = "jco",           # Rectangle color
          labels_track_height = 0.8      # Augment the room for labels
          )

Es posible visualizar individuos en el mapa de componentes principales y colorear individuos de acuerdo con el grupo al que pertenecen.

fviz_cluster(res.hcpc,
             repel = FALSE,            # Avoid label overlapping
             show.clust.cent = TRUE, # Show cluster centers
             palette = "jco",         # Color palette see ?ggpubr::ggpar
             ggtheme = theme_minimal(),
             main = "Factor map"
             )

También puede dibujar un gráfico tridimensional que combine el agrupamiento jerárquico y el mapa factorial utilizando la función base R

# Principal components + tree
plot(res.hcpc, choice = "3D.map")

Agrupamiento jerarquico usando K-Means

Usaremos el codo de jambu para determinar el valor optimo de k

fviz_nbclust(datos, kmeans, method = "wss") +
    geom_vline(xintercept = 4, linetype = 2)

La gráfica anterior representa la varianza dentro de los grupos. Disminuye a medida que k aumenta, pero se puede ver una curva en k = 4. Esta curva indica que los cúmulos adicionales más allá del cuarto tienen poco valor.

Corremos K-Means

km.res <- kmeans(datos, 4, nstart = 1000)

Como el resultado final del resultado de clustering k-means es sensible a las asignaciones de inicio aleatorias, especificamos nstart = 25 . Esto significa que R probará 25 asignaciones de inicio aleatorio diferentes y luego seleccionará los mejores resultados correspondientes a la que tenga la variación más baja dentro del grupo. El valor predeterminado de nstart en R es uno. Sin embargo, se recomienda encarecidamente calcular clusters k-means con un gran valor de nstart , como 25 o 50, para tener un resultado más estable.

Estadisticas del agrupamiento

#centros de gravedad
km.res$centers  
##       EDAD LONGITUD DIAMETRO
## 1 33.00439 10.35307 3.769956
## 2 71.58784 10.05405 3.566554
## 3 45.53759  9.99906 3.721053
## 4 57.43446 10.05805 3.994007
#inercia total
km.res$totss
## [1] 177306.8
#inercia intraclases

km.res$tot.withinss
## [1] 22398.94
#inercia inter-clases
km.res$betweenss
## [1] 154907.9
#individuos por grupo
km.res$size
## [1] 228 148 266 267

VISUALIZANDO CLUSTERS EN KMEANS

fviz_cluster(km.res, data = datos,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"), 
             ellipse.type = "euclid", # Concentration ellipse
             star.plot = TRUE, # Add segments from centroids to items
             repel = FALSE, # Avoid label overplotting (slow)
             ggtheme = theme_minimal()
             )

GRaficando k-medias en 3d

library(scatterplot3d)
g3d<-scatterplot3d(datos)



g3d$points3d(km.res$centers,pch=19,col="yellow",cex=2)
g3d$points3d(datos,col=km.res$cluster,pch=19)

Interpreaciones por cluster

row.names(km.res$centers)<-c("cluster 1","cluster 2","cluster 3","cluster 4")

barplot(t(km.res$centers),beside = TRUE,legend= colnames(datos),main = "grafico de interpretacion de clases",col=c(1,2,3),ylim = c(0,100))

Centros de gravedad

centrosk <- km.res$centers
row.names(centrosk) <-c("Cluster 1","Cluster 2","Cluster 3","Cluster 4")
centrosk<- as.data.frame(centrosk)
maximos <-apply(centrosk,2,max)
minimos <- apply(centrosk,2,min)
centrosk <- rbind(minimos,centrosk)
centrosk <- rbind(maximos,centrosk)
centrosk
##               EDAD LONGITUD DIAMETRO
## 1         71.58784 10.35307 3.994007
## 11        33.00439  9.99906 3.566554
## Cluster 1 33.00439 10.35307 3.769956
## Cluster 2 71.58784 10.05405 3.566554
## Cluster 3 45.53759  9.99906 3.721053
## Cluster 4 57.43446 10.05805 3.994007
radarchart(centrosk,maxmin = TRUE, axistype = 4, axislabcol = "slategray4",
           centerzero = FALSE,seg = 8,cglcol = "gray67",
           pcol = c("black","red","green","blue"),
           plty = 1,
           plwd = 5,
           title = "comparacion de clusteres"
           )


legenda <- legend(1.5,1,legend = c("Cluster 1","Cluster2","Cluster 3","Cluster 4"),
                  seg.len=1.4,
                  title = "clusteres",
                  pch=21,
                  bty = "n",lwd = 3, y.intersp = 1,horiz = FALSE,
                  col=c("black","red","green","blue"))

K-means ventajas y desventajas de agrupamiento

K-means clustering es un algoritmo muy simple y rápido. Puede tratar de manera eficiente conjuntos de datos muy grandes. Sin embargo, hay algunas debilidades, que incluyen:

Asume conocimiento previo de los datos y requiere que el analista elija el número apropiado de clúster (k) por adelantado

Los resultados finales obtenidos son sensibles a la selección aleatoria inicial de los centros del grupo. Por qué es un problema? Porque, para cada ejecución diferente del algoritmo en el mismo conjunto de datos, puede elegir un conjunto diferente de centros iniciales. Esto puede conducir a diferentes resultados de agrupamiento en diferentes ejecuciones del algoritmo. Es sensible a los valores atípicos.

Si reorganiza sus datos, es muy posible que obtenga una solución diferente cada vez que cambie el orden de sus datos.

Referencias

Hartigan, JA y MA Wong. 1979. “Algoritmo AS 136: Un algoritmo de agrupamiento de K-means.” Estadística aplicada . Royal Statistical Society, 100-108.

MacQueen, J. 1967. “Algunos métodos para la clasificación y el análisis de observaciones multivariadas”. En los procedimientos del quinto Simposio de Berkeley sobre estadísticas matemáticas y probabilidad, Volumen 1: Estadísticas , 281-97. Berkeley, California: University of California Press.