En esta ocación tomaremos la data ‘bupa’ como caso de estudio donde cuenta con las siguientes variables:
V1
V2
V3
V4
V5
V6
V7
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.
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.
Para aplicar componentes principales tenemos que pasar la data por 3 pruebas que son las siguientes:
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).
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.
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.
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.
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.
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.
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.
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.
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).
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).
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.