Maureen Corrales
Gabriel Cordero
Felipe Jiménez
Punto a
Salto máximo
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
modelo1 = hclust(dist(Datos), method = "complete")
plot(modelo1)
# la siguiente instrucción separa los clústeres usando 3
rect.hclust(modelo1, k = 2, border = "red")
Salto mínimo
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
modelo2 = hclust(dist(Datos), method = "single")
plot(modelo2)
rect.hclust(modelo2, k = 2, border = "red")
Promedio
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
modelo3 = hclust(dist(Datos), method = "average")
plot(modelo3)
rect.hclust(modelo3, k = 2, border = "red")
Ward
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
modelo4 = hclust(dist(Datos), method = "ward")
plot(modelo4)
rect.hclust(modelo4, k = 2, border = "red")
# cutree corta el el árbol con k clústeres
Grupo <- cutree(modelo4, k = 2)
NDatos <- cbind(Datos, Grupo)
# Establezco el directorio en donde se quiere grabar el archivo
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
# Se graba el archivo en como un CSV
write.csv(NDatos, "AlgoritmosRecomendacion2.csv")
Punto b
suppressMessages(library(rattle))
suppressMessages(library(ggplot2))
D1 <- dist(Datos, method = "euclidean")
ClusterWard = hclust(D1, method = "ward")
centros <- centers.hclust(Datos, ClusterWard, nclust = 2, use.median = FALSE)
rownames(centros) <- c("Cluster1", "Cluster2")
atributo <- c("Velocidad.Entrega", "Precio", "Durabilidad", "Imagen.Producto",
"Valor.Educativo", "Servicio.Retorno", "Tamano.Paquete", "Calidad.Producto",
"Numero.Estrella")
cluster1 <- cbind(cbind(centros[1, ], "1"), atributo)
cluster2 <- cbind(cbind(centros[2, ], "2"), atributo)
clusters <- rbind(cluster1, cluster2)
colnames(clusters) <- c("Centro", "Cluster", "Atributo")
rownames(clusters) <- c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17", "18")
clusters <- as.data.frame(clusters)
clusters$Centro <- as.numeric(as.character(clusters$Centro))
g1 <- ggplot(data = clusters, aes(x = Atributo, y = Centro, colour = Cluster,
fill = Cluster)) + geom_bar(stat = "identity", position = "dodge") + scale_colour_brewer() +
ggtitle("Distribución de los Atributos por Cluster") + theme(text = element_text(size = 12,
face = "italic")) + labs(x = "Atributo", y = "Centro") + ylim(0, 5)
g1
Interpretación: El gráfico muestra los valores promedios para cada cluster en los atributos evaluados por los clientes. En general, el cluster 2 tiene mayores evaluaciones de los atributos, solamente en el atributo “tamaño del paquete” el cluster 1 tiene una mayor evaluación. La variable precio es la de menor evaluación con valores similares en ambos clusters y la durabilidad es la caracterí???stica con mayores valores en el cluster 2 y la segunda en el cluster 1.
Punto c
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", )
modelo5 = hclust(dist(Datos), method = "ward")
## Warning: NAs introduced by coercion
plot(modelo5)
rect.hclust(modelo5, k = 4, border = "red")
D1 <- dist(Datos, method = "euclidean")
## Warning: NAs introduced by coercion
ClusterWard = hclust(D1, method = "ward")
GrupoWard4 <- cutree(ClusterWard, k = 4)
RECWARD4 <- cbind(Datos, GrupoWard4)
tail(RECWARD4)
## X Velocidad.Entrega Precio Durabilidad Imagen.Producto
## 95 Theodore 2.00 0.25 3.35 2.25
## 96 Teofan 0.30 0.80 3.20 2.50
## 97 Teofil 3.05 0.25 4.60 2.40
## 98 Teofila 1.00 1.40 2.60 2.50
## 99 Teon 1.55 1.10 3.35 3.40
## 100 Teresa 1.25 0.90 4.50 2.50
## Valor.Educativo Servicio.Retorno Tamano.Paquete Calidad.Producto
## 95 2.2 2.1 2.50 2.00
## 96 0.7 2.1 4.20 1.70
## 97 3.3 2.8 3.55 2.60
## 98 2.4 2.7 4.20 1.85
## 99 2.6 2.9 4.20 2.15
## 100 2.2 3.0 3.00 2.20
## Numero.Estrellas GrupoWard4
## 95 1.6 1
## 96 1.0 2
## 97 4.5 4
## 98 2.3 2
## 99 2.7 2
## 100 1.8 1
# Grupos de Teresa, Leo y Justin
TERESA <- RECWARD4[100, 11]
LEO <- RECWARD4[52, 11]
JUSTIN <- RECWARD4[44, 11]
TERESA
## [1] 1
LEO
## [1] 3
JUSTIN
## [1] 4
GrupoWard <- cutree(ClusterWard, k = 2)
RECWARD <- cbind(Datos, GrupoWard)
RECOMIENDA_TERESA <- subset(RECWARD[, 1], GrupoWard4 == 1)
RECOMIENDA_LEO <- subset(RECWARD[, 1], GrupoWard4 == 3)
RECOMIENDA_JUSTIN <- subset(RECWARD[, 1], GrupoWard4 == 4)
RECOMIENDA_TERESA
## [1] Adam Marisol Irene Isabelle Evdokia Fedir Ivan
## [8] Lesia Lydia Monica Theodore Teresa
## 100 Levels: Adam Anna Bernard Edward Emilia Eugene Eugenia Eunice ... Xavier
RECOMIENDA_LEO
## [1] Bernard Gabriel Henry Felix Helen
## [6] Hilary Jervis Leo Louise Magdalyna
## [11] Maksym Maria Markian Martin Maya
## [16] Maximillian Mina Salome Sarah Sebastian
## [21] Susanna Sylvester
## 100 Levels: Adam Anna Bernard Edward Emilia Eugene Eugenia Eunice ... Xavier
RECOMIENDA_JUSTIN
## [1] Emilia Philip Xavier Isidore Joseph Eugenia Eunice
## [8] Eva Flavia Flora Florence Hannah Lourdes Josephine
## [15] Judith Justin Larissa Lawrence Leonard Leonid Marcel
## [22] Margaret Marian Marianna Maryna Maura Melania Methodius
## [29] Michael Mykyta Myroslav Myroslava Stephania Sylvan Teofil
## 100 Levels: Adam Anna Bernard Edward Emilia Eugene Eugenia Eunice ... Xavier
Recomendación de los más cercanos según gráfico: en el caso de Teresa le recomendaríamos comprar productos similares a los que compra Marisol o Isabelle; a Leo le recomendaríamos productos como los de María o Maya; mientras que a Justin le recomendaríamos comprar similares a las de Joseph, Methodius, Hannan o Mykyta. Las listas anteriores corresponden a todos los individuos del cluster al que pertenecen.
Punto d
suppressMessages(library(stats))
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
analisis <- prcomp(Datos)
biplot(analisis)
Punto e
suppressMessages(library(FactoMineR))
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
modelo6 <- PCA(Datos, scale.unit = TRUE, ncp = 5, graph = FALSE)
plot(modelo6, axes = c(1, 2), choix = "ind", col.ind = "red", new.plot = TRUE,
select = "cos2 0.2")
plot(modelo6, axes = c(1, 2), choix = "var", col.var = "blue", new.plot = TRUE,
select = "cos2 0.55")
Punto f
suppressMessages(library(FactoMineR))
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",", row.names = 1)
modelo7 <- PCA(Datos, scale.unit = TRUE, ncp = 5, graph = FALSE)
modelo7.hcpc <- HCPC(modelo7, nb.clust = -1, consol = TRUE, min = 2, max = 4,
graph = FALSE)

Punto a
# install.packages('cluster',dependencies=TRUE)
suppressMessages(library(cluster))
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
Datos <- read.csv("VotosCongresoUS.csv", header = TRUE, sep = ",", dec = ".")
D <- daisy(Datos, metric = "euclidean")
## Warning: with mixed variables, metric "gower" is used automatically
jer <- hclust(D, method = "complete")
plot(jer)
rect.hclust(jer, k = 4, border = "red")
Punto b
grupo <- cutree(jer, k = 3) # Genera un corte al cluster de tamaño 3.
NDatos <- cbind(Datos, grupo) # Genera una matriz que le incluye el grupo anterior al set de datos.
cluster <- NDatos$grupo # Agrega una columna llamada cluster al set de datos anterior.
sel.cluster1 <- match(cluster, c(1), 0) # Identifica los registros del Cluster 1.
Datos.Cluster1 <- NDatos[sel.cluster1 > 0, ] # Selecciona los registros del Cluster 1.
dim(Datos.Cluster1) # Muestra la dimensión de la matriz.
## [1] 232 18
sel.cluster2 <- match(cluster, c(2), 0) # Identifica los registros del Cluster 2.
Datos.Cluster2 <- NDatos[sel.cluster2 > 0, ] # Selecciona los registros del Cluster 2.
dim(Datos.Cluster2) # Muestra la dimensión de la matriz.
## [1] 198 18
sel.cluster3 <- match(cluster, c(3), 0) # Identifica los registros del Cluster 2.
Datos.Cluster3 <- NDatos[sel.cluster3 > 0, ] # Selecciona los registros del Cluster 2.
dim(Datos.Cluster3) # Muestra la dimensión de la matriz.
## [1] 5 18
plot(Datos$Party, col = c(4, 6), las = 2, main = "Party", xlab = "Todos los Datos")
plot(Datos.Cluster1$Party, col = c(4, 6), las = 2, main = "Party", xlab = "Cluster-1")
plot(Datos.Cluster2$Party, col = c(4, 6), las = 2, main = "Party", xlab = "Cluster-2")
plot(Datos.Cluster3$Party, col = c(4, 6), las = 2, main = "party", xlab = "Cluster-3")
Interpretación: El cluster 1 es el segmento más grande, en donde predominan los demócratas, en más de 100 registros respecto a los republicanos.El cluster 3 esta compuesto por prácticamente registros demócratas y su tamaño no es despreciable. El cluster 2, el segundo en tamaño predominan los republicanos, mientras que el cluster 4 es el más pequeño de todos los clusters con 5 registros.
\[ D = \begin{bmatrix} 0 \\ 5 & 0 \\ 2 & 1 & 0 \\ 3 & 7 & 6 & 0 \end{bmatrix} \]
Salto máximo
De la matriz D (original) que tiene orden A1, A2, A3, A4, el mínimo es \( {A2,A3} \) = 1, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 5 & 0 \\ 3 & 7 & 0 \end{bmatrix} \]
De la anterior que tiene orden A1, A2A3 y A4, el mínimo es \( {A1,A4} \) = 3, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 7 & 0 \end{bmatrix} \]
Uniéndose de último A1A4 con A2A3 a una disimilitud de 7. El dendograma es el siguiente:
Al verificarlo con la función hclust, se obtiene:
d <- matrix(c(0, 5, 2, 3, 5, 0, 1, 7, 2, 1, 0, 6, 3, 7, 6, 0), nrow = 4, ncol = 4)
as.dist(d)
## 1 2 3
## 2 5
## 3 2 1
## 4 3 7 6
# method = agregación del Salto Máximo
modelo = hclust(as.dist(d), method = "complete")
plot(modelo)
Promedio
De la matriz D (original) que tiene orden A1, A2, A3, A4, el mínimo es \( {A2,A3} \) = 1, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 3,5 & 0 \\ 3 & 6,5 & 0 \end{bmatrix} \]
De la anterior que tiene orden A1, A2A3 y A4, el mínimo es \( {A1,A4} \) = 3, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 5 & 0 \end{bmatrix} \]
Uniéndose de último A1A4 con A2A3 a una disimilitud de 5. El dendograma es el siguiente:
Al verificarlo con la función hclust, se obtiene:
d <- matrix(c(0, 5, 2, 3, 5, 0, 1, 7, 2, 1, 0, 6, 3, 7, 6, 0), nrow = 4, ncol = 4)
as.dist(d)
## 1 2 3
## 2 5
## 3 2 1
## 4 3 7 6
# method = agregación del Salto promedio
modelo = hclust(as.dist(d), method = "average")
plot(modelo)
\[ S = \begin{bmatrix} 1 \\ 0,10 & 1 \\ 0,42 & 0,63 & 1 \\ 0,54 & 0,46 & 0,41 & 1 \\ 0,35 & 0,98 & 0,85 & 0,73 & 1 \end{bmatrix} \]
Si hacemos:
\[ d(i,j) = 1 - s(i,j) \]
Entonces,
\[ D = \begin{bmatrix} 0 \\ 0,90 & 0 \\ 0,58 & 0,37 & 0 \\ 0,46 & 0,54 & 0,59 & 0 \\ 0,65 & 0,02 & 0,15 & 0,27 & 0 \end{bmatrix} \]
Salto mínimo
De la matriz D (original) que tiene orden A1, A2, A3, A4 y A5, el mínimo es \( {A2,A5} \) = 0,02, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 0,65 & 0 \\ 0,58 & 0,15 & 0 \\ 0,46 & 0,27 & 0,59 & 0 \end{bmatrix} \]
De la anterior que tiene orden A1, A2A5, A3 y A4, el mínimo es \( {A2A5,A3} \) = 0,15, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 0,58 & 0 \\ 0,46 & 0,27 & 0 \end{bmatrix} \]
De la anterior que tiene orden A1, A2A5A3 y A4, el mínimo es \( {A2A5A3,A4} \) = 0,27, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 0,46 & 0 \end{bmatrix} \]
Uniéndose de último A1 con A2A5A3A4 a una disimilitud de 0,46. El dendograma es el siguiente:
Al verificarlo con la función hclust, se obtiene:
ejemplo <- matrix(c(0, 0.9, 0.58, 0.46, 0.65, 0.9, 0, 0.37, 0.54, 0.02, 0.58,
0.37, 0, 0.59, 0.15, 0.46, 0.54, 0.59, 0, 0.27, 0.65, 0.02, 0.15, 0.27,
0), 5, 5)
modelo = hclust(dist(ejemplo), method = "single")
plot(modelo)
Salto máximo
De la matriz D (original) que tiene orden A1, A2, A3, A4, A5, el mínimo es \( {A2,A5} \) = 0,02, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 0,90 & 0 \\ 0,58 & 0,37 & 0 \\ 0,46 & 0,54 & 0,59 & 0 \end{bmatrix} \]
De la anterior que tiene orden A1, A2A5, A3 y A4, el mínimo es \( {A2A5,A3} \) = 0,37, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 0,90 & 0 \\ 0,46 & 0,59 & 0 \end{bmatrix} \]
De la anterior que tiene orden A1, A2A5A3 y A4, el mínimo es \( {A1,A4} \) = 0,46, por consiguiente:
\[ D = \begin{bmatrix} 0 \\ 0,90 & 0 \end{bmatrix} \]
Uniéndose de último A1A4 con A2A5A3 a una disimilitud de 0,9. El dendograma es el siguiente:
Al verificarlo con la función hclust, se obtiene:
ejemplo <- matrix(c(0, 0.9, 0.58, 0.46, 0.65, 0.9, 0, 0.37, 0.54, 0.02, 0.58,
0.37, 0, 0.59, 0.15, 0.46, 0.54, 0.59, 0, 0.27, 0.65, 0.02, 0.15, 0.27,
0), 5, 5)
modelo = hclust(dist(ejemplo), method = "complete")
plot(modelo)
Punto a
La distancia de Chebyshev definida como:
\[ d(i,j) = max |x_{ik} - x_{jk}| \text{para k=1, 2, ..., p} \]
Criterios basados en distancias como indicadores de disimilaridad
Se da, en general, el nombre de distancia o disimilaridad entre dos individuos i y j a una medida, indicada por d(i,j) , que mide el grado de semejanza, o a mejor decir de desemejanza, entre ambos objetos o individuos, en relación a un cierto número de características cuantitativa y / o cualitativas. El valor de d(i,j) es siempre un valor no negativo, y cuanto mayor sea este valor mayor será la diferencia entre los individuos i y j.
Toda distancia debe verificar, al menos, las siguientes propiedades:
(P.1) d(i,j) > 0 (no negatividad), valor obsoluto garantiza no negatividad
(P.2) d(i,i) = 0 , la diferencia del mismo punto es cero
(P.3) d(i,j) = d(j,i) (simetría), sí existe simetría
Fuente: http://www.uv.es/ceaces/multivari/cluster/criterios_de_similitud.htm
Punto b
cheby <- function(v1, v2) {
return(max(abs(v1 - v2)))
}
# Validación
v1 <- c(4, 6, 7, 8, 10)
v2 <- c(6, 20, 10, 16, 1)
cheby(v1, v2)
## [1] 14
Punto c
DF <- matrix(c(0, 1, 2, 3, 4, 5, 6, 7, 8), 3, 3, byrow = T)
dist.matriz.cheby <- function(M) {
n <- dim(M)[1]
m <- dim(M)[2]
D <- matrix(0, nrow = n, ncol = n)
for (i in 1:n) {
for (j in 1:n) {
D[i, j] <- cheby(M[i, ], M[j, ])
}
}
rownames(D) <- rownames(M)
colnames(D) <- rownames(M)
return(as.dist(D))
}
D2 <- dist.matriz.cheby(DF)
D2
## 1 2
## 2 3
## 3 6 3
DF
## [,1] [,2] [,3]
## [1,] 0 1 2
## [2,] 3 4 5
## [3,] 6 7 8
Punto d
setwd("C:/Users/Usuario/Desktop/Datos_Mineria")
REC = read.table("EjemploAlgoritmosRecomendacion.csv", header = TRUE, sep = ";",
dec = ",")
Clustercheby = hclust(dist.matriz.cheby(REC[, c(2:10)]), method = "ward")
Clustercheby
##
## Call:
## hclust(d = dist.matriz.cheby(REC[, c(2:10)]), method = "ward")
##
## Cluster method : ward
## Number of objects: 100
pcheby <- plot(Clustercheby)
# la siguiente instrucción separa los clusteres usando 2
rect.hclust(Clustercheby, k = 2, border = "red")
GrupoCheby <- cutree(Clustercheby, k = 2)
RECCheby <- cbind(REC, GrupoWard)
# Comparación con distancia euclediana
pward <- plot(ClusterWard)
rect.hclust(ClusterWard, k = 2, border = "red")
Se puede observar que la distancia euclídea genera dos grupos de un tamaño más similar que la distancia de Chebyshev, que genera un grupo claramente de mayor tamaño.