Importando Librerias
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.0.5
Para simplificar, seleccionamos un subconjunto del año que desee trabajar y seleccione únicamente los casos completos del conjunto de datos. En casos de registros incompletos el algoritmo de clusterización podrá lanzar errores o excepciones.
# subset por año
mpg2008 <- subset(mpg,mpg$year == 1999 & mpg$class=="suv")
# seleccionar casos con datos en todas las columnas
mpg2008 <- mpg2008[complete.cases(mpg2008),]
# mostar las primeros 3 filas
head(mpg2008,3)
## # A tibble: 3 x 11
## manufacturer model displ year cyl trans drv cty hwy fl class
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 chevrolet c1500 sub~ 5.7 1999 8 auto(~ r 13 17 r suv
## 2 chevrolet k1500 tah~ 5.7 1999 8 auto(~ 4 11 15 r suv
## 3 chevrolet k1500 tah~ 6.5 1999 8 auto(~ 4 14 17 d suv
Nuestro conjunto de datos tiene columnas numéricas en varios órdenes de magnitud. Estas diferencias pueden impactar el cálculo de la distancia, porque los órdenes de magnitud menores no tendran tanto impacto como los mayores. Para esto es conveniente normalizar los valores. La función scale() normaliza por defecto cada columna relativa a su desviacion estandar. Esta función también tiene otras formas de normalizar.
# duplico el dataset
mpg2008N <- mpg2008
# Normalizar columnas numericas
mpg2008N[,c(3,5,8,9)] <- scale(mpg2008[,c(3,5,8,9)])
# crear columna con secuencia de números
mpg2008N$ID <- seq(1,nrow(mpg2008N))
# pegar la marca al numero de sequencia creado
mpg2008N$ID <- do.call(paste0,mpg2008N[c(1,12)])
# renombrar las filas
rownames(mpg2008N) <- mpg2008N$ID
## Warning: Setting row names on a tibble is deprecated.
# mostar las primeros 3 filas
str(mpg2008N,3)
## tibble [29 x 12] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:29] "chevrolet" "chevrolet" "chevrolet" "dodge" ...
## $ model : chr [1:29] "c1500 suburban 2wd" "k1500 tahoe 4wd" "k1500 tahoe 4wd" "durango 4wd" ...
## $ displ : num [1:29] 1.262 1.262 1.997 -0.393 0.802 ...
## $ year : int [1:29] 1999 1999 1999 1999 1999 1999 1999 1999 1999 1999 ...
## $ cyl : num [1:29] 0.853 0.853 0.853 -0.521 0.853 ...
## $ trans : chr [1:29] "auto(l4)" "auto(l4)" "auto(l4)" "auto(l4)" ...
## $ drv : chr [1:29] "r" "4" "4" "4" ...
## $ cty : num [1:29] -0.18 -1.127 0.294 -0.18 -1.127 ...
## $ hwy : num [1:29] -0.23 -1.064 -0.23 -0.23 -0.647 ...
## $ fl : chr [1:29] "r" "r" "d" "r" ...
## $ class : chr [1:29] "suv" "suv" "suv" "suv" ...
## $ ID : chr [1:29] "chevrolet1" "chevrolet2" "chevrolet3" "dodge4" ...
Compute las distancias (euclidiana por defecto), construya el objeto hclust y grafíquelo preliminarmente
# Calcula las distancias
matrizDistancias <- dist(mpg2008N)
## Warning in dist(mpg2008N): NAs introducidos por coerción
# visualiza los valores de la matriz de distancias
# head(data.matrix(matrizDistancias),3)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.0.5
# convierte el formato del dataframe de wide a long
matrizLong <- melt(data.matrix(matrizDistancias))
# head(matrizLong)
# Usamos ggplot para creat un heatmap
plot <- ggplot(matrizLong, aes(Var1, Var2, fill=value))
plot <- plot + geom_tile()
plot <- plot + scale_fill_viridis_c(option="inferno")
plot <- plot + theme(axis.text.x = element_text(angle = 90, size = 6) , axis.text.y = element_text(size = 6))
plot
La funcion hclust() de R hace el trabajo de agrupamiento. hclust() tiene varios algoritmos de agrupamiento jerárquico y métodos para calcular la distancia entre elementos. La distancia se calcula entre atributos numéricos de los elementos. Para información del objeto que retorna hclust() y las formas de cálculo de distancias digite ?hclust en la consola.
# hace el agrupamiento jerárquico
hc2008 <- hclust(matrizDistancias)
# Construye la gráfica. Si no tiene la librería instalada instale 'ggdendro' Ver: https://cran.r-project.org/web/packages/ggdendro/vignettes/ggdendro.html
library(ggdendro)
## Warning: package 'ggdendro' was built under R version 4.0.5
p <- ggdendrogram (hc2008, rotate=TRUE, size=2)
p