Cargar librerías y conjunto de datos

library(ggplot2)
data(mpg)
head(mpg)
## # A tibble: 6 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 audi         a4      1.8  1999     4 auto(~ f        18    29 p     comp~
## 2 audi         a4      1.8  1999     4 manua~ f        21    29 p     comp~
## 3 audi         a4      2    2008     4 manua~ f        20    31 p     comp~
## 4 audi         a4      2    2008     4 auto(~ f        21    30 p     comp~
## 5 audi         a4      2.8  1999     6 auto(~ f        16    26 p     comp~
## 6 audi         a4      2.8  1999     6 manua~ f        18    26 p     comp~
str(mpg)
## Classes 'tbl_df', 'tbl' and 'data.frame':    234 obs. of  11 variables:
##  $ manufacturer: chr  "audi" "audi" "audi" "audi" ...
##  $ model       : chr  "a4" "a4" "a4" "a4" ...
##  $ displ       : num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int  4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr  "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr  "f" "f" "f" "f" ...
##  $ cty         : int  18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int  29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr  "p" "p" "p" "p" ...
##  $ class       : chr  "compact" "compact" "compact" "compact" ...

Crear un subset para un año específico (2008)

mpg2008 <- subset(mpg,mpg$year == 2008)
mpg2008 <- mpg2008[complete.cases(mpg2008),]
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 audi         a4      2    2008     4 manua~ f        20    31 p     comp~
## 2 audi         a4      2    2008     4 auto(~ f        21    30 p     comp~
## 3 audi         a4      3.1  2008     6 auto(~ f        18    27 p     comp~

Generar identificador de filas

# # crear columna con secuencia de números
mpg2008$ID <- seq(1,nrow(mpg2008))
# # pegar la marca al numero de sequencia creado 
mpg2008$ID <- do.call(paste0,mpg2008[c(1,12)])
# renombrar las filas
rownames(mpg2008) <- mpg2008$ID
# mostar las primeros 3 filas
head(mpg2008,3)
## # A tibble: 3 x 12
##   manufacturer model displ  year   cyl trans drv     cty   hwy fl    class
##   <chr>        <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
## 1 audi         a4      2    2008     4 manu~ f        20    31 p     comp~
## 2 audi         a4      2    2008     4 auto~ f        21    30 p     comp~
## 3 audi         a4      3.1  2008     6 auto~ f        18    27 p     comp~
## # ... with 1 more variable: ID <chr>

Normalizar variables numéricas

# duplico el dataset
mpg2008N <- mpg2008
# Normalizar columnas numericas
mpg2008N[,c(3,5,8,9)] <- scale(mpg2008[,c(3,5,8,9)])
# mostar las primeros 3 filas
head(mpg2008N,3)
## # A tibble: 3 x 12
##   manufacturer model  displ  year     cyl trans drv     cty   hwy fl   
##   <chr>        <chr>  <dbl> <int>   <dbl> <chr> <chr> <dbl> <dbl> <chr>
## 1 audi         a4    -1.28   2008 -1.26   manu~ f     0.813 1.29  p    
## 2 audi         a4    -1.28   2008 -1.26   auto~ f     1.06  1.12  p    
## 3 audi         a4    -0.432  2008 -0.0515 auto~ f     0.320 0.607 p    
## # ... with 2 more variables: class <chr>, ID <chr>

Generar identificador de filas para datset escalado

# 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

Calcular distancias (euclidianas)

matrizDistancias <- dist(mpg2008N)

# visualiza los valores de la matriz de distancias
# head(data.matrix(matriz_dist),3)

library(reshape2)
matrizLong <- melt(data.matrix(matrizDistancias))
head(matrizLong)
##    Var1  Var2     value
## 1 audi1 audi1 0.0000000
## 2 audi2 audi1 0.4648124
## 3 audi3 audi1 2.6291275
## 4 audi4 audi1 0.7947403
## 5 audi5 audi1 1.1263825
## 6 audi6 audi1 3.0075324
plot <- ggplot(matrizLong, aes(x=Var1, y=Var2, fill=value)) 
plot <- plot + geom_tile()
plot <- plot + scale_fill_viridis_c()
plot <- plot + theme(axis.text.x = element_text(angle = 90))
plot

Agrupamiento jerárquico

# hace el agrupamiento jerárquico
hc2008 <- hclust(matrizDistancias)
# Construye la gráfica. Si no tiene la librearía instalada instale 'ggdendro'
library(ggdendro)
p <- ggdendrogram (hc2008, rotate=TRUE, size=2)
p