1. Introducción

K-means es un algoritmo de clasificación no supervisada que agrupa objetos en k grupos basándose en sus características, los elementos que comparten características semenjantes estarán juntos en un mismo grupo, mientras que aquellos individuos de grupos diferentes estarán alejados del grupo. Para realizar el agrupamiento, el algoritmo utiliza la distancia entre los datos, con lo cual las observaciones que se asemejan tendrán una menor distancia entre ellas.Como medida para el cálculo se utiliza la distancia euclidiana o distancia cuadrática.

Pasos para el proceso de K-Means:

  1. Especificar el número K de clusters o grupos que se quieren crear.
  2. Seleccionar de forma aleatoria k observaciones del set de datos como centroides iniciales.
  3. Asignar cada una de las observaciones al centroide más cercano.
  4. Para cada uno de los k - clusters recalcular su centroide
  5. Repetir los pasos 3 y 4 hasta que las asignaciones no cambien o se alcance el número máximo de iteraciones establecido.

Ventajas y desventajas

2. Planeamiento del problema y metodología

Importamos las librerías que serán utilizadas

library(mvtnorm)
library(MBESS)
## Warning: package 'MBESS' was built under R version 4.0.5
library(Matrix)
library(cluster)
library(kableExtra)
library(ggplot2)

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.0.5
require(MASS)
## Loading required package: MASS
## Warning: package 'MASS' was built under R version 4.0.5
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
  1. A continuación, se simulan tres grupos de distribuciones normales bivariadas independientes con traslape, para lo cual:

2.1. Se crea una matriz de correlación de orden 2x2 a partir de la cual se calcula la matriz de varianzas y covarianzas y finalmente, se halla la matriz positiva más cercana:

M_cor<-matrix(c(1,0.6,0.6,1),ncol=2) #Se ingresa la matriz de correlaciones
M_cov<-cor2cov(M_cor,sd=c(1,1)) #A partir de la matriz de correlaciones se halla la matriz de covarianza con base en un vector de desviación estándar
M_cov_pd<-as.matrix(nearPD(M_cov)$mat)

2.2. Se definen los tamaños de muestra para las clases 1, 2 y 3 y los vectores de medias:

n1<-250 # Tamaño de la muestra de la clase 1
n2<-180 # Tamaño de la muestra de la clase 2
n3<-300 # Tamaño de la muestra de la clase 2

mu1<-c(0.5,1.5) # Vector de medias de la clase 1
mu2<-c(-1,1.5) # Vector de medias de la clase 2
mu3<-c(2,1.5) # Vector de medias de la clase 3

2.3. Con la función rmvnorm y los anteriores tamaños de muestra y vector de medias se generan tres grupos de datos con distribuciones normales

set.seed(101) #Semilla para garantizar replicabilidad
muestra1<-rmvnorm(n=n1,mean=mu1,sigma=M_cov_pd,method="eigen")
muestra2<-rmvnorm(n=n2,mean=mu2,sigma=M_cov_pd,method="eigen")
muestra3<-rmvnorm(n=n3,mean=mu3,sigma=M_cov_pd,method="eigen")
muestra_nosep<-rbind(muestra1,muestra2,muestra3)
colnames(muestra_nosep) <- c("x1", "x2")

clase<-c(rep(1,n1),rep(2,n2),rep(3,n3))
muestra_nosep_df<-data.frame(muestra_nosep,clase) # se concatenan los datos a las clases

2.4. De manera gráfica las muestras se encuentran distribuidas de la siguiente manera, observando un traslape:

plot(muestra_nosep,
     col=(clase+2),
     pch=(clase+2),
     ylim=c(-2,6),xlim=c(-6,6),
     xaxt="n",yaxt="n",
     xlab=expression(x[1]),
     ylab=expression(x[2]),
     main="Tres grupos que se traslapan",
     las=1,cex=1.5,lwd=2)
grid()
legend("topleft",legend=c("Grupo 1", "Grupo 2", "Grupo 3"),
       pch=c(1,3,5),col=c(1,3,5),pt.lwd=2,pt.cex=1.8,bty="n")

  1. Encontramos los centroides con K-Means fijando el método de inicialización de los centroides. Encuentre los centroides para nc inicializaciones aleatorias.

Suponga que el i -ésimo individuo es de la forma Xi=[xi1xi2]T. Cree la variable x3 como xi3=xi1+ϵi con ϵi iid de media cero y varianza constante. ¿Cuál es la varianza de x3? ¿Cuál es la covarianza entre x1 y x3? ¿Al agregar esta variable K-Means sigue detectando correctamente los centroides? ¿Qué pasa con la estabilidad de los centroides cuando la varianza de ϵ aumenta?

set.seed(101)
km_clusters <- kmeans(x = muestra_nosep, centers = 3, nstart = 100)
km_clusters
## K-means clustering with 3 clusters of sizes 210, 277, 243
## 
## Cluster means:
##          x1       x2
## 1  2.512736 2.317574
## 2  1.034464 1.033660
## 3 -1.012885 1.090569
## 
## Clustering vector:
##   [1] 2 3 1 2 2 2 2 2 3 3 2 3 2 2 2 2 2 2 2 3 1 3 3 2 3 3 2 2 1 2 3 3 2 3 2 1 2
##  [38] 3 2 2 1 3 3 1 1 1 3 2 2 2 2 1 2 3 2 3 1 2 3 2 3 3 2 3 2 3 3 2 1 2 3 3 2 2
##  [75] 2 3 3 3 1 2 2 3 3 3 3 2 1 1 2 2 2 2 2 2 1 2 1 3 2 3 3 2 1 2 2 2 2 1 2 1 1
## [112] 2 3 1 2 1 2 2 2 2 2 3 2 3 2 2 2 3 2 3 3 2 1 2 2 2 3 3 2 3 3 1 2 2 3 2 2 2
## [149] 2 2 3 1 2 2 2 2 3 2 1 2 2 3 3 2 3 2 2 3 1 2 2 3 2 2 1 2 3 2 1 2 3 2 2 1 3
## [186] 3 2 1 2 3 2 2 1 2 2 1 2 2 3 3 3 3 2 3 2 3 2 1 2 3 3 1 3 2 3 3 2 2 2 2 2 2
## [223] 2 1 3 3 3 3 2 2 3 2 3 3 3 2 1 2 2 3 1 1 2 3 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3
## [260] 3 3 3 2 2 2 3 2 3 3 3 3 3 1 3 3 3 3 3 2 3 3 2 3 3 2 3 3 3 3 3 3 3 3 3 3 3
## [297] 3 3 3 1 3 3 3 3 3 3 3 3 3 2 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2
## [334] 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 3
## [371] 3 3 3 3 3 3 2 3 2 3 3 3 3 3 3 3 3 3 2 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 3 2
## [408] 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 2 1 2 1 1 1 2 2 3 1 1 1 1
## [445] 2 1 1 1 1 2 1 1 1 1 2 1 1 1 1 2 2 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 1 1 2 1 2
## [482] 1 1 1 1 2 1 2 1 1 1 2 1 2 2 1 1 1 1 2 2 1 2 1 2 1 1 2 2 2 1 2 1 1 2 1 1 1
## [519] 2 1 2 2 1 1 2 1 1 2 2 2 1 1 2 2 1 2 1 2 2 2 2 1 1 1 1 2 1 2 1 2 2 2 2 1 2
## [556] 2 1 1 2 1 2 1 2 2 2 2 2 2 1 2 1 1 2 2 1 2 1 2 2 3 1 1 2 1 1 3 2 2 1 2 1 1
## [593] 2 1 2 2 2 1 1 1 1 2 1 1 2 1 2 1 2 2 2 1 1 1 2 2 1 1 2 2 2 1 2 2 2 1 3 2 1
## [630] 1 2 1 1 1 1 2 2 2 1 2 2 1 1 1 2 1 1 1 1 2 2 1 1 1 1 1 1 2 2 1 1 2 2 1 1 1
## [667] 2 1 1 2 3 2 1 2 1 1 2 2 1 1 1 1 1 1 2 1 2 1 2 1 2 1 1 1 1 1 2 1 2 2 1 2 2
## [704] 1 1 1 2 1 2 1 2 1 1 1 1 1 2 2 2 1 2 2 2 2 1 2 2 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 258.4302 289.0675 297.8212
##  (between_SS / total_SS =  66.3 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

El algoritmo K-Means selecciona los centroides iniciales y asigna los puntos al centroide más cercano, lo cual se hizo anteriormente, luego vuelve a calcular el centroide de cada grupo de manera iterativa hasta que los centroides no cambien o cambien muy poso, a continuación se realiza el proceso iterativo para el cálculo de los centroides:

#A través de un proceso iterativo se cálculan los centroides de cada grupo hasta que estos no cambien
centers <- data.frame("ejecucion" = numeric(),
                      "v1"= numeric(),
                      "v2" = numeric())

for (i in 1:10){
  kmeans <- kmeans(muestra_nosep, centers=3, iter.max = 1000, nstart = 100)
  ejecucion <- rep(i,3)
  centers2 <- kmeans$centers
  c <- cbind(ejecucion, centers2)
  centers <- rbind (centers, c)
}

3.1.Gráficamente, tenemos los tres centroides ubicados en los lugares donde se observan los puntos:

plot(muestra_nosep, col = km_clusters$cluster)
points(km_clusters$centers, cex=2, col=11, pch=19)
points(matrix(colMeans(muestra_nosep), nrow=1, ncol=2), cex=3, col=12, pch=19)

Dados los anteriores centroides, tenemos los siguientes grupos o clusters:

clusplot(muestra_nosep, km_clusters$cluster, color = TRUE, 
          shade = TRUE, labels = 4, lines = 1 )

3.2. Después de las iteracciones tenemos los siguientes centroides, no se observa un cambio significativo en comparación con el primer cálculo:

km_clusters$centers #imprime los centroides después del proceso iterativo
##          x1       x2
## 1  2.512736 2.317574
## 2  1.034464 1.033660
## 3 -1.012885 1.090569
  1. Suponga que el \(i\)-ésimo individuo es de la forma \(X_i = [x_1^i \quad x_2^i]^T\). Cree la variable \(x_3\) como \(x_3^i=x_1^i+\epsilon_i\) con \(\epsilon_i\) iid de media cero y varianza constante. ¿Cuál es la varianza de \(x_3\)? ¿Cuál es la covarianza entre \(x_1\) y \(x_3\)? ¿Al agregar esta variable, K-Means sigue detectando correctamente los centroides? ¿Qué pasa con la estabilidad de los centroides cuando la varianza de \(\epsilon\) aumenta??
ei <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 0.5) #la constante tiene media  0 y su desviación es constante
x3 <- muestra_nosep[,1] + ei #se agrega un variable con base en la variable X1 más una constante definida como e1
muestra_nosep_df <- cbind(muestra_nosep, x3)

Varianza de \(x_3\)

varix3 <- var(x3)
{paste('La varianza de X_3 es', varix3)} 
## [1] "La varianza de X_3 es 2.72619608132265"

Matriz de correlación

cor <- cor(muestra_nosep_df)
cor
##           x1        x2        x3
## x1 1.0000000 0.3794623 0.9573412
## x2 0.3794623 1.0000000 0.3443091
## x3 0.9573412 0.3443091 1.0000000

Dado que \(X_3\) se encuentra basada en la variable \(X_1\) la correlación de estas dos variables es fuerte casi cercana a 1

Matriz de covarianzas

cova<-as.data.frame(muestra_nosep_df)
cova<-cova[,-2]
cov <- cov(cova)

{paste('La covarianza entre X1 y X3 es: ',cov[2,1])}
## [1] "La covarianza entre X1 y X3 es:  2.49759721628624"

Dado que la covarianza entre \(X_1\) y \(X_3\) es mayor que cero, se puede concluir que estas dos variables tienen una relación positiva

4.1. Se calculan nuevamente los centroides

# Este es con las dos variables iniciales X1 y X2

kmeans <- kmeans(muestra_nosep, centers=3, iter.max = 2000, nstart = 100)
muestra_nosep<-as.data.frame(muestra_nosep)
muestra_nosep$cluster <- kmeans$cluster


# Este ya tiene las tres variables
kmeans1 <- kmeans(muestra_nosep_df, centers = 3, iter.max = 20000, nstart = 100)
muestra_nosep0<-as.data.frame(muestra_nosep_df)
muestra_nosep0$cluster <- kmeans1$cluster



par(mfrow=c(1,2)) 
ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep0, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans1$centers[, 1], y = kmeans1$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios con variables X1,X2 y X3') 

ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans$centers[, 1], y = kmeans$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios con variables X1 y X2') 

Como se puede observar en la primera gráfica, con la inclusión de la variable \(X_3\), los centroides se acercan, lo cual genera que los grupos definidos que se observan en la gráfica final(centroides íniciales) tengan algún grado de traslape y no estén tan bién definidos.

{'Estos son los centroides para el K means con X1, X2 y X3:'} 
## [1] "Estos son los centroides para el K means con X1, X2 y X3:"
{kmeans1$centers[,1:2]}
##           x1       x2
## 1 -1.1086081 1.032080
## 2  0.7825998 1.310469
## 3  2.6003872 1.943462
{'Estos son los centroides para el K means  con X1 y X2 es: '}
## [1] "Estos son los centroides para el K means  con X1 y X2 es: "
{kmeans$centers[,1:2]}
##          x1       x2
## 1 -1.012885 1.090569
## 2  1.034464 1.033660
## 3  2.512736 2.317574

Con la inclusión de la variable \(X_3\), se observa que los centroides cambian, aunque el hecho de que la variable incluida no tenga una varianza alta hace que el cambio en los centroides no sea tan significativo en comparación a cuando la variable tiene una varianza alta como se explica en el siguiente numeral.

4.2. Si se aumenta la varianza de \(x_3\), tenemos:

#Se crea la nueva distribución X3 con mayor  std
ei <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 50) # se aumenta la desviación estándar de la constante de 0.5 a 50
x3 <- muestra_nosep[,1] + ei 
muestra_nosep_df_1 <- cbind(muestra_nosep, x3)

# Este es con las dos variables iniciales X1 y X2

kmeans <- kmeans(muestra_nosep, centers=3, iter.max = 2000, nstart = 100)
muestra_nosep<-as.data.frame(muestra_nosep)
muestra_nosep$cluster <- kmeans$cluster


# Este ya tiene las tres variables
kmeans2 <- kmeans(muestra_nosep_df_1, centers = 3, iter.max = 20000, nstart = 100)
muestra_nosep1<-as.data.frame(muestra_nosep_df_1)
muestra_nosep1$cluster <- kmeans2$cluster

par(mfrow=c(1,2)) 
ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep1, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans2$centers[, 1], y = kmeans2$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios con variables X1, X2 y X3 ') 

ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans$centers[, 1], y = kmeans$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios con variables X1 y X2') 

Se calculan los centroides nuevamente:

{'Estos son los centroides para el K means con X1, X2 y X3 y std aumentada:'} 
## [1] "Estos son los centroides para el K means con X1, X2 y X3 y std aumentada:"
{kmeans2$centers[,1:2]}
##          x1       x2
## 1 0.7126267 1.429363
## 2 0.8948951 1.405606
## 3 0.7245479 1.430308
{'Estos son los centroides para el K means  con X1 y X2 es: '}
## [1] "Estos son los centroides para el K means  con X1 y X2 es: "
{kmeans$centers[,1:2]}
##          x1       x2
## 1  1.034464 1.033660
## 2 -1.012885 1.090569
## 3  2.512736 2.317574

Como podemos observar en la primera gráfica, la inclusión de una variable con un nivel de desviación alto genera que los centroides cambien significativamente y terminen convergiendo lo cual afecta los clusteres que antes eran definidos (imagen final)

4.3. Si se crean las variables \(x_4\) y \(x_6\) como la suma de \(x_2\) y otra variable de media cero y varianza constante y la variable \(x_5\) como la suma de \(x_3\) y otra variable de media cero y varianza constante, tenemos:

ei1 <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 5)
ei2 <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 6)
ei3 <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 7)
x4 <- muestra_nosep_df[,2] + ei1 #se agrega la variable x4 que depende de x2 más la constante ei1(de media 0 y var constante)
x5 <- muestra_nosep_df[,3] + ei2 #se agrega la variable x5 que depende de x4 más la constante ei2(de media 0 y var constante)
x6 <- muestra_nosep_df[,2] + ei3 #se agrega la variable x6 que depende de x2 más la constante ei3(de media 0 y var constante)
muestra_nosep_df_2 <- cbind(muestra_nosep_df, x4, x5, x6)

Calculamos las correlaciones entre las nuevas variables:

Matriz de correlación

cor <- cor(muestra_nosep_df_2)
cor 
##            x1         x2         x3          x4          x5         x6
## x1 1.00000000 0.37946228 0.95734116 0.024351315 0.221726177 0.08253032
## x2 0.37946228 1.00000000 0.34430910 0.183109584 0.088093007 0.14881902
## x3 0.95734116 0.34430910 1.00000000 0.025324396 0.244332997 0.07068807
## x4 0.02435131 0.18310958 0.02532440 1.000000000 0.006748908 0.01853364
## x5 0.22172618 0.08809301 0.24433300 0.006748908 1.000000000 0.03971737
## x6 0.08253032 0.14881902 0.07068807 0.018533643 0.039717370 1.00000000

De acuerdo a la matriz de correlación se observa que todas las variables poseen una correlación positiva, en el caso de \(x_3\) y \(x_5\) se observa que esta correlación es alta del 0.999 debido a que la última proviene de los datos de la primera más una constante.

Se calculan los centroides nuevamente:

# Este es con las dos variables iniciales X1 y X2
kmeans <- kmeans(muestra_nosep, centers=3, iter.max = 2000, nstart = 100)
muestra_nosep<-as.data.frame(muestra_nosep)
muestra_nosep$cluster <- kmeans$cluster


# Este ya tiene las tres variables
kmeans3 <- kmeans(muestra_nosep_df_2, centers = 3, iter.max = 20000, nstart = 100)
muestra_nosep2<-as.data.frame(muestra_nosep_df_2)
muestra_nosep2$cluster <- kmeans3$cluster

par(mfrow=c(1,2)) 
ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep2, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans3$centers[, 1], y = kmeans3$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios') 

ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans$centers[, 1], y = kmeans$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios') 

Después de la inclusión de las nuevas variables en la primera gráfica se observa que los centroides se acercan y los grupos se encuentran dispersos y traslapados con lo cual se puede concluir que con la inclusión de ruido o más dimensiones se afecta el algoritmo K-Means y ya no es posible una adecuada clusterización.En comparación con los grupos inicialmente obtenidos(figura final) los grupos se desdibujan y no son definidos.

Los centroides son:

{'Estos son los centroides para el K means con X1, X2 ,X3 ,X4,X5 y X6:'} 
## [1] "Estos son los centroides para el K means con X1, X2 ,X3 ,X4,X5 y X6:"
{kmeans3$centers[,1:2]}
##          x1       x2
## 1 0.8429409 1.353200
## 2 0.3733354 1.313392
## 3 1.1402943 1.616092
{'Estos son los centroides para el K means  con X1 y X2 es: '}
## [1] "Estos son los centroides para el K means  con X1 y X2 es: "
{kmeans$centers[,1:2]}
##          x1       x2
## 1  2.512736 2.317574
## 2 -1.012885 1.090569
## 3  1.034464 1.033660

4.4. Si se incrementan las varianzas de las variables \(x_4\), \(x_5\)y \(x_6\), se tendría:

# En este código se crean las nuevas variables x4, x5 y x6 y se les agrega una constante ei1, ei2 y ei3, respectivamente. Se les asigna una media = 0 y una desviación estandar alta en comparación con el punto anterior
ei1 <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 50)
ei2 <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 30)
ei3 <- rnorm(n=dim(muestra_nosep)[1], mean = 0 , sd = 90)
x4 <- muestra_nosep_df[,2] + ei1
x5 <- muestra_nosep_df[,3] + ei2
x6 <- muestra_nosep_df[,2] + ei3
muestra_nosep_df_3 <- cbind(muestra_nosep_df, x4, x5, x6)

Calculamos las correlaciones entre las nuevas variables:

Matriz de correlación

cor <- cor(muestra_nosep_df_3)
cor 
##             x1           x2          x3           x4         x5         x6
## x1 1.000000000 0.3794622784 0.957341162 0.0081870585 0.14752997 0.09945756
## x2 0.379462278 1.0000000000 0.344309097 0.0001811094 0.09584037 0.07036137
## x3 0.957341162 0.3443090975 1.000000000 0.0070864206 0.13298224 0.10907383
## x4 0.008187058 0.0001811094 0.007086421 1.0000000000 0.07509443 0.06958584
## x5 0.147529967 0.0958403663 0.132982243 0.0750944325 1.00000000 0.03471583
## x6 0.099457560 0.0703613708 0.109073828 0.0695858415 0.03471583 1.00000000

De acuerdo a la matriz de correlación se observa que todas las variables poseen una correlación positiva, en este caso la correlación entre \(x_3\) y \(x_5\) disminuye un poco.

Matriz de covarianzas

#cov <- cov(muestra_nosep_df1)
#cov

Se calculan los centroides nuevamente:

# Este es con las dos variables iniciales X1 y X2

kmeans <- kmeans(muestra_nosep, centers=3, iter.max = 2000, nstart = 100)
muestra_nosep<-as.data.frame(muestra_nosep)
muestra_nosep$cluster <- kmeans$cluster


# Este ya tiene las tres variables
kmeans4 <- kmeans(muestra_nosep_df_3, centers = 3, iter.max = 20000, nstart = 100)
muestra_nosep3<-as.data.frame(muestra_nosep_df_3)
muestra_nosep3$cluster <- kmeans4$cluster

par(mfrow=c(1,2)) 
ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep3, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans4$centers[, 1], y = kmeans4$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios') 

ggplot() + geom_point(aes(x = x1, y = x2, color = cluster), data =muestra_nosep, size = 2) +
  scale_colour_gradientn(colours=rainbow(4)) +
  geom_point(aes(x = kmeans$centers[, 1], y = kmeans$centers[, 2]), color =c("yellow","black","magenta"), size =5) +
  ggtitle('Clusters de Datos con k = 3 / K-Medios') 

Los centroides son:

{'Estos son los centroides para el K means con X1, X2 , X3,X4,X5,X6:'} 
## [1] "Estos son los centroides para el K means con X1, X2 , X3,X4,X5,X6:"
{kmeans4$centers[,1:2]}
##          x1       x2
## 1 0.9677177 1.503333
## 2 0.5472750 1.316098
## 3 0.8279490 1.447915
{'Estos son los centroides para el K means  con X1 y X2 es: '}
## [1] "Estos son los centroides para el K means  con X1 y X2 es: "
{kmeans$centers[,1:2]}
##          x1       x2
## 1  1.034464 1.033660
## 2 -1.012885 1.090569
## 3  2.512736 2.317574

5. Resultados

¿Qué se podría decir del efecto de la correlación entre variables y la estabilidad de los centroides en K-Medias?

Los centroides de la información inicial con dos variables son:

{kmeans$centers[,1:2]}
##          x1       x2
## 1  1.034464 1.033660
## 2 -1.012885 1.090569
## 3  2.512736 2.317574
cor <- cor(muestra_nosep[,1:2])
cor 
##           x1        x2
## x1 1.0000000 0.3794623
## x2 0.3794623 1.0000000

Los centroides de la información agregando la variable \(x_3\), con una varianza constante, son:

{kmeans1$centers[,1:2]}
##           x1       x2
## 1 -1.1086081 1.032080
## 2  0.7825998 1.310469
## 3  2.6003872 1.943462
cor <- cor(muestra_nosep_df)
cor 
##           x1        x2        x3
## x1 1.0000000 0.3794623 0.9573412
## x2 0.3794623 1.0000000 0.3443091
## x3 0.9573412 0.3443091 1.0000000

Los centroides de la información cuando la varianza de la variable \(x_3\) aumenta son:

{kmeans2$centers[,1:2]}
##          x1       x2
## 1 0.7126267 1.429363
## 2 0.8948951 1.405606
## 3 0.7245479 1.430308
cor <- cor(muestra_nosep_df_1)
cor 
##                 x1         x2    cluster         x3
## x1      1.00000000 0.37946228 0.88193672 0.06394867
## x2      0.37946228 1.00000000 0.48064069 0.02622389
## cluster 0.88193672 0.48064069 1.00000000 0.01975175
## x3      0.06394867 0.02622389 0.01975175 1.00000000

Los centroides de la información agregando las variables \(x_4\), \(x_5\) y \(x_6\) son:

{kmeans3$centers[,1:2]}
##          x1       x2
## 1 0.8429409 1.353200
## 2 0.3733354 1.313392
## 3 1.1402943 1.616092
cor <- cor(muestra_nosep_df_2)
cor 
##            x1         x2         x3          x4          x5         x6
## x1 1.00000000 0.37946228 0.95734116 0.024351315 0.221726177 0.08253032
## x2 0.37946228 1.00000000 0.34430910 0.183109584 0.088093007 0.14881902
## x3 0.95734116 0.34430910 1.00000000 0.025324396 0.244332997 0.07068807
## x4 0.02435131 0.18310958 0.02532440 1.000000000 0.006748908 0.01853364
## x5 0.22172618 0.08809301 0.24433300 0.006748908 1.000000000 0.03971737
## x6 0.08253032 0.14881902 0.07068807 0.018533643 0.039717370 1.00000000

Los centroides de la información cuando la varianza de las variables \(x_4\), \(x_5\) y \(x_6\) aumentan, son:

{kmeans4$centers[,1:2]}
##          x1       x2
## 1 0.9677177 1.503333
## 2 0.5472750 1.316098
## 3 0.8279490 1.447915
cor <- cor(muestra_nosep_df_3)
cor 
##             x1           x2          x3           x4         x5         x6
## x1 1.000000000 0.3794622784 0.957341162 0.0081870585 0.14752997 0.09945756
## x2 0.379462278 1.0000000000 0.344309097 0.0001811094 0.09584037 0.07036137
## x3 0.957341162 0.3443090975 1.000000000 0.0070864206 0.13298224 0.10907383
## x4 0.008187058 0.0001811094 0.007086421 1.0000000000 0.07509443 0.06958584
## x5 0.147529967 0.0958403663 0.132982243 0.0750944325 1.00000000 0.03471583
## x6 0.099457560 0.0703613708 0.109073828 0.0695858415 0.03471583 1.00000000

Como se puede ver en los resultados y en las gráficas incluidas en cada punto, la inclusión de nuevas variables al algortimo K-Means con alto grado de variabilidad hace que los centroides terminen convergiendo con lo cual el objetivo de generar clusters confiables no se puede cumplir pues el algoritmo termina adivinando. Esta situación afecta la efectividad del método y se debe a que a medida que el número de dimensiones (atributos) aumenta, la distancia que los discrimina es cada vez menor (los valores similares y diferentes poseen las mismas distancias sobre los centroides). En este caso podría ser necesario reducir la dimensionalidad mediante el uso del método de componentes principales - PCA en los datos u otros mecanismos.

De acuerdo con lo anterior el algoritmo K-Means puede ser adecuado para los datos con pocas dimensiones o ya preprocesados con técnicas como la de componentes principales PCA.

6.Referencias

Delgado, R. (16 de 5 de 2021). Obtenido de https://rpubs.com/rdelgado/399475

El algoritmo k-means aplicado a clasificación y procesamiento de imágenes. (15 de 5 de 2021). Obtenido de https://www.unioviedo.es/compnum/laboratorios_py/kmeans/kmeans.html

Fernandez Jauregui, A. (16 de 5 de 2021). Data Scientist & Business Intelligence. Obtenido de https://anderfernandez.com/blog/que-es-y-como-programar-el-algoritmo-k-means-en-r-desde-0/

INCAE. (15 de 05 de 2021). Datamining: agrupamiento con K-Means. Obtenido de https://www.youtube.com/watch?v=-_HdNIdI9uc&list=RDCMUCbdsyFBdG0Fmjroqk-ZoPcg

Notas de la clase Decisiones bajo incertumbre del profesor Juan David Ospina