You are on page 1of 47

Técnicas de segmentación y clasificación de datos

Diplomado en Estadística y Análisis de Datos

Contraloría General de la República

08 Febrero 2018


Sebastián Moreno

Universidad Adolfo Ibañez

Datos de producción

• Imaginemos que estamos trabajando en una fabrica y una máquina
deja de funcionar, comenzando a generar distintos tipos de piezas.
Antes de determinar el problema, lo primero que hay que hacer es
determinar cuantas piezas se han estado generando en realidad

• Para poder analizar los datos es necesario

• 1) Cargar los datos:

• 2) Visualizar los datos:

• 3) Segmentar los datos:

Datos de producción, cargar y visualizar datos
• datos <- read.table("data.txt")

Datos de producción, cargar y visualizar datos
• datos <- read.table("data.txt") • install.packages(“GGally")

library(GGally)

ggpairs(datos)

packages(“GGally")
 library(GGally)
 ggpairs(datos) .txt") • install.read.table("data. cargar y visualizar datos • datos <.Datos de producción.

packages(“GGally")
 library(GGally)
 ggpairs(datos) ¿Qué podemos concluir de los datos? .Datos de producción.table("data. cargar y visualizar datos • datos <.txt") • install.read.

cargar y visualizar datos • Escalando los datos
 X <.Datos de producción.scale(datos) .

Datos de producción. cargar y visualizar datos • Escalando los datos
 X <.get_clust_tendency(X.81 . n = 30)
 1-res$hopkins_stat
 CÓDIGO A UN CLICK 0.scale(datos) • Verifiquemos si existe la posibilidad de clusters
 library(factoextra)
 res <.

n = 30)
 1-res$hopkins_stat
 0.get_clust_tendency(X.81 • Aplicando algoritmos jerárquicos y visualizando
 d = dist(X.Datos de producción. method="single")
 CÓDIGO A UN CLICK fit2 = hclust(d. method="average") . method = "euclidean")
 fit1 = hclust(d. cargar y visualizar datos • Escalando los datos
 X <.scale(datos) • Verifiquemos si existe la posibilidad de clusters
 library(factoextra)
 res <. method="complete")
 fit3 = hclust(d.

method = "euclidean")
 fit1 = hclust(d.scale(datos) • Verifiquemos si existe la posibilidad de clusters
 library(factoextra)
 res <. method="single")
 fit2 = hclust(d. method="average") .81 • Aplicando algoritmos jerárquicos y visualizando
 d = dist(X.get_clust_tendency(X. cargar y visualizar datos • Escalando los datos
 X <. method="complete")
 fit3 = hclust(d. n = 30)
 1-res$hopkins_stat
 0.Datos de producción.

ylab="distancia".cex.5.main=1.axis=1.cex. main=“Single-linkage". xlab="puntos". Datos de producción.5.lab=1. algoritmos jerárquicos • Visualizando
 plot(fit1.3)
 .cex.

xlab="puntos". algoritmos jerárquicos • Visualizando
 plot(fit1.axis=1.3)
 ¿Cuantos clusters deberíamos seleccionar? .cex.cex.5. Datos de producción. main=“Single-linkage".5.lab=1.main=1. ylab="distancia".cex.

xlab="puntos". Datos de producción.main=1.axis=1. ylab="distancia".cex.cex.cex.lab=1. main=“Average-linkage”.3)
 . algoritmos jerárquicos • Visualizando
 plot(fit2.5.5.

algoritmos jerárquicos • Visualizando
 plot(fit2.main=1.lab=1. main=“Average-linkage”. Datos de producción. xlab="puntos".3)
 ¿Cuantos clusters deberíamos seleccionar? .cex.5. ylab="distancia".5.cex.cex.axis=1.

lab=1. xlab="puntos".5.main=1. ylab="distancia".axis=1.cex.5.cex. main=“Complete-linkage". algoritmos jerárquicos • Visualizando
 plot(fit3. Datos de producción.3)
 .cex.

seleccionar? ylab="distancia". Datos de producción.axis=1. ¿Cuantosalgoritmos jerárquicos clusters • Visualizando
 deberíamos plot(fit3. xlab="puntos".main=1.cex.cex.3)
 .5.cex. main=“Complete-linkage".lab=1.5.

cex.cex.3)
 ¿Cual de los tres modelos deberíamos escoger? . seleccionar? ylab="distancia". xlab="puntos".cex.5. main=“Complete-linkage".main=1. Datos de producción.5.lab=1.axis=1. ¿Cuantosalgoritmos jerárquicos clusters • Visualizando
 deberíamos plot(fit3.

cohesion=1/0
 coefSil=numeric(K).d)
 coefSil[i]=mean(temp[. generemos de 2 a 9 clusters y evaluemos la cohesion y el coeficiente de silhouette • install. coefSil[1]=1/0
 for (i in 2:K){
 groups = cutree(fit3.]
 tempC=tempC+sum(dist2(tempData.Datos de producción. buscando K • #Basado en complete linkage. library(flexclust)
 K=9
 cohesion=numeric(K).3])
 } .colMeans(tempData))^2)
 }
 cohesion[i]=tempC
 temp = silhouette(groups. k=i)
 tempC=0
 for (j in 1:i){
 tempData=X[which(groups==j).packages(“flexclust”).

cex.cex.cex.3)
 CÓDIGO A UNvalores plot(1:K.lab=1.main="Buscando CLICKde K".5.typ='b'.cex.cex.typ='b'. ylab=“Cohesion".Datos de producción.lab=1.5.main=1.3) .axis=1. xlab="Número de clusters".main=1. Silhouette".cex. visualizando • #Visualización de los errores
 plot(1:K.main="Buscando valores de K". buscando K.axis=1.coefSil.5. xlab="Número de clusters". ylab=“Coef.5.cohesion.

ylab=“Cohesion".5.cex.axis=1. buscando K.lab=1. xlab="Número de clusters".Datos de producción.5.coefSil. xlab="Número de clusters".typ='b'. Silhouette".main="Buscando valores de K".5.cex. visualizando • #Visualización de los errores
 plot(1:K.cohesion.5.cex.main=1.3)
 plot(1:K.axis=1. ylab=“Coef.lab=1.cex.main=1.typ='b'.cex.3) .cex.main="Buscando valores de K".

axis=1.main="Buscando valores de K".3)
 plot(1:K.5. Silhouette". ylab=“Cohesion". xlab="Número de clusters".5.cohesion.5.main=1.typ='b'. xlab="Número de clusters".lab=1.typ='b'. ylab=“Coef.lab=1.main="Buscando valores de K".cex.cex. visualizando • #Visualización de los errores
 plot(1:K.axis=1.main=1.coefSil.cex.Datos de producción.cex.cex. buscando K.cex.5.3) ¿Cuantos clusters deberíamos seleccionar? .

axis. k=4)
 groups = factor(groups)
 ggplot(datos. color = groups)) + geom_point() +theme(axis.title=element_text(size=18)) .V4. visualización de clusters • #Gráfico de los 3 o 4 posibles clusters
 groups = cutree(fit3. aes(V1.text=element_text(size=12).Datos de producción.

20070 0.99113 0.2009 0.7417 0.04854 0. visualización de clusters PCA • #Otra forma de ver los datos es aplicando PCA
 XPCA=prcomp(datos.06374
 Proportion of Variance 0.00806 0.7417 0.49264 0.99919 1.9258 1.00000 .center = TRUE.00081
 Cumulative Proportion 0.Datos de producción. = TRUE)
 #XPCA$x son los datos en las nuevas dimensiones
 summary(XPCA)
 Importance of components%s:
 PC1 PC2 PC3 PC4 PC5
 Standard deviation 1.scale.0022 0.9426 0.

99919 1.00081
 Cumulative Proportion 0.9258 1.2009 0. visualización de clusters PCA • #Otra forma de ver los datos es aplicando PCA
 XPCA=prcomp(datos.9426 0.00806 0.00000 • ¿Cuantas dimensiones deberíamos considerar?
 Con una dimensión estamos considerando el 74% de la varianza
 Con dos dimensiones estamos considerando el 94% de la varianza
 Con tres dimensiones estamos considerando SOLUCIÓN el 99% de la varianza
 A UN CLICK Deberíamos seleccionar 2 o 3 dimensiones. 
 Por temas de visualización seleccionaremos solo 2 dimensiones . = TRUE)
 #XPCA$x son los datos en las nuevas dimensiones
 summary(XPCA)
 Importance of components%s:
 PC1 PC2 PC3 PC4 PC5
 Standard deviation 1.center = TRUE.Datos de producción.7417 0.7417 0.scale.0022 0.49264 0.06374
 Proportion of Variance 0.99113 0.20070 0.04854 0.

9258 1.20070 0.99113 0.Datos de producción. visualización de clusters PCA • #Otra forma de ver los datos es aplicando PCA
 XPCA=prcomp(datos.9426 0. = TRUE)
 #XPCA$x son los datos en las nuevas dimensiones
 summary(XPCA)
 Importance of components%s:
 PC1 PC2 PC3 PC4 PC5
 Standard deviation 1.center = TRUE.0022 0.2009 0.99919 1.7417 0.06374
 Proportion of Variance 0.00806 0.scale. 
 Por temas de visualización seleccionaremos solo 2 dimensiones .04854 0.7417 0.00081
 Cumulative Proportion 0.00000 • ¿Cuantas dimensiones deberíamos considerar?
 Con una dimensión estamos considerando el 74% de la varianza
 Con dos dimensiones estamos considerando el 94% de la varianza
 Con tres dimensiones estamos considerando el 99% de la varianza
 Deberíamos seleccionar 2 o 3 dimensiones.49264 0.

frame(XPCA$x). visualización de clusters PCA • #Gráfico de los 3 o 4 posibles clusters utilizando los datos de PCA
 groups = cutree(fit3.title=element_text(size=18)) .text=element_text(size=12). k=3)
 groups = factor(groups)
 ggplot(as.Datos de producción. color = groups))+geom_point() +theme(axis.data. aes(PC1.PC2.axis.

Datos de producción. análisis sin estandarización sin 
 est. .

Datos de producción. análisis sin estandarización sin estandarización .

sin estandarización .

sin estandarización ¿Qué otro factor puede influir en el proceso de clustering? .

Datos de producción. . PCA • Al utilizar los datos estandarizados las variables con alta correlación son mas representativas debido a que la cercanía en una de sus dimensiones debería implicar cercanía en otras dimensiones.

ya que debería existir mayor información. Algunas personas encuentran que es importante que variables correlacionadas tengan más peso. Otras SOLUCIÓN personas prefieren buscar A UN cluster donde CLICK existe mayor variabilidad.Datos de producción. • ¿Corresponde o no aplicar PCA antes de clusterizar?
 No hay respuesta definitiva para ello. . PCA • Al utilizar los datos estandarizados las variables con alta correlación son mas representativas debido a que la cercanía en una de sus dimensiones debería implicar cercanía en otras dimensiones.

• ¿Corresponde o no aplicar PCA antes de clusterizar?
 No hay respuesta definitiva para ello. Algunas personas encuentran que es importante que variables correlacionadas tengan más peso.Datos de producción. • Veamos la diferencias al aplicar PCA . Otras personas prefieren buscar cluster donde existe mayor variabilidad. ya que debería existir mayor información. PCA • Al utilizar los datos estandarizados las variables con alta correlación son mas representativas debido a que la cercanía en una de sus dimensiones debería implicar cercanía en otras dimensiones.

Datos de producción. análisis con PCA PCA .

análisis sin estandarización PCA .Datos de producción.

PCA .

05.55.
 Según error => K=3 ó 4. 1. 
 Según CS => K=2 y m=1.Datos de producción.05. clustering difuso.55 . C-medias • #En el caso de C-medias.55 o SOLUCIÓN A UN CLICK 3.
 Elijamos K=3 y m=2. es necesario encontrar m y K. • ¿Qué valores seleccionaría?
 Según cohesion => K=3 ó 4. m = 2.

55 o 3. 
 Según CS => K=2 y m=1. m = 2.
 Elijamos K=3 y m=2. • ¿Qué valores seleccionaría?
 Según cohesion => K=3 ó 4.55 .05.Datos de producción.
 Según error => K=3 ó 4. 1. C-medias • #En el caso de C-medias. es necesario encontrar m y K.05. clustering difuso.55.

clustering difuso.Datos de producción.18+nModel.rainbow(nModel) #selecciona los colores de las líneas
 linetype <.seq(18. C-medias • #Veamos el código para hacer los gráficos anteriores
 nModel <.1) #define distintos tipos de puntos .c(1:nModel) #define distintos tipos de lineas
 plotchar <.5 #Número de modelos
 colors <.

C-medias • #Veamos el código para hacer los gráficos anteriores
 nModel <.18+nModel.c(1:nModel) #define distintos tipos de lineas
 plotchar <.51.Datos de producción.1) #define distintos tipos de puntos • #Base del gráfico sin lineas
 plot(range(1:9).rainbow(nModel) #selecciona los colores de las líneas
 linetype <.ylab="Coeficiente Silhouette") . xlab="Número de clusters".5 #Número de modelos
 colors <.01)). type="n".0.0. clustering difuso. range(seq(0.seq(18.1.

c(1:nModel) #define distintos tipos de lineas
 plotchar <.18+nModel. pch=plotchar[i]) 
 } .ylab="Coeficiente Silhouette") • #Agregando las lineas
 for (i in 1:nModel) { 
 lines(1:9. xlab="Número de clusters".1.1) #define distintos tipos de puntos • #Base del gráfico sin lineas
 plot(range(1:9). coefSil[i. type="n".Datos de producción.51.]. lwd=1.0.5 #Número de modelos
 colors <.5. clustering difuso.rainbow(nModel) #selecciona los colores de las líneas
 linetype <.lty=linetype[i].seq(18.01)). type="b". range(seq(0. C-medias • #Veamos el código para hacer los gráficos anteriores
 nModel <.0. col=colors[i].

c(1:nModel) #define distintos tipos de lineas
 plotchar <. C-medias • #Veamos el código para hacer los gráficos anteriores
 nModel <.5. legend=seq(1.5).8.05.rainbow(nModel) #selecciona los colores de las líneas
 linetype <.18+nModel. title="valor de m") .1.0.]. cex=0.lty=linetype[i]. clustering difuso. range(seq(0.seq(18. type="b".1) #define distintos tipos de puntos • #Base del gráfico sin lineas
 plot(range(1:9). lwd=1.0.5 #Número de modelos
 colors <.01)). xlab="Número de clusters".51.05. lty=linetype.ylab="Coeficiente Silhouette") • #Agregando las lineas
 for (i in 1:nModel) { 
 lines(1:9. type="n".Datos de producción. 3. coefSil[i.pch=plotchar. 0. pch=plotchar[i]) 
 } • # Agregando leyenda
 legend("bottomleft". col=colors. col=colors[i].

clustering difuso.Datos de producción. C-medias • #Visualizando solución para K=3 y m=2.55
 .


 model = Mclust(datos) #Entrenando el modelo
 plot(model) #Graficando los BIC . clustering difuso.Datos de producción. GMM • #En el caso de GMM. es necesario encontrar el número de clusters.

Datos de producción. GMM • #Visualización de clusters . clustering difuso.

Datos de producción. GMM • #Visualización de clusters si aplicamos GMM sobre los datos de PCA . clustering difuso.

Datos de producción. clustering difuso. GMM • #Visualización de clusters si aplicamos GMM sobre los datos de PCA ¿Por qué se diferencia tanto las clases en las primeras componentes y casi nada en las últimas? .