SP 1666 MINERÍA DE DATOS

TAREA NښMERO 3

INTEGRANTES

SOLUCIONES

1. Usando los datos EjemploAlgoritmosRecomendación.csv se va a definir un conglomerado para recomendarle a un cliente qué productos comprar según el grupo al que pertenece.

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")

plot of chunk Ejercicio 1.Amax

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")

plot of chunk Ejercicio 1.Amin

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")

plot of chunk Ejercicio 1.Aprom

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")

plot of chunk Ejercicio 1.Award


# 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

plot of chunk Ejercicio 1.B

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")

plot of chunk Ejercicio 1.C


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)

plot of chunk Ejercicio 1.D

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 of chunk Ejercicio 1.E

plot(modelo6, axes = c(1, 2), choix = "var", col.var = "blue", new.plot = TRUE, 
    select = "cos2 0.55")

plot of chunk Ejercicio 1.E

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)

alt text alt text alt text

2. Usando los datos VotosCongresoUS.cvs.

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")

plot of chunk Ejercicio 2.A

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 of chunk Ejercicio 2.B

plot(Datos.Cluster1$Party, col = c(4, 6), las = 2, main = "Party", xlab = "Cluster-1")

plot of chunk Ejercicio 2.B

plot(Datos.Cluster2$Party, col = c(4, 6), las = 2, main = "Party", xlab = "Cluster-2")

plot of chunk Ejercicio 2.B

plot(Datos.Cluster3$Party, col = c(4, 6), las = 2, main = "party", xlab = "Cluster-3")

plot of chunk Ejercicio 2.B

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.

3. Usando la matriz de disimilitudes entre 4 individuos, construir a mano una jerarquí binaria usando la agregación de salto máximo y de promedio, dibujar el dendograma y luego verificar con hclust.

\[ 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:

alt text

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)

plot of chunk unnamed-chunk-1

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:

alt text

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)

plot of chunk unnamed-chunk-2

4. Usando la matriz de similitudes de 5 individuos, construir a mano una jerarquía binaria usando agregación del salto mínimo y salto máximo, dibujar los dendogramas y luego verificarlo con hclust.

\[ 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:

alt text

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)

plot of chunk unnamed-chunk-3

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:

alt text

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)

plot of chunk unnamed-chunk-4

5. Distancia de Chebyshev.

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")

plot of chunk Ejercicio 5.D


GrupoCheby <- cutree(Clustercheby, k = 2)
RECCheby <- cbind(REC, GrupoWard)

# Comparación con distancia euclediana

pward <- plot(ClusterWard)
rect.hclust(ClusterWard, k = 2, border = "red")

plot of chunk Ejercicio 5.D

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.