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 ….
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")
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()
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.
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)
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)