#INSERTAR LA BASE DE DATOS BUPA Y VERIFICAR QUE TODOS LOS DATOS SEAN CUANTITATIVOS

bupa=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Mineria-de-datos-2019-2/master/bupa.txt", sep = ",")
str(bupa)
## 'data.frame':    345 obs. of  7 variables:
##  $ V1: int  85 85 86 91 87 98 88 88 92 90 ...
##  $ V2: int  92 64 54 78 70 55 62 67 54 60 ...
##  $ V3: int  45 59 33 34 12 13 20 21 22 25 ...
##  $ V4: int  27 32 16 24 28 17 17 11 20 19 ...
##  $ V5: int  31 23 54 36 10 17 9 11 7 5 ...
##  $ V6: num  0 0 0 0 0 0 0.5 0.5 0.5 0.5 ...
##  $ V7: int  1 2 2 2 2 2 1 1 1 1 ...

#1. PRUEBA DE CORRELACIONES #Examinando la matriz de correlaciones se puede evidenciar la existencia de #correlaciones significativas

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
library(VIM)
library(corrplot)
corrplot(cor(bupa))

#Se observa la correlacion de cada campo, es decir cara esfera "azul" indica si presenta o no correlacion asi como las casillas con esferas "rojas" que indican lo contrario

library(PerformanceAnalytics)
chart.Correlation(bupa)

#En el siguiente grafico muestra una situacion similar ya que permite visualizar las correlaciones pero en este caso se indica por las "estrellas rojas"

library(psych)


#PRUEBA GENERAL DE CORRELACIONES

cortest(cor(bupa))
## Tests of correlation matrices 
## Call:cortest(R1 = cor(bupa))
##  Chi Square value 208.01  with df =  21   with probability < 9.6e-33

#2. PRUEBA DE BARLERT #Permite probar si existe una intercorrelación significativa entre las variables originales.

#indicas los valores de los componentes y se visualiza el chi cuadrado
cortest.bartlett(cor(bupa), n=345)
## $chisq
## [1] 544.8724
## 
## $p.value
## [1] 6.004754e-102
## 
## $df
## [1] 21
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

#3. PRUEBA kMO

#El ındice de Kaiser-Meyer-Olkin o medida de adecuación muestral KMO tiene el mismo objetivo que el test de Bartlett

library(psych)
#Ddebe tener un numero mayor  A 0.50 para ser aprobada 
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
#SEGUN LOS RESULTADOS SE JUSTIFICA LA REALIZACION DEL ACP
#Grafico de sedimentacion, tomar en cuenta la cantidad, en este caso es 3 componentes
scree(bupa)

#analisis paralelo

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

## Parallel analysis suggests that the number of factors =  NA  and the number of components =  2
#parallel analisys suggest that number of factor
#COMPONENTES PRINCIPALES
#se observa el grafico de barra e indica la suma mas factible para agrupar
componentes=prcomp(bupa, scale=TRUE, center = T)
componentes
## Standard deviations (1, .., p=7):
## [1] 1.5837765 1.0926330 1.0046350 0.9465752 0.8188865 0.7061828 0.4724823
## 
## Rotation (n x k) = (7 x 7):
##           PC1        PC2         PC3         PC4         PC5         PC6
## V1 0.26093155  0.4869910  0.49039467 -0.02430417  0.67017404  0.04830950
## V2 0.14769977  0.3252950 -0.66587263 -0.62523056  0.15949171  0.06888411
## V3 0.50668951 -0.1526510 -0.23040936  0.41245134  0.03558136  0.19739104
## V4 0.53762897 -0.2217274 -0.14693268  0.13167289  0.08655906  0.36430265
## V5 0.49239652 -0.1143955  0.03814116 -0.10572417 -0.07449247 -0.84970661
## V6 0.34359042  0.3470071  0.37146594 -0.27134023 -0.69137189  0.25772936
## V7 0.06173834 -0.6716080  0.31938586 -0.57986125  0.18200666  0.18115126
##            PC7
## V1  0.04700907
## V2  0.08880155
## V3  0.67566973
## V4 -0.69473462
## V5 -0.06539520
## V6  0.07416000
## V7  0.20234232
summary(componentes)
## 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
#Se observa las relacions en forma de flecha para cada campo y segun se acoplen
plot(componentes)

componentes$rotation
##           PC1        PC2         PC3         PC4         PC5         PC6
## V1 0.26093155  0.4869910  0.49039467 -0.02430417  0.67017404  0.04830950
## V2 0.14769977  0.3252950 -0.66587263 -0.62523056  0.15949171  0.06888411
## V3 0.50668951 -0.1526510 -0.23040936  0.41245134  0.03558136  0.19739104
## V4 0.53762897 -0.2217274 -0.14693268  0.13167289  0.08655906  0.36430265
## V5 0.49239652 -0.1143955  0.03814116 -0.10572417 -0.07449247 -0.84970661
## V6 0.34359042  0.3470071  0.37146594 -0.27134023 -0.69137189  0.25772936
## V7 0.06173834 -0.6716080  0.31938586 -0.57986125  0.18200666  0.18115126
##            PC7
## V1  0.04700907
## V2  0.08880155
## V3  0.67566973
## V4 -0.69473462
## V5 -0.06539520
## V6  0.07416000
## V7  0.20234232
biplot(componentes, scale=1)

#extraemos los componentes 

componentes_print=componentes$x
componentes_print=componentes_print[,1:3]
head(componentes_print)
##             PC1         PC2        PC3
## [1,] -0.1390785  0.11105334 -2.3448572
## [2,]  0.2907050 -1.94038272 -0.9286607
## [3,] -0.8721346 -1.54263788  0.1152322
## [4,] -0.1580974 -0.70132800 -0.3506241
## [5,] -1.1408941 -1.12133672 -0.3251554
## [6,] -1.0901984  0.03114855  1.5875375
#exportamos los componentes
write.csv(componentes_print, file="componentes_clientes.csv")
getwd()
## [1] "C:/Users/15-cc601/Desktop"

#METODO PAM Para realiza el método PAM se tomó como muestra la base de datos “BUPA”, antes de realizar el método se debe verificar que no tenga datos cualitativos pues este solo trabaja con cuantitativos.

datos <- scale(bupa)
#insertaremos las librerías “cluster” para las particiones y “Factoextra” para visualizar el resultado del análisis.  Se debe tener en cuenta que nuestras distancias de “bupa” están almacenadas en “datos” y el valor “K” es el numero de cluster que se generaran, en este caso se eligió al azar 8 para poder observar.

library(cluster)
library(factoextra)
fviz_nbclust(x = datos, FUNcluster = pam, method = "wss", k = 10,
             diss = dist(datos, method = "manhattan"))

summary(datos)
##        V1                 V2                V3                V4         
##  Min.   :-5.65622   Min.   :-2.5545   Min.   :-1.3533   Min.   :-1.9518  
##  1st Qu.:-0.71029   1st Qu.:-0.7014   1st Qu.:-0.5845   1st Qu.:-0.5607  
##  Median :-0.03584   Median :-0.1564   Median :-0.2258   Median :-0.1633  
##  Mean   : 0.00000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.63861   3rd Qu.: 0.5521   3rd Qu.: 0.1842   3rd Qu.: 0.2341  
##  Max.   : 2.88676   Max.   : 3.7133   Max.   : 6.3854   Max.   : 5.6989  
##        V5                V6                V7         
##  Min.   :-0.8479   Min.   :-1.0351   Min.   :-1.1727  
##  1st Qu.:-0.5932   1st Qu.:-0.8853   1st Qu.:-1.1727  
##  Median :-0.3384   Median :-0.1363   Median : 0.8502  
##  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.1966   3rd Qu.: 0.7624   3rd Qu.: 0.8502  
##  Max.   : 6.5907   Max.   : 4.9568   Max.   : 0.8502
#Se observa en el grafico que el valor mas optimo para generar los clusters es de 3 ya que a partir de ese número la línea presenta una desviación hacia adelante

set.seed(111)

#Una vez obtenida definido el número cluster, se inserte un “set.seed(xxx)” eso puede ser opcional ya que solo permite obtener un valor mas exacto,  se ejecuta la métrica “manhattan” utilizando el método “PAM”  y generando 3 clusters para ser almacenadas en “cluster_pam”

library(cluster)
cluster_pam=pam(datos, 3, metric = "manhattan")

#Finalmente se observa que el Cluster 1 agrupo 132 datos con un 38% , el cluster 2 agrupo 170 con un 49% y el cluster 3 agrupo 43 datos con un 12% de una total de 345 datos. 

table(cluster_pam$clustering)
## 
##   1   2   3 
## 132 170  43
prop.table(table(cluster_pam$clustering))
## 
##         1         2         3 
## 0.3826087 0.4927536 0.1246377
#En este último grafico se podrá visualizar la dispersión de todos los datos en cada cluster diferenciándose por un color diferente, también se observa que hay una intersección entre ambos cluster.

library(factoextra)
fviz_cluster(object = cluster_pam, data =  dat, ellipse.type = "convex",
             repel = TRUE) +
  theme_bw()+
  labs(title = "Resultados clustering PAM") +
  theme(legend.position= "none")

plot(cluster_pam)

#METODO CLARA Los resultados finales de la agrupación corresponden al conjunto de medoides con el costo mínimo.

#Utilizar la libreria Cluster para generar los grupos
library(cluster)
#Utilizar la libreria Cluster para utilizar el comando "factoextra"
library(factoextra)
#Encontrar el numero optimo de cluster 
wss=as.numeric() 
for (k in 2:10){
  agrupa=kmeans(bupa, k) 
  wss[k-1]=agrupa$tot.withinss 
}
plot(2:10, wss, type = "b") 

#Se observa en el grafico que el valor mas optimo para generar los clusters es de 3 ya que a partir de ese número la línea presenta una desviación hacia adelante


#Se utilizara las librerias "ggplot2" y "factoextra" para generar el grafico y cluster respectivamente enfocados en el metodo clara

library(ggplot2) 
library(factoextra) 
clara_clusters=clara(bupa, k =3, metric ="manhattan", stand = TRUE, samples = 50, pamLike =TRUE) 
clara_clusters
## Call:     clara(x = bupa, k = 3, metric = "manhattan", stand = TRUE, samples = 50,      pamLike = TRUE) 
## Medoids:
##      V1 V2 V3 V4 V5  V6 V7
## [1,] 90 73 34 21 22 2.0  1
## [2,] 90 63 24 24 24 0.5  2
## [3,] 93 84 58 47 62 7.0  2
## Objective function:   5.273574
## Clustering vector:    int [1:345] 1 2 2 2 2 2 1 1 1 1 2 1 1 1 1 1 1 1 ...
## Cluster sizes:            131 171 43 
## Best sample:
##  [1]  18  24  30  37  43  45  60  74  89  97 100 101 110 114 119 120 129
## [18] 135 141 149 152 169 178 179 181 187 195 199 203 220 222 227 230 234
## [35] 250 258 263 266 270 278 284 299 310 314 334 336
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
#En el grafico finalmente se observa los 3 clusters y el cluster 3 en el de mayor area siendo los otros de menor area
fviz_cluster(object = clara_clusters, ellipse.type ="t", geom="point", pointsize = 2.5) +
  theme_bw()+
  labs(title= "Resultados clustering CLARA")

theme(legend.position = "none") 
## List of 1
##  $ legend.position: chr "none"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi FALSE
##  - attr(*, "validate")= logi TRUE