Sei sulla pagina 1di 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)
Datos de producción, cargar y visualizar datos
• datos <- read.table("data.txt") • install.packages(“GGally")

library(GGally)

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

library(GGally)

ggpairs(datos)

¿Qué podemos concluir


de los datos?
Datos de producción, cargar y visualizar datos
• Escalando los datos

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

X <- scale(datos)

• Verifiquemos si existe la posibilidad de clusters



library(factoextra)

res <- get_clust_tendency(X, n = 30)

1-res$hopkins_stat
 CÓDIGO A UN CLICK
0.81
Datos de producción, cargar y visualizar datos
• Escalando los datos

X <- scale(datos)

• Verifiquemos si existe la posibilidad de clusters



library(factoextra)

res <- get_clust_tendency(X, n = 30)

1-res$hopkins_stat

0.81

• Aplicando algoritmos jerárquicos y visualizando



d = dist(X, method = "euclidean")

fit1 = hclust(d, method="single")

CÓDIGO A UN CLICK
fit2 = hclust(d, method="complete")

fit3 = hclust(d, method="average")
Datos de producción, cargar y visualizar datos
• Escalando los datos

X <- scale(datos)

• Verifiquemos si existe la posibilidad de clusters



library(factoextra)

res <- get_clust_tendency(X, n = 30)

1-res$hopkins_stat

0.81

• Aplicando algoritmos jerárquicos y visualizando



d = dist(X, method = "euclidean")

fit1 = hclust(d, method="single")

fit2 = hclust(d, method="complete")

fit3 = hclust(d, method="average")
Datos de producción, algoritmos jerárquicos
• Visualizando

plot(fit1, main=“Single-linkage", xlab="puntos",
ylab="distancia",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

Datos de producción, algoritmos jerárquicos
• Visualizando

plot(fit1, main=“Single-linkage", xlab="puntos",
ylab="distancia",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)


¿Cuantos clusters
deberíamos
seleccionar?
Datos de producción, algoritmos jerárquicos
• Visualizando

plot(fit2, main=“Average-linkage”, xlab="puntos",
ylab="distancia",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

Datos de producción, algoritmos jerárquicos
• Visualizando

plot(fit2, main=“Average-linkage”, xlab="puntos",
ylab="distancia",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)


¿Cuantos clusters
deberíamos
seleccionar?
Datos de producción, algoritmos jerárquicos
• Visualizando

plot(fit3, main=“Complete-linkage", xlab="puntos",
ylab="distancia",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

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

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


¿Cual de los tres


modelos deberíamos
escoger?
Datos de producción, buscando K
• #Basado en complete linkage, generemos de 2 a 9 clusters y evaluemos
la cohesion y el coeficiente de silhouette

• install.packages(“flexclust”); library(flexclust)

K=9

cohesion=numeric(K); cohesion=1/0

coefSil=numeric(K); coefSil[1]=1/0

for (i in 2:K){

groups = cutree(fit3, k=i)

tempC=0

for (j in 1:i){

tempData=X[which(groups==j),]

tempC=tempC+sum(dist2(tempData,colMeans(tempData))^2)

}

cohesion[i]=tempC

temp = silhouette(groups,d)

coefSil[i]=mean(temp[,3])

}
Datos de producción, buscando K, visualizando
• #Visualización de los errores

plot(1:K,cohesion,typ='b',main="Buscando valores de K", xlab="Número de
clusters", ylab=“Cohesion",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

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

plot(1:K,cohesion,typ='b',main="Buscando valores de K", xlab="Número de
clusters", ylab=“Cohesion",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

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

plot(1:K,cohesion,typ='b',main="Buscando valores de K", xlab="Número de
clusters", ylab=“Cohesion",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

plot(1:K,coefSil,typ='b',main="Buscando valores de K", xlab="Número de
clusters", ylab=“Coef. Silhouette",cex.lab=1.5,cex.main=1.5,cex.axis=1.3)

¿Cuantos clusters deberíamos seleccionar?


Datos de producción, visualización de clusters
• #Gráfico de los 3 o 4 posibles clusters

groups = cutree(fit3, k=4)

groups = factor(groups)

ggplot(datos, aes(V1,V4, color = groups)) + geom_point()
+theme(axis.text=element_text(size=12),axis.title=element_text(size=18))
Datos de producción, visualización de clusters PCA
• #Otra forma de ver los datos es aplicando PCA

XPCA=prcomp(datos,center = TRUE,scale. = TRUE)

#XPCA$x son los datos en las nuevas dimensiones

summary(XPCA)

Importance of components%s:

PC1 PC2 PC3 PC4 PC5

Standard deviation 1.9258 1.0022 0.49264 0.20070 0.06374

Proportion of Variance 0.7417 0.2009 0.04854 0.00806 0.00081

Cumulative Proportion 0.7417 0.9426 0.99113 0.99919 1.00000
Datos de producción, visualización de clusters PCA
• #Otra forma de ver los datos es aplicando PCA

XPCA=prcomp(datos,center = TRUE,scale. = TRUE)

#XPCA$x son los datos en las nuevas dimensiones

summary(XPCA)

Importance of components%s:

PC1 PC2 PC3 PC4 PC5

Standard deviation 1.9258 1.0022 0.49264 0.20070 0.06374

Proportion of Variance 0.7417 0.2009 0.04854 0.00806 0.00081

Cumulative Proportion 0.7417 0.9426 0.99113 0.99919 1.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
Datos de producción, visualización de clusters PCA
• #Otra forma de ver los datos es aplicando PCA

XPCA=prcomp(datos,center = TRUE,scale. = TRUE)

#XPCA$x son los datos en las nuevas dimensiones

summary(XPCA)

Importance of components%s:

PC1 PC2 PC3 PC4 PC5

Standard deviation 1.9258 1.0022 0.49264 0.20070 0.06374

Proportion of Variance 0.7417 0.2009 0.04854 0.00806 0.00081

Cumulative Proportion 0.7417 0.9426 0.99113 0.99919 1.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. 

Por temas de visualización seleccionaremos solo 2 dimensiones
Datos de producción, visualización de clusters PCA
• #Gráfico de los 3 o 4 posibles clusters utilizando los datos de PCA

groups = cutree(fit3, k=3)

groups = factor(groups)

ggplot(as.data.frame(XPCA$x), aes(PC1,PC2, color = groups))+geom_point()
+theme(axis.text=element_text(size=12),axis.title=element_text(size=18))
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.
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.

• ¿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. Otras
SOLUCIÓN
personas prefieren buscar A UN
cluster donde CLICK
existe mayor variabilidad, ya
que debería existir mayor información.
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.

• ¿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. Otras
personas prefieren buscar cluster donde existe mayor variabilidad, ya
que debería existir mayor información.

• Veamos la diferencias al aplicar PCA


Datos de producción, análisis con PCA

PCA
Datos de producción, análisis sin estandarización
PCA
PCA
Datos de producción, clustering difuso, C-medias
• #En el caso de C-medias, es necesario encontrar m y K.

• ¿Qué valores seleccionaría?



Según cohesion => K=3 ó 4, 

Según CS => K=2 y m=1.05, 1.55.

Según error => K=3 ó 4, m = 2.55 o
SOLUCIÓN A UN CLICK
3.05.

Elijamos K=3 y m=2.55
Datos de producción, clustering difuso, C-medias
• #En el caso de C-medias, es necesario encontrar m y K.

• ¿Qué valores seleccionaría?



Según cohesion => K=3 ó 4, 

Según CS => K=2 y m=1.05, 1.55.

Según error => K=3 ó 4, m = 2.55 o
3.05.

Elijamos K=3 y m=2.55
Datos de producción, clustering difuso, C-medias
• #Veamos el código para hacer los gráficos anteriores

nModel <- 5 #Número de modelos

colors <- rainbow(nModel) #selecciona los colores de las líneas

linetype <- c(1:nModel) #define distintos tipos de lineas

plotchar <- seq(18,18+nModel,1) #define distintos tipos de puntos
Datos de producción, clustering difuso, C-medias
• #Veamos el código para hacer los gráficos anteriores

nModel <- 5 #Número de modelos

colors <- rainbow(nModel) #selecciona los colores de las líneas

linetype <- c(1:nModel) #define distintos tipos de lineas

plotchar <- seq(18,18+nModel,1) #define distintos tipos de puntos

• #Base del gráfico sin lineas



plot(range(1:9), range(seq(0.1,0.51,0.01)), type="n", xlab="Número de
clusters",ylab="Coeficiente Silhouette")
Datos de producción, clustering difuso, C-medias
• #Veamos el código para hacer los gráficos anteriores

nModel <- 5 #Número de modelos

colors <- rainbow(nModel) #selecciona los colores de las líneas

linetype <- c(1:nModel) #define distintos tipos de lineas

plotchar <- seq(18,18+nModel,1) #define distintos tipos de puntos

• #Base del gráfico sin lineas



plot(range(1:9), range(seq(0.1,0.51,0.01)), type="n", xlab="Número de
clusters",ylab="Coeficiente Silhouette")

• #Agregando las lineas



for (i in 1:nModel) { 

lines(1:9, coefSil[i,], type="b", lwd=1.5,lty=linetype[i], col=colors[i],
pch=plotchar[i]) 

}
Datos de producción, clustering difuso, C-medias
• #Veamos el código para hacer los gráficos anteriores

nModel <- 5 #Número de modelos

colors <- rainbow(nModel) #selecciona los colores de las líneas

linetype <- c(1:nModel) #define distintos tipos de lineas

plotchar <- seq(18,18+nModel,1) #define distintos tipos de puntos

• #Base del gráfico sin lineas



plot(range(1:9), range(seq(0.1,0.51,0.01)), type="n", xlab="Número de
clusters",ylab="Coeficiente Silhouette")

• #Agregando las lineas



for (i in 1:nModel) { 

lines(1:9, coefSil[i,], type="b", lwd=1.5,lty=linetype[i], col=colors[i],
pch=plotchar[i]) 

}

• # Agregando leyenda

legend("bottomleft", legend=seq(1.05, 3.05, 0.5), cex=0.8, col=colors,pch=plotchar,
lty=linetype, title="valor de m")
Datos de producción, clustering difuso, C-medias
• #Visualizando solución para K=3 y m=2.55

Datos de producción, clustering difuso, GMM
• #En el caso de GMM, es necesario encontrar el número de clusters. 

model = Mclust(datos) #Entrenando el modelo

plot(model) #Graficando los BIC
Datos de producción, clustering difuso, GMM
• #Visualización de clusters
Datos de producción, clustering difuso, GMM
• #Visualización de clusters si aplicamos GMM sobre los datos de PCA
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?

Potrebbero piacerti anche