En esta ocación tomaremos la data ‘bupa’ como caso de estudio donde cuenta con las siguientes variables:

Después de haber mencionado los datos se realizará un pequeño análisis utilizando los algoritmos de PAM y CLARA, pero antes de ello se aplicaré análisis de componentes principales.Para dicho análisis solo se tomará todas las variables de la data porque todas son cuantitativas.

Carga de data

bupa=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Mineria-de-datos-2019-2/master/bupa.txt",sep=",")
head(bupa)
##   V1 V2 V3 V4 V5 V6 V7
## 1 85 92 45 27 31  0  1
## 2 85 64 59 32 23  0  2
## 3 86 54 33 16 54  0  2
## 4 91 78 34 24 36  0  2
## 5 87 70 12 28 10  0  2
## 6 98 55 13 17 17  0  2

Aplicando el código de ‘head’ nos mostrará los 6 primero datos de cada variable.

ANÁLISIS DE COMPONENTES PRINCIPALES

Para aplicar componentes principales tenemos que pasar la data por 3 pruebas que son las siguientes:

1.- Prueba de correlaciones

cor(bupa)
##             V1          V2          V3        V4        V5          V6
## V1  1.00000000  0.04410300  0.14769505 0.1877652 0.2223145  0.31267960
## V2  0.04410300  1.00000000  0.07620761 0.1460565 0.1331404  0.10079606
## V3  0.14769505  0.07620761  1.00000000 0.7396749 0.5034353  0.20684793
## V4  0.18776515  0.14605655  0.73967487 1.0000000 0.5276259  0.27958777
## V5  0.22231449  0.13314040  0.50343525 0.5276259 1.0000000  0.34122396
## V6  0.31267960  0.10079606  0.20684793 0.2795878 0.3412240  1.00000000
## V7 -0.09107012 -0.09805018 -0.03500879 0.1573558 0.1463925 -0.02204853
##             V7
## V1 -0.09107012
## V2 -0.09805018
## V3 -0.03500879
## V4  0.15735580
## V5  0.14639252
## V6 -0.02204853
## V7  1.00000000

Con el código ‘cor’ nos mostrará todas las correlacones entre variables. Podemos darnos cuenta que la mayor correlación es de 0.76 mientrsa que la mas baja correlación es de -0.022.

library(corrplot)
## corrplot 0.84 loaded
corrplot(cor(bupa))

Esta gráfica nos indica que mientras más pintada esté los círculos sus variables se correlacionan mejor.

library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Registered S3 method overwritten by 'xts':
##   method     from
##   as.zoo.xts zoo
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
chart.Correlation(bupa)

En esta gráfica nos muestra los histogramas y sus correlaciones entre las 7 variables(V1,V2,V3,V4,V5,V7).

2.- Prueba de Bartlet

library(psych)
cortest.bartlett(cor(bupa),n=345)
## $chisq
## [1] 544.8724
## 
## $p.value
## [1] 6.004754e-102
## 
## $df
## [1] 21

Para contrastar la igualdad de las varianzas (homocedastividad).En este caso rechaza Pvalue.

3.- Prueba KMO

library(psych)
KMO(bupa)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = bupa)
## Overall MSA =  0.64
## MSA for each item = 
##   V1   V2   V3   V4   V5   V6   V7 
## 0.70 0.53 0.59 0.63 0.81 0.73 0.23

Según los resultados se justifica la realizacion de pca(componentes principale), digo eso porque su MSA es igual a 0.64, si hubiera sido menor a 0.50 no lo tomaría.

Gráficos de sedimentación

scree(bupa)  

El código ‘scree’ grafica los componentes y traza una línea referencial para que nos ayude a tomar los componentes necesarios para nuestro análisis.

En nuestro caso los unicos puntos que se tomarán son los que están encima de la línea y como se puede apreciar solo tomaremos 3 componentes.

fa.parallel(bupa, fa="pc" )

## Parallel analysis suggests that the number of factors =  NA  and the number of components =  2

El código ‘fa.parellel’ es similar al código ‘scree’ pero en esta se traza 2 lineas referenciales para una mayor precisón.

Con el código anterior dije que tomaría 3 componentes, pero en este gráfico muestra que solo se tomaría 2 pues como hay una contradicción tendremos que ir con otro código (será el siguiente).

componentesb=prcomp(bupa, scale= TRUE, center=TRUE)
summary(componentesb)
## Importance of components:
##                           PC1    PC2    PC3    PC4    PC5     PC6     PC7
## Standard deviation     1.5838 1.0926 1.0046 0.9466 0.8189 0.70618 0.47248
## Proportion of Variance 0.3583 0.1706 0.1442 0.1280 0.0958 0.07124 0.03189
## Cumulative Proportion  0.3583 0.5289 0.6731 0.8011 0.8969 0.96811 1.00000

El código de prcomp es para que realice un análisis de componentes principales en la matriz de datos y devuelve los resultados como un objeto de clase.

En nuestro caso hubo una contradicción en los 2 códigos anteriores, por eso se recurrió a sumar la proporcion de la varianza. Si hacemos caso al primer código (scree) nos daría 67.31 % de proporción de varianza, pero si tomamos solo 2 componentes como dijo el segundo código (fa.parellel) nos daría 52.89% de proporción de varianza. Viendo a ambas son buenas porque supera el 50%, pero si tomamos la primera sería mejor aunque si tomamos un componente mas (osea tomar 4 componentes) sería mucho mejor porque alcanzaría un 80.11% y a mi punto de vista es la mejor de todas por ello tomaré 4 componentes para mi análisis.

plot(componentesb) 

El codigo ‘plot’ sirve para obtener más detalles sobre los argumentos de parámetros gráficos. En nuestro caso sería para tener mas detalle de los componentes.

Graficamos los componentes

biplot(componentesb,scale=1)

El código ‘biplot’ aproxima la distribución de una muestra multivariante en un espacio de dimensión reducida, normalmente de dimensión dos, y superpone sobre la misma representaciones de las variables sobre las que se mide la muestra. En nuestro caso nos muestra la distribución de los componentes.

Extraemos los componentes

componentes_prinb=componentesb$x
componentes_prinb=componentes_prinb[,1:4]
head(componentes_prinb) 
##             PC1         PC2        PC3        PC4
## [1,] -0.1390785  0.11105334 -2.3448572  0.5938918
## [2,]  0.2907050 -1.94038272 -0.9286607  0.7578934
## [3,] -0.8721346 -1.54263788  0.1152322  0.2507909
## [4,] -0.1580974 -0.70132800 -0.3506241 -0.4200923
## [5,] -1.1408941 -1.12133672 -0.3251554 -0.4683007
## [6,] -1.0901984  0.03114855  1.5875375 -0.1588787

Aqui solo separamos los componentes requeridos en una nueva variable y tambien usamos un código para mostrar los 6 primeros datos de esa nueva variable.

APLICANDO ALGORITMOS DE CLUSTERING

APLICANDO EL ALGORITMO DE PAM

bupa_scale<- scale(bupa)
library(cluster)
library(factoextra)
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
## Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ

Para empezar este análisis primero cargamos estas dos librerias que nos servirán luego.

Identificar el número óptimo de clusters (Método del Codo)

fviz_nbclust(x = bupa_scale,FUNcluster = pam, method="wss" , k.max = 15,
             diss = dist(bupa_scale,method = "manhattan"))

Luego aplicamos el método del codo para ver cuantos clusters se formarán, y por ello ponemos que la cantidad maxima de clusters sea 15. Ademas se puede ver que se utilizó el método de ‘Manhattan’, aunque en la data no muestre ningún valor atípico.

Específica la cantidad de grupos (clusters)

set.seed(111)
pam_cluster <- pam(x = bupa_scale,k = 3,metric = "manhattan")
pam_cluster
## Medoids:
##       ID          V1         V2         V3          V4         V5
## [1,]  66 -0.26065541  0.3886289 -0.2257958 -0.46137226 -0.4912558
## [2,]  60 -0.03584012 -0.3744108 -0.3282952 -0.06393548 -0.3638822
## [3,] 169  0.63860576  0.7701487  1.4141947  2.22132601  0.6041568
##              V6         V7
## [1,] -0.7355283 -1.1727371
## [2,] -0.8853260  0.8502344
## [3,]  1.0620439  0.8502344
## Clustering vector:
##   [1] 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##  [36] 3 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2
##  [71] 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1
## [106] 1 1 1 1 2 2 2 2 2 3 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 1 1 3 3 2 2 2 2 2 2
## [141] 1 1 1 1 1 1 1 3 1 1 3 2 2 2 2 2 3 3 3 2 3 2 2 2 2 2 3 3 3 1 1 1 1 1 3
## [176] 1 2 2 3 2 3 1 3 2 3 3 3 3 3 3 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [211] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 1 1
## [246] 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 2 2 2 3 1 2
## [281] 2 2 2 2 2 3 2 2 2 2 2 2 2 2 3 2 2 2 2 3 2 2 2 2 3 2 3 1 1 1 3 3 1 1 1
## [316] 3 3 1 2 2 2 2 3 2 1 1 1 1 1 2 2 2 2 3 1 1 2 3 2 3 1 3 3 1 3
## Objective function:
##    build     swap 
## 3.823487 3.818007 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

Para que nos salga los mismos resultados ponemos una semilla de ‘111’, luego especificamos la cantidad de clusters con ‘pam’ y se especifica que ‘metric’ (metrica) sea ‘manhattan’.(en nuestro caso la cantidad óptima de cluster es 3).

Gráfica de dspersión

fviz_cluster(object = pam_cluster, data = bupa_scale,geom = "point",
             ellipse.type = "t",repel = TRUE)+
  theme_bw() +
  labs(title = "RESULTADOS CLUSTERING PAM")

Para la mejor visualización del algoritmo PAM se aplicó un diagrama de dispersión donde mustra los 3 grupos(clusters).

APLICANDO EL ALGORITMO DE CLARA

Diagrama de dispersión

clara_cluster<-clara(bupa,2)
fviz_cluster(clara_cluster,stand = T,geom = "point",pointsize = 1)+
  theme_bw() +
  labs(title = "RESULTADOS CLUSTERING CLARA")

Para aplicar CLARA solamente aplicamos el codigo que se mostró porque anteriormente ya hicimos el análisis respectivo. Aparte de lo mencionado CLARA es similar PAM, pues CLARA se define el punto centro de los clusters mientras que en PAM lo hace aleatorio.


Al final de todo descubrí que en el análisis de componentes me resultó útil escoger 4 componentes porque era lo óptimo. Por otro lado en los algoritmos de clustering escogí PAM y CLARA porque quería hacer una comparación entre ellas y pues como vimos PAM require de 3 cluster mientras que CLARA solo requiere 2 porque en la primera los cluster son aleatorio mientras que la otra ya se predefine.

Con lo dicho anteriormente no digo que una otra sea mejor que la otra sino que es según los datos o mejor dicho según la data que trabaje.