Cuando inicié con el aprendizaje de R me preocupaba un poco porque no encontraba la forma de hacer gráficos, ni siquiera los más básicos que estaba acostumbrado y que creaba con tanta facilidad en Excel.

Por eso, ya entendiendo de sobra por lo que pasan los nuevos usuarios de R quiero sintetizar aquí un poco del contenido del curso introductorio a la visualización de datos con R que imparten en http://Datacamp.com

Paquetes requeridos

library(MASS) # Para habilitar el set de datos "whiteside"
library(robustbase) # set de datos "Animals"
library(insuranceData)
library(car) #para habilitar el gráfico qqplot
library(aplpack) # para activar los bagplots
library(corrplot) # Para graficar correlaciones
library(rpart) # arboles de decisión
library(wordcloud) # gráfico de palabras

En el set de datos whiteside se cuenta con el registro de temperaturas promedio semanales y el consumo de gas de un calentador luego de la instalación de un muro aislante en una residencia.

head(whiteside) # primera observaciones del set de datos
##    Insul Temp Gas
## 1 Before -0.8 7.2
## 2 Before -0.7 6.9
## 3 Before  0.4 6.4
## 4 Before  2.5 6.0
## 5 Before  2.9 5.8
## 6 Before  3.2 5.8

variables * Temp : temperatura promedio * Gas : consumo de combustible semanal * Insul : antes o después de la instalación del aislante

Primero una manera de hacer una matriz de diagramas de disperción de las variables del set de datos. En este caso en particular la relación entre Temp y Gas es la única que tiene relevacia.

plot(whiteside)

Ahora un gráfico de dispersión más elaborado, con las etiqueta de los ejes y un título.

plot(whiteside$Temp, whiteside$Gas, ylab = "Consumo de gas del calentador", xlab = "Temperatura promedio")

La función plot() es generica, lo que significa que dependiendo del tipo de objeto que se grafique arroja un resultado distinto.

plot(whiteside$Insul) #Esta vez tenemos un gráfico de barras porque `Insul` es un factor

Dos argumentos importantes en la función plot() son “col” y “pch” que permiten modificar los colores y los marcadores del gráfico.

de igual forma las funciones points() y abline() que se usan para agregar datos al gráfico y líneas rectas respectivamente.

plot(Cars93$Max.Price, Cars93$Price, pch = 17, col = "red")
points(Cars93$Min.Price, Cars93$Price, pch = 16, col = "blue")
abline(a = 0, b = 1, lty = 1) # La función abline necesita un intercepto y una pendiente

Como pueden ver, los gráficos en R se pueden ir construyendo paulatinamente e ir agregando elemntos en el orden que se desee. La construcción de gráficos de esta forma se hace con las denominadas funciones de bajo nivel.

Veamos un ejemplo

par(mfrow = c(1, 2)) #Permite dividir la pantalla de gráficos para hacer graficos juntos, con el parametro nfrow = c(filas, columnas)

plot(Animals2$brain, Animals2$body, ylab ="Body", xlab = "Brain")

title("Escala original") # Agregar el titulo del grafico, esto se puede hacer con el argumento "main" dentro de la función plot

plot(Animals2$body, Animals2$brain, log ="xy",  ylab ="log Body", xlab = "log Brain") # log = "xy" combierte las variables señaldas en logaritmo. Se podrías usar log = "x" por ejemplo

title("Log-log plot")

Gráficos de barras y de pastel

Hay que saber elegir el tipo de gráficos que se va a utilizar para la visualización de los datos. Los gráficos de pastel a pesar de ser muy populares suelen ser una mala opción, veamos una comparación entre estos y un gráfico de barras.

data("dataCar")

par(mfrow = c(1, 2))

tbl <- sort(table(dataCar$veh_body), decreasing = T)

# Grafico de pie
pie(tbl)
title("Gráfico de pastel")

# Grafico de barras
barplot(tbl, las = 2, cex.names = 0.5)
title("Gráfico de barras")

Gráficos descriptivos de variables cuantitativas

Histogramas

par(mfrow = c(1, 2))
hist(Cars93$Horsepower, main = "hist() plot")
truehist(Cars93$Horsepower, main = "truehist() plot")

Histograma con densidades

Este set de datos es de gallinas, tiene variables como el peso y el tiempo de vida en semanas

# Distribución de los pesos de las gallinas con 16 semanas de vida

weights16 <- ChickWeight[ChickWeight$Time == 16, ]$weight
truehist(weights16)
lines(density(weights16))

QQplot

El QQplot es un tipo de gráfico que arroja información sobre el tipo de distibución de los datos. Mientras más alineados están los puntos con la ínea recta más cercana a la normal es la distribución.

A continuación dos ejemplo totalmente distintos

qqPlot(weights16)

qqPlot(Boston$tax)

Graficos de dispersión y Sunflower plots

par(mfrow = c(1, 2))

plot(rad ~ zn, data = Boston)
title("Standard scatterplot")

sunflowerplot(rad ~ zn, data = Boston) # los graficos sunflowers agregan un petalo por cada punto que caiga en el mismo lugar, asi se puede ver la superposición de los datos

title("Sunflower plot")          

Gráficos de cajas y bigotes

boxplot(crim ~ rad, data = Boston,
        varwidth = T, #Este argumento permite que el ancho de la caja indique el tamaño de la muestra 
        las = 1,      # Esto cambia de horizaontal a vertical la orientacion de las etiquetas del eje x (puede tomar el valor d e1 o 2)
        log = "y" ) 

title("Crime rate vs. radial highway index")

Gráfico de misaicos

mosaicplot(carb ~ cyl, data = mtcars)

Gráfico de correlaciones

# Con el siguiente código seleccionamos las variables cuantitativas del dataset
numericalVars <- UScereal[,which(sapply(UScereal, class) == "numeric" | sapply(UScereal,class) == "integer" )]

# Creamos una matriz de correlaciones
corrMat <- cor(numericalVars)

corrplot(corrMat, "ellipse")

Gráficos de bajo nivel

Recuerdan que les dije que los gráficos se pueden ir haciendo paulatinamente, agregando elemenos parte por parte. Bueno, hagamos un o dos ejemplo de esto

#Primero creamos el área del gráfico vacía
plot(mtcars$hp, mtcars$mpg,type = "n", xlab = "caballos de fuerza", ylab = "Millas por galón")
#Ahora le agregamos algunos puntos de diferentes formas según el cilindro del carro
points(y = mtcars$mpg, x = mtcars$hp, pch = mtcars$cyl)

Como ven en el gráfico anterior se le atribuye un marcador distinto a cada punto dependiendo del la cantidad de cilindros que tenga, pero no tenemos forma de saber que significa cada forma ya que el gráfico no tiene una leyenda y aún no hemos introducido una. El siguiente gráfico tampoco tendrá leyenda pero sabremos cuantos cilindros tiene cada vehículo

plot(mtcars$hp, mtcars$mpg, type = "n", xlab = "Horsepower", ylab = "Millas por galón")
points(y = mtcars$mpg,x = mtcars$hp, pch = as.character(mtcars$cyl))

Texto en los gráficos

plot( Cars93$Horsepower, Cars93$MPG.city, pch = 15)

# índice de los carros con 3 cilindros
index3 <- which(Cars93$Cylinders == 3)

# para agregar texto en los gráficos hay que saber las coodenadas de dónde lo vamos a colocar, para eso los argumentos `x` y `y` de la función `text`
text(x = Cars93$Horsepower[index3], 
     y = Cars93$MPG.city[index3],
     labels = Cars93$Make[index3], adj = 0)

Leyendas en los gráficos

Haremos otra vez el segundo gráfico que hicimos, pero ahora le agregaremos mucha más información

# Creando el área del gráfico
plot(whiteside$Temp, whiteside$Gas,
     type = "n", xlab = "Temperatura promedio",
     ylab = "Consumo de gas del calentador")

# Creando indices para saber cuales mediciones se hicieron antes o después de la instalación del aislante
indexB <- which(whiteside$Insul == "Before")
indexA <- which(whiteside$Insul == "After")

# Agregando los puntos con las mediciones antes de la instalación
points(whiteside$Temp[indexB], whiteside$Gas[indexB], pch = 17)

#Agregando los puntos con las mediciones después de la instalación
points(whiteside$Temp[indexA], whiteside$Gas[indexA], pch = 1)

# Agreagando la leyenda
legend("topright", pch = c(17,1), 
       legend = c("Before", "After"))

Gráficos con tendencias no lineales

# Grafico de dispersión de MPG.city vs. Horsepower
plot(Cars93$Horsepower, Cars93$MPG.city)

# Crear objeto con la tendencia no lineal usando la función supsmu
trend1 <- supsmu(Cars93$Horsepower, Cars93$MPG.city)

# agregar la tendencia
lines(trend1)

# La suavidad de la tendencia se puede ajustar con el parametro bass. creemos otra tendencia más suave
trend2 <- supsmu(Cars93$Horsepower, Cars93$MPG.city, bass = 10)

# Agregando la línea de tendencia nueva con una línea gruesa y punteada
lines(trend2, lty = 3, lwd = 2)