You are on page 1of 12

Hoja 5 ADM

 Library(foreign) permite leer los archivos .sav


 Si quieres te molesta el nombre de fila porque vienen números, un ejemplo es hacer:
Row.names(mamíferos)=mamíferos$animal
Mamimeros=mamíferos[,-1]

 NOTA IMPORTANTE. Recuerda a R que la variable factor, es de tipo factor. Por


ejemplo,
Mamiferos$animal=factor(mamíferos$animal)
IMPORTANTE HACER ESTO ANTES DEL SUMMARY

Ej 1.

a) Identifica pares de variables que presenten una correlacion lineal positiva.


Tras haber convertido la variable factor en factor, hacemos:

pairs(mamiferos,col=2)
cor(mamiferos)
library(corrplot)
corrplot(cor(mamiferos),method="ellipse")

b) Aplica un ANÁLISIS DE CONGLOMERADOS JERÁRQUICO CON HCLUST (a partir de las


distancias euclídeas) (Método completo)
En primer lugar necesitamos una matriz de distancias.

D<- dist(mamiferos) #dist(x,method=“euclidean”,….)


class(D) #hacemos siempre esto
round(D,1) #no está la diag superior

conglo<- hclust(D,method="complete")

class(conglo) #"clase del objeto creado"

names(conglo) # "Elementos incluidos en el objeto creado"

El dendograma es:

plot(conglo, cex=0.8, labels=mamiferos$ANIMAL,


main="Dendrograma",xlab=conglo$method,
sub="",ylab="Distancias",col="blue")

Listas de uniones que se van produciendo:


rownames(mamiferos)
cbind(conglo$merge,conglo$height)

c) Establecer una partición en 3 conglomerados. Calcular los centroides (vectores de


medias de los conglomerados respectivos).
Aplicamos la orden cutree()

cluster <- cutree(conglo, k = 3)

table(cluster) # Número de casos en cada cluster

split(mamiferos,cluster)#animales de cada conglomerado // by(mamiferos,cluster,function(x)


x)

which(cluster==1)
which(cluster==2)
which(cluster==3)

Centroides: Notar que los centroides nos da una idea de las características de los
distintos conglomerados

1ª forma:

Centros=by(mamiferos,cluster,colMeans)
Centros
class(Centros) #clase by o lista

2ª forma:

Centros= t(sapply(split(mamiferos,cluster),colMeans))
Centros
class(Centros) # clase matriz

Dendograma con la línea horizontal de la distancia y las horizontales separando los


clusters:

plot(conglo, cex=0.8,labels=mamiferos$ANIMAL,
main="Dendrograma",xlab=conglo$method,
sub="",ylab="Distancias",col="blue")
abline(h=20,col=2)
abline(v=2.5,col=2,lty=2)
abline(v=16.5,col=2,lty=2)

Otra forma es:


plot(conglo, cex=0.8,labels=mamiferos$ANIMAL,
main="Dendrograma",xlab=conglo$method,
sub="",ylab="Distancias",col="blue")
rect.hclust(conglo,h=20) #NOTA h=20 es la distancia mas o menos en la que obtengo los
conglomerados que deseo.

d) ¿Qué varibles representan mayor variabilidad entre conglomerados?


Para cada variable, nos planteamos el anova de un factor (genera un análisis de
varianza de un factor para una variable dependiente cuantitativa respecto a una única
variable de factor)
Recordemos que la función lm(objetivo ~ explicativas,…) realiza el modelo lineal de la
variable objetivo frente a las variables explicativas.

Lo hacemos con una variable y luego con apply lo hacemos con todas para estudiar
cuál es la que proporciona mayor variabilidad.

---- Con una variable

lm(agua ~ factor(cluster), data=mamiferos)


summary(lm(agua ~ factor(cluster), data=mamiferos)) #(nos fijamos en el f-statistic)
anova(lm(agua ~ factor(cluster), data=mamiferos))#nos fijamos en el f-value. Cuanto mayor
sea F, mayor explica esa variable la división de los grupos.!!!!!

--- Con todas a la vez.


Notar que estamos interesados en el cálculo del estadístico F del ANOVA de un factor
de cada variable utilizada en la distancia frente a los grupos determinados en el
Análisis Cluster:

apply(mamiferos,2,
function(x) summary(lm(x~factor(cluster)))$fstatistic[1]
)

Las variables que mayor valor tengan, esas variables son las que más nos ayudan a
establecer los conglomerados.

--- Plot de las dos variables más explicativas: (agua y grasa) (es una nube de puntos)

colores<- c("red","blue","green") #tantos colores como conglomerados


attach(mamiferos)

plot(agua,grasa,type="n",
main="Resultado tres conglomerados")

text(agua,grasa,labels=row.names(mamiferos),
cex=0.6,col=colores[cluster])
text(Centros[,1],Centros[,3], #el 1 y el 3 hace ref a las variables ag#ua y grasa
labels=row.names(Centros),cex=1.5,col=colores)
grid()

e) Análisis de conglomerados jerárquicos con el método simple y average.

 Método single:

conglosin<- hclust(D,method="single")

#DENDOGRAMA:

plot(conglosin, cex=0.8,
labels=mamiferos$ANIMAL,main=conglosin$method,
xlab="",sub="",ylab="Distancias",col="blue")

#en el main, también es típico poner main=”Dendograma”


#CONSIDERAMOS 3 CONGLOMERADOS:

clustersin <- cutree(conglosin, k = 3)


table(clustersin)

 Método average:

congloaver<- hclust(D,method="average")

# DENDOGRAMA:

plot(congloaver, cex=0.8,
labels=mamiferos$ANIMAL,main=congloaver$method,
xlab="",sub="",ylab="Distancias",col="blue")

#CONSIDERAMOS TRES CONGLOMERADOS:


clusteraver <- cutree(congloaver, k = 3)
table(clusteraver)

NOTA: Si queremos comparar cuantos grupos se forman por cada método, lo vemos
en en table. Por ejemplo,

table(clusteraver,cluster) # Tabla unión media frente a unión completa

f) PARTICIÓN EN 3 CONGLOMERADOS CON AGNES:

NOTA DEL AGNES: Las métricas posibles son “euclidean” y “manhattan”. Los métodos
de unión posibles son: “average”, “single”, “complete”, “ward”, “weighted”
NOTA DEL AGNES: No le tenemos que meter la matriz de distancias, a diferencia del
hclust. (siempre y cuando los datos puedan medirse con la dist euclidea)

NOTA DEL AGNES: Si no se especifica la métrica, por defecto es la más general, donde
los datos no son necesariamente de la misma naturaleza. No obstante, en este caso
hemos definido la matriz de distancias dada por Daysi, y en este caso si tenemos que
poner la matriz D dentro del agnes.
Si vemos que las variables son de tipo factor, ponemos lo de euclidean y no es
necesario poner la matriz D, solo los datos
stand sirve para tipificar las variables

library(cluster)

agnclus <- agnes(mamiferos, metric = "euclidean",


stand = FALSE,method="complete")

 Para ver las uniones que se van formando, en el summary, nos fijamos en el merge.

summary(agnclus)

 Obtención del dendrograma y del “banner plot”. (coef de aglomeración)

plot(agnclus, main=paste("Agnes:",agnclus$method,sep=" "))

agnclus$ac

Cuanto más cercano sea a 1 el coef, más homogéneos serán los casos de un mismo
grupo y más se diferenciarán los de distinto grupo. El coeficiente ac es también la
anchura media del gráfico de banderas (o proporción rellena de dicho gráfico).
NOTA: Este coeficiente es sólo exclusivo del agnes, si construyes el hclust y luego te
preguntan el coef de ag, tienes que pasarlo al agnes.

Conglomerados dados por el agnes:

clusteragn=cutree(agnclus,3)

table(cluster,clusteragn) #para comparar

g) Seleccionar número de conglomerados y dibujar el dendograma:

En este caso da igual si usamos agnes o hclust. Lo hacemos con hclust por
ejemplo(average)

library(factoextra)
#dibujar dendrograma con k=3 clusters

k=3
fviz_dend(x = congloaver, k = k,
cex=0.6,
main="Dendrograma: Método Average",
xlab="Mamíferos",
ylab="Distancias de unión")

Si se desea incluir una línea de corte indicativa de los tres grupos:

corte=congloaver$height[nrow(mamiferos)-k]+1 # Punto de corte para la altura o distancia de


unión

fviz_dend(x = congloaver, k = k,
cex=0.6,
main="Dendrograma: Método Average",
xlab="Mamíferos",
ylab="Distancias de unión") +
geom_hline(yintercept = corte, linetype = "dashed")

Ej. 2.

a) Calcular el coef general de disimilaridad de Gower.

Nota. Esto lo tenemos que hacer porque las variables del dato son de distintos
factores. Primero cargamos la librería cluster.

library(cluster)

Antes de calcular la matriz de distancias, observamos la naturaleza de las variables.

v1: Asim. V2: Sim. V3: Asim. V4: Nominal. V5, V6: Ordinal. V7: transformada a Ordinal.V8
numérica.

Calculamos ya sí la matriz de distancias, a través de la orden Daysi.

D <- daisy(flower,type = list(asymm = c("V1", "V3"), symm= 2,ordratio= 7,logratio= 8))


class(D)

round(D,2)
Y podemos aplicar las técnicas jerárquicas vistas con hclust

b) Coef de aglomeración.

Para el cálculo necesitamos la función “agnes” definida sobre la matriz de distancias de


Gower calculada.

agnclusin <- agnes(D,method="single")

summary(agnclusin)

agnclusin$ac

plot(agnclusin,main=agncluscom$method)

Nota. Si tienes varios métodos, elige siemore el que tenga mayor coef ac.

Ej. 3.

a) Realizar un análisis de conglomerados de centros móviles (k=3) utilizando como


centroides iniciales los resultantes de un análisis jerárquico (método “complete”).
(k-medias con centros iniciales resultantea del hclust)

 Primero partimos del hclust

h<- hclust(dist(swiss),method="complete")
plot(h) #dendograma
abline(h=80,col=4)

 Obtencion de los centros (siempre en formato matriz con sapply)

Recuerda que los centros nos da una idea de las ccas de los grupos que se forman

cluster<- cutree(h,3)
Centros= t(sapply(split(swiss,cluster),colMeans))
class(Centros)

 Procedimientos de las k-medias con puntos iniciales Centros


Usamos kmeans

km<- kmeans(swiss,Centros) #lo segundo es la inicialización


km ----- ## (between_SS / total_SS = 81.8 %)
IMPORTANTE. Esto es una medida de calidad del conglomerado. Mientras
mas alto mejor, más se diferencian los conglomerados que hemos
obtenido.

Pero le podemos sacar más provecho. Lo vemos:

names(km)

km$cluster # Cluster en el que se incluye cada caso

km$centers # Centros de los clusters formados

table(km$cluster) # Número de casos en cada cluster

km$totss # Suma de cuadrados total de los datos

km$withinss # Suma de cuadrados dentro de cada grupo

km$tot.withinss # Suma de cuadrados total "dentro" de los grupos

km$betweenss # Suma de cuadrados totla entre los grupos

b) Representar gráficamente la solución sobre las dos variables con mayor


variabilidad entre los conglomerados.

Cuidado! Es casi igual, apply(…summary), pero en este caso le tenemos que especificar
que viene del algoritmo de las kmedias

 Primero calculamos el estadístico F del ANOVA asociado a cada variable:


apply(swiss,2, function(x) summary(lm(x~factor(km$cluster)))
$fstatistic[1] )

 Representamos las variables mas significativass

colores<- c("red","blue","green") #por tener 3 cong


lomerados
plot(swiss[,c(5,2)],type="n", main="Swiss, KM") #FIjate en el orden de
esas variables mas significativas

text(swiss[,c(5,2)], labels=row.names(swiss),
cex=0.6,col=colores[km$cluster])

text(km$centers[,5],km$centers[,2],
labels=row.names(Centros),cex=1.5,col=colores)
grid()

 Repetir el análisis de centros móviles utilizando 15 soluciones iniciales diferentes


Se realiza a través del parámetro “nstart” de la función “kmeans”
Repetimos el algoritmo 15 veces con dist inicialización y me quedo con la mejor.
km3 <- kmeans(swiss, 3, nstart = 15)
km3

Ej. 5.

a) Partición mediante el método de los k-medoides (k=2). Representa gráficamente la


partición.

Usaremos la orden pam(). Queremos minimizar una función objetivo.

agric.pam<- pam(agriculture,2) #quiero dos grupos formar

names(agric.pam)

summary(agric.pam) #AQUI VEMOS QUIENES SON LOS MEDOIDES

Destaco los elementos más importantes:

agric.pam$clusinfo

esto ultimo contiene: tamaño del cluster; disimilaridad máxima y media entre los casos y su
medoide; diámetro, es decir, la máxima disimilaridad entre dos casos y separación,
mínima distancia entre un caso y un caso de otro cluster.

agric.pam$isolation #si el cluster es aislado o no


agric.pam$diss # Las distancias o disimilaridades

agric.pam$silinfo #ESTO ES PARA SABER CON QUE CALIDAD HEMOS ASIGNADO


UN CASO A UN CLUSTER. Por ejemplo, España, 0,17, se ha quedado a
medias de ser asignado claramente a un grupo.

El valor ## $avg.width
## [1] 0.6314058
Nos dice la anchura media de la silueta del conjunto de los datos.
Se trata de una medida de calidad. Nos dice cómo de similar es un
objeto a su propio clúster (cohesión) en comparación con otros
clústeres (separación). 1: la muestra se parece mucho a sus vecinos y
muy poco a las de otro clúster,

0.71-1 : estructura fuerte. 0.51-0.7: estructura razonable lo demás estructura débil.

 Representacion grafica

plot(agric.pam)
Y la nube de puntos es: (en este caso tenemos dos variables)

#Nube de puntos, los medioides con mayor tamaño


colores=c("red","blue")
plot(agriculture,type="n",main="Casos y medoides")
text(agriculture[-agric.pam$id.med,],
labels=row.names(agriculture)[-agric.pam$id.med],
col=colores[agric.pam$clustering[-agric.pam$id.med]])
grid()
text(agric.pam$medoids,col=c("red","blue"),
label=rownames(agric.pam$medoids),cex=2)

b) ¿Se puede mejorar la solución para algún valor de k entre 3 y 7?


El coeficiente $avg.width nos determina qué solución es la mejor.

listak<- 2:7
s<- numeric(length(listak))
s

# Se realiza el análisis cluster para k=2,3,...7 y se almacena la


anchura media
for (i in 1:length(listak))
{
agric.pam.i<- pam(agriculture,listak[i])
s[i]<- agric.pam.i$silinfo$avg.width
}
s

# Determinación del máximo


max(s)

listak[which.max(s)]

plot(listak,s,type="l",xlab="k",
main="k-medioides",ylab="Silueta media")
xs

Ej. 6. El data frame ruspini de la librería cluster contiene 75 puntos con dos variables x
e y. Comprobar que para estos datos simulados la mejor partición con el método de
los k-medoides corresponde a k=4.

 Representación de las anchuras medias para k-medioides con k=2,…,10,


plot(2:10, sapply(2:10,function(x) pam(ruspini,x)
$silinfo$avg.width ),type="l",xlab="Número de medioides
(k)",ylab="anchura media")

Vemos que el máxImo valor del coeficiente se alcanza cuando k=4.

Guardamos ese dato


rusp.pam<- pam(ruspini,4) #guardamos este caso

plot(rusp.pam) #obtenemos dos plots

 Representación de la nube de puntos donde localizamos además los k medoides

plot(ruspini,main="4-medioides",
col=rusp.pam$clustering)
points(rusp.pam$medoids,pch=10,cex=2.5,col="red")
grid()

Ej. 7. K-medoides cuando n es muy grande.


Hemos dicho que para los kmedoides, usamos la orden pam. No obstante, esta orden
es inviable cuando tenemos n muy grande. Para ello, usamos la orden clara()

clara(x, k, metric = "euclidean", stand = FALSE, samples = 5,


sampsize = min(n, 40 + 2 * k),....)

 x : matriz de datos o data frame.


 k : número de clusters
 metric : distancia o métrica (euclidea o Manhattan)
 stand : (True/False) indicando si las medidas en x están estandarizadas antes de
calcular las diferencias. Las mediciones son estandarizadas para cada variable
(columna), al restar el valor medio y dividir por la desviación absoluta media.
 samples : número de muestras que han de ser seleccionadas aleatoriamente
 sampsize : numero de observaciones en cada muestra

clx3 <- clara(xclara, 3)


plot(clx3)
summary(clx3)
clx3$sample # mejor muestra seleccionada
clx3$medoids # medioides seleccionados
clx3$i.med # índices de los casos seleccionados como medioides

Con “clusinfo” se obtienen una matriz en la que cada fila se refiere a un cluster,y contiene:
 tamaño del cluster;
 disimilaridad máxima y media entre los casos y su medioide;
 diámetro, es decir, la máxima disimilaridad entre dos casos
 separación, mínima dist. entre un caso y un caso de otro cluster.

clx3$clusinfo

Con “silinfo” se obtiene una lista con la información sobre la silueta

clx3$silinfo
Dibujar la nube de puntos distinguiendo el conglomerado mediante colores

plot(xclara, col=clx3$clustering)

Ej. 8 Aplicar el método fanny (método fuzzy, difuso, Fuzzy Analysis Clustering) sobre los datos
agricultura

Se trata de unos coefs ci(i,h) donde i es el caso y h es el clustering asociado, coefs de


pertenencia, prob de que i pertenezca a la clase h.

Queremos minimizar una función., el objetivo es en calcular esos coeficientes de forma que se
minimice la función objetivo y que se maximice la probabilidad de que cada caso sea de un
cluster h.

agric.fan<- fanny(agriculture,2) indicación: tomar 2 siempre.


summary(agric.fan)
el membership coeff nos da la prob de que belgica pertenezca al
conglomerado 1 y al conglomerado 2.

Mientras mas alto sea dunn coef mejor es la calidad de las


asignaciones

You might also like