Graficos de mosaicos

Su funcion es resumir las probabilidades condicionadas a las coocurrencias de diferentes variables categoricas en una lista de registros de la misma longitud.

Haremos uso de la libreria stats y el dataset “mtcars”:

library(stats)
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Ahora miraremos las variables categorias cruzadas entre ellas para ver que informacion nos dan:

mosaicplot(~gear + carb, # introducimos las variables que queremos cruzar
           data = mtcars, 
           color = 2:7, # vector de colores, si se pone color = T, queda en banco y negro. 
           las = 1) # estilo de los ejes

Este grafico nos representa el tipo de carburador en relacion a los coches de 3 marchas, 4, 5 ….

Paquete treemaps

Este paquete utiliza una visualizacion basado en el area que ocupa el dibujo para representar informacion jerarquica, a traves de figuras anidadas las unas dentro de las otras, donde el tamano de cada figura representa un valor metrico. Por lo tanto una caja mas grande significa mas ocurrencias.

library(treemap)

Primero crearemos un dataset con diferentes ramas, es decir, valores y subvalores.

(branch <- c(rep("branch-1",4), rep("branch-2", 2), rep("branch-3", 3)))
## [1] "branch-1" "branch-1" "branch-1" "branch-1" "branch-2" "branch-2"
## [7] "branch-3" "branch-3" "branch-3"
(subbranch <- paste("subbranch", c(1,2,3,4,1,2,1,2,3), sep = "-"))
## [1] "subbranch-1" "subbranch-2" "subbranch-3" "subbranch-4" "subbranch-1"
## [6] "subbranch-2" "subbranch-1" "subbranch-2" "subbranch-3"
values = c(15, 4, 22, 13, 11, 8, 6, 1, 25) # tienen que haber 9 areas (valores)

data <- data.frame(branch, subbranch, values) # creamos  un dataset

Visualizamos la informacion del dataset:

treemap(data, index = c("branch","subbranch"),
        vSize = "values", type = "index")

Este grafico nos muestra el area que es proporcional a cada una de las subramas.

Ejemplos de analisis posts:

posts <- read.csv("../DataSets/post-data.csv")
head(posts)
##     id  views comments               category
## 1 5019 148896       28 Artistic Visualization
## 2 1416  81374       26          Visualization
## 3 1416  81374       26               Featured
## 4 3485  80819       37               Featured
## 5 3485  80819       37                Mapping
## 6 3485  80819       37           Data Sources

Podriamos juntar la categoria por un lado con el numero de visualizaciones por el otro. El volumen de la caja sera “Views”

treemap(posts, index = c("category","comments"),
        vSize = "views", type = "index")

Graficos con matrices de correlación

Una matriz de correlación se utiliza para investigar als dependencia entre multibles variables a la vez. El resultado de la tabla contiene los coeficientes de correlacion entre las diferentes variables que conforman el dataframe, nos ayuda a entender la relacion entre ellas. Con este grafico podemos seleccionar las variables relevantes y el eliminar aquellas que son redundantes, que tienen covariancia.

library(corrplot)
## corrplot 0.84 loaded
mtcars <- read.csv("../DataSets/mtcars.csv")

Vamos a calcular los coefficientes de correlacion para cada par de columnas con la funcion corr(). Podemos usar diferentes metodos para calcular la correlacion (pearson, …) y se pueden asignar como parametro dentro de la funcion.

# Eliminamos las variables que no sean numericas
mtcars$X <- NULL
# Buscamos la correlacion
mtcars.cor <- cor(mtcars, method = "pearson")
round(mtcars.cor,2)
##        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
## mpg   1.00 -0.85 -0.85 -0.78  0.68 -0.87  0.42  0.66  0.60  0.48 -0.55
## cyl  -0.85  1.00  0.90  0.83 -0.70  0.78 -0.59 -0.81 -0.52 -0.49  0.53
## disp -0.85  0.90  1.00  0.79 -0.71  0.89 -0.43 -0.71 -0.59 -0.56  0.39
## hp   -0.78  0.83  0.79  1.00 -0.45  0.66 -0.71 -0.72 -0.24 -0.13  0.75
## drat  0.68 -0.70 -0.71 -0.45  1.00 -0.71  0.09  0.44  0.71  0.70 -0.09
## wt   -0.87  0.78  0.89  0.66 -0.71  1.00 -0.17 -0.55 -0.69 -0.58  0.43
## qsec  0.42 -0.59 -0.43 -0.71  0.09 -0.17  1.00  0.74 -0.23 -0.21 -0.66
## vs    0.66 -0.81 -0.71 -0.72  0.44 -0.55  0.74  1.00  0.17  0.21 -0.57
## am    0.60 -0.52 -0.59 -0.24  0.71 -0.69 -0.23  0.17  1.00  0.79  0.06
## gear  0.48 -0.49 -0.56 -0.13  0.70 -0.58 -0.21  0.21  0.79  1.00  0.27
## carb -0.55  0.53  0.39  0.75 -0.09  0.43 -0.66 -0.57  0.06  0.27  1.00

La correlacion puede ir de 1 a -1. Cuando mas grande, mas positiva a 1 es, o mas pequena, mas negativa a 1 es, mayor es la relacion entre las variables.

Si es positiva, es directamente propocional en el momento que es 1, o bien negativa, es inversamente proprcional.

Si es cercana a 0 nos indica que no has apenas correlacion entre esas dos variables.

Como ver la correlacion graficamente para identificar rapidamente las variables que nos interessan:

corrplot(mtcars.cor)

Representacion en cuadrados:

corrplot(mtcars.cor, method = "shade", shade.col = NA,
         tl.col = "black", tl.srt = 45) # el parametro tl.srt nos permite dar una inclinacion de 45 grados a los titulares, method igual a shade nos proporciona las formas cuadradas, tl.col color negro. 

Vamos a definir una paleta de colores mas suave para modificar el grafico:

col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF",
                          "#77AADD","#4477AA"))
corrplot(mtcars.cor, method = "shade", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "AOE", type = "lower", diag = F, addshade = "all") # col de colores nos expandira hasta 200 colores con las gamas usadas

Otros ejemplos:

corrplot(mtcars.cor, method = "circle", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "AOE", type = "upper", diag = F, addshade = "all")

corrplot(mtcars.cor, method = "ellipse", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "AOE", type = "upper", diag = F, addshade = "all")

corrplot(mtcars.cor, method = "pie", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "AOE", type = "upper", diag = F, addshade = "all")

corrplot(mtcars.cor, method = "square", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "AOE", type = "upper", diag = F, addshade = "all")

El parametr order dentro del corrplot() nos permitirias seguir diferente orden. El estandar es AOE, angluar ordered agent vectors, ye las ordena de as mas correlacionadas a las menos, como en los casos anteriories. O usando FPC, de fisrt principle component:

corrplot(mtcars.cor, method = "square", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "FPC", type = "upper", diag = F, addshade = "all")

O por se puede usar “hclust”, ordenandolo por clusters jerarquicos:

corrplot(mtcars.cor, method = "square", shade.col = NA, tl.col = "black",
         tl.srt = 45, col = col(200), addCoef.col = "black", addcolorlabel = "no",
         order = "hclust", type = "upper", diag = F, addshade = "all")

Tambien se pueden visualizar matrices de correlacion con la libreria ggplot2:

library(reshape2)
library(ggplot2)
mtcars.melted <- melt(mtcars.cor) # fundimos los datos 
head(mtcars.melted)
##   Var1 Var2      value
## 1  mpg  mpg  1.0000000
## 2  cyl  mpg -0.8521620
## 3 disp  mpg -0.8475514
## 4   hp  mpg -0.7761684
## 5 drat  mpg  0.6811719
## 6   wt  mpg -0.8676594
ggplot(data = mtcars.melted, aes(Var1, Var2, fill = value)) +
  geom_tile()

Agregando tonalidades a las matrices de color

Vamos a usar el paquete ggplot2 para mejorar la visualizacion de nuestra matriz de correlacion. Seguimos con el ejemplo anterior para representar una matriz junto con un heat map:

Usaremos dos funciones que nos ayudaran mucho:

get_lower_triangle <- function(cormal){ # obtener triangulo inferior que dado una matriz de correlacion me obtenra el triangulo inferior
  cormat[upper.tri(cormat)] <- NA # Ponemos en NA el triangulo superior
  return(cormat)
} 

get_upper_triangle <- function(cormat){ # lo mismo que la anterior per con el triangulo superior
  cormat[lower.tri(cormat)] <- NA
  return(cormat)
}

reorder_cormat <- function(cormat){ 
  dd <- as.dist((1-cormat)/2) # correlacion entre variables como factor de distancia, usamos esta formula para que siempre sean positivos, ademas cuando son 100% correlacionadas la distancia es 0, ya sea 1 o -1
  hc <- hclust(dd)  # creamos un cluster jerarquico
  cormat <- cormat[hc$order, hc$order] # suscribimos la matrix de correlacion original
}

Vamos a aplicar las funciones que hemos creado:

# reaordenamos en base al clustering de la informacion
cormat <- reorder_cormat(mtcars.cor)
cormat.ut <- get_upper_triangle(cormat)

cormat.ut.melted <- melt(cormat.ut, na.rm = TRUE)

Representamos la informacion:

ggplot(cormat.ut.melted, aes(Var2, Var1, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1), space = "Lab", name = "Pearson\nCorrelation")+
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, size = 12, hjust = 1)) +
  coord_fixed()

Podemos ver que estan agrupadas las variables que estan mas correlacionadas enentre ellas.

Heatmap para la informacion geoespacial

Vamos a crear un mapa de calor con el siguiente dataset:

# en caso de publicar l ainformacion de google maps siempre se debe citar
#install.packages(c("ggmap", "maps"))
library(ggmap)
tartu.data <- read.csv("../DataSets/tartu_housing.csv",
                       sep = ";") 

Vamos a hacer un mapa de tartu para ver como pintaremos toda la informacion:

tartu.map <- get_map(location = "tartu",
                     maptype = "satellite",
                     zoom = 12)

# Pintamos el mapa
ggmap(tartu.map, extent = "device")

Anadimos mas informacion en tartu:

ggmap(tartu.map, extent = "device")+
  geom_point(data = tartu.data, aes(x=lon, y = lat), 
             colour = "red", alpha = 0.12, size = 2)

Vamos a representar un mapa de densidades:

library(maps)
library(ggmap)
tartu.map2 <- get_map(location="tartu", zoom = 13)
ggmap(tartu.map2, extent = "device")+
  geom_density2d(data = tartu.data, aes(x=lon, y = lat),
                 size = .3)+
  # Da problemas el código
  # stat_density2d(data = tartu.data, aes(x=lon, y = lat,
  #                                      fill = ..level..,
  #                                      alpha = ..level..),
  #               size = 0.01, bins = 16, geom = "polygon")+
  scale_fill_gradient(low = "green", high = "red") + 
  scale_alpha(range=c(0,0.25), guide = F)

Redes o gráficos enforma de red - grafo

Para poder representar un grafo debemos pasar un vector que tenga pares de ítems en el objeto graph. Vamos a representar un grafo dirigido:

library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
g.dir <- graph(edges = c(1,2, 2,3, 2,4, 1,4, 5,5, 3,6, 5,6), n=6) # con edge avisamos que serán valores conectados entre ellos, dirigridos

plot(g.dir)

Representamos un grafo no dirigido:

g.n_dir <- graph(edges = c(1,2, 2,3, 2,4, 1,4,
                           5,5, 3,6, 5,6), n=6, directed = F)
plot(g.n_dir)

Podemos usar el parametro isolated para avisa que hay parámetros que estan aislados:

g_isolated <- graph(edges = c("Juan", "María", 
                      "María", "Ana",
                      "Ana", "Juan", 
                      "José", "María",
                      "Pedro", "José",
                      "Joel", "Pedro"),
                    isolates = c( "Carmen", "Antonio", 
                                  "Mario", "Vicente"))# con este parámetro avisamos que estarán separados

par(mfrow = c(1,1))
plot(g_isolated, edge.arrow.size = 1,
     vertex.color="gold",vertex.size = 15,
     vertex.frame.color = "gray", 
     vertex.label.color = "black",
     vertex.label.cex = 0.8,
     vertex.label.dist = 2,
     edge.curved=0.2)